Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/AssemblyInfo.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/AssemblyInfo.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/AssemblyInfo.cs	(revision 1134)
@@ -0,0 +1,61 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+//
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("Clinical Scheduling")]
+[assembly: AssemblyDescription("Windows Scheduling Application for VistA")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("WorldVistA")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]		
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.5.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the 
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing. 
+//
+// Notes: 
+//   (*) If no key is specified, the assembly is not signed.
+//   (*) KeyName refers to a key that has been installed in the Crypto Service
+//       Provider (CSP) on your machine. KeyFile refers to a file which contains
+//       a key.
+//   (*) If the KeyFile and the KeyName values are both specified, the 
+//       following processing occurs:
+//       (1) If the KeyName can be found in the CSP, that key is used.
+//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
+//           in the KeyFile is installed into the CSP and used.
+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+//       When specifying the KeyFile, the location of the KeyFile should be
+//       relative to the project output directory which is
+//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+//       located in the project directory, you would specify the AssemblyKeyFile 
+//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+//       documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
+[assembly: AssemblyFileVersionAttribute("1.5.0.0")]
+[assembly: ComVisibleAttribute(false)]
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAVDocument.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAVDocument.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAVDocument.cs	(revision 1134)
@@ -0,0 +1,562 @@
+using System;
+using System.Collections;
+using System.Data;
+//using System.Data.OleDb;
+using System.Diagnostics;
+using System.Drawing;
+using System.Windows.Forms;
+using IndianHealthService.BMXNet;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Contains array of availability blocks for a scheduling resource
+	/// </summary>
+	public class CGAVDocument : System.Object
+	{
+		public CGAVDocument()
+		{
+			m_AVBlocks = new CGAppointments();
+			m_sResourcesArray = new ArrayList();
+		}
+
+		#region Member Variables
+
+		public int				m_nColumnCount; //todo: this should point to the view's member for column count
+		public int				m_nTimeUnits;
+		public string			m_sSecondary;
+		private string			m_sDocName;
+		public ArrayList		m_sResourcesArray;
+		public ScheduleType		m_ScheduleType;
+		private DateTime		m_dSelectedDate; //Holds the user's selection from the dtpicker
+		private DateTime		m_dStartDate; //Beginning date of document data
+		private DateTime		m_dEndDate; //Ending date of document data
+		public CGAppointments	m_AVBlocks;
+		private CGDocumentManager m_DocManager;
+		private int				m_nDocID;	//Resource IEN in ^BSDXRES
+
+		#endregion
+
+		#region Properties
+
+		/// <summary>
+		/// Resource IEN in ^BSDXRES
+		/// </summary>
+		public int ResourceID
+		{
+			get
+			{
+				return m_nDocID;
+			}
+			set
+			{
+				m_nDocID = value;
+			}
+		}
+
+		/// <summary>
+		/// The list of Resource names
+		/// </summary>
+		public ArrayList Resources
+		{
+			get
+			{
+				return this.m_sResourcesArray;
+			}
+			set
+			{
+				this.m_sResourcesArray = value;
+			}
+		}
+
+		public CGDocumentManager DocManager
+		{
+			get
+			{
+				return m_DocManager;
+			}
+			set
+			{
+				m_DocManager = value;
+			}
+		}
+
+		/// <summary>
+		/// Contains the hashtable of Availability Blocks
+		/// </summary>
+		public CGAppointments AVBlocks
+		{
+			get
+			{
+				return m_AVBlocks;
+			}
+			set
+			{
+				m_AVBlocks = value;
+			}
+		}
+
+		/// <summary>
+		/// Holds the date selected by the user in CGView.dateTimePicker1
+		/// </summary>
+		public DateTime SelectedDate
+		{
+			get
+			{
+				return this.m_dSelectedDate;
+			}
+			set
+			{
+				this.m_dSelectedDate = value;
+				bool bRet = false;
+				if (m_ScheduleType == ScheduleType.Resource)
+				{
+					bRet = this.WeekNeedsRefresh(1, m_dSelectedDate, out this.m_dStartDate, out this.m_dEndDate);
+				}
+				else
+				{
+					this.m_dStartDate = m_dSelectedDate;
+					this.m_dEndDate = m_dSelectedDate;
+					this.m_dEndDate = this.m_dEndDate.AddHours(23);
+					this.m_dEndDate = this.m_dEndDate.AddMinutes(59);
+					this.m_dEndDate = this.m_dEndDate.AddSeconds(59);
+				}
+
+				bRet = this.RefreshDaysSchedule();
+			}
+		}
+
+		/// <summary>
+		/// Contains the beginning date of the appointment document
+		/// </summary>
+		public DateTime StartDate
+		{
+			get
+			{
+				return this.m_dStartDate;
+			}
+		}
+		
+		public string DocName
+		{
+			get
+			{
+				return this.m_sDocName;
+			}
+			set
+			{
+				this.m_sDocName = value;
+			}
+		}
+
+		#endregion
+	
+		#region Methods
+
+		public void ChangeAppointmentTime(CGAppointment pAppt, DateTime dNewStart, DateTime dNewEnd, string sResource)
+		{
+			try 
+			{
+				DateTime dOldStart = pAppt.StartTime;
+				DateTime dOldEnd = pAppt.EndTime;
+				if ((dOldStart == dNewStart) && (dOldEnd == dNewEnd)) 
+				{ //no change in time
+					return;
+				}
+
+				foreach (CGAppointment a in m_AVBlocks.AppointmentTable.Values)
+				{
+					DateTime sStart2 = a.StartTime;
+					DateTime sEnd2 = a.EndTime;
+					if ((a.AppointmentKey != pAppt.AppointmentKey) && (CalendarGrid.TimesOverlap(dNewStart, dNewEnd, a.StartTime, a.EndTime)))
+					{
+						MessageBox.Show("Access blocks may not overlap.","Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+						return;
+					}
+				}
+
+				this.DeleteAvailability(pAppt.AppointmentKey);
+				pAppt.StartTime = dNewStart;
+				pAppt.EndTime = dNewEnd;
+				pAppt.Resource = sResource;
+				this.CreateAppointment(pAppt);
+				
+			}
+			catch(Exception e)
+			{
+				MessageBox.Show("CGDocument::ChangeAppointmentTime failed: " + e.Message);
+				return;
+			}
+		}
+
+		public void DeleteAvailability(int nApptID)
+		{
+			if (this.m_AVBlocks.AppointmentTable.ContainsKey(nApptID))
+			{
+				string sSql = "BSDX CANCEL AVAILABILITY^" + nApptID.ToString();
+				DataTable dtAppt =m_DocManager.RPMSDataTable(sSql, "DeleteAvailability");
+				int nErrorID;				
+				Debug.Assert(dtAppt.Rows.Count == 1);
+				DataRow r = dtAppt.Rows[0];
+				nErrorID = Convert.ToInt32(r["ERRORID"]);
+				this.m_AVBlocks.RemoveAppointment(nApptID);
+				UpdateAllViews();
+			}		
+		}
+
+		/// <summary>
+		/// Called by LoadTemplate to create Access Block
+		/// Returns the IEN of the availability block in the RPMS BSDX AVAILABILITY file.
+		/// </summary>
+		public int CreateAppointmentAuto(CGAppointment rApptInfo)
+		{
+			try
+			{
+				string sStart;
+				string sEnd;
+				string sResource;
+				string sNote;
+				string sTypeID;
+				string sSlots;
+
+				//sStart = rApptInfo.StartTime.ToString("M-d-yyyy@HH:mm");
+				//sEnd = rApptInfo.EndTime.ToString("M-d-yyyy@HH:mm");
+                // i18n support
+                sStart = FMDateTime.Create(rApptInfo.StartTime).FMDateString;
+                sEnd = FMDateTime.Create(rApptInfo.EndTime).FMDateString;
+                sNote = rApptInfo.Note;
+				sResource = rApptInfo.Resource;
+				sTypeID = rApptInfo.AccessTypeID.ToString();
+				sSlots = rApptInfo.Slots.ToString();
+
+				CGAppointment aCopy = new CGAppointment();
+				aCopy.CreateAppointment(rApptInfo.StartTime, rApptInfo.EndTime, sNote, 0, sResource);
+				aCopy.AccessTypeID = rApptInfo.AccessTypeID;
+				aCopy.Slots = rApptInfo.Slots;
+				aCopy.IsAccessBlock = true;
+
+				string sSql = "BSDX ADD NEW AVAILABILITY^" + sStart + "^" + sEnd + "^" + sTypeID + "^" + sResource + "^" +  sSlots + "^" + sNote;
+				DataTable dtAppt = m_DocManager.RPMSDataTable(sSql, "NewAvailability");
+
+				int nApptID;
+				int nErrorID;
+
+				Debug.Assert(dtAppt.Rows.Count == 1);
+				DataRow r = dtAppt.Rows[0];
+				nApptID =Convert.ToInt32(r["AVAILABILITYID"]);
+				nErrorID = Convert.ToInt32(r["ERRORID"]);
+				if (nErrorID != -1)
+				{
+					throw new Exception("VistA Error");
+				}
+				Debug.Write("CreateAvailabilityAuto -- new AV block created\n");
+
+				//UpdateAllViews();
+
+				aCopy.AppointmentKey = nApptID;
+				return nApptID;
+			}
+			catch (Exception ex)
+			{
+				Debug.Write("CGAVDocument.CreateAppointmentAuto Failed: " + ex.Message);
+				return -1;
+			}		
+		}
+
+
+		public int CreateAppointment(CGAppointment rApptInfo)
+		{
+			try
+			{
+				string sStart;
+				string sEnd;
+				string sResource;
+				string sNote;
+				string sTypeID;
+				string sSlots;
+
+				//sStart = rApptInfo.StartTime.ToString("M-d-yyyy@HH:mm");
+				//sEnd = rApptInfo.EndTime.ToString("M-d-yyyy@HH:mm");
+                // i18n support
+                sStart = FMDateTime.Create(rApptInfo.StartTime).FMDateString;
+                sEnd = FMDateTime.Create(rApptInfo.EndTime).FMDateString;
+				sNote = rApptInfo.Note;
+				sResource = rApptInfo.Resource;
+				sTypeID = rApptInfo.AccessTypeID.ToString();
+				sSlots = rApptInfo.Slots.ToString();
+
+				CGAppointment aCopy = new CGAppointment();
+				aCopy.CreateAppointment(rApptInfo.StartTime, rApptInfo.EndTime, sNote, 0, sResource);
+				aCopy.AccessTypeID = rApptInfo.AccessTypeID;
+				aCopy.Slots = rApptInfo.Slots;
+				aCopy.IsAccessBlock = true;
+
+				aCopy.AccessTypeName = this.AccessNameFromID(aCopy.AccessTypeID);
+
+				foreach (CGAppointment a in this.m_AVBlocks.AppointmentTable.Values)
+				{
+					DateTime sStart2 = a.StartTime;
+					DateTime sEnd2 = a.EndTime;
+					if (CalendarGrid.TimesOverlap(aCopy.StartTime, aCopy.EndTime, a.StartTime, a.EndTime))
+					{
+						//						throw new Exception("Access blocks may not overlap.");
+						MessageBox.Show("Access blocks may not overlap.","Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+						return -1;
+					}
+						
+				}
+
+				string sSql = "BSDX ADD NEW AVAILABILITY^" + sStart + "^" + sEnd + "^" + sTypeID + "^" + sResource + "^" +  sSlots + "^" + sNote;
+				DataTable dtAppt =m_DocManager.RPMSDataTable(sSql, "NewAvailability");
+
+				int nApptID;
+				int nErrorID;
+
+				Debug.Assert(dtAppt.Rows.Count == 1);
+				DataRow r = dtAppt.Rows[0];
+				nApptID =Convert.ToInt32(r["AVAILABILITYID"]);
+				nErrorID = Convert.ToInt32(r["ERRORID"]);
+				if (nErrorID != -1)
+				{
+					throw new Exception("VistA Error");
+				}
+				Debug.Write("CreateAvailability -- new AV block created\n");
+
+				aCopy.AppointmentKey = nApptID;
+			
+				this.m_AVBlocks.AddAppointment(aCopy);
+
+				UpdateAllViews();
+
+				return nApptID;
+			}
+			catch (Exception ex)
+			{
+				Debug.Write("CGAVDocument.CreateAppointment Failed: " + ex.Message);
+				return -1;
+			}
+		}
+
+		private int GetTotalMinutes(DateTime dDate)
+		{
+			return ((dDate.Hour * 60) + dDate.Minute);
+		}
+
+		private string AccessNameFromID(int nAccessTypeID)
+		{
+			DataView dvTypes = new DataView(this.DocManager.GlobalDataSet.Tables["AccessTypes"]);
+			dvTypes.Sort = "BMXIEN ASC";
+			int nRow = dvTypes.Find(nAccessTypeID);
+			DataRowView drv = dvTypes[nRow];
+			string sAccessTypeName = drv["ACCESS_TYPE_NAME"].ToString();
+			return sAccessTypeName;		
+		}
+
+
+		/// <summary>
+		/// Update availability block schedule based on info in RPMS
+		/// </summary>
+		public bool RefreshDaysSchedule()
+		{
+			DateTime dStart;
+			DateTime dEnd;
+			int nKeyID;
+			string sNote;
+			string sResource;
+			string sAccessType;
+			string sSlots;
+			CGAppointment	pAppointment;
+			CGDocumentManager pApp = CGDocumentManager.Current;
+			DataTable rAppointmentSchedule;
+
+			this.m_AVBlocks.ClearAllAppointments();
+
+			ArrayList apptTypeIDs = new ArrayList();
+
+			rAppointmentSchedule = CGSchedLib.CreateAvailabilitySchedule(m_DocManager, m_sResourcesArray, this.m_dStartDate, this.m_dEndDate, apptTypeIDs,/* */ this.m_ScheduleType, "0");
+
+			foreach (DataRow r in rAppointmentSchedule.Rows) 
+			{
+				nKeyID = Convert.ToInt32(r["AVAILABILITYID"].ToString());
+				if (nKeyID > 0) 
+				{
+					dStart = (DateTime) r["START_TIME"];
+					dEnd = (DateTime) r["END_TIME"];
+					sNote = r["NOTE"].ToString();
+					sResource = r["RESOURCE"].ToString();
+					sAccessType = r["ACCESS_TYPE"].ToString();
+					sSlots = r["SLOTS"].ToString();
+
+					pAppointment = new CGAppointment();
+					pAppointment.CreateAppointment(dStart, dEnd, sNote, nKeyID, sResource);
+					pAppointment.AccessTypeID = Convert.ToInt16(sAccessType);
+					pAppointment.Slots = Convert.ToInt16(sSlots);
+					pAppointment.IsAccessBlock = true;
+					pAppointment.AccessTypeName = this.AccessNameFromID(pAppointment.AccessTypeID);
+
+					this.m_AVBlocks.AddAppointment(pAppointment);
+				}
+			}		
+			return true;
+		}
+
+        /// <summary>
+        /// Given a selected date,
+        /// Calculates StartDay and End Day and returns them in output params.  
+        /// nWeeks == number of Weeks to display
+        /// nColumnCount is number of days displayed per week.  
+        /// If 5 columns, begin on Second Day of Week
+        /// If 7 Columns, begin on First Day of Week
+        /// (this is a change from the hardcoded behavior for US-based calendars)
+        /// 
+        /// Returns TRUE if the document's data needs refreshing based on 
+        /// this newly selected date.
+        /// </summary>
+        /// TODO: This is a duplicate of the method in CGDocument. We need to put them together.
+		public bool WeekNeedsRefresh(int nWeeks, DateTime SelectedDate, 
+			out DateTime WeekStartDay, out DateTime WeekEndDay)
+		{
+            DateTime OldStartDay = m_dStartDate;
+            DateTime OldEndDay = m_dEndDate;
+            // Week start based on thread locale
+            int nStartWeekDay = (int)System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek;
+            // Current Day
+            int nWeekDay = (int)SelectedDate.DayOfWeek; //0 == Sunday
+
+            // this offset gets approrpriate day based on locale.
+            int nOff = (nStartWeekDay + 1) % 7;
+            TimeSpan ts = new TimeSpan(nWeekDay - nOff, 0, 0, 0); //d,h,m,s
+
+            // if ts is negative, we will jump to the next week in the logic.
+            // to show the correct week, add 7. Confusing, I know.
+            if (ts < new TimeSpan()) ts = ts + new TimeSpan(7, 0, 0, 0);
+
+            if (m_nColumnCount == 1) // if one column start and end on the same day.
+            {
+                ts = new TimeSpan(0, 23, 59, 59);
+                WeekStartDay = SelectedDate;
+                WeekEndDay = WeekStartDay + ts;
+            }
+            else if (m_nColumnCount == 5 || m_nColumnCount == 0) // if 5 column start (or default) at the 2nd day of this week and end in 4:23:59:59 days.
+            {
+                // if picked day is start of week (Sunday in US), start in the next day since that's the first day of work week
+                // else, just substract the calculated time span to get to the start of week (first work day)
+                WeekStartDay = (nWeekDay == nStartWeekDay) ? SelectedDate + new TimeSpan(1, 0, 0, 0) : SelectedDate - ts;
+                // End day calculation
+                int nEnd = 3;
+                ts = new TimeSpan((7 * nWeeks) - nEnd, 23, 59, 59);
+                WeekEndDay = WeekStartDay + ts;
+            }
+            else // if 7 column start at the 1st day of this week and end in 6:23:59:59 days.
+            {
+                // if picked day is start of week, use that. Otherwise, go to the fist work day and substract one to get to start of week.
+                WeekStartDay = (nWeekDay == nStartWeekDay) ? SelectedDate : SelectedDate - ts - new TimeSpan(1, 0, 0, 0);
+                // End day calculation
+                int nEnd = 1;
+                ts = new TimeSpan((7 * nWeeks) - nEnd, 23, 59, 59);
+                WeekEndDay = WeekStartDay + ts;
+            }
+
+            bool bRet = ((WeekStartDay.Date != OldStartDay.Date) || (WeekEndDay.Date != OldEndDay.Date));
+            return bRet;
+		}
+
+		public void OnOpenDocument() 
+		{
+			//Create new Document
+			//			DateTime dStart;
+			//			DateTime dEnd;
+
+			Debug.Assert(m_sResourcesArray.Count > 0);
+
+			m_sSecondary = "";
+
+			m_ScheduleType = (m_sResourcesArray.Count == 1) ? ScheduleType.Resource: ScheduleType.Clinic;
+		
+			bool bRet = false;
+			//Set initial From and To dates based on current day
+			//			DateTime dDate = new DateTime(2001,12,05); //test line
+			DateTime dDate = DateTime.Today;
+			if (m_ScheduleType == ScheduleType.Resource)
+			{
+				bRet = this.WeekNeedsRefresh(1,dDate, out this.m_dStartDate, out this.m_dEndDate);
+			}
+			else
+			{
+				this.m_dStartDate = dDate;
+				this.m_dEndDate = dDate;
+				this.m_dEndDate = this.m_dEndDate.AddHours(23);
+				this.m_dEndDate = this.m_dEndDate.AddMinutes(59);
+				this.m_dEndDate = this.m_dEndDate.AddSeconds(59);
+			}
+
+			bRet = this.RefreshDaysSchedule();
+
+			CGAVView view = null;
+			//If this document already has a view, the use it
+			Hashtable h = CGDocumentManager.Current.AvailabilityViews;		
+			CGAVDocument d;
+			bool bReuseView = false;
+			foreach (CGAVView v in h.Keys)
+			{
+				d = (CGAVDocument) h[v];
+				if (d == this)
+				{
+					view = v;
+					bReuseView = true;
+					break;
+				}
+			}
+
+			//Otherwise, create new View
+			if (bReuseView == false)
+			{
+				view = new CGAVView();
+
+				view.DocManager = this.DocManager;
+				view.StartDate = m_dStartDate;
+			
+				//Assign the document to the view
+				view.Document = this;
+
+				//Link the calendargrid's appointments table to the document's table
+				view.AVBlocks = this.AVBlocks;
+			
+				view.Text = "Edit Availability - " + this.DocName;
+				view.Show();
+			}
+
+			this.UpdateAllViews();
+
+		}
+
+		public void AddResource(string sResource)
+		{
+			//TODO:  Test that resource is not currently in list, that it IS a resource, etc
+			this.m_sResourcesArray.Add(sResource);
+			this.UpdateAllViews();
+		}
+
+		/// <summary>
+		/// Calls each AVview associated with this AVdocument and tells it to update itself
+		/// </summary>
+		public void UpdateAllViews()
+		{
+			//iterate through all views and call update.
+			Hashtable h = CGDocumentManager.Current.AvailabilityViews;
+			
+			CGAVDocument d;
+			foreach (CGAVView v in h.Keys)
+			{
+				d = (CGAVDocument) h[v];
+				if (d == this)
+				{
+					v.UpdateArrays();
+				}
+			}
+		}
+
+		#endregion
+	
+	}//End class
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAVView.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAVView.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAVView.cs	(revision 1134)
@@ -0,0 +1,1571 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Diagnostics;
+using System.Data;
+using System.Data.OleDb;
+using System.IO;
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters.Binary;
+using IndianHealthService.BMXNet;
+
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for CGAVView.
+	/// </summary>
+	public class CGAVView : System.Windows.Forms.Form
+	{
+
+
+		public CGAVView()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+			this.panelRight.Visible = false;
+			this.tvSchedules.Visible = false;
+			m_ClipList = new CGAppointments();
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CGAVView));
+            this.panelRight = new System.Windows.Forms.Panel();
+            this.panelClip = new System.Windows.Forms.Panel();
+            this.lstClip = new System.Windows.Forms.ListBox();
+            this.ctxApptClipMenu = new System.Windows.Forms.ContextMenu();
+            this.mnuRemoveClipItem = new System.Windows.Forms.MenuItem();
+            this.mnuClearClipItems = new System.Windows.Forms.MenuItem();
+            this.label1 = new System.Windows.Forms.Label();
+            this.panelBottom = new System.Windows.Forms.Panel();
+            this.statusBar1 = new System.Windows.Forms.StatusBar();
+            this.panelTop = new System.Windows.Forms.Panel();
+            this.dateTimePicker1 = new System.Windows.Forms.DateTimePicker();
+            this.lblResource = new System.Windows.Forms.Label();
+            this.panelCenter = new System.Windows.Forms.Panel();
+            this.ctxCalendarGrid = new System.Windows.Forms.ContextMenu();
+            this.ctxCalGridAdd = new System.Windows.Forms.MenuItem();
+            this.ctxCalGridEdit = new System.Windows.Forms.MenuItem();
+            this.ctxCalGridDelete = new System.Windows.Forms.MenuItem();
+            this.tvSchedules = new System.Windows.Forms.TreeView();
+            this.mainMenu1 = new System.Windows.Forms.MainMenu(this.components);
+            this.menuItem1 = new System.Windows.Forms.MenuItem();
+            this.mnuLoadTemplate = new System.Windows.Forms.MenuItem();
+            this.mnuSaveTemplate = new System.Windows.Forms.MenuItem();
+            this.mnuDeleteAllSlots = new System.Windows.Forms.MenuItem();
+            this.menuItem6 = new System.Windows.Forms.MenuItem();
+            this.mnuSchedulingManagment = new System.Windows.Forms.MenuItem();
+            this.menuItem5 = new System.Windows.Forms.MenuItem();
+            this.mnuClose = new System.Windows.Forms.MenuItem();
+            this.mnuAvailability = new System.Windows.Forms.MenuItem();
+            this.mnuAddNewAV = new System.Windows.Forms.MenuItem();
+            this.mnuRemoveAV = new System.Windows.Forms.MenuItem();
+            this.mnuEditAV = new System.Windows.Forms.MenuItem();
+            this.mnuCalendar = new System.Windows.Forms.MenuItem();
+            this.mnu1Day = new System.Windows.Forms.MenuItem();
+            this.mnu5Day = new System.Windows.Forms.MenuItem();
+            this.mnu7Day = new System.Windows.Forms.MenuItem();
+            this.menuItem7 = new System.Windows.Forms.MenuItem();
+            this.mnuTimeScale = new System.Windows.Forms.MenuItem();
+            this.mnu10Minute = new System.Windows.Forms.MenuItem();
+            this.mnu15Minute = new System.Windows.Forms.MenuItem();
+            this.mnu20Minute = new System.Windows.Forms.MenuItem();
+            this.mnu30Minute = new System.Windows.Forms.MenuItem();
+            this.mnuViewRightPanel = new System.Windows.Forms.MenuItem();
+            this.mnuHelp = new System.Windows.Forms.MenuItem();
+            this.mnuHelpAbout = new System.Windows.Forms.MenuItem();
+            this.splitter1 = new System.Windows.Forms.Splitter();
+            this.saveAccessBlocksWorker = new System.ComponentModel.BackgroundWorker();
+            this.calendarGrid1 = new IndianHealthService.ClinicalScheduling.CalendarGrid();
+            this.panelRight.SuspendLayout();
+            this.panelClip.SuspendLayout();
+            this.panelBottom.SuspendLayout();
+            this.panelTop.SuspendLayout();
+            this.panelCenter.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // panelRight
+            // 
+            this.panelRight.Controls.Add(this.panelClip);
+            this.panelRight.Dock = System.Windows.Forms.DockStyle.Right;
+            this.panelRight.Location = new System.Drawing.Point(728, 0);
+            this.panelRight.Name = "panelRight";
+            this.panelRight.Size = new System.Drawing.Size(120, 343);
+            this.panelRight.TabIndex = 1;
+            // 
+            // panelClip
+            // 
+            this.panelClip.Controls.Add(this.lstClip);
+            this.panelClip.Controls.Add(this.label1);
+            this.panelClip.Dock = System.Windows.Forms.DockStyle.Top;
+            this.panelClip.Location = new System.Drawing.Point(0, 0);
+            this.panelClip.Name = "panelClip";
+            this.panelClip.Size = new System.Drawing.Size(120, 448);
+            this.panelClip.TabIndex = 1;
+            // 
+            // lstClip
+            // 
+            this.lstClip.AllowDrop = true;
+            this.lstClip.ContextMenu = this.ctxApptClipMenu;
+            this.lstClip.DisplayMember = "ToString()";
+            this.lstClip.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lstClip.Location = new System.Drawing.Point(0, 32);
+            this.lstClip.Name = "lstClip";
+            this.lstClip.Size = new System.Drawing.Size(120, 416);
+            this.lstClip.TabIndex = 0;
+            this.lstClip.DragDrop += new System.Windows.Forms.DragEventHandler(this.lstClip_DragDrop);
+            this.lstClip.DragEnter += new System.Windows.Forms.DragEventHandler(this.lstClip_DragEnter);
+            this.lstClip.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lstClip_MouseDown);
+            this.lstClip.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lstClip_MouseMove);
+            // 
+            // ctxApptClipMenu
+            // 
+            this.ctxApptClipMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.mnuRemoveClipItem,
+            this.mnuClearClipItems});
+            this.ctxApptClipMenu.Popup += new System.EventHandler(this.ctxApptClipMenu_Popup);
+            // 
+            // mnuRemoveClipItem
+            // 
+            this.mnuRemoveClipItem.Index = 0;
+            this.mnuRemoveClipItem.Text = "Remove Item";
+            this.mnuRemoveClipItem.Click += new System.EventHandler(this.mnuRemoveClipItem_Click);
+            // 
+            // mnuClearClipItems
+            // 
+            this.mnuClearClipItems.Index = 1;
+            this.mnuClearClipItems.Text = "Clear All";
+            this.mnuClearClipItems.Click += new System.EventHandler(this.mnuClearClipItems_Click);
+            // 
+            // label1
+            // 
+            this.label1.Dock = System.Windows.Forms.DockStyle.Top;
+            this.label1.Location = new System.Drawing.Point(0, 0);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(120, 32);
+            this.label1.TabIndex = 1;
+            this.label1.Text = "Access Block Clipboard";
+            this.label1.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
+            // 
+            // panelBottom
+            // 
+            this.panelBottom.Controls.Add(this.statusBar1);
+            this.panelBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.panelBottom.Location = new System.Drawing.Point(8, 319);
+            this.panelBottom.Name = "panelBottom";
+            this.panelBottom.Size = new System.Drawing.Size(720, 24);
+            this.panelBottom.TabIndex = 2;
+            // 
+            // 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(720, 24);
+            this.statusBar1.SizingGrip = false;
+            this.statusBar1.TabIndex = 1;
+            // 
+            // panelTop
+            // 
+            this.panelTop.Controls.Add(this.dateTimePicker1);
+            this.panelTop.Controls.Add(this.lblResource);
+            this.panelTop.Dock = System.Windows.Forms.DockStyle.Top;
+            this.panelTop.Location = new System.Drawing.Point(8, 0);
+            this.panelTop.Name = "panelTop";
+            this.panelTop.Size = new System.Drawing.Size(720, 24);
+            this.panelTop.TabIndex = 3;
+            // 
+            // dateTimePicker1
+            // 
+            this.dateTimePicker1.Dock = System.Windows.Forms.DockStyle.Right;
+            this.dateTimePicker1.DropDownAlign = System.Windows.Forms.LeftRightAlignment.Right;
+            this.dateTimePicker1.Location = new System.Drawing.Point(517, 0);
+            this.dateTimePicker1.Name = "dateTimePicker1";
+            this.dateTimePicker1.Size = new System.Drawing.Size(203, 20);
+            this.dateTimePicker1.TabIndex = 4;
+            this.dateTimePicker1.ValueChanged += new System.EventHandler(this.dateTimePicker1_ValueChanged);
+            // 
+            // lblResource
+            // 
+            this.lblResource.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lblResource.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.lblResource.ForeColor = System.Drawing.SystemColors.Highlight;
+            this.lblResource.Location = new System.Drawing.Point(0, 0);
+            this.lblResource.Name = "lblResource";
+            this.lblResource.Size = new System.Drawing.Size(720, 24);
+            this.lblResource.TabIndex = 3;
+            this.lblResource.Text = "lblResource";
+            // 
+            // panelCenter
+            // 
+            this.panelCenter.Controls.Add(this.calendarGrid1);
+            this.panelCenter.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.panelCenter.Location = new System.Drawing.Point(8, 24);
+            this.panelCenter.Name = "panelCenter";
+            this.panelCenter.Size = new System.Drawing.Size(712, 295);
+            this.panelCenter.TabIndex = 4;
+            // 
+            // ctxCalendarGrid
+            // 
+            this.ctxCalendarGrid.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.ctxCalGridAdd,
+            this.ctxCalGridEdit,
+            this.ctxCalGridDelete});
+            this.ctxCalendarGrid.Popup += new System.EventHandler(this.ctxCalendarGrid_Popup);
+            // 
+            // ctxCalGridAdd
+            // 
+            this.ctxCalGridAdd.Index = 0;
+            this.ctxCalGridAdd.Text = "Add New Access Block";
+            this.ctxCalGridAdd.Click += new System.EventHandler(this.ctxCalGridAdd_Click);
+            // 
+            // ctxCalGridEdit
+            // 
+            this.ctxCalGridEdit.Index = 1;
+            this.ctxCalGridEdit.Text = "Edit Access Block";
+            this.ctxCalGridEdit.Click += new System.EventHandler(this.ctxCalGridEdit_Click);
+            // 
+            // ctxCalGridDelete
+            // 
+            this.ctxCalGridDelete.Index = 2;
+            this.ctxCalGridDelete.Text = "Delete Access Block";
+            this.ctxCalGridDelete.Click += new System.EventHandler(this.ctxCalGridDelete_Click);
+            // 
+            // tvSchedules
+            // 
+            this.tvSchedules.BackColor = System.Drawing.SystemColors.ControlLight;
+            this.tvSchedules.Dock = System.Windows.Forms.DockStyle.Left;
+            this.tvSchedules.HotTracking = true;
+            this.tvSchedules.Location = new System.Drawing.Point(0, 0);
+            this.tvSchedules.Name = "tvSchedules";
+            this.tvSchedules.Size = new System.Drawing.Size(8, 343);
+            this.tvSchedules.Sorted = true;
+            this.tvSchedules.TabIndex = 5;
+            // 
+            // mainMenu1
+            // 
+            this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.menuItem1,
+            this.mnuAvailability,
+            this.mnuCalendar,
+            this.mnuHelp});
+            // 
+            // menuItem1
+            // 
+            this.menuItem1.Index = 0;
+            this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.mnuLoadTemplate,
+            this.mnuSaveTemplate,
+            this.mnuDeleteAllSlots,
+            this.menuItem6,
+            this.mnuSchedulingManagment,
+            this.menuItem5,
+            this.mnuClose});
+            this.menuItem1.Text = "&File";
+            // 
+            // mnuLoadTemplate
+            // 
+            this.mnuLoadTemplate.Index = 0;
+            this.mnuLoadTemplate.Shortcut = System.Windows.Forms.Shortcut.CtrlA;
+            this.mnuLoadTemplate.Text = "&Apply Template";
+            this.mnuLoadTemplate.Click += new System.EventHandler(this.mnuLoadTemplate_Click);
+            // 
+            // mnuSaveTemplate
+            // 
+            this.mnuSaveTemplate.Index = 1;
+            this.mnuSaveTemplate.Shortcut = System.Windows.Forms.Shortcut.CtrlS;
+            this.mnuSaveTemplate.Text = "&Save Template";
+            this.mnuSaveTemplate.Click += new System.EventHandler(this.mnuSaveTemplate_Click);
+            // 
+            // mnuDeleteAllSlots
+            // 
+            this.mnuDeleteAllSlots.Index = 2;
+            this.mnuDeleteAllSlots.Shortcut = System.Windows.Forms.Shortcut.CtrlD;
+            this.mnuDeleteAllSlots.Text = "&Delete All Slots";
+            this.mnuDeleteAllSlots.Click += new System.EventHandler(this.mnuDeleteAllSlots_Click);
+            // 
+            // menuItem6
+            // 
+            this.menuItem6.Index = 3;
+            this.menuItem6.Text = "-";
+            // 
+            // mnuSchedulingManagment
+            // 
+            this.mnuSchedulingManagment.Index = 4;
+            this.mnuSchedulingManagment.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftM;
+            this.mnuSchedulingManagment.Text = "Scheduling &Management";
+            this.mnuSchedulingManagment.Click += new System.EventHandler(this.mnuSchedulingManagment_Click);
+            // 
+            // menuItem5
+            // 
+            this.menuItem5.Index = 5;
+            this.menuItem5.Text = "-";
+            // 
+            // mnuClose
+            // 
+            this.mnuClose.Index = 6;
+            this.mnuClose.Shortcut = System.Windows.Forms.Shortcut.CtrlW;
+            this.mnuClose.Text = "&Close";
+            this.mnuClose.Click += new System.EventHandler(this.mnuClose_Click);
+            // 
+            // mnuAvailability
+            // 
+            this.mnuAvailability.Index = 1;
+            this.mnuAvailability.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.mnuAddNewAV,
+            this.mnuRemoveAV,
+            this.mnuEditAV});
+            this.mnuAvailability.Text = "&Access Blocks";
+            this.mnuAvailability.Popup += new System.EventHandler(this.mnuAvailability_Popup);
+            // 
+            // mnuAddNewAV
+            // 
+            this.mnuAddNewAV.Index = 0;
+            this.mnuAddNewAV.Shortcut = System.Windows.Forms.Shortcut.CtrlN;
+            this.mnuAddNewAV.Text = "Add &New Block";
+            this.mnuAddNewAV.Click += new System.EventHandler(this.mnuAddNewAV_Click);
+            // 
+            // mnuRemoveAV
+            // 
+            this.mnuRemoveAV.Index = 1;
+            this.mnuRemoveAV.Shortcut = System.Windows.Forms.Shortcut.CtrlR;
+            this.mnuRemoveAV.Text = "&Remove Block";
+            this.mnuRemoveAV.Click += new System.EventHandler(this.mnuRemoveAV_Click);
+            // 
+            // mnuEditAV
+            // 
+            this.mnuEditAV.Index = 2;
+            this.mnuEditAV.Shortcut = System.Windows.Forms.Shortcut.CtrlE;
+            this.mnuEditAV.Text = "&Edit Block";
+            this.mnuEditAV.Click += new System.EventHandler(this.mnuEditAV_Click);
+            // 
+            // mnuCalendar
+            // 
+            this.mnuCalendar.Index = 2;
+            this.mnuCalendar.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.mnu1Day,
+            this.mnu5Day,
+            this.mnu7Day,
+            this.menuItem7,
+            this.mnuTimeScale,
+            this.mnuViewRightPanel});
+            this.mnuCalendar.Text = "&View";
+            // 
+            // mnu1Day
+            // 
+            this.mnu1Day.Index = 0;
+            this.mnu1Day.Shortcut = System.Windows.Forms.Shortcut.Ctrl1;
+            this.mnu1Day.Text = "&1-Day View";
+            this.mnu1Day.Click += new System.EventHandler(this.mnu1Day_Click);
+            // 
+            // mnu5Day
+            // 
+            this.mnu5Day.Index = 1;
+            this.mnu5Day.Shortcut = System.Windows.Forms.Shortcut.Ctrl5;
+            this.mnu5Day.Text = "&5-Day View";
+            this.mnu5Day.Click += new System.EventHandler(this.mnu5Day_Click);
+            // 
+            // mnu7Day
+            // 
+            this.mnu7Day.Index = 2;
+            this.mnu7Day.Shortcut = System.Windows.Forms.Shortcut.Ctrl7;
+            this.mnu7Day.Text = "&7-Day View";
+            this.mnu7Day.Click += new System.EventHandler(this.mnu7Day_Click);
+            // 
+            // menuItem7
+            // 
+            this.menuItem7.Index = 3;
+            this.menuItem7.Text = "-";
+            // 
+            // mnuTimeScale
+            // 
+            this.mnuTimeScale.Index = 4;
+            this.mnuTimeScale.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.mnu10Minute,
+            this.mnu15Minute,
+            this.mnu20Minute,
+            this.mnu30Minute});
+            this.mnuTimeScale.Text = "&Time Scale";
+            // 
+            // mnu10Minute
+            // 
+            this.mnu10Minute.Index = 0;
+            this.mnu10Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl0;
+            this.mnu10Minute.Text = "&10-Minute";
+            this.mnu10Minute.Click += new System.EventHandler(this.mnu10Minute_Click);
+            // 
+            // mnu15Minute
+            // 
+            this.mnu15Minute.Index = 1;
+            this.mnu15Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl4;
+            this.mnu15Minute.Text = "&15-Minute";
+            this.mnu15Minute.Click += new System.EventHandler(this.mnu15Minute_Click);
+            // 
+            // mnu20Minute
+            // 
+            this.mnu20Minute.Index = 2;
+            this.mnu20Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl3;
+            this.mnu20Minute.Text = "&20-Minute";
+            this.mnu20Minute.Click += new System.EventHandler(this.mnu20Minute_Click);
+            // 
+            // mnu30Minute
+            // 
+            this.mnu30Minute.Index = 3;
+            this.mnu30Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl2;
+            this.mnu30Minute.Text = "&30-Minute";
+            this.mnu30Minute.Click += new System.EventHandler(this.mnu30Minute_Click);
+            // 
+            // mnuViewRightPanel
+            // 
+            this.mnuViewRightPanel.Index = 5;
+            this.mnuViewRightPanel.Text = "&Access Block Clipboard";
+            this.mnuViewRightPanel.Click += new System.EventHandler(this.mnuViewRightPanel_Click);
+            // 
+            // mnuHelp
+            // 
+            this.mnuHelp.Index = 3;
+            this.mnuHelp.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.mnuHelpAbout});
+            this.mnuHelp.Text = "&Help";
+            // 
+            // mnuHelpAbout
+            // 
+            this.mnuHelpAbout.Index = 0;
+            this.mnuHelpAbout.Text = "&About";
+            this.mnuHelpAbout.Click += new System.EventHandler(this.mnuHelpAbout_Click);
+            // 
+            // splitter1
+            // 
+            this.splitter1.Dock = System.Windows.Forms.DockStyle.Right;
+            this.splitter1.Location = new System.Drawing.Point(720, 24);
+            this.splitter1.Name = "splitter1";
+            this.splitter1.Size = new System.Drawing.Size(8, 295);
+            this.splitter1.TabIndex = 6;
+            this.splitter1.TabStop = false;
+            // 
+            // saveAccessBlocksWorker
+            // 
+            this.saveAccessBlocksWorker.WorkerReportsProgress = true;
+            this.saveAccessBlocksWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.saveAccessBlocksWorker_DoWork);
+            this.saveAccessBlocksWorker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.saveAccessBlocksWorker_ProgressChanged);
+            this.saveAccessBlocksWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.saveAccessBlocksWorker_RunWorkerCompleted);
+            // 
+            // calendarGrid1
+            // 
+            this.calendarGrid1.AllowDrop = true;
+            this.calendarGrid1.Appointments = null;
+            this.calendarGrid1.ApptDragSource = null;
+            this.calendarGrid1.AutoScroll = true;
+            this.calendarGrid1.AutoScrollMinSize = new System.Drawing.Size(600, 1898);
+            this.calendarGrid1.AvailabilityArray = null;
+            this.calendarGrid1.BackColor = System.Drawing.SystemColors.Window;
+            this.calendarGrid1.Columns = 5;
+            this.calendarGrid1.ContextMenu = this.ctxCalendarGrid;
+            this.calendarGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.calendarGrid1.DrawWalkIns = true;
+            this.calendarGrid1.GridBackColor = "blue";
+            this.calendarGrid1.GridEnter = false;
+            this.calendarGrid1.Location = new System.Drawing.Point(0, 0);
+            this.calendarGrid1.Name = "calendarGrid1";
+            this.calendarGrid1.Resources = ((System.Collections.ArrayList)(resources.GetObject("calendarGrid1.Resources")));
+            this.calendarGrid1.SelectedAppointment = 0;
+            this.calendarGrid1.Size = new System.Drawing.Size(712, 295);
+            this.calendarGrid1.StartDate = new System.DateTime(2003, 1, 27, 0, 0, 0, 0);
+            this.calendarGrid1.TabIndex = 2;
+            this.calendarGrid1.TimeScale = 20;
+            this.calendarGrid1.CGAppointmentChanged += new IndianHealthService.ClinicalScheduling.CalendarGrid.CGAppointmentChangedHandler(this.calendarGrid1_CGAppointmentChanged);
+            this.calendarGrid1.CGAppointmentAdded += new IndianHealthService.ClinicalScheduling.CalendarGrid.CGAppointmentChangedHandler(this.calendarGrid1_CGAppointmentAdded);
+            this.calendarGrid1.CGSelectionChanged += new IndianHealthService.ClinicalScheduling.CalendarGrid.CGSelectionChangedHandler(this.calendarGrid1_CGSelectionChanged);
+            this.calendarGrid1.DoubleClick += new System.EventHandler(this.calendarGrid1_DoubleClick);
+            // 
+            // CGAVView
+            // 
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.ClientSize = new System.Drawing.Size(848, 343);
+            this.Controls.Add(this.panelCenter);
+            this.Controls.Add(this.splitter1);
+            this.Controls.Add(this.panelTop);
+            this.Controls.Add(this.panelBottom);
+            this.Controls.Add(this.panelRight);
+            this.Controls.Add(this.tvSchedules);
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.Menu = this.mainMenu1;
+            this.Name = "CGAVView";
+            this.Text = "CGAVView";
+            this.Closing += new System.ComponentModel.CancelEventHandler(this.CGAVView_Closing);
+            this.Load += new System.EventHandler(this.CGAVView_Load);
+            this.panelRight.ResumeLayout(false);
+            this.panelClip.ResumeLayout(false);
+            this.panelBottom.ResumeLayout(false);
+            this.panelTop.ResumeLayout(false);
+            this.panelCenter.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+		}
+		#endregion
+
+        private IContainer components;
+
+		#region Member Variables
+
+        private	CGAVDocument			m_Document;
+		private System.Windows.Forms.Panel panelRight;
+		private System.Windows.Forms.Panel panelBottom;
+		private System.Windows.Forms.Panel panelTop;
+		private System.Windows.Forms.Panel panelCenter;
+		private System.Windows.Forms.Label lblResource;
+		private System.Windows.Forms.TreeView tvSchedules;
+		private System.Windows.Forms.DateTimePicker dateTimePicker1;
+		private IndianHealthService.ClinicalScheduling.CalendarGrid calendarGrid1;
+		private System.Windows.Forms.StatusBar statusBar1;
+		private System.Windows.Forms.MainMenu mainMenu1;
+		private System.Windows.Forms.MenuItem mnuAvailability;
+		private System.Windows.Forms.MenuItem mnuAddNewAV;
+		private System.Windows.Forms.MenuItem mnuRemoveAV;
+		private System.Windows.Forms.MenuItem mnuEditAV;
+		private System.Windows.Forms.MenuItem menuItem1;
+		private System.Windows.Forms.MenuItem mnuSchedulingManagment;
+		private System.Windows.Forms.MenuItem menuItem5;
+		private System.Windows.Forms.MenuItem menuItem6;
+		private System.Windows.Forms.MenuItem mnuClose;
+		private System.Windows.Forms.MenuItem mnuHelp;
+		private System.Windows.Forms.MenuItem mnuHelpAbout;
+		private System.Windows.Forms.MenuItem mnuLoadTemplate;
+		private System.Windows.Forms.MenuItem mnuSaveTemplate;
+		private System.Windows.Forms.Panel panelClip;
+		private System.Windows.Forms.ListBox lstClip;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.MenuItem mnuCalendar;
+		private System.Windows.Forms.MenuItem mnuViewRightPanel;
+		private System.Windows.Forms.MenuItem mnuTimeScale;
+		private System.Windows.Forms.MenuItem mnu10Minute;
+		private System.Windows.Forms.MenuItem mnu15Minute;
+		private System.Windows.Forms.MenuItem mnu20Minute;
+		private System.Windows.Forms.MenuItem mnu30Minute;
+		private System.Windows.Forms.MenuItem menuItem7;
+		private System.Windows.Forms.MenuItem mnu1Day;
+		private System.Windows.Forms.MenuItem mnu5Day;
+		private System.Windows.Forms.MenuItem mnu7Day;
+		private System.Windows.Forms.Splitter splitter1;
+		private CGDocumentManager		m_DocManager;
+		private CGAppointments		m_ClipList;
+		private System.Windows.Forms.ContextMenu ctxApptClipMenu;
+		private System.Windows.Forms.MenuItem mnuRemoveClipItem;
+		private System.Windows.Forms.MenuItem mnuClearClipItems;
+		private System.Windows.Forms.ContextMenu ctxCalendarGrid;
+		private System.Windows.Forms.MenuItem ctxCalGridAdd;
+		private System.Windows.Forms.MenuItem ctxCalGridEdit;
+		private System.Windows.Forms.MenuItem ctxCalGridDelete;
+        private BackgroundWorker saveAccessBlocksWorker;
+        private MenuItem mnuDeleteAllSlots;
+		private bool				m_bDragDropStart = false;
+
+		#endregion
+
+		#region Properties
+
+		/// <summary>
+		/// Access the CalendarGrid associated with this view
+		/// </summary>
+		public CalendarGrid CGrid
+		{
+			get
+			{
+				return this.calendarGrid1;
+			}
+		}
+		/// <summary>
+		/// Accesses the document associated with this view
+		/// </summary>
+		public CGAVDocument Document
+		{
+			get
+			{
+				return this.m_Document;
+			}
+			set
+			{
+				this.m_Document = value;
+			}
+		}
+
+		public CGDocumentManager DocManager
+		{
+			get
+			{
+				return m_DocManager;
+			}
+			set
+			{
+				m_DocManager = value;
+			}
+
+		}
+
+		public CGAppointments AVBlocks
+		{
+			get
+			{
+				return this.calendarGrid1.Appointments;
+			}
+			set
+			{
+				this.calendarGrid1.Appointments = value;
+			}
+		}
+
+		public DateTime StartDate
+		{
+			get
+			{
+				return this.calendarGrid1.StartDate;
+			}
+			set
+			{
+				this.calendarGrid1.StartDate = value;
+			}
+		}	
+		
+		#endregion //Properties
+
+		#region Methods
+
+		private void RaiseRPMSEvent(string sEvent, string sParams)
+		{
+			try
+			{
+				//Signal RPMS to raise an event
+//				string sSql;
+//				sSql = "BSDX RAISE EVENT^" + sEvent + "^" + sParams + "^^";
+//				DataTable dtAppt =m_DocManager.RPMSDataTable(sSql, "RaiseEvent");
+				this.m_DocManager.ConnectInfo.RaiseEvent(sEvent, sParams, true);
+			}
+			catch (Exception ex)
+			{
+				Debug.Write(ex.Message);
+			}
+		}
+
+		void UpdateStatusBar(DateTime dStart, DateTime dEnd)
+		{
+			string sMsg =  dStart.ToShortTimeString() + " to " + dEnd.ToShortTimeString();
+			this.statusBar1.Text = sMsg;
+		}
+
+		private void AvailabilityEdit()
+		{
+			try
+			{
+				int nApptID = this.calendarGrid1.SelectedAppointment;
+				if (nApptID != 0)
+				{
+
+					CGAppointment pAppt = this.Document.AVBlocks.GetAppointment(nApptID);
+					DAccessBlock dA = new DAccessBlock();
+					dA.InitializePage(pAppt, m_DocManager.GlobalDataSet);
+					calendarGrid1.CGToolTip.Active = false;
+					if (dA.ShowDialog(this) == DialogResult.Cancel)
+					{
+						calendarGrid1.CGToolTip.Active = true;
+						return;
+					}
+					calendarGrid1.CGToolTip.Active = true;
+					this.Document.DeleteAvailability(nApptID);
+					this.Document.CreateAppointment(dA.Appointment);
+					this.calendarGrid1.Invalidate();
+					this.m_DocManager.UpdateViews((string) this.m_Document.Resources[0], "");
+				}
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show("Unable to add new access block  " +  ex.Message, "Clinical Scheduling");
+				return;
+			}
+			try
+			{
+				RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+				this.calendarGrid1.Invalidate();
+			}
+			catch (Exception ex)
+			{
+				Debug.Write(ex.Message);
+			}
+		}
+
+		private void AvailabilityAddNew()
+		{
+			try
+			{
+				CGAppointment appt = new CGAppointment();
+			
+				//Get Time and Resource from Selected Cell
+				DateTime dStart = DateTime.Today;
+				DateTime dEnd = DateTime.Today;
+				string sResource = "";
+				bool bRet = this.calendarGrid1.GetSelectedTime(out dStart, out dEnd, out sResource);
+				if (bRet == false)
+					return;
+
+				foreach (CGAppointment a in this.Document.m_AVBlocks.AppointmentTable.Values)
+				{
+					DateTime sStart2 = a.StartTime;
+					DateTime sEnd2 = a.EndTime;
+					if (CalendarGrid.TimesOverlap(dStart, dEnd, a.StartTime, a.EndTime))
+					{
+						MessageBox.Show("Access blocks may not overlap.","Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+						return;
+					}
+				}
+			
+				string sNote = "";
+				DAccessBlock dA = new DAccessBlock();
+				dA.InitializePage(dStart, dEnd, sResource, sNote, this.m_DocManager.GlobalDataSet);
+				if (dA.ShowDialog(this) == DialogResult.Cancel)
+				{
+					return;
+				}
+				appt.StartTime = dStart;
+				appt.EndTime = dEnd;
+				appt.Resource = sResource;
+				appt.Note = " " + dA.Note; // + ": " + dA.Slots.ToString()+ " Slots";
+				appt.AccessTypeID = dA.AccessTypeID;
+				appt.Slots = dA.Slots;
+
+				//Call Document to add a new appointment
+				this.Document.CreateAppointment(appt);
+				this.m_DocManager.UpdateViews((string) this.m_Document.Resources[0], "");
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show("Unable to add new access block  " +  ex.Message, "Clinical Scheduling");
+				return;
+			}
+			try
+			{
+				RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+				this.calendarGrid1.Invalidate();
+			}
+			catch (Exception ex)
+			{
+				Debug.Write(ex.Message);
+			}
+		}//End AvailabilityAddNew
+
+
+        /// <summary>
+        /// Delete All slots from certain dates in one swoop. DAL does actualy deletion.
+        /// </summary>
+        private void MassSlotDelete()
+        {
+            // Ask users for from and to dates
+            DMassSlotDelete dMassSlotDelete = new DMassSlotDelete();
+            DialogResult res = dMassSlotDelete.ShowDialog();
+
+            // peel off if user cancelled.
+            if (res != DialogResult.OK) return;
+
+            // Get this ResourceID from here, and the start and end dates from the dialog.
+            string sResourceID = this.m_Document.ResourceID.ToString();
+            DateTime dStartDate = dMassSlotDelete.StartDate;
+            DateTime dEndDate = dMassSlotDelete.EndDate;
+
+            // Deletes Slots through DAL.
+            DataTable result = this.m_DocManager.DAL.MassSlotDelete(sResourceID, dStartDate, dEndDate);
+            
+            // One row (and only one) expected:
+            Debug.Assert(result.Rows.Count == 1);
+
+            // -1 Expected in first row, otherwise, there is an error
+            if (result.Rows[0][0].ToString() != "-1")
+                throw new ApplicationException(
+                    @"VISTA couldn't delete the slots. Contact tech support.\r\n
+                     Error Message from VISTA: " + result.Rows[0][1].ToString());
+
+            // Update Access Blocks views
+            this.Document.RefreshDaysSchedule(); // Retrieve the slots from the server
+            this.Document.UpdateAllViews(); // Recalibrate the calendar grid with the new cells
+            this.calendarGrid1.Invalidate(); // Redraw it.
+
+            // Tell other clients that slots have changed.
+            RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+        }
+
+		private void AppointmentDelete() 
+		{
+			calendarGrid1.CGToolTip.Active = false;
+			string sMsg = " this access block?";
+			if (calendarGrid1.SelectedAppointments.AppointmentTable.Count > 1)
+				sMsg = " these access blocks?";
+
+			calendarGrid1.CGToolTip.Active = true;
+
+			bool bDeleted = false;
+			foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
+			{
+				int nApptID = a.AppointmentKey;
+				Debug.Assert(nApptID != 0);
+				try
+				{
+					Document.DeleteAvailability(nApptID);
+					bDeleted = true;
+				}
+				catch (Exception ex)
+				{
+					MessageBox.Show("Unable to delete access block" +  ex.Message, "Clinical Scheduling");
+				}
+			}
+			if (bDeleted == true)
+			{
+				try
+				{
+					this.m_DocManager.UpdateViews((string) this.m_Document.Resources[0], "");
+					RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+				}
+				catch (Exception ex)
+				{
+					Debug.Write(ex.Message);
+				}
+				this.calendarGrid1.Invalidate();
+			}		
+		}
+
+		private void AccessTypeManage()
+		{
+//			DAccessType dAT = new DAccessType();
+//			dAT.InitializePage(0, this.m_DocManager.GlobalDataSet, this.m_DocManager.ADOConnection);
+//			if (dAT.ShowDialog(this) == DialogResult.Cancel)
+//			{
+//				return;
+//			}
+		}
+
+		private void SchedulingManagement()
+		{
+			try
+			{
+				bool bLock = DocManager.ConnectInfo.bmxNetLib.Lock("^BSDXMGR", "+");
+				if (bLock == false)
+				{
+					throw new Exception("Another user is currently in Scheduling Management.  Try later.");
+				}
+
+				DManagement dMgm = new DManagement();
+				dMgm.InitializeDialog(this.m_DocManager);
+			
+				if (dMgm.ShowDialog(this) == DialogResult.Cancel)
+				{
+					return;
+				}
+				bLock = DocManager.ConnectInfo.bmxNetLib.Lock("^BSDXMGR", "-");
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show("Scheduling Management Error:  " +  ex.Message, "Clinical Scheduling");
+			}
+		}
+
+		public void UpdateArrays()
+		{
+			//TODO:  Create these components
+			this.calendarGrid1.Resources = this.m_Document.Resources;
+            this.calendarGrid1.Appointments = (CGAppointments)this.m_Document.m_AVBlocks.Clone();
+			this.calendarGrid1.OnUpdateArrays();
+			this.lblResource.Text = this.m_Document.DocName;
+			
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+		#endregion //Methods
+
+		#region Events
+
+		private void dateTimePicker1_ValueChanged(object sender, System.EventArgs e)
+		{
+			DateTime dDate = dateTimePicker1.Value;
+			dDate = dDate.Date;
+			this.Document.SelectedDate = dDate;
+			if (this.calendarGrid1.Columns > 1)
+			{
+				this.StartDate = this.Document.StartDate;
+			}
+			else
+			{
+				this.StartDate = this.Document.SelectedDate;
+			}
+			this.Document.UpdateAllViews();
+			this.calendarGrid1.Invalidate();
+		}
+
+		private void CGAVView_Load(object sender, System.EventArgs e)
+		{
+			Debug.Assert (this.Document != null);
+
+			//Register the view
+			CGDocumentManager.Current.RegisterAVDocumentView(this.Document, this);
+            this.mnu5Day.Click += new System.EventHandler(this.dateTimePicker1_ValueChanged); // MJL 1/17/2007
+            this.mnu7Day.Click += new System.EventHandler(this.dateTimePicker1_ValueChanged);
+
+            //Set start date
+            DateTime startDate,endDate;
+            Document.WeekNeedsRefresh(1, DateTime.Today, out startDate, out endDate);
+            this.StartDate = startDate;
+            //Draw the calendar
+            this.calendarGrid1.OnUpdateArrays();
+            this.calendarGrid1.Invalidate();
+
+		}
+
+		private void CGAVView_Closing(object sender, System.ComponentModel.CancelEventArgs e)
+		{
+			this.calendarGrid1.CloseGrid();
+			DocManager.ConnectInfo.bmxNetLib.Lock("^BSDXRES(" + Document.ResourceID.ToString() + ")", "-");
+		}
+
+		private void calendarGrid1_CGSelectionChanged(object sender, IndianHealthService.ClinicalScheduling.CGSelectionChangedArgs e)
+		{
+			UpdateStatusBar(e.StartTime, e.EndTime);
+		}
+
+		private void calendarGrid1_CGAppointmentChanged(object sender, IndianHealthService.ClinicalScheduling.CGAppointmentChangedArgs e)
+		{
+			try
+			{
+//				this.DocManager.EnableAutoRefresh(false);
+
+				m_Document.ChangeAppointmentTime(e.Appointment, e.StartTime, e.EndTime, e.Resource);
+				this.m_DocManager.UpdateViews((string) this.m_Document.Resources[0], "");
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show("Unable to change access block  " +  ex.Message, "Clinical Scheduling");
+				this.m_DocManager.UpdateViews();
+				return;
+			}
+			finally
+			{
+//				this.DocManager.EnableAutoRefresh(true);
+			}
+			try
+			{
+				RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+				this.calendarGrid1.Invalidate();
+			}
+			catch (Exception ex)
+			{
+				Debug.Write(ex.Message);
+			}
+		}
+
+		private void mnuAddNewAV_Click(object sender, System.EventArgs e)
+		{
+			AvailabilityAddNew();
+		}
+
+		private void mnuRemoveAV_Click(object sender, System.EventArgs e)
+		{
+			this.AppointmentDelete();
+		}
+
+		private void mnuManageAT_Click(object sender, System.EventArgs e)
+		{
+			AccessTypeManage();
+		}
+
+		private void mnuEditAV_Click(object sender, System.EventArgs e)
+		{
+			AvailabilityEdit();
+		}
+
+		private void mnuAvailability_Popup(object sender, System.EventArgs e)
+		{
+			this.mnuAddNewAV.Enabled = (this.calendarGrid1.SelectedRange.Cells.CellCount > 0);	
+			this.mnuEditAV.Enabled = (this.calendarGrid1.SelectedAppointment > 0);
+			this.mnuRemoveAV.Enabled = (this.calendarGrid1.SelectedAppointment > 0);
+		}
+
+		private void mnuSchedulingManagment_Click(object sender, System.EventArgs e)
+		{
+			SchedulingManagement();
+		}
+
+		#endregion //Events
+
+		private void mnuClose_Click(object sender, System.EventArgs e)
+		{
+			DialogResult dr = MessageBox.Show("Are you sure you want to close this schedule?", Application.ProductName, MessageBoxButtons.OKCancel);
+			if (dr != DialogResult.OK)
+				return;
+
+			this.Close();
+		}
+
+		private void mnuHelpAbout_Click(object sender, System.EventArgs e)
+		{
+			MessageBox.Show("Clinical Scheduling Version " + Application.ProductVersion, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Information);	
+		}
+
+		private void ImplementMsg()
+		{
+			MessageBox.Show("Clinical Scheduling", "TODO: Implement this function");
+		}
+
+		private void mnuLoadTemplate_Click(object sender, System.EventArgs e)
+		{
+			/*
+			 * Display dialog to collect:
+			 * - Number of weeks to apply template
+			 * - Starting week (application starts on Culture WeekStartDay of selected week)
+			 * - Template path & filename
+			 * 
+			 * 
+			 */
+			DAccessTemplate dlg = new DAccessTemplate();
+			dlg.InitializePage();
+			if (dlg.ShowDialog(this) == DialogResult.Cancel)
+			{
+				return;
+			}
+
+			try
+			{
+                this.saveAccessBlocksWorker.RunWorkerAsync(dlg);
+                /*
+                 * Moved to RunWorkerAsync. Leave until I think I am safe removing it.
+                 * 
+                */ 
+                
+                //OpenFileDialog openFileDialog1 = dlg.FileDialog;
+                //openFileDialog1.RestoreDirectory = false; // go back to our dir
+                //Stream streamFile;
+                //if((streamFile = openFileDialog1.OpenFile())== null)
+                //{
+                //    MessageBox.Show("Unable to open template file.");
+                //    return;
+                //}
+
+                //BinaryFormatter formatter = new BinaryFormatter();
+                //CGAppointments cgaTemp = (CGAppointments) formatter.Deserialize(streamFile);
+                //streamFile.Close();
+
+                //DateTime dtStart = dlg.StartDate;
+                //DateTime newStartDate, newEndDate;
+                //this.Document.WeekNeedsRefresh(1,dtStart, out newStartDate, out newEndDate);
+                //dtStart = newStartDate;
+                //int nWeeksToApply = dlg.WeeksToApply;
+                //DateTime dtEnd = dtStart.AddDays(6); // or 7?
+
+                //string sResourceID = this.m_Document.ResourceID.ToString();
+                //DataTable dt;
+
+                //for (int j=1; j < nWeeksToApply + 1; j++)
+                //{
+                //    //Convert start and end to string
+                //    //string sStart = dtStart.ToString("M/d/yyyy");
+                //    //string sEnd = dtEnd.ToString("M/d/yyyy");
+                //    //i18n
+                //    string sStart = FMDateTime.Create(dtStart).DateOnly.FMDateString;
+                //    string sEnd = FMDateTime.Create(dtEnd).DateOnly.FMDateString;
+                //    //Cancel all existing access blocks in the date range
+                //    string sSql = "BSDX CANCEL AV BY DATE^" + sResourceID + "^" + sStart + "^" + sEnd;
+                //    dt = this.m_DocManager.RPMSDataTable(sSql, "Cancelled");
+
+                //    //for each CGAppointment in AVBlocks, call AddNew
+                //    string sResource = "";
+                //    sResource = (string) this.Document.Resources[0];
+                //    foreach (CGAppointment a in cgaTemp.AppointmentTable.Values)
+                //    {
+                //        //Change the resource to the current one
+                //        a.Resource = sResource;
+
+                //        //Change the date to correspond to the GridColumn member
+                //        int col = a.GridColumn;
+                //        col--;
+                //        DateTime dBuildDate = dtStart.Date;
+                //        dBuildDate = dBuildDate.AddDays(col);
+                //        dBuildDate = dBuildDate.AddHours(a.StartTime.Hour);
+                //        dBuildDate = dBuildDate.AddMinutes(a.StartTime.Minute);
+                //        a.StartTime = dBuildDate;
+                //        dBuildDate = dtStart.Date;
+                //        dBuildDate = dBuildDate.AddDays(col);
+                //        dBuildDate = dBuildDate.AddHours(a.EndTime.Hour);
+                //        dBuildDate = dBuildDate.AddMinutes(a.EndTime.Minute);
+                //        a.EndTime = dBuildDate;
+
+                //        //Call Document to add a new appointment
+                //        this.Document.CreateAppointmentAuto(a);
+                //    }
+
+                //    //Increment start and end
+                //    dtStart = dtStart.AddDays(7);
+                //    dtEnd = dtStart.AddDays(6);
+
+				// }//end for
+				try
+				{
+					RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+				}
+				catch (Exception ex)
+				{
+					Debug.Write(ex.Message);
+				}
+				this.calendarGrid1.Invalidate();
+				this.m_DocManager.UpdateViews((string) this.m_Document.Resources[0], "");
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show(this, "Error loading template:  " + ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+			}
+		}
+
+				//Check that there are no blocks in document
+//				if (this.Document.AVBlocks.AppointmentTable.Count > 0)
+//				{
+//					Exception bmxex = new Exception("You may not load a template if there are already access blocks defined for the week.");
+//					throw bmxex;
+//				}
+//				OpenFileDialog openFileDialog1 = new OpenFileDialog();
+//				string sPath = "";
+//				sPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
+//
+//				openFileDialog1.InitialDirectory = "c:\\" ;
+//				openFileDialog1.InitialDirectory = sPath ;
+//				openFileDialog1.Filter = "Schedule Template Files (*.bsdxa)|*.bsdxa|All files (*.*)|*.*" ;
+//				openFileDialog1.FilterIndex = 0 ;
+//				openFileDialog1.RestoreDirectory = true ;
+
+//				Stream streamFile;
+//				if(openFileDialog1.ShowDialog() == DialogResult.OK)
+//				{
+//					if((streamFile = openFileDialog1.OpenFile())!= null)
+//					{
+//						BinaryFormatter formatter = new BinaryFormatter();
+//						CGAppointments cgaTemp = (CGAppointments) formatter.Deserialize(streamFile);
+//						streamFile.Close();
+//
+//						//for each CGAppointment in AVBlocks, call AddNew
+//						string sResource = "";
+//						sResource = (string) this.Document.Resources[0];
+//						foreach (CGAppointment a in cgaTemp.AppointmentTable.Values)
+//						{
+//							//Change the resource to the current one
+//							a.Resource = sResource;
+//
+//							//Change the date to correspond to the GridColumn member
+//							int col = a.GridColumn;
+//							Rectangle r = new Rectangle(0,0,0,0);
+//							int row = 5;
+//							CGCell c = new CGCell(r, row, col);
+//							DateTime dTemp = this.calendarGrid1.GetTimeFromCell(c);
+//							DateTime dBuildDate = dTemp.Date;
+//							dBuildDate = dBuildDate.AddHours(a.StartTime.Hour);
+//							dBuildDate = dBuildDate.AddMinutes(a.StartTime.Minute);
+//							a.StartTime = dBuildDate;
+//							dBuildDate = dTemp.Date;
+//							dBuildDate = dBuildDate.AddHours(a.EndTime.Hour);
+//							dBuildDate = dBuildDate.AddMinutes(a.EndTime.Minute);
+//							a.EndTime = dBuildDate;
+//
+//							//Call Document to add a new appointment
+//							this.Document.CreateAppointment(a);
+//						}
+//						try
+//						{
+//							RaiseRPMSEvent("SCHEDULE-" + m_Document.DocName, "");
+//						}
+//						catch (Exception ex)
+//						{
+//							Debug.Write(ex.Message);
+//						}
+//						this.calendarGrid1.Invalidate();
+//						this.m_DocManager.UpdateViews((string) this.m_Document.Resources[0], "");
+//					}
+//				}
+//			}//end try
+//			catch (Exception ex)
+//			{
+//				MessageBox.Show(this, "Error loading template:  " + ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+//			}
+//		}
+
+		private void mnuSaveTemplate_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				//Check that there is at least one block in document
+//				if (this.Document.AVBlocks.AppointmentTable.Count == 0)
+//				{
+//					Exception bmxex = new Exception("You may not save a template if there are no access blocks defined for the week.");
+//					throw bmxex;
+//				}
+
+				Stream streamFile ;
+				SaveFileDialog saveFileDialog1 = new SaveFileDialog();
+ 
+				saveFileDialog1.Filter = "Schedule Template Files (*.bsdxa)|*.bsdxa|All files (*.*)|*.*" ;
+				saveFileDialog1.FilterIndex = 0 ;
+				saveFileDialog1.RestoreDirectory = true ;
+				saveFileDialog1.AddExtension = true;
+				saveFileDialog1.DefaultExt = "bsdxa";
+ 
+				//Iterate through AVBlocks and set the GridColumn member based on the date
+				foreach (CGAppointment a in this.Document.AVBlocks.AppointmentTable.Values)
+				{
+					//Get the column by subtracting the grid's Start day from dStart.		
+					int col =(int) a.StartTime.DayOfWeek - (int) this.calendarGrid1.StartDate.DayOfWeek + 1;
+					a.GridColumn = col;
+				}
+
+				if(saveFileDialog1.ShowDialog() == DialogResult.OK)
+				{
+					if((streamFile = saveFileDialog1.OpenFile()) != null)
+					{
+						BinaryFormatter formatter = new BinaryFormatter();
+
+						formatter.Serialize(streamFile, this.Document.AVBlocks);
+
+						streamFile.Close();
+					}
+				}
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show(this, "Error saving template:  " + ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+			}
+		}
+
+		private void mnuViewRightPanel_Click(object sender, System.EventArgs e)
+		{
+			this.mnuViewRightPanel.Checked = this.panelRight.Visible;
+			this.panelRight.Visible = !(this.panelRight.Visible);
+			this.mnuViewRightPanel.Checked = !(this.mnuViewRightPanel.Checked);
+		}
+
+		private void lstClip_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
+		{
+			try
+			{
+				CGAppointment a = (CGAppointment) e.Data.GetData(typeof(CGAppointment));
+				if (m_ClipList.AppointmentTable.Contains((int) a.AppointmentKey))
+				{
+					return;
+				}
+				m_ClipList.AddAppointment(a);
+				lstClip.Items.Add(a);
+			}
+			catch(Exception ex)
+			{
+				Debug.Write(ex.Message);
+			}		
+		}
+
+		private void lstClip_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
+		{
+			bool b = e.Data.GetDataPresent(typeof(CGAppointment));
+			if (b == true)
+			{
+				e.Effect = DragDropEffects.Move;
+			}
+			else
+			{
+				e.Effect = DragDropEffects.None;
+			}
+		}
+
+		private void lstClip_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
+		{
+			m_bDragDropStart = false;
+		}
+
+		private void lstClip_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
+		{
+			try
+			{
+				if ((m_bDragDropStart == false)&&(lstClip.SelectedIndex > -1))
+				{
+					CGAppointment a = (CGAppointment) lstClip.Items[lstClip.SelectedIndex];
+					this.calendarGrid1.ApptDragSource = "list";
+					DragDropEffects effect = DoDragDrop(a, DragDropEffects.Move);
+					m_bDragDropStart = true;
+				}
+			}
+			catch (Exception ex)
+			{
+				Debug.Write(ex.Message);
+			}
+		}
+
+		private void calendarGrid1_CGAppointmentAdded(object sender, IndianHealthService.ClinicalScheduling.CGAppointmentChangedArgs e)
+		{
+			//CalendarGrid Event raised when appointment is dragdropped onto the grid
+
+			try
+			{
+				CGAppointment aCopy = new CGAppointment();
+				aCopy.CreateAppointment(e.StartTime, e.EndTime, e.Appointment.Note, 0, e.Resource);
+				aCopy.AccessTypeID = e.AccessTypeID;
+				aCopy.Slots = e.Slots;
+
+				m_Document.CreateAppointment(aCopy);
+				//			RaiseRPMSEvent("SCHEDULE-" + e.Resource , "");
+				this.m_DocManager.UpdateViews(e.Resource, e.OldResource);
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show("Unable to add new access block  " +  ex.Message, "Clinical Scheduling");
+				return;
+			}
+			try
+			{
+				RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+				if (e.Resource != e.OldResource)
+					RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+				this.calendarGrid1.Invalidate();
+			}
+			catch (Exception ex)
+			{
+				Debug.Write(ex.Message);
+			}
+		}
+
+		#region ctxApptClipMenu Handlers
+
+		private void ctxApptClipMenu_Popup(object sender, System.EventArgs e)
+		{
+			mnuClearClipItems.Enabled = (m_ClipList.AppointmentTable.Count > 0);
+			mnuRemoveClipItem.Enabled = (lstClip.SelectedIndex > -1);
+		}
+
+		private void mnuRemoveClipItem_Click(object sender, System.EventArgs e)
+		{
+			int i = lstClip.SelectedIndex;
+			CGAppointment a = (CGAppointment) lstClip.SelectedItem;
+			int nKey = a.AppointmentKey;
+			if (i > -1)
+			{
+				m_ClipList.RemoveAppointment(nKey);
+				lstClip.Items.RemoveAt(i);
+			}
+		}
+
+		private void mnuClearClipItems_Click(object sender, System.EventArgs e)
+		{
+			this.m_ClipList.ClearAllAppointments();
+			lstClip.Items.Clear();
+		}
+
+		#endregion ctxApptClipMenu Handlers
+
+		#region ctxCalGridMenu Handlers
+
+		private void ctxCalGridAdd_Click(object sender, System.EventArgs e)
+		{
+			AvailabilityAddNew();
+		}
+
+		private void ctxCalGridEdit_Click(object sender, System.EventArgs e)
+		{
+			AvailabilityEdit();
+		}
+
+		private void ctxCalGridDelete_Click(object sender, System.EventArgs e)
+		{
+			AppointmentDelete();
+		}
+
+		private void ctxCalendarGrid_Popup(object sender, System.EventArgs e)
+		{
+			//Toggle availability of make, edit and delete appointments
+			//based on whether appropriate element is selected.
+			ctxCalGridAdd.Enabled = ((calendarGrid1.SelectedRange.Cells.CellCount > 0) );	
+			ctxCalGridDelete.Enabled = (calendarGrid1.SelectedAppointment > 0);
+			ctxCalGridEdit.Enabled = (calendarGrid1.SelectedAppointment > 0);
+		}
+
+		private void calendarGrid1_DoubleClick(object sender, System.EventArgs e)
+		{
+			if (calendarGrid1.SelectedAppointment > 0)
+				AvailabilityEdit();
+		}
+
+		#endregion ctxCalGridMenu Handlers
+
+		private void mnu10Minute_Click(object sender, System.EventArgs e)
+		{
+			CalendarGrid cg = this.calendarGrid1;
+			cg.TimeScale = 10;
+			PositionGrid(cg, 7);		
+		}
+
+		private void mnu15Minute_Click(object sender, System.EventArgs e)
+		{
+			CalendarGrid cg = this.calendarGrid1;
+			cg.TimeScale = 15;
+			PositionGrid(cg, 7);		
+		}
+
+		private void mnu20Minute_Click(object sender, System.EventArgs e)
+		{
+			CalendarGrid cg = this.calendarGrid1;
+			cg.TimeScale = 20;
+			PositionGrid(cg, 7);		
+		}
+
+		private void mnu30Minute_Click(object sender, System.EventArgs e)
+		{
+			CalendarGrid cg = this.calendarGrid1;
+			cg.TimeScale = 30;
+			PositionGrid(cg, 7);		
+		}
+
+		private void mnu1Day_Click(object sender, System.EventArgs e)
+		{
+			DateTime dtPicker = dateTimePicker1.Value;
+			DateTime DayOnly = new DateTime(dtPicker.Year, dtPicker.Month, dtPicker.Day);
+			this.calendarGrid1.StartDate = DayOnly;
+			this.calendarGrid1.Columns = 1;
+		}
+
+		private void mnu5Day_Click(object sender, System.EventArgs e)
+		{
+			this.calendarGrid1.Columns = 5;
+            this.Document.m_nColumnCount = 5; //TODO: redundant but now needed
+		}
+
+		private void mnu7Day_Click(object sender, System.EventArgs e)
+		{
+			this.calendarGrid1.Columns = 7;
+            this.Document.m_nColumnCount = 7; //TODO: redundant but now needed
+		}
+
+		private void PositionGrid(CalendarGrid cg, int nHour)
+		{
+			//Position grid to nHour
+			int nRow = 0, nCol = 0;
+			DateTime dStart = DateTime.Today;
+			dStart = dStart.AddHours(nHour);
+			cg.GetCellFromTime(dStart, ref nRow, ref nCol, false, "");
+			int nHeight = cg.CellHeight;
+			nHeight *= nRow;
+			cg.AutoScrollPosition = new Point(50, nHeight);
+			cg.Invalidate();
+		}
+
+
+
+        private void saveAccessBlocksWorker_DoWork(object sender, DoWorkEventArgs e)
+        {
+            BackgroundWorker worker = (BackgroundWorker)sender;
+            DAccessTemplate dlg = (DAccessTemplate)e.Argument;
+
+            OpenFileDialog openFileDialog1 = dlg.FileDialog;
+            openFileDialog1.RestoreDirectory = false; // go back to our dir
+            Stream streamFile;
+            if ((streamFile = openFileDialog1.OpenFile()) == null)
+            {
+                MessageBox.Show("Unable to open template file.");
+                return;
+            }
+
+            BinaryFormatter formatter = new BinaryFormatter();
+            CGAppointments cgaTemp = (CGAppointments)formatter.Deserialize(streamFile);
+            streamFile.Close();
+
+            DateTime dtStart = dlg.StartDate;
+            DateTime newStartDate, newEndDate;
+            this.Document.WeekNeedsRefresh(1, dtStart, out newStartDate, out newEndDate);
+            dtStart = newStartDate;
+            int nWeeksToApply = dlg.WeeksToApply;
+            DateTime dtEnd = dtStart.AddDays(6); // or 7? smh:: not 7 for sure.
+
+            string sResourceID = this.m_Document.ResourceID.ToString();
+
+            for (int j = 1; j < nWeeksToApply + 1; j++)
+            {
+                float fProgressPercentage = ((float)(j-1) / (float)nWeeksToApply) * 100;
+                int iProgressPercentage = (int)fProgressPercentage;
+                worker.ReportProgress(iProgressPercentage);
+                string sResource = (string)this.Document.Resources[0];
+                foreach (CGAppointment a in cgaTemp.AppointmentTable.Values)
+                {
+                    //Change the resource to the current one
+                    a.Resource = sResource;
+
+                    //Change the date to correspond to the GridColumn member
+                    int col = a.GridColumn;
+                    col--;
+                    DateTime dBuildDate = dtStart.Date;
+                    dBuildDate = dBuildDate.AddDays(col);
+                    dBuildDate = dBuildDate.AddHours(a.StartTime.Hour);
+                    dBuildDate = dBuildDate.AddMinutes(a.StartTime.Minute);
+                    a.StartTime = dBuildDate;
+                    dBuildDate = dtStart.Date;
+                    dBuildDate = dBuildDate.AddDays(col);
+                    dBuildDate = dBuildDate.AddHours(a.EndTime.Hour);
+                    dBuildDate = dBuildDate.AddMinutes(a.EndTime.Minute);
+                    a.EndTime = dBuildDate;
+
+                    //Call Document to add a new appointment
+                    this.Document.CreateAppointmentAuto(a);
+                }
+
+                //Increment start and end
+                dtStart = dtStart.AddDays(7);
+                dtEnd = dtStart.AddDays(6);
+
+            }
+
+        }
+
+        private void saveAccessBlocksWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
+        {
+            // Update Access Blocks views
+            this.Document.RefreshDaysSchedule(); // Retrieve the slots from the server
+            this.Document.UpdateAllViews(); // Recalibrate the calendar grid with the new cells
+            this.calendarGrid1.Invalidate(); // Redraw it.
+
+            // Tell other clients that slots have changed.
+            RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+
+            this.statusBar1.Text = "Done saving access blocks.";
+        }
+
+        private void saveAccessBlocksWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
+        {
+            this.statusBar1.Text = "Saving Data to VISTA. Progress: " + e.ProgressPercentage + " %";
+        }
+
+        private void mnuDeleteAllSlots_Click(object sender, EventArgs e)
+        {
+            MassSlotDelete();
+        }
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAVView.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAVView.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAVView.resx	(revision 1134)
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="ctxApptClipMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="ctxCalendarGrid.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>151, 17</value>
+  </metadata>
+  <data name="calendarGrid1.Resources" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRl
+        bXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAAAAAAAAAAAQAgAAAAAAAAAL
+</value>
+  </data>
+  <metadata name="mainMenu1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>281, 17</value>
+  </metadata>
+  <metadata name="saveAccessBlocksWorker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>398, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAIAC
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIh3iI
+        iId4iAAAAAAAAAAACId4iIiHeIAiIiIggAAAAAAAAAAAAAgCqqqqoggAAAAAAAAAAACAKqqqqiAIAAiH
+        eId4iIiIAqqqqqIAAIAIh3iHeIiIgCqqqqogAACAAAAAAAAACAKqqqqiAAAAgAAAAAAAAIAqqqqqIAAA
+        AIAAAAAAAAgCqqqqogAAAAgAAAAAAAAAIiIiIiAAAACAAAAA////8AAAAAAAAAAIAAAAAP////8Aqqqq
+        IAAAgAAAAAD/iIj/gCqqqqIACAAAAAAA/4iI/4gCqqqqIIAAAAAAAP//////8AAAAAgAAAAAAAD/////
+        //+IiIiPAAAAAAAA/4iI/4iI/4iI/wAAAAAAAP+IiP+IiP+IiP8AAAAAAAD/////////////AAAAAAAA
+        /////////////wAAAAAAAP+IiP+IiP+IiP8AAAAAAAD/iIj/iIj/iIj/AAAAAAAA/////////////wAA
+        AAAAAP////////////8AAAAAAERERERERERERERERAAAAABEREREREREREREREQAAAAARERERERERERE
+        REREAAAAAERERERERERERERERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////
+        ///4AAAP+AAAB///gAP//wADgAAAAYAAAAH/+AAB//AAAcAAAAPAAAAHwAAAD8AAAB/AAAA/wAAAP8AA
+        AD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////////
+        //8oAAAAEAAAACAAAAABAAQAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+        AACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAHh4iHgA
+        CAAAAAAAACIiAAh4eIgCqqIIAAAAACqqIAAAAAACqqIAAAAP/wAAAAAAAA+IgKqiAAAAD//4AADwAAAP
+        iPiPiPAAAA//////8AAAD4j4j4jwAAAP//////AAAERERERERAAAREREREREAAAAAAAAAAAA//8AAMAD
+        AAD/gQAAgAAAAP4AAADAAQAAwAMAAMADAADAAwAAwAMAAMADAADAAwAAwAMAAMADAADAAwAA//8AAA==
+</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAppointment.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAppointment.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAppointment.cs	(revision 1134)
@@ -0,0 +1,310 @@
+﻿namespace IndianHealthService.ClinicalScheduling
+{
+    using System;
+    using System.Drawing;
+    /// <summary>
+    /// Data Structuer to Represent an Appointment
+    /// 
+    /// </summary>
+    [Serializable]
+    public class CGAppointment
+    {
+        private bool m_bAccessBlock;
+        private bool m_bNoShow;
+        private bool m_bSelected = false;
+        private bool m_bWalkIn;
+        public DateTime m_dAuxTime;
+        public DateTime m_dCheckIn;
+        private DateTime m_EndTime;
+        public int m_nAccessTypeID = -1;
+        private int m_nColumn;
+        public int m_nKey;
+        private string m_Note;
+        public int m_nPatientID;
+        public int m_nSlots;
+        private Rectangle m_rectangle;
+        public string m_sAccessTypeName;
+        private string m_sHRN = "";
+        private string m_sPatientName;
+        public string m_sResource;
+        private DateTime m_StartTime;
+        private string m_Text;
+
+        public void CreateAppointment(DateTime StartTime, DateTime EndTime, string Note, int Key, string sResource)
+        {
+            this.m_StartTime = StartTime;
+            this.m_EndTime = EndTime;
+            this.m_Note = Note;
+            this.m_nKey = Key;
+            this.m_sResource = sResource;
+        }
+
+        public override string ToString()
+        {
+            //StringFormat sf = new StringFormat();
+            //sf.SetDigitSubstitution(System.Threading.Thread.CurrentThread.CurrentCulture.LCID, StringDigitSubstitute.National);
+            string patientName = "";
+            if (this.m_bAccessBlock)
+            {
+                string str2 = (this.Slots == 1) ? " Slot, " : " Slots, ";
+                return ((((this.AccessTypeName + ": ") + this.Slots.ToString() + str2) + this.Duration.ToString() + " Minutes. ") + this.Note);
+            }
+            patientName = this.PatientName;
+            if (this.HealthRecordNumber != "")
+            {
+                patientName = patientName + " #" + this.HealthRecordNumber;
+            }
+            return (patientName + " " + this.Note);
+        }
+
+        public int AccessTypeID
+        {
+            get
+            {
+                return this.m_nAccessTypeID;
+            }
+            set
+            {
+                this.m_nAccessTypeID = value;
+            }
+        }
+
+        public string AccessTypeName
+        {
+            get
+            {
+                return this.m_sAccessTypeName;
+            }
+            set
+            {
+                this.m_sAccessTypeName = value;
+            }
+        }
+
+        public int AppointmentKey
+        {
+            get
+            {
+                return this.m_nKey;
+            }
+            set
+            {
+                this.m_nKey = value;
+            }
+        }
+
+        public DateTime AuxTime
+        {
+            get
+            {
+                return this.m_dAuxTime;
+            }
+            set
+            {
+                this.m_dAuxTime = value;
+            }
+        }
+
+        public DateTime CheckInTime
+        {
+            get
+            {
+                return this.m_dCheckIn;
+            }
+            set
+            {
+                this.m_dCheckIn = value;
+            }
+        }
+
+        public int Duration
+        {
+            get
+            {
+                TimeSpan span = (TimeSpan) (this.EndTime - this.StartTime);
+                return (int) span.TotalMinutes;
+            }
+        }
+
+        public DateTime EndTime
+        {
+            get
+            {
+                return this.m_EndTime;
+            }
+            set
+            {
+                this.m_EndTime = value;
+            }
+        }
+
+        public int GridColumn
+        {
+            get
+            {
+                return this.m_nColumn;
+            }
+            set
+            {
+                this.m_nColumn = value;
+            }
+        }
+
+        public Rectangle GridRectangle
+        {
+            get
+            {
+                return this.m_rectangle;
+            }
+            set
+            {
+                this.m_rectangle = value;
+            }
+        }
+
+        public string HealthRecordNumber
+        {
+            get
+            {
+                return this.m_sHRN;
+            }
+            set
+            {
+                this.m_sHRN = value;
+            }
+        }
+
+        public bool IsAccessBlock
+        {
+            get
+            {
+                return this.m_bAccessBlock;
+            }
+            set
+            {
+                this.m_bAccessBlock = value;
+            }
+        }
+
+        public bool NoShow
+        {
+            get
+            {
+                return this.m_bNoShow;
+            }
+            set
+            {
+                this.m_bNoShow = value;
+            }
+        }
+
+        public string Note
+        {
+            get
+            {
+                return this.m_Note;
+            }
+            set
+            {
+                this.m_Note = value;
+            }
+        }
+
+        public int PatientID
+        {
+            get
+            {
+                return this.m_nPatientID;
+            }
+            set
+            {
+                this.m_nPatientID = value;
+            }
+        }
+
+        public string PatientName
+        {
+            get
+            {
+                return this.m_sPatientName;
+            }
+            set
+            {
+                this.m_sPatientName = value;
+            }
+        }
+
+        public string Resource
+        {
+            get
+            {
+                return this.m_sResource;
+            }
+            set
+            {
+                this.m_sResource = value;
+            }
+        }
+
+        public bool Selected
+        {
+            get
+            {
+                return this.m_bSelected;
+            }
+            set
+            {
+                this.m_bSelected = value;
+            }
+        }
+
+        public int Slots
+        {
+            get
+            {
+                return this.m_nSlots;
+            }
+            set
+            {
+                this.m_nSlots = value;
+            }
+        }
+
+        public DateTime StartTime
+        {
+            get
+            {
+                return this.m_StartTime;
+            }
+            set
+            {
+                this.m_StartTime = value;
+            }
+        }
+
+        public string Text
+        {
+            get
+            {
+                this.m_Text = this.m_sPatientName;
+                return this.m_Text;
+            }
+        }
+
+        public bool WalkIn
+        {
+            get
+            {
+                return this.m_bWalkIn;
+            }
+            set
+            {
+                this.m_bWalkIn = value;
+            }
+        }
+
+        public Patient Patient { get; set; }
+        public Provider Provider { get; set; }
+    }
+}
+
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAppointmentChangedArgs.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAppointmentChangedArgs.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAppointmentChangedArgs.cs	(revision 1134)
@@ -0,0 +1,27 @@
+﻿namespace IndianHealthService.ClinicalScheduling
+{
+    using System;
+    /// <summary>
+    /// Custom event args for CGAppointment events when changing appointments.
+    /// More documentation when I totally understand it.
+    /// I changed it to automatic properties.
+    /// </summary>
+    [Serializable]
+    public class CGAppointmentChangedArgs : EventArgs
+    {
+        public int AccessTypeID {get; set;}
+
+        public CGAppointment Appointment {get; set;}
+
+        public DateTime EndTime {get; set;}
+
+        public string OldResource {get; set;}
+
+        public string Resource {get; set;}
+
+        public int Slots {get; set;}
+
+        public DateTime StartTime {get; set;}
+    }
+}
+
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAppointments.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAppointments.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAppointments.cs	(revision 1134)
@@ -0,0 +1,78 @@
+﻿namespace IndianHealthService.ClinicalScheduling
+{
+    using System;
+    using System.Collections;
+    /// <summary>
+    /// Managers Appointment objects CGAppointment using an array list internally.
+    /// </summary>
+    /// <remarks>
+    /// Really needs to be refactored to use generics
+    /// </remarks>
+    [Serializable]
+    public class CGAppointments : IEnumerable, ICloneable
+    {
+        private Hashtable apptList = new Hashtable();
+
+        public void AddAppointment(CGAppointment appt)
+        {
+            if (this.apptList.ContainsKey(appt.AppointmentKey))
+            {
+                this.apptList.Remove(appt.AppointmentKey);
+            }
+            this.apptList.Add(appt.AppointmentKey, appt);
+        }
+
+        public void ClearAllAppointments()
+        {
+            this.apptList.Clear();
+        }
+
+        public CGAppointment GetAppointment(int nKey)
+        {
+            return (CGAppointment) this.apptList[nKey];
+        }
+
+        public IEnumerator GetEnumerator()
+        {
+            return this.apptList.GetEnumerator();
+        }
+
+        public void RemoveAppointment(int nKey)
+        {
+            this.apptList.Remove(nKey);
+        }
+
+        public int AppointmentCount
+        {
+            get
+            {
+                return this.apptList.Count;
+            }
+        }
+
+        public Hashtable AppointmentTable
+        {
+            get
+            {
+                return this.apptList;
+            }
+        }
+
+ 
+        /// <summary>
+        /// Returns a deep copy of CGAppointments
+        /// </summary>
+        /// <returns></returns>
+        public object Clone()
+        {
+            CGAppointments newappts = new CGAppointments();
+            foreach (DictionaryEntry d in this.apptList)
+            {
+                newappts.apptList.Add(d.Key, d.Value);
+            }
+            
+            return newappts;
+        }
+    }
+}
+
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAvailability.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAvailability.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGAvailability.cs	(revision 1134)
@@ -0,0 +1,223 @@
+﻿namespace IndianHealthService.ClinicalScheduling
+{
+    using System;
+    using System.Drawing;
+    /// <summary>
+    /// This class was regenerated from Calendargrid.dll using Reflector.exe
+    /// by Sam Habiel for WorldVista. The original source code is lost.
+    /// </summary>
+    public class CGAvailability
+    {
+        private DateTime m_EndTime;
+        private int m_nAvailabilityType;
+        private int m_nBlue;
+        private int m_nGreen;
+        private int m_nRed;
+        private int m_nSlots;
+        private string m_sAccessRuleList;
+        private string m_sAccessTypeName;
+        private string m_sDisplayColor = "Cornsilk";
+        private string m_sNote;
+        private string m_sResourceList;
+        private DateTime m_StartTime;
+
+        public CGAvailability()
+        {
+            Color color = Color.FromName("Khaki");
+            this.m_nRed = color.R;
+            this.m_nGreen = color.G;
+            this.m_nBlue = color.B;
+            this.m_sNote = "";
+        }
+
+        public void Create(DateTime StartTime, DateTime EndTime, int nSlots)
+        {
+            this.m_StartTime = StartTime;
+            this.m_EndTime = EndTime;
+            this.m_nAvailabilityType = 0;
+            this.m_nSlots = nSlots;
+            this.m_sResourceList = "";
+            this.m_sAccessRuleList = "";
+        }
+
+        public void Create(DateTime StartTime, DateTime EndTime, int nAvailabilityType, int nSlots)
+        {
+            this.m_StartTime = StartTime;
+            this.m_EndTime = EndTime;
+            this.m_nAvailabilityType = nAvailabilityType;
+            this.m_nSlots = nSlots;
+            this.m_sResourceList = "";
+            this.m_sAccessRuleList = "";
+        }
+
+        public void Create(DateTime StartTime, DateTime EndTime, int nAvailabilityType, int nSlots, string sResourceList)
+        {
+            this.m_StartTime = StartTime;
+            this.m_EndTime = EndTime;
+            this.m_nAvailabilityType = nAvailabilityType;
+            this.m_nSlots = nSlots;
+            this.m_sResourceList = sResourceList;
+            this.m_sAccessRuleList = "";
+        }
+
+        public void Create(DateTime StartTime, DateTime EndTime, int nAvailabilityType, int nSlots, string sResourceList, string sAccessRuleList)
+        {
+            this.m_StartTime = StartTime;
+            this.m_EndTime = EndTime;
+            this.m_nAvailabilityType = nAvailabilityType;
+            this.m_nSlots = nSlots;
+            this.m_sResourceList = sResourceList;
+            this.m_sAccessRuleList = sAccessRuleList;
+        }
+
+        public string AccessRuleList
+        {
+            get
+            {
+                return this.m_sAccessRuleList;
+            }
+            set
+            {
+                this.m_sAccessRuleList = value;
+            }
+        }
+
+        public string AccessTypeName
+        {
+            get
+            {
+                return this.m_sAccessTypeName;
+            }
+            set
+            {
+                this.m_sAccessTypeName = value;
+            }
+        }
+
+        public int AvailabilityType
+        {
+            get
+            {
+                return this.m_nAvailabilityType;
+            }
+            set
+            {
+                this.m_nAvailabilityType = value;
+            }
+        }
+
+        public int Blue
+        {
+            get
+            {
+                return this.m_nBlue;
+            }
+            set
+            {
+                this.m_nBlue = value;
+            }
+        }
+
+        public string DisplayColor
+        {
+            get
+            {
+                return this.m_sDisplayColor;
+            }
+            set
+            {
+                this.m_sDisplayColor = value;
+            }
+        }
+
+        public DateTime EndTime
+        {
+            get
+            {
+                return this.m_EndTime;
+            }
+            set
+            {
+                this.m_EndTime = value;
+            }
+        }
+
+        public int Green
+        {
+            get
+            {
+                return this.m_nGreen;
+            }
+            set
+            {
+                this.m_nGreen = value;
+            }
+        }
+
+        public string Note
+        {
+            get
+            {
+                return this.m_sNote;
+            }
+            set
+            {
+                this.m_sNote = value;
+            }
+        }
+
+        public int Red
+        {
+            get
+            {
+                return this.m_nRed;
+            }
+            set
+            {
+                this.m_nRed = value;
+            }
+        }
+
+        public string ResourceList
+        {
+            get
+            {
+                return this.m_sResourceList;
+            }
+            set
+            {
+                this.m_sResourceList = value;
+            }
+        }
+
+        public int Slots
+        {
+            get
+            {
+                return this.m_nSlots;
+            }
+            set
+            {
+                this.m_nSlots = value;
+            }
+        }
+
+        public DateTime StartTime
+        {
+            get
+            {
+                return this.m_StartTime;
+            }
+            set
+            {
+                this.m_StartTime = value;
+            }
+        }
+
+        public override string ToString()
+        {
+            return ResourceList + " (" + Slots + ") @ " + StartTime;
+        }
+    }
+}
+
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGCell.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGCell.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGCell.cs	(revision 1134)
@@ -0,0 +1,113 @@
+﻿namespace IndianHealthService.ClinicalScheduling
+{
+    using System;
+    using System.Drawing;
+    using System.Text;
+    /// <summary>
+    /// This class was regenerated from Calendargrid.dll using Reflector.exe
+    /// by Sam Habiel for WorldVista. The original source code is lost.
+    /// </summary>
+    public class CGCell
+    {
+        private Brush m_ApptTypeColor;
+        public bool m_bIsSelected;
+        private int m_Col;
+        private Rectangle m_Rectangle;
+        private int m_Row;
+        private string m_sKey;
+
+        public CGCell()
+        {
+            this.m_ApptTypeColor = Brushes.Cornsilk;
+        }
+
+        public CGCell(Rectangle r, int row, int col)
+        {
+            this.m_Rectangle = r;
+            this.m_Row = row;
+            this.m_Col = col;
+            this.m_sKey = BuildKey(this.m_Row, this.m_Col);
+            this.m_ApptTypeColor = Brushes.Cornsilk;
+        }
+
+        public static string BuildKey(int nRow, int nCol)
+        {
+            StringBuilder builder = new StringBuilder("r");
+            builder.Append(nRow.ToString());
+            builder.Append("c");
+            builder.Append(nCol.ToString());
+            return builder.ToString();
+        }
+
+        public Brush AppointmentTypeColor
+        {
+            get
+            {
+                return this.m_ApptTypeColor;
+            }
+            set
+            {
+                this.m_ApptTypeColor = value;
+            }
+        }
+
+        public int CellColumn
+        {
+            get
+            {
+                return this.m_Col;
+            }
+            set
+            {
+                this.m_Col = value;
+                this.m_sKey = BuildKey(this.m_Row, this.m_Col);
+            }
+        }
+
+        public Rectangle CellRectangle
+        {
+            get
+            {
+                return this.m_Rectangle;
+            }
+            set
+            {
+                this.m_Rectangle = value;
+            }
+        }
+
+        public int CellRow
+        {
+            get
+            {
+                return this.m_Row;
+            }
+            set
+            {
+                this.m_Row = value;
+                this.m_sKey = BuildKey(this.m_Row, this.m_Col);
+            }
+        }
+
+        public bool IsSelected
+        {
+            get
+            {
+                return this.m_bIsSelected;
+            }
+            set
+            {
+                this.m_bIsSelected = value;
+            }
+        }
+
+        public string Key
+        {
+            get
+            {
+                return this.m_sKey;
+            }
+        }
+    }
+}
+
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGCells.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGCells.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGCells.cs	(revision 1134)
@@ -0,0 +1,60 @@
+﻿namespace IndianHealthService.ClinicalScheduling
+{
+    using System;
+    using System.Collections;
+    /// <summary>
+    /// This class was regenerated from Calendargrid.dll using Reflector.exe
+    /// by Sam Habiel for WorldVista. The original source code is lost.
+    /// </summary>
+    public class CGCells : IEnumerable
+    {
+        private Hashtable cellList = new Hashtable();
+
+        internal CGCells()
+        {
+        }
+
+        public void AddCell(CGCell r)
+        {
+            this.cellList.Add(r.Key, r);
+        }
+
+        public void ClearAllCells()
+        {
+            this.cellList.Clear();
+        }
+
+        public CGCell GetCellFromRowCol(int nRow, int nCol)
+        {
+            string str = CGCell.BuildKey(nRow, nCol);
+            return (CGCell) this.cellList[str];
+        }
+
+        public IEnumerator GetEnumerator()
+        {
+            return this.cellList.GetEnumerator();
+        }
+
+        public void RemoveCell(string sKey)
+        {
+            this.cellList.Remove(sKey);
+        }
+
+        public int CellCount
+        {
+            get
+            {
+                return this.cellList.Count;
+            }
+        }
+
+        public Hashtable CellHashTable
+        {
+            get
+            {
+                return this.cellList;
+            }
+        }
+    }
+}
+
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGDocument.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGDocument.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGDocument.cs	(revision 1134)
@@ -0,0 +1,1291 @@
+using System;
+using System.Collections;
+using System.Data;
+using System.Data.OleDb;
+using System.Diagnostics;
+using System.Drawing;
+using System.Windows.Forms;
+using IndianHealthService.BMXNet;
+using System.Linq;
+using System.Collections.Generic;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+    /// <summary>
+    /// Contains the array of appointments and availabily that make up the document class
+    /// </summary>
+    public class CGDocument
+    {
+        #region Member Variables
+        public int m_nColumnCount;                 //todo: this should point to the view's member for column count
+        public int m_nTimeUnits;                   //?
+        private string m_sDocName;                     //Document Name ?
+        public ArrayList m_sResourcesArray;              //keeps the resources
+        public ScheduleType m_ScheduleType;                 //Either a Resource or a Clinic (Group of Resources)
+        private DateTime m_dSelectedDate;                //Holds the user's selection from the dtpicker
+        private DateTime m_dStartDate;                   //Beginning date of document data
+        private DateTime m_dEndDate;                     //Ending date of document data
+        public CGAppointments m_appointments;                 //Appointment List
+        private ArrayList m_pAvArray;                     //Availability List
+        private CGDocumentManager m_DocManager;                 //Holds a reference to the document manager
+        private DateTime m_dLastRefresh = DateTime.Now;  //Holds last refersh date
+        #endregion
+
+        /// <summary>
+        /// Constructor. Initialize State Data:
+        /// 3 Arrays (Appointments, Availabilities, and Resources)
+        /// Schedule Type is Resource not Clinic
+        /// Selected Date is Today
+        /// Start Date is Today
+        /// End Date is 7 days from Today
+        /// </summary>
+        public CGDocument()
+        {
+            m_appointments = new CGAppointments();      // Holds Appointments
+            m_pAvArray = new ArrayList();               // Holds Availabilites
+            m_sResourcesArray = new ArrayList();        // Holds Resources
+            m_ScheduleType = ScheduleType.Resource;     // Default Schedule Type is a Resource
+            m_dSelectedDate = DateTime.Today;           // Default Selected Date is Today
+            m_dStartDate = DateTime.Today;              // Default Start Date is Today
+            m_dEndDate = DateTime.Today.AddDays(7);     // Default End Date is 7 days from Today.
+        }
+
+
+        #region Properties
+
+        /// <summary>
+        /// Returns the latest refresh time for this document
+        /// </summary>
+        public DateTime LastRefreshed
+        {
+            get
+            {
+                return m_dLastRefresh;
+            }
+        }
+
+        /// <summary>
+        /// The list of Resource names
+        /// </summary>
+        public ArrayList Resources
+        {
+            get
+            {
+                return this.m_sResourcesArray;
+            }
+            set
+            {
+                this.m_sResourcesArray = value;
+            }
+        }
+
+        /// <summary>
+        /// The array of CGAvailabilities that contains appt type and slots
+        /// </summary>
+        public ArrayList AvailabilityArray
+        {
+            get
+            {
+                return this.m_pAvArray;
+            }
+        }
+
+        public CGDocumentManager DocManager
+        {
+            get
+            {
+                return m_DocManager;
+            }
+            set
+            {
+                m_DocManager = value;
+            }
+        }
+
+        /// <summary>
+        /// Contains the hashtable of appointments
+        /// </summary>
+        public CGAppointments Appointments
+        {
+            get
+            {
+                return m_appointments;
+            }
+        }
+
+        /// <summary>
+        /// Holds the date selected by the user in CGView.dateTimePicker1
+        /// </summary>
+        public DateTime SelectedDate
+        {
+            get
+            {
+                return this.m_dSelectedDate;
+            }
+            set
+            {
+                this.m_dSelectedDate = value;
+            }
+        }
+
+        /// <summary>
+        /// Contains the beginning date of the appointment document
+        /// </summary>
+        public DateTime StartDate
+        {
+            get
+            {
+                return this.m_dStartDate;
+            }
+        }
+
+        public string DocName
+        {
+            get
+            {
+                return this.m_sDocName;
+            }
+            set
+            {
+                this.m_sDocName = value;
+            }
+        }
+
+        #endregion
+
+        #region Methods
+
+        public void UpdateAllViews()
+        {
+            //iterate through all views and call update.
+            Hashtable h = CGDocumentManager.Current.Views;
+
+            CGDocument d;
+            foreach (CGView v in h.Keys)
+            {
+                d = (CGDocument)h[v];
+                if (d == this)
+                {
+                    v.UpdateArrays();
+                }
+            }
+
+        }
+
+        /// <summary>
+        /// Update schedule based on info in RPMS
+        /// <returns>Clears and repopluates m_appointments</returns>
+        /// </summary>
+        private bool RefreshAppointments()
+        {
+            try
+            {
+                string sPatientName;
+                string sPatientID;
+                DateTime dStart;
+                DateTime dEnd;
+                DateTime dCheckIn;
+                DateTime dAuxTime;
+                int nKeyID;
+                string sNote;
+                string sResource;
+                bool bNoShow = false;
+                string sNoShow = "0";
+                string sHRN = "";
+                int nAccessTypeID; //used in autorebook
+                string sWalkIn = "0";
+                bool bWalkIn;
+                CGAppointment pAppointment;
+                CGDocumentManager pApp = CGDocumentManager.Current;
+                DataTable rAppointmentSchedule;
+
+                //Nice to know that it gets set here!!!
+                m_dLastRefresh = DateTime.Now;
+
+                //Clear appointments associated with this document
+                this.m_appointments.ClearAllAppointments();
+
+                //  calls RPC to get appointments
+                rAppointmentSchedule = CGSchedLib.CreateAppointmentSchedule(m_DocManager, m_sResourcesArray, this.m_dStartDate, this.m_dEndDate);
+
+                // loop through datatable: Create CGAppointment and add to CGAppointments
+                foreach (DataRow r in rAppointmentSchedule.Rows)
+                {
+
+                    if (r["APPOINTMENTID"].ToString() == "0")
+                    {
+                        string sMsg = r["NOTE"].ToString();
+                        throw new BMXNetException(sMsg);
+                    }
+                    nKeyID = Convert.ToInt32(r["APPOINTMENTID"].ToString());
+                    sResource = r["RESOURCENAME"].ToString();
+                    sPatientName = r["PATIENTNAME"].ToString();
+                    sPatientID = r["PATIENTID"].ToString();
+                    dStart = (DateTime)r["START_TIME"];
+                    dEnd = (DateTime)r["END_TIME"];
+                    dCheckIn = new DateTime();
+                    dAuxTime = new DateTime();
+
+                    if (r["CHECKIN"].GetType() != typeof(System.DBNull))
+                        dCheckIn = (DateTime)r["CHECKIN"];
+                    if (r["AUXTIME"].GetType() != typeof(System.DBNull))
+                        dCheckIn = (DateTime)r["AUXTIME"];
+                    sNote = r["NOTE"].ToString();
+                    sNoShow = r["NOSHOW"].ToString();
+                    bNoShow = (sNoShow == "1") ? true : false;
+                    sHRN = r["HRN"].ToString();
+                    nAccessTypeID = (int)r["ACCESSTYPEID"];
+                    sWalkIn = r["WALKIN"].ToString();
+                    bWalkIn = (sWalkIn == "1") ? true : false;
+
+                    Patient pt = new Patient()
+                    {
+                        DFN = Convert.ToInt32(sPatientID),
+                        Name = sPatientName,
+                        DOB = (DateTime)r["DOB"],
+                        ID = r["PID"].ToString(), 
+                        HRN = sHRN,
+                        Sex = r["SEX"].ToString() == "MALE" ? Sex.Male : Sex.Female
+                    };
+
+                    pAppointment = new CGAppointment();
+                    pAppointment.Patient = pt;
+                    pAppointment.CreateAppointment(dStart, dEnd, sNote, nKeyID, sResource);
+                    pAppointment.PatientName = sPatientName;
+                    pAppointment.PatientID = Convert.ToInt32(sPatientID);
+                    if (dCheckIn.Ticks > 0)
+                        pAppointment.CheckInTime = dCheckIn;
+                    if (dAuxTime.Ticks > 0)
+                        pAppointment.AuxTime = dAuxTime;
+                    pAppointment.NoShow = bNoShow;
+                    pAppointment.HealthRecordNumber = sHRN;
+                    pAppointment.AccessTypeID = nAccessTypeID;
+                    pAppointment.WalkIn = bWalkIn;
+                    this.m_appointments.AddAppointment(pAppointment);
+
+                }
+
+                return true;
+            }
+            catch (Exception Ex)
+            {
+                Debug.Write("CGDocument.RefreshDaysSchedule error: " + Ex.Message + "\n");
+                return false;
+            }
+        }
+
+
+        public bool IsRefreshNeeded()
+        {
+            if (m_sResourcesArray.Count == 0) return false;
+            return this.WeekNeedsRefresh(1, m_dSelectedDate, out this.m_dStartDate, out this.m_dEndDate);
+        }
+
+        //sam: This is a test that duplicates RefreshDocument, but without the UpdateAllViews,
+        // as that has to be done synchornously.
+        //XXX: Needs to be refactored obviously, but now for testing.
+        //XXX: Tested extensively enough. Less refactoring now. 2011-01-26
+        public void RefreshDocumentAsync()
+        {
+            Debug.WriteLine("IN REFERSH DOCUMENT ASYNC\n\n");
+
+            bool bRet = false;
+            if (m_sResourcesArray.Count == 0)
+                return;
+            if (m_sResourcesArray.Count == 1)
+            {
+                bRet = this.WeekNeedsRefresh(1, m_dSelectedDate, out this.m_dStartDate, out this.m_dEndDate);
+            }
+            else
+            {
+                this.m_dStartDate = m_dSelectedDate;
+                this.m_dEndDate = m_dSelectedDate;
+                this.m_dEndDate = this.m_dEndDate.AddHours(23);
+                this.m_dEndDate = this.m_dEndDate.AddMinutes(59);
+                this.m_dEndDate = this.m_dEndDate.AddSeconds(59);
+            }
+
+            bRet = RefreshSchedule();
+        }
+
+        
+        public void RefreshDocument()
+        {
+            bool bRet = false;
+            if (m_sResourcesArray.Count == 0)
+                return;
+            if (m_sResourcesArray.Count == 1)
+            {
+                bRet = this.WeekNeedsRefresh(1, m_dSelectedDate, out this.m_dStartDate, out this.m_dEndDate);
+            }
+            else
+            {
+                this.m_dStartDate = m_dSelectedDate;
+                this.m_dEndDate = m_dSelectedDate;
+                this.m_dEndDate = this.m_dEndDate.AddHours(23);
+                this.m_dEndDate = this.m_dEndDate.AddMinutes(59);
+                this.m_dEndDate = this.m_dEndDate.AddSeconds(59);
+            }
+
+            bRet = RefreshSchedule();
+            
+            this.UpdateAllViews();
+        }
+
+        public void OnOpenDocument(DateTime dDate)
+        {
+            try
+            {
+                this.SelectedDate = dDate.Date;
+
+                m_ScheduleType = (m_sResourcesArray.Count == 1) ? ScheduleType.Resource : ScheduleType.Clinic;
+                bool bRet = false;
+                
+                if (m_ScheduleType == ScheduleType.Resource)
+                {
+                    bRet = this.WeekNeedsRefresh(1, dDate, out this.m_dStartDate, out this.m_dEndDate);
+                }
+                else
+                {
+                    this.m_dStartDate = dDate;
+                    this.m_dEndDate = dDate;
+                    this.m_dEndDate = this.m_dEndDate.AddHours(23);
+                    this.m_dEndDate = this.m_dEndDate.AddMinutes(59);
+                    this.m_dEndDate = this.m_dEndDate.AddSeconds(59);
+                }
+
+                bRet = RefreshSchedule();
+
+                CGView view = null;
+                //If this document already has a view, the use it
+                //SAM: Why do this again???
+                //SAM: I think it's not needed; b/c 
+                Hashtable h = CGDocumentManager.Current.Views;
+                CGDocument d;
+                bool bReuseView = false;
+                foreach (CGView v in h.Keys)
+                {
+                    d = (CGDocument)h[v];
+                    if (d == this)
+                    {
+                        view = v;
+                        bReuseView = true;
+                        v.InitializeDocView(this.DocName);
+                        break;
+                    }
+                }
+
+                //Otherwise, create new View
+                if (bReuseView == false)
+                {
+                    view = new CGView();
+
+                    view.InitializeDocView(this,
+                        this.DocManager,
+                        m_dStartDate,
+                        this.DocName);
+
+                    view.Show();
+                    view.SyncTree();
+
+                }
+                this.UpdateAllViews();
+            }
+            catch (BMXNetException bmxEx)
+            {
+                throw bmxEx;
+            }
+            catch (Exception ex)
+            {
+                throw new BMXNet.BMXNetException("ClinicalScheduling.OnOpenDocument error:  " + ex.Message);
+            }
+        }
+
+        /// <summary>
+        /// Refreshes Availablility and Schedules from RPMS.
+        /// </summary>
+        /// <returns>Success or Failure. Should be always Success.</returns>
+        public bool RefreshSchedule()
+        {
+            this.RefreshAvailabilitySchedule();
+            this.RefreshAppointments();
+            return true;
+        }
+
+        private bool RefreshAvailabilitySchedule()
+        {
+            try
+            {
+                ArrayList saryApptTypes = new ArrayList();
+                
+                //Refresh Availability schedules
+                DataTable rAvailabilitySchedule;
+                rAvailabilitySchedule = CGSchedLib.CreateAvailabilitySchedule(m_DocManager, m_sResourcesArray, this.m_dStartDate, this.m_dEndDate, saryApptTypes,/**/ m_ScheduleType, "0");
+
+                ////NEW
+                //NOTE: This lock makes sure that availabilities aren't queried for slots when the array is an intermediate
+                //state. The other place that has this lock is SlotsAvailable function.
+                lock (this.m_pAvArray)
+                {
+                    m_pAvArray.Clear();
+                    foreach (DataRow rTemp in rAvailabilitySchedule.Rows)
+                    {
+                        DateTime dStart = (DateTime)rTemp["START_TIME"];
+                        DateTime dEnd = (DateTime)rTemp["END_TIME"];
+
+                        //TODO: Fix this slots datatype problem
+                        string sSlots = rTemp["SLOTS"].ToString();
+                        int nSlots = Convert.ToInt16(sSlots);
+
+                        string sResourceList = rTemp["RESOURCE"].ToString();
+                        string sAccessRuleList = rTemp["ACCESS_TYPE"].ToString();
+                        string sNote = rTemp["NOTE"].ToString();
+
+                        int nApptTypeID;
+
+                        if ((nSlots < -1000) || (sAccessRuleList == ""))
+                        {
+                            nApptTypeID = 0;
+                        }
+                        else
+                        {
+                            nApptTypeID = Int32.Parse(rTemp["ACCESS_TYPE"].ToString());
+                        }
+
+                        AddAvailability(dStart, dEnd, nApptTypeID, nSlots, sResourceList, sAccessRuleList, sNote);
+                    }
+                }
+                return true;
+                
+                /* NOT USED
+                //Refresh Type Schedule
+                string sResourceName = "";
+                DataTable rTypeSchedule = new DataTable(); ;
+                for (int j = 0; j < m_sResourcesArray.Count; j++)
+                {
+                    sResourceName = m_sResourcesArray[j].ToString();
+                    DataTable dtTemp = CGSchedLib.CreateAssignedTypeSchedule(m_DocManager, sResourceName, this.m_dStartDate, this.m_dEndDate, m_ScheduleType);
+
+                    if (j == 0)
+                    {
+                        rTypeSchedule = dtTemp;
+                    }
+                    else
+                    {
+                        rTypeSchedule = CGSchedLib.UnionBlocks(rTypeSchedule, dtTemp);
+                    }
+                }
+
+                DateTime dStart;
+                DateTime dEnd;
+                DateTime dTypeStart;
+                DateTime dTypeEnd;
+                int nSlots;
+                Rectangle crRectA = new Rectangle(0, 0, 1, 0);
+                Rectangle crRectB = new Rectangle(0, 0, 1, 0);
+                bool bIsect;
+                string sResourceList;
+                string sAccessRuleList;
+
+                //smh: moved clear availabilities down here.
+                //smh: Temporary solution to make sure that people don't touch the availability table at the same time!!!
+                //NOTE: This lock makes sure that availabilities aren't queried for slots when the array is an intermediate
+                //state. The other place that has this lock is SlotsAvailable function.
+                lock (this.m_pAvArray)
+                {
+                    m_pAvArray.Clear();
+
+                    foreach (DataRow rTemp in rAvailabilitySchedule.Rows)
+                    {
+                        //get StartTime, EndTime and Slots 
+                        dStart = (DateTime)rTemp["START_TIME"];
+                        dEnd = (DateTime)rTemp["END_TIME"];
+
+                        //TODO: Fix this slots datatype problem
+                        string sSlots = rTemp["SLOTS"].ToString();
+                        nSlots = Convert.ToInt16(sSlots);
+
+                        sResourceList = rTemp["RESOURCE"].ToString();
+                        sAccessRuleList = rTemp["ACCESS_TYPE"].ToString();
+
+                        string sNote = rTemp["NOTE"].ToString();
+
+                        if ((nSlots < -1000) || (sAccessRuleList == ""))
+                        {
+                            nApptTypeID = 0;
+                        }
+                        else
+                        {
+                            foreach (DataRow rType in rTypeSchedule.Rows)
+                            {
+
+                                dTypeStart = (DateTime)rType["StartTime"];
+                                dTypeEnd = (DateTime)rType["EndTime"];
+                                //if start & end times overlap, then
+                                string sTypeResource = rType["ResourceName"].ToString();
+                                if ((dTypeStart.DayOfYear == dStart.DayOfYear) && (sResourceList == sTypeResource))
+                                {
+                                    crRectA.Y = GetTotalMinutes(dStart);
+                                    crRectA.Height = GetTotalMinutes(dEnd) - crRectA.Top;
+                                    crRectB.Y = GetTotalMinutes(dTypeStart);
+                                    crRectB.Height = GetTotalMinutes(dTypeEnd) - crRectB.Top;
+                                    bIsect = crRectA.IntersectsWith(crRectB);
+                                    if (bIsect == true)
+                                    {
+                                        //TODO: This code:
+                                        //	nApptTypeID = (int) rType["AppointmentTypeID"];
+                                        //Causes this exception:
+                                        //Unhandled Exception: System.InvalidCastException: Specified cast is not valid.
+                                        string sTemp = rType["AppointmentTypeID"].ToString();
+                                        nApptTypeID = Convert.ToInt16(sTemp);
+                                        break;
+                                    }
+                                }
+                            }//end foreach datarow rType
+                        }
+
+
+                        //AddAvailability(dStart, dEnd, nApptTypeID, nSlots, sResourceList, sAccessRuleList, sNote);
+                    }//end foreach datarow rTemp
+                }//end lock
+                return true;
+             */
+            }
+            catch (Exception ex)
+            {
+                Debug.Write("CGDocument.RefreshAvailabilitySchedule error: " + ex.Message + "\n");
+                return false;
+            }
+        }
+
+        private int GetTotalMinutes(DateTime dDate)
+        {
+            return ((dDate.Hour * 60) + dDate.Minute);
+        }
+
+        /// <summary>
+        /// Adds Availability to Availability Array held by document
+        /// </summary>
+        /// <param name="StartTime">Self-Explan</param>
+        /// <param name="EndTime">Self-Explan</param>
+        /// <param name="nType"></param>
+        /// <param name="nSlots"></param>
+        /// <param name="UpdateView"></param>
+        /// <param name="sResourceList"></param>
+        /// <param name="sAccessRuleList"></param>
+        /// <param name="sNote"></param>
+        /// <returns></returns>
+        public int AddAvailability(DateTime StartTime, DateTime EndTime, int nType, int nSlots, string sResourceList, string sAccessRuleList, string sNote)
+        {
+            //adds it to the object array
+            //Returns the index in the array
+
+            CGAvailability pNewAv = new CGAvailability();
+            pNewAv.Create(StartTime, EndTime, nType, nSlots, sResourceList, sAccessRuleList);
+
+            pNewAv.Note = sNote;
+
+            //Look up the color and type name using the AppointmentTypes datatable
+            DataTable dtType = this.m_DocManager.GlobalDataSet.Tables["AccessTypes"];
+            DataRow dRow = dtType.Rows.Find(nType.ToString());
+            if (dRow != null)
+            {
+                string sColor = dRow["DISPLAY_COLOR"].ToString();
+                pNewAv.DisplayColor = sColor;
+                string sTemp = dRow["RED"].ToString();
+                sTemp = (sTemp == "") ? "0" : sTemp;
+                int nRed = Convert.ToInt16(sTemp);
+                pNewAv.Red = nRed;
+                sTemp = dRow["GREEN"].ToString();
+                sTemp = (sTemp == "") ? "0" : sTemp;
+                int nGreen = Convert.ToInt16(sTemp);
+                pNewAv.Green = nGreen;
+                sTemp = dRow["BLUE"].ToString();
+                sTemp = (sTemp == "") ? "0" : sTemp;
+                int nBlue = Convert.ToInt16(sTemp);
+                pNewAv.Blue = nBlue;
+
+                string sName = dRow["ACCESS_TYPE_NAME"].ToString();
+                pNewAv.AccessTypeName = sName;
+            }
+
+            int nIndex = 0;
+            nIndex = m_pAvArray.Add(pNewAv);
+
+            return nIndex;
+        }
+
+
+        public void AddResource(string sResource)
+        {
+            //TODO:  Test that resource is not currently in list, that it IS a resource, etc
+            this.m_sResourcesArray.Add(sResource);
+        }
+
+        /// <summary>
+        /// Gets number of slots left in a certain selection on the grid. Used in Multiple Places.
+        /// </summary>
+        /// <param name="dSelStart">Selection Start Date</param>
+        /// <param name="dSelEnd">Selection End Date</param>
+        /// <param name="sResource">Resource Name</param>
+        /// <param name="sAccessType">Out: Name of Access Type</param>
+        /// <param name="sAvailabilityMessage">Out: Access Note</param>
+        /// <returns>Number of slots</returns>
+        public int SlotsAvailable(DateTime dSelStart, DateTime dSelEnd, string sResource, int viewTimeScale, out CGAvailability resultantAV)
+        {
+
+            resultantAV = null;
+
+            double slotsAvailable = 0;      //defalut return value
+
+            double effectiveSlotsAvailable = 0;    //Slots available based on the time scale.
+
+
+            //NOTE: What's this lock? This lock makes sure that nobody is editing the availability array
+            //when we are looking at it. Since the availability array could potentially be updated on
+            //a different thread, we are can be potentially left stuck with an empty array.
+            //
+            //The other place that uses this lock is the RefershAvailabilitySchedule method
+            //
+            //This is a temporary fix until I figure out how to divorce the availbilities here from those drawn
+            //on the calendar. Appointments are cloned b/c they are in an object that supports that; and b/c I
+            //don't need to suddenly query them at runtime like I do with Availabilities.
+
+            //Let's Try Linq
+            lock (this.m_pAvArray)
+            {
+                //This foreach loop looks for an availability that overlaps where the user clicked.
+                //Availabilites cannot overlap each other (enforced at the DB level)
+                //If selection hits multiple blocks, get the block with the most slots (reflected by the sorting here)
+                List<CGAvailability> lstAV = (from avail in this.m_pAvArray.Cast<CGAvailability>()
+                           where (sResource == avail.ResourceList && CalendarGrid.TimesOverlap(dSelStart, dSelEnd, avail.StartTime, avail.EndTime))
+                           select avail).ToList();
+
+                //if we don't have any availabilities, then return with zero slots.
+                if (lstAV.Count == 0) return 0;
+                
+                CGAvailability pAV;
+
+                //if there is just one, that's it.
+                if (lstAV.Count == 1) pAV = lstAV.First();
+                //otherwise...
+                else
+                {
+                    //if availabilities are contigous to each other, need to join them together.
+
+                    //First, are they the same?
+                    string firsttype = lstAV.First().AccessTypeName;
+                    bool bAllSameType = lstAV.All(av => av.AccessTypeName == firsttype);
+
+                    //Second are they ALL contigous?
+                    DateTime lastEndTime = DateTime.Today; //bogus value to please compiler who wants it assigned.
+                    int index = 0;
+
+                    bool bContigous = lstAV.OrderBy(av => av.StartTime)
+                       .All(av =>
+                       {
+                           index++;
+                           if (index == 1)
+                           {
+                               lastEndTime = av.EndTime;
+                               return true;
+                           }
+                           if (av.StartTime == lastEndTime)
+                           {
+                               lastEndTime = av.EndTime;
+                               return true;
+                           }
+
+                           return false;
+                       });
+
+
+
+                    if (bContigous && bAllSameType)
+                    {
+                        var enumAVOrdered = lstAV.OrderBy(av => av.StartTime);
+
+                        pAV = new CGAvailability
+                        {
+                            StartTime = enumAVOrdered.First().StartTime,
+                            EndTime = enumAVOrdered.Last().EndTime,
+                            Slots = enumAVOrdered.Sum(av => av.Slots),
+                            AccessTypeName = enumAVOrdered.First().AccessTypeName,
+                            Note = enumAVOrdered.First().Note
+                        };
+                    }
+                    else
+                    {
+                        pAV = lstAV.OrderByDescending(av => av.Slots).First();
+                    }
+                }
+
+                resultantAV = pAV; // out var
+                
+                slotsAvailable = pAV.Slots;
+                
+                //Subtract total slots current appointments take up.
+                slotsAvailable -= (from appt in this.Appointments.AppointmentTable.Values.Cast<CGAppointment>()
+                                   //If the resource is the same and the user selection overlaps, then...
+                                   where (sResource == appt.Resource && CalendarGrid.TimesOverlap(pAV.StartTime, pAV.EndTime, appt.StartTime, appt.EndTime))
+                                   // if appt starttime is before avail start time, only count against the avail starting from the availability start time
+                                   let startTimeToCountAgainstBlock = appt.StartTime < pAV.StartTime ? pAV.StartTime : appt.StartTime
+                                   // if appt endtime is after the avail ends, only count against the avail up to where the avail ends
+                                   let endTimeToCountAgainstBlock = appt.EndTime > pAV.EndTime ? pAV.EndTime : appt.EndTime
+                                   // theoretical minutes per slot for the availability
+                                   let minPerSlot = (pAV.EndTime - pAV.StartTime).TotalMinutes / pAV.Slots
+                                   // how many minutes does this appointment take away from the slot
+                                   let minPerAppt = (endTimeToCountAgainstBlock - startTimeToCountAgainstBlock).TotalMinutes
+                                   // how many slots the appointment takes up using this availability's scale
+                                   let slotsConsumed = minPerAppt / minPerSlot
+                                   select slotsConsumed)
+                                   // add up SlotsConsumed to substract from slotsAvailable
+                                   .Sum();
+
+                //theoretical minutes per slot for the availability
+                double minPerSlot2 = (pAV.EndTime - pAV.StartTime).TotalMinutes / pAV.Slots;
+                
+                //Convert it to the view's time scale.
+                effectiveSlotsAvailable = (minPerSlot2 / viewTimeScale) * slotsAvailable;
+
+            }
+            
+            //round it down.
+            return (int)effectiveSlotsAvailable;
+
+            /* OLD ALGOTHRIM 2
+
+            lock (this.m_pAvArray)
+            {
+                //This foreach loop looks for an availability that overlaps where the user clicked.
+                //There can only be one, as availabilites cannot overlap each other (enforced at the DB level)
+                //Therefore, we loop, and once we find it, we break.
+                foreach (CGAvailability pAV in this.m_pAvArray)
+                {
+                    //If the resource is the same and the user selection overlaps, then...
+                    if (sResource == pAV.ResourceList && CalendarGrid.TimesOverlap(dSelStart, dSelEnd, pAV.StartTime, pAV.EndTime))
+                    {
+                        slotsAvailable = pAV.Slots;         //variable now holds the total number of slots
+                        sAccessType = pAV.AccessTypeName;   //Access Name
+                        sAvailabilityMessage = pAV.Note;    //Access Block Note
+                        
+                        //Here we substract each appointment weight in slots from slotsAvailable
+                        foreach (DictionaryEntry apptDict in this.m_appointments.AppointmentTable)
+                        {
+                            CGAppointment appt = (CGAppointment)apptDict.Value;
+                            //If the appointment is in the same resource and overlaps with this availablity
+                            if (sResource == appt.Resource && CalendarGrid.TimesOverlap(pAV.StartTime, pAV.EndTime, appt.StartTime, appt.EndTime))
+                            {
+                                // if appt starttime is before avail start time, only count against the avail starting from the availability start time
+                                DateTime startTimeToCountAgainstBlock = appt.StartTime < pAV.StartTime ? pAV.StartTime : appt.StartTime;
+                                // if appt endtime is after the avail ends, only count against the avail up to where the avail ends
+                                DateTime endTimeToCountAgainstBlock = appt.EndTime > pAV.EndTime ? pAV.EndTime : appt.EndTime;
+                                // theoretical minutes per slot for the availability
+                                double minPerSlot = (pAV.EndTime - pAV.StartTime).TotalMinutes/pAV.Slots;
+                                // how many minutes does this appointment take away from the slot
+                                double minPerAppt = (endTimeToCountAgainstBlock - startTimeToCountAgainstBlock).TotalMinutes;
+                                // how many slots the appointment takes up using this availability's scale
+                                double slotsConsumed = minPerAppt / minPerSlot;
+                                // subscract that from the total slots for the availability
+                                slotsAvailable -= slotsConsumed;
+                            } //end if
+                            //now go to the next appointment in foreach
+                        } 
+                        // As I said above, we can match only one availability. Once we found it and substracted from it; we are done.
+                        break;
+                    }
+                }
+                // We return the integer portion of the variable for display to the user or for calculations.
+                // That means, if 2.11 slots are left, the user sees 2. If 2.66, still 2.
+                return (int)slotsAvailable;
+            }
+            */
+
+            /* ORIGINAL ALGORITHM
+            sAccessType = "";
+            sAvailabilityMessage = "";
+            DateTime dStart;
+            DateTime dEnd;
+            int nAvailableSlots = 999;
+            int nSlots = 0;
+            int i = 0;
+            CGAvailability pAv;
+            Rectangle crRectA = new Rectangle(0, 0, 1, 0);
+            Rectangle crRectB = new Rectangle(0, 0, 1, 0);
+            bool bIsect;
+            crRectB.Y = GetTotalMinutes(dSelStart);
+            crRectB.Height = GetTotalMinutes(dSelEnd) - crRectB.Y;
+
+            //NOTE: What's this lock? This lock makes sure that nobody is editing the availability array
+            //when we are looking at it. Since the availability array could potentially be updated on
+            //a different thread, we are can be potentially left stuck with an empty array.
+            //
+            //The other place that uses this lock is the RefershAvailabilitySchedule method
+            //
+            //This is a temporary fix until I figure out how to divorce the availbilities here from those drawn
+            //on the calendar. Appointments are cloned b/c they are in an object that supports that; and b/c I
+            //don't need to suddenly query them at runtime like I do with Availabilities.
+
+            lock (this.m_pAvArray)
+            {
+                //loop thru m_pAvArray
+                //Compare the start time and end time of eachblock
+                while (i < m_pAvArray.Count)
+                {
+                    pAv = (CGAvailability)m_pAvArray[i];
+                    dStart = pAv.StartTime;
+                    dEnd = pAv.EndTime;
+                    if ((sResource == pAv.ResourceList) &&
+                        ((dSelStart.Date == dStart.Date) || (dSelStart.Date == dEnd.Date)))
+                    {
+                        crRectA.Y = (dStart.Date < dSelStart.Date) ? 0 : GetTotalMinutes(dStart);
+                        crRectA.Height = (dEnd.Date > dSelEnd.Date) ? 1440 : GetTotalMinutes(dEnd);
+                        crRectA.Height = crRectA.Height - crRectA.Y;
+                        bIsect = crRectA.IntersectsWith(crRectB);
+                        if (bIsect != false)
+                        {
+                            nSlots = pAv.Slots;
+                            if (nSlots < 1)
+                            {
+                                nAvailableSlots = 0;
+                                break;
+                            }
+                            if (nSlots < nAvailableSlots)
+                            {
+                                nAvailableSlots = nSlots;
+                                sAccessType = pAv.AccessTypeName;
+                                sAvailabilityMessage = pAv.Note;
+
+                            }
+                        }//end if
+                    }//end if
+                    i++;
+                }//end while
+            }//end lock
+
+            if (nAvailableSlots == 999)
+            {
+                nAvailableSlots = 0;
+            }
+            return nAvailableSlots;
+            */
+        }
+
+        /// <summary>
+        /// Given a selected date,
+        /// Calculates StartDay and End Day and returns them in output params.  
+        /// nWeeks == number of Weeks to display
+        /// nColumnCount is number of days displayed per week.  
+        /// If 5 columns, begin on Second Day of Week
+        /// If 7 Columns, begin on First Day of Week
+        /// (this is a change from the hardcoded behavior for US-based calendars)
+        /// 
+        /// Returns TRUE if the document's data needs refreshing based on 
+        /// this newly selected date.
+        /// </summary>
+        public bool WeekNeedsRefresh(int nWeeks, DateTime SelectedDate,
+            out DateTime WeekStartDay, out DateTime WeekEndDay)
+        {
+            DateTime OldStartDay = m_dStartDate;
+            DateTime OldEndDay = m_dEndDate;
+            // Week start based on thread locale
+            int nStartWeekDay = (int)System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek;
+            // Current Day
+            int nWeekDay = (int)SelectedDate.DayOfWeek; //0 == Sunday
+
+            // this offset gets approrpriate day based on locale.
+            int nOff = (nStartWeekDay + 1) % 7;
+            TimeSpan ts = new TimeSpan(nWeekDay - nOff, 0, 0, 0); //d,h,m,s
+
+            // if ts is negative, we will jump to the next week in the logic.
+            // to show the correct week, add 7. Confusing, I know.
+            if (ts < new TimeSpan()) ts = ts + new TimeSpan(7, 0, 0, 0);
+
+            if (m_nColumnCount == 1) // if one column start and end on the same day.
+            {
+                ts = new TimeSpan(0, 23, 59, 59);
+                WeekStartDay = SelectedDate;
+                WeekEndDay = WeekStartDay + ts;
+            }
+            else if (m_nColumnCount == 5 || m_nColumnCount == 0) // if 5 column start (or default) at the 2nd day of this week and end in 4:23:59:59 days.
+            {
+                // if picked day is start of week (Sunday in US), start in the next day since that's the first day of work week
+                // else, just substract the calculated time span to get to the start of week (first work day)
+                WeekStartDay = (nWeekDay == nStartWeekDay) ? SelectedDate + new TimeSpan(1, 0, 0, 0) : SelectedDate - ts;
+                // End day calculation
+                int nEnd = 3;
+                ts = new TimeSpan((7 * nWeeks) - nEnd, 23, 59, 59);
+                WeekEndDay = WeekStartDay + ts;
+            }
+            else // if 7 column start at the 1st day of this week and end in 6:23:59:59 days.
+            {
+                // if picked day is start of week, use that. Otherwise, go to the fist work day and substract one to get to start of week.
+                WeekStartDay = (nWeekDay == nStartWeekDay) ? SelectedDate : SelectedDate - ts - new TimeSpan(1, 0, 0, 0);
+                // End day calculation
+                int nEnd = 1;
+                ts = new TimeSpan((7 * nWeeks) - nEnd, 23, 59, 59);
+                WeekEndDay = WeekStartDay + ts;
+            }
+
+            bool bRet = ((WeekStartDay.Date != OldStartDay.Date) || (WeekEndDay.Date != OldEndDay.Date));
+            return bRet;
+        }
+
+        /// <summary>
+        /// Calls RPMS to create appointment then 
+        /// adds appointment to the m_appointments collection
+        /// Returns the IEN of the appointment in the RPMS BSDX APPOINTMENT file.
+        /// </summary>
+        /// <param name="rApptInfo"></param>
+        /// <returns></returns>
+        public int CreateAppointment(CGAppointment rApptInfo)
+        {
+            return CreateAppointment(rApptInfo, false);
+        }
+
+        /// <summary>
+        /// Use this overload to create a walkin appointment
+        /// </summary>
+        /// <param name="rApptInfo"></param>
+        /// <param name="bWalkin"></param>
+        /// <returns></returns>
+        public int CreateAppointment(CGAppointment rApptInfo, bool bWalkin)
+        {
+            // i18n code -- Use culture neutral FMDates
+            string sStart = FMDateTime.Create(rApptInfo.StartTime).FMDateString;
+            string sEnd = FMDateTime.Create(rApptInfo.EndTime).FMDateString;
+
+            TimeSpan sp = rApptInfo.EndTime - rApptInfo.StartTime;
+            string sLen = sp.TotalMinutes.ToString();
+            string sPatID = rApptInfo.PatientID.ToString();
+            string sNote = rApptInfo.Note;
+            string sResource = rApptInfo.Resource;
+
+            string sApptID;
+
+            if (bWalkin == true)
+            {
+                sApptID = "WALKIN";
+            }
+            else
+            {
+                sApptID = rApptInfo.AccessTypeID.ToString();
+            }
+
+            string sSql = "BSDX ADD NEW APPOINTMENT^" + sStart + "^" + sEnd + "^" + sPatID + "^" + sResource + "^" + sLen + "^" + sNote + "^" + sApptID;
+            System.Data.DataTable dtAppt = m_DocManager.RPMSDataTable(sSql, "NewAppointment");
+
+            Debug.Assert(dtAppt.Rows.Count == 1);
+            DataRow r = dtAppt.Rows[0];
+            int nApptID = Convert.ToInt32(r["APPOINTMENTID"]);
+            string sErrorID;
+            sErrorID = r["ERRORID"].ToString();
+            if ((sErrorID != "") || (nApptID < 1))
+            {
+                throw new Exception(sErrorID);
+            }
+
+            //next line is probably done elsewhere
+            rApptInfo.WalkIn = bWalkin ? true : false;
+            rApptInfo.AppointmentKey = nApptID;
+
+            this.m_appointments.AddAppointment(rApptInfo);
+
+            //Have make appointment from CGView responsible for requesting an update for the avialability.
+            //bool bRet = RefreshAvailabilitySchedule();
+
+            //Sam: don't think this is needed as it is called from CGView.
+            //Make CGView responsible for all drawing.
+            //UpdateAllViews();
+
+            return nApptID;
+        }
+
+        public void EditAppointment(CGAppointment pAppt, string sNote)
+        {
+            try
+            {
+                int nApptID = pAppt.AppointmentKey;
+                string sSql = "BSDX EDIT APPOINTMENT^" + nApptID.ToString() + "^" + sNote;
+
+                System.Data.DataTable dtAppt = m_DocManager.RPMSDataTable(sSql, "EditAppointment");
+
+                Debug.Assert(dtAppt.Rows.Count == 1);
+                DataRow r = dtAppt.Rows[0];
+                string sErrorID = r["ERRORID"].ToString();
+                if (sErrorID == "-1")
+                    pAppt.Note = sNote;
+
+                if (this.m_appointments.AppointmentTable.ContainsKey(nApptID))
+                {
+                    bool bRet = RefreshAvailabilitySchedule();
+                    UpdateAllViews();
+                }
+            }
+            catch (Exception ex)
+            {
+                Debug.Write("CGDocument.EditAppointment Failed:  " + ex.Message);
+            }
+        }
+
+        public void CheckInAppointment(int nApptID, DateTime dCheckIn)
+        {
+            string sCheckIn = FMDateTime.Create(dCheckIn).FMDateString;
+
+            string sSql = "BSDX CHECKIN APPOINTMENT^" + nApptID.ToString() + "^" + sCheckIn; // +"^";
+            //sSql += ClinicStopIEN + "^" + ProviderIEN + "^" + PrintRouteSlip + "^";
+            //sSql += PCCClinicIEN + "^" + PCCFormIEN + "^" + PCCOutGuide;
+
+            System.Data.DataTable dtAppt = m_DocManager.RPMSDataTable(sSql, "CheckInAppointment");
+
+            Debug.Assert(dtAppt.Rows.Count == 1);
+            DataRow r = dtAppt.Rows[0];
+            string sErrorID = r["ERRORID"].ToString();
+        }
+
+        public string DeleteAppointment(int nApptID)
+        {
+            return DeleteAppointment(nApptID, true, 0, "");
+        }
+
+        public string DeleteAppointment(int nApptID, bool bClinicCancelled, int nReason, string sRemarks)
+        {
+            //Returns "" if deletion successful
+            //Otherwise, returns reason for failure
+
+            string sClinicCancelled = (bClinicCancelled == true) ? "C" : "PC";
+            string sReasonID = nReason.ToString();
+            string sSql = "BSDX CANCEL APPOINTMENT^" + nApptID.ToString();
+            sSql += "^" + sClinicCancelled;
+            sSql += "^" + sReasonID;
+            sSql += "^" + sRemarks;
+            DataTable dtAppt = m_DocManager.RPMSDataTable(sSql, "DeleteAppointment");
+
+            Debug.Assert(dtAppt.Rows.Count == 1);
+            DataRow r = dtAppt.Rows[0];
+            string sErrorID = r["ERRORID"].ToString();
+            if (sErrorID != "")
+                return sErrorID;
+
+            if (this.m_appointments.AppointmentTable.ContainsKey(nApptID))
+            {
+                this.m_appointments.RemoveAppointment(nApptID);
+                
+                // View responsible for deciding to redraw the grid; not the document now.
+                //bool bRet = RefreshAvailabilitySchedule();
+                //UpdateAllViews();
+            }
+            return "";
+        }
+
+        public string AutoRebook(CGAppointment a, int nSearchType, int nMinimumDays, int nMaximumDays, out CGAppointment aRebook)
+        {
+            //If successful Returns "1" and new start date and time returned in aRebook
+            //Otherwise, returns error message
+
+            CGAppointment aCopy = new CGAppointment();
+            aCopy.CreateAppointment(a.StartTime, a.EndTime, a.Note, 0, a.Resource);
+            aCopy.PatientID = a.PatientID;
+            aCopy.PatientName = a.PatientName;
+            aCopy.HealthRecordNumber = a.HealthRecordNumber;
+            aCopy.AccessTypeID = a.AccessTypeID;
+            aRebook = aCopy;
+
+            //Determine Rebook access type
+            //nSearchType = -1: use current, -2: use any non-zero type, >0 use this access type id
+            int nAVType = 0;
+
+            switch (nSearchType)
+            {
+                case -1:
+                    nAVType = a.AccessTypeID;
+                    break;
+                case -2:
+                    nAVType = 0;
+                    break;
+                default:
+                    nAVType = nSearchType;
+                    break;
+            }
+
+            int nSlots = 0;
+            string sSlots = "";
+            int nAccessTypeID;  //To compare with nAVType
+
+            DateTime dResult = new DateTime(); //StartTime of access block to autorebook into
+
+            //Next two are empty, but needed to pass to CreateAvailabilitySchedule
+            ArrayList alAccessTypes = new ArrayList();
+            string sSearchInfo = "";
+
+            //Find the StartTime of first availability block of this type for this clinic
+            //between nMinimumDays and nMaximumDays
+
+            string sAVStart = a.StartTime.AddDays(nMinimumDays).ToString("M/d/yyyy@H:mm");
+
+            //dtAVEnd is the last day to search
+            DateTime dtAVEnd = a.StartTime.AddDays(nMinimumDays + nMaximumDays);
+            string sAVEnd = dtAVEnd.ToString("M/d/yyyy@H:mm");
+
+            //Increment start day to search a week (or so) at a time
+            //30 is a test increment.  Need to test different values for performance
+            int nIncrement = (nMaximumDays < 30) ? nMaximumDays : 30;
+
+            //nCount and nCountEnd are the 'moving' counters 
+            //that I add to start and end to get the bracket
+            //At the beginning of the DO loop, nCount and nCountEnd are already set
+            bool bFinished = false;
+            bool bFound = false;
+
+            DateTime dStart = a.StartTime.AddDays(nMinimumDays);
+            // v 1.3 i18n support - FM Date passed insated of American Date
+            string sStart = FMDateTime.Create(dStart).DateOnly.FMDateString;
+            DateTime dEnd = dStart.AddDays(nIncrement);
+            do
+            {
+                string sSql = "BSDX REBOOK NEXT BLOCK^" + sStart + "^" + a.Resource + "^" + nAVType.ToString();
+                DataTable dtNextBlock = this.DocManager.RPMSDataTable(sSql, "NextBlock");
+                Debug.Assert(dtNextBlock.Rows.Count == 1);
+                DataRow drNextBlockRow = dtNextBlock.Rows[0];
+
+                object oNextBlock;
+                oNextBlock = drNextBlockRow["NEXTBLOCK"];
+                if (oNextBlock.GetType() == typeof(System.DBNull))
+                    break;
+                DateTime dNextBlock = (DateTime)drNextBlockRow["NEXTBLOCK"];
+                if (dNextBlock > dtAVEnd)
+                {
+                    break;
+                }
+
+                dStart = dNextBlock;
+                dEnd = dStart.AddDays(nIncrement);
+                if (dEnd > dtAVEnd)
+                    dEnd = dtAVEnd;
+
+                DataTable dtResult = CGSchedLib.CreateAvailabilitySchedule(m_DocManager, this.Resources, dStart, dEnd, alAccessTypes, ScheduleType.Resource, sSearchInfo);
+                //Loop thru dtResult looking for a slot having the required availability type.
+                //If found, set bFinished = true;	
+                foreach (DataRow dr in dtResult.Rows)
+                {
+
+                    sSlots = dr["SLOTS"].ToString();
+                    if (sSlots == "")
+                        sSlots = "0";
+                    nSlots = Convert.ToInt16(sSlots);
+                    if (nSlots > 0)
+                    {
+                        nAccessTypeID = 0;  //holds the access type id of the availability block
+                        if (dr["ACCESS_TYPE"].ToString() != "")
+                            nAccessTypeID = Convert.ToInt16(dr["ACCESS_TYPE"].ToString());
+                        if ((nSearchType == -2) && (nAccessTypeID > 0)) //Match on any non-zero type
+                        {
+                            bFinished = true;
+                            bFound = true;
+                            dResult = (DateTime)dr["START_TIME"];
+                            break;
+                        }
+                        if (nAccessTypeID == nAVType)
+                        {
+                            bFinished = true;
+                            bFound = true;
+                            dResult = (DateTime)dr["START_TIME"];
+                            break;
+                        }
+                    }
+                }
+                dStart = dEnd.AddDays(1);
+                dEnd = dStart.AddDays(nIncrement);
+                if (dEnd > dtAVEnd)
+                    dEnd = dtAVEnd;
+            } while (bFinished == false);
+
+            if (bFound == true)
+            {
+                aCopy.StartTime = dResult;
+                aCopy.EndTime = dResult.AddMinutes(a.Duration);
+                //Create the appointment
+                //Set the AUTOREBOOKED flag 
+                //and store the "AutoRebooked To DateTime" 
+                //in each autorebooked appointment
+                this.CreateAppointment(aCopy);
+                SetAutoRebook(a, dResult);
+                return "1";
+            }
+            else
+            {
+                return "0";
+            }
+        }
+
+        private void SetAutoRebook(CGAppointment a, DateTime dtRebookedTo)
+        {
+            string sApptKey = a.AppointmentKey.ToString();
+            //string sRebookedTo = dtRebookedTo.ToString("M/d/yyyy@HH:mm");
+            // i18n
+            string sRebookedTo = FMDateTime.Create(dtRebookedTo).FMDateString;
+            string sSql = "BSDX REBOOK SET^" + sApptKey + "^" + sRebookedTo;
+            System.Data.DataTable dtRebook = m_DocManager.RPMSDataTable(sSql, "AutoRebook");
+
+        }
+
+        public string AppointmentNoShow(CGAppointment a, bool bNoShow)
+        {
+            /*
+             * BSDX NOSHOW RPC Returns 1  in ERRORID if  successfully sets NOSHOW flag in BSDX APPOINTMENT and, if applicable, File 2
+             *Otherwise, returns negative numbers for failure and errormessage in ERRORTXT
+             *
+             */
+            int nApptID = a.AppointmentKey;
+            string sTest = bNoShow.ToString();
+            string sNoShow = (bNoShow == true) ? "1" : "0";
+            string sSql = "BSDX NOSHOW^" + nApptID.ToString();
+            sSql += "^";
+            sSql += sNoShow;
+
+            DataTable dtAppt = m_DocManager.RPMSDataTable(sSql, "AppointmentNoShow");
+
+            Debug.Assert(dtAppt.Rows.Count == 1);
+            DataRow r = dtAppt.Rows[0];
+            string sErrorID = r["ERRORID"].ToString();
+            if (sErrorID != "1")
+            {
+                return r["ERRORTEXT"].ToString();
+            }
+
+            //All okay over here... then set appointment noshow or not no show...
+            a.NoShow = bNoShow ? true : false;
+
+            //bool bRet = RefreshSchedule();
+
+            return sErrorID;
+        }
+
+        public bool AppointmentUndoCheckin(CGAppointment a, out string msg)
+        {
+            msg = "";
+            //zero good, anything else bad
+            DataTable dt = CGDocumentManager.Current.DAL.RemoveCheckIn(a.AppointmentKey);
+            if (dt.Rows[0][0].ToString() == "0")
+            {
+                a.CheckInTime = DateTime.MinValue; // remove check-in time.
+                return true;
+            }
+
+            else
+            {
+                msg = dt.Rows[0][0].ToString();
+                return false;
+            }
+        }
+
+        //DON'T USE OBVIOUSLY. JUST FOR TESTING.
+        public void ThrowException()
+        {
+            throw new Exception("Hello World. I am an Exception.");
+        }
+
+        #endregion Methods
+
+    }//End class
+}//End namespace
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGDocumentManager.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGDocumentManager.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGDocumentManager.cs	(revision 1134)
@@ -0,0 +1,1339 @@
+using System;
+using System.Windows.Forms;
+using System.Collections;
+using System.Data;
+using System.Diagnostics;
+using System.Threading;
+using IndianHealthService.BMXNet;
+using Mono.Options;
+using System.Runtime.InteropServices;
+using System.Globalization;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Main Worker. Handles sub-forms.
+	/// </summary>
+	public class CGDocumentManager //: System.Windows.Forms.Form
+	{
+		#region Member Variables
+
+		private static CGDocumentManager	_current;
+		private Hashtable					_views = new Hashtable();       //Returns the list of currently opened documents
+		private Hashtable					m_AVViews = new Hashtable();    // List of currently opened CGAVViews
+		private string						m_sWindowText = "Clinical Scheduling"; //Default Window Text
+		private bool						m_bSchedManager = false;    // Do you have the XUPROGMODE or BSDXZMGR?
+		private bool						m_bExitOK = true;           // Okay to exit program? Used to control Re-logins. Default true.
+        public string                       m_sHandle = "0";            // Not Used
+        
+        //Connection variables (tied to command line parameters /a /v /s /p /e)
+        private string                      m_AccessCode="";
+        private string                      m_VerifyCode="";
+        private string                      m_Server="";
+        private int                         m_Port=0;
+        private string                      m_Encoding="";  //Encoding is "" by default;
+
+        //Globalization Object (tied to command line parameter /culture)
+        private string                      m_CultureName = "";
+
+        //Data Access Layer
+        private DAL                         _dal = null;
+
+		//M Connection member variables
+		private DataSet									m_dsGlobal = null;      // Holds all user data
+		private BMXNetConnectInfo						m_ConnectInfo = null;   // Connection to VISTA object
+        private BMXNetConnectInfo.BMXNetEventDelegate CDocMgrEventDelegate;     // Delegate to respond to messages from VISTA. Responds to event: BMXNetConnectInfo.BMXNetEvent
+
+        //Custom Printing
+        private Printing                          m_PrintingObject = null; 
+		#endregion
+
+        #region Properties
+
+        /// <summary>
+        /// Returns the document manager's BMXNetConnectInfo member
+        /// </summary>
+        public BMXNetConnectInfo ConnectInfo
+        {
+            get
+            {
+                return m_ConnectInfo;
+            }
+        }
+
+        /// <summary>
+        /// True if the current user holds the BSDXZMGR or XUPROGMODE keys in RPMS
+        /// </summary>
+        public bool ScheduleManager
+        {
+            get
+            {
+                return m_bSchedManager;
+            }
+        }
+
+        /// <summary>
+        /// Holds the user and division
+        /// </summary>
+        public string WindowText
+        {
+            get
+            {
+                return m_sWindowText;
+            }
+        }
+
+        /// <summary>
+        /// This dataset contains tables used by the entire application
+        /// </summary>		
+        public DataSet GlobalDataSet
+        {
+            get
+            {
+                return m_dsGlobal;
+            }
+            set
+            {
+                m_dsGlobal = value;
+            }
+        }
+
+        /// <summary>
+        /// User Preferences Auto Property
+        /// </summary>
+        public UserPreferences UserPreferences { get; private set; }
+ 
+        /// <summary>
+        /// Returns the single CGDocumentManager object
+        /// </summary>
+        public static CGDocumentManager Current
+        {
+            get
+            {
+                return _current;
+            }
+        }
+
+
+        /// <summary>
+        /// Returns the list of currently opened documents
+        /// </summary>
+        public Hashtable Views
+        {
+            get
+            {
+                return _views;
+            }
+        }
+
+        /// <summary>
+        /// Returns the list of currently opened CGAVViews
+        /// </summary>
+        public Hashtable AvailabilityViews
+        {
+            get
+            {
+                return this.m_AVViews;
+            }
+        }
+
+        public DAL DAL
+        {
+            get { return this._dal; }
+        }
+
+        public Printing PrintingObject
+        {
+            get
+            {
+                return this.m_PrintingObject;
+            }
+        }
+        #endregion
+
+        /// <summary>
+        /// Constructor. Does absolutely nothing at this point.
+        /// </summary>
+		public CGDocumentManager()
+		{
+        }
+
+
+#if DEBUG
+        //To write to the console
+        [DllImport("kernel32.dll")]
+        static extern bool AttachConsole(int dwProcessId);
+        private const int ATTACH_PARENT_PROCESS = -1;
+#endif
+        /// <summary>
+        /// Main Entry Point
+        /// </summary>
+        /// <param name="args">We accept the following Arguments:
+        /// /s or -s = Server ip address or name
+        /// /p or -p = port number (must be numeric)
+        /// /a or -a = Access Code
+        /// /v or -v = Verify Code
+        /// /e or -e = Encoding (name of encoding as known to windows, such as windows-1256)
+        /// /culture or -culture = Culture Name for UI Culture if you wish to override the Windows Culture
+        /// </param>
+        /// <remarks>
+        /// Encoding decision is complex. This is the order of priority:
+        /// - If the M DB runs in UTF-8, that's what we are going to use.
+        /// - If that's not so, /e sets the default encoding. If /e is a non-existent encoding, move to next step.
+        /// - If /e is not supplied or is not recognized, the default encoding is the Windows default Encoding for the user.
+        /// </remarks>
+        [STAThread()]
+        static void Main(string[] args)
+        {
+            //Application wide error handler for unhandled errors (later I figure out that's only for WinForm ex'es)
+            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
+            Application.ThreadException += new ThreadExceptionEventHandler(App_ThreadException);
+
+            // Add the event handler for handling non-UI thread exceptions to the event. 
+            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(App_DomainException);
+
+#if DEBUG
+            // Print console messages to console if launched from console
+            // Note: Imported From kernel32.dll
+            AttachConsole(ATTACH_PARENT_PROCESS);
+#endif
+
+#if TRACE
+            DateTime startLoadTime = DateTime.Now;
+#endif
+
+            //Store a class instance of manager. Actual constructor does nothing.
+            _current = new CGDocumentManager();
+
+            //Get command line options; store in private class wide variables
+            var opset = new OptionSet() {
+                { "s=", s => _current.m_Server = s },
+                { "p=", p => _current.m_Port = int.Parse(p) },
+                { "a=", a => _current.m_AccessCode = a },
+                { "v=", v => _current.m_VerifyCode = v },
+                { "e=", e => _current.m_Encoding = e},
+                { "culture=", culture => _current.m_CultureName = culture }
+            };
+
+            opset.Parse(args);
+            
+            //Init app
+            bool isEverythingOkay = _current.InitializeApp();
+
+            //if an error occurred, break out.
+            if (!isEverythingOkay) return;
+
+            //Create the first empty document
+            //A document holds the resources, appointments, and availabilites
+            //SAM: Good place for break point
+            CGDocument doc = new CGDocument();
+            doc.DocManager = _current;
+
+            //Create new View
+            //A view is a specific arrangement of appointments and availabilites that constitute a document
+            CGView view = new CGView();
+            view.InitializeDocView(doc, _current, doc.StartDate, _current.WindowText);
+
+            //Handle BMX Event
+            Application.DoEvents();
+
+            //test
+            //doc.ThrowException();
+            //test
+
+#if TRACE
+            DateTime EndLoadTime = DateTime.Now;
+            TimeSpan LoadTime = EndLoadTime - startLoadTime;
+            Debug.Write("Load Time for GUI is " + LoadTime.Seconds + " s & " + LoadTime.Milliseconds + " ms\n");
+#endif
+            
+            view.Show();
+            view.Activate();
+            
+            Application.Run();
+        }
+
+        /// <summary>
+        /// Exception handler for application errors. Only for WinForm Errors.
+        /// </summary>
+        /// <remarks>Never tested. I can't get an error to go here!</remarks>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        static void App_ThreadException(object sender, ThreadExceptionEventArgs e)
+        {
+            string msg = "A problem has occured in this applicaton. \r\n\r\n" +
+                "\t" + e.Exception.Message + "\r\n\r\n" +
+                "Would you like to continue the application?";
+
+            DialogResult res = MessageBox.Show(msg, "Unexpected Error", MessageBoxButtons.YesNo);
+
+            if (res == DialogResult.Yes) return;
+            else Application.Exit();
+        }
+
+        /// <summary>
+        /// If we are here, we are dead meat.
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        static void App_DomainException(object sender, UnhandledExceptionEventArgs e)
+        {
+            if (e.ExceptionObject is System.Net.Sockets.SocketException)
+            {
+                MessageBox.Show("Looks like we lost our connection with the server\nClick OK to terminate the application.");
+            }
+            else
+            {
+                Exception ex = e.ExceptionObject as Exception;
+
+                string msg = "A problem has occured in this applicaton. \r\n\r\n" +
+                    "\t" + ex.InnerException.Message;
+
+                MessageBox.Show(msg, "Unexpected Error");
+            }
+        }// here application terminates
+
+        #region BMXNet Event Handler
+        private void CDocMgrEventHandler(Object obj, BMXNet.BMXNetEventArgs e)
+		{
+			if (e.BMXEvent == "BSDX CALL WORKSTATIONS")
+			{
+				string sParam = "";
+				string sDelim="~";
+				sParam += this.m_ConnectInfo.UserName + sDelim;
+				sParam += this.m_sHandle + sDelim;
+				sParam += Application.ProductVersion + sDelim;
+				sParam += this._views.Count.ToString();
+				_current.m_ConnectInfo.RaiseEvent("BSDX WORKSTATION REPORT", sParam, true);
+			}
+			if (e.BMXEvent == "BSDX ADMIN MESSAGE")
+			{
+				string sMsg = e.BMXParam;
+				ShowAdminMsgDelegate samd = new ShowAdminMsgDelegate(ShowAdminMsg);
+				//this.Invoke(samd, new object [] {sMsg});
+                samd.Invoke(sMsg);
+			}
+			if (e.BMXEvent == "BSDX ADMIN SHUTDOWN")
+			{
+				string sMsg = e.BMXParam;
+				CloseAllDelegate cad = new CloseAllDelegate(CloseAll);
+				//this.Invoke(cad, new object [] {sMsg});
+                cad.Invoke(sMsg);
+			}
+		}
+		
+		delegate void ShowAdminMsgDelegate(string sMsg);
+
+		private void ShowAdminMsg(string sMsg)
+		{
+			MessageBox.Show(sMsg, "Message from Scheduling Administrator", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+        }
+
+        #endregion  BMXNet Event Handler
+
+
+		#region Methods & Events
+
+        /// <summary>
+        /// See InitializeApp(bool) below
+        /// </summary>
+		private bool InitializeApp()
+		{
+			return InitializeApp(false);
+		}
+
+		/// <summary>
+		/// Does a million things:
+        /// 1. Starts Connection and displays log-in dialogs
+        /// 2. Starts Splash screen
+        /// 3. Loads data tables
+		/// </summary>
+		/// <param name="bReLogin">Is the User logging in again from a currently running instance?
+        /// If so, display a dialog to collect access and verify codes.</param>
+        private bool InitializeApp(bool bReLogin)
+		{
+            //Set M connection info
+            m_ConnectInfo = new BMXNetConnectInfo(m_Encoding); // Encoding is "" unless passed in command line
+            _dal = new DAL(m_ConnectInfo);   // Data access layer
+            //m_ConnectInfo.bmxNetLib.StartLog();    //This line turns on logging of messages
+            
+            //Create a delegate to process events raised by BMX.
+            CDocMgrEventDelegate = new BMXNetConnectInfo.BMXNetEventDelegate(CDocMgrEventHandler);
+            //Tie delegate to Events generated by BMX.
+            m_ConnectInfo.BMXNetEvent += CDocMgrEventDelegate;
+            //Disable polling (But does this really work???? I don't see how it gets disabled)
+            m_ConnectInfo.EventPollingEnabled = false;
+
+            //Show a splash screen while initializing; define delegates to remote thread
+            DSplash m_ds = new DSplash();
+            DSplash.dSetStatus setStatusDelegate = new DSplash.dSetStatus(m_ds.SetStatus);
+            DSplash.dAny closeSplashDelegate = new DSplash.dAny(m_ds.RemoteClose);
+            DSplash.dProgressBarSet setMaxProgressDelegate = new DSplash.dProgressBarSet(m_ds.RemoteProgressBarMaxSet);
+            DSplash.dProgressBarSet setProgressDelegate = new DSplash.dProgressBarSet(m_ds.RemoteProgressBarValueSet);
+
+            //Start new thread for the Splash screen.
+            Thread threadSplash = new Thread(new ParameterizedThreadStart(frm => ((DSplash)frm).ShowDialog()));
+            threadSplash.IsBackground = true; //expendable thread -- exit even if still running.
+            threadSplash.Name = "Splash Thread";
+            threadSplash.Start(m_ds); // pass form as parameter.
+
+            //There are 21 steps to load the application. That's max for the progress bar.
+            setMaxProgressDelegate(21);
+            
+            // smh--not used: System.Configuration.ConfigurationManager.GetSection("appSettings");
+            
+            setStatusDelegate("Connecting to VISTA");
+            
+            //Try to connect using supplied values for Server and Port
+            //Why am I doing this? The library BMX net uses prompts for access and verify code
+            //whether you can connect or not. Not good. So I test first whether
+            //we can connect at all by doing a simple connection and disconnect.
+            //TODO: Make this more robust by sending a TCPConnect message and seeing if you get a response
+            if (m_Server != "" && m_Port != 0)
+            {
+                System.Net.Sockets.TcpClient tcpClient = new System.Net.Sockets.TcpClient();
+                try
+                {
+                    tcpClient.Connect(m_Server, m_Port); // open it
+                    tcpClient.Close();                  // then close it
+                }
+                catch (System.Net.Sockets.SocketException)
+                {
+                    MessageBox.Show("Cannot connect to VistA. Network Error");
+                    return false;
+                }
+            }
+
+
+            bool bRetry = true;
+
+            // Do block is Log-in logic
+            do
+			{
+                // login crap
+                try
+                {
+                    // Not my code
+                    if (bReLogin == true)
+                    {
+                        //Prompt for Access and Verify codes
+                        _current.m_ConnectInfo.LoadConnectInfo("", "");
+                    }
+                    // My code -- buts looks so ugly!
+                    // Checks the passed parameters stored in the class variables
+                    else
+                    {
+                        if (m_Server != String.Empty && m_Port != 0 && m_AccessCode != String.Empty
+                            && m_VerifyCode != String.Empty)
+                        {
+                            m_ConnectInfo.LoadConnectInfo(m_Server, m_Port, m_AccessCode, m_VerifyCode);
+                        }
+                        else if (m_Server != String.Empty && m_Port != 0)
+                            m_ConnectInfo.LoadConnectInfo(m_Server, m_Port, "", "");
+                        else
+                            m_ConnectInfo.LoadConnectInfo();
+                    }
+                    bRetry = false;
+                }
+                catch (System.Net.Sockets.SocketException)
+                {
+                    MessageBox.Show("Cannot connect to VistA. Network Error");
+                }
+                catch (BMXNetException ex)
+                {
+                    if (MessageBox.Show("Unable to connect to VistA.  " + ex.Message, "Clinical Scheduling", MessageBoxButtons.RetryCancel) == DialogResult.Retry)
+                    {
+                        bRetry = true;
+                        //I hate this, but this is how the library is designed. It throws an error if the user cancels. XXX: Won't fix library until BMX 4.0 port.
+                        try { _current.m_ConnectInfo.ChangeServerInfo(); }
+                        catch (Exception) 
+                        {
+                            closeSplashDelegate();
+                            bRetry = false;
+                            return false; //tell main that it's a no go.
+                        }
+                    }
+                    else
+                    {
+                        closeSplashDelegate();
+                        bRetry = false;
+                        return false; //tell main that it's a no go.
+                    }
+                }
+			}while (bRetry == true);
+            
+            //Printing
+
+            string DllLocation = string.Empty;
+            System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(Application.StartupPath + @"\Printing\");
+            if (di.Exists)
+            {
+                System.IO.FileInfo[] rgFiles = di.GetFiles("*.dll");
+                
+                foreach (System.IO.FileInfo fi in rgFiles)
+                {
+                    DllLocation = fi.FullName;
+                }
+            }
+
+            PrintingCreator Creator = null;
+            if (DllLocation == string.Empty)
+            {
+                this.m_PrintingObject = new Printing();
+            }
+            else
+            {
+                System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(DllLocation);
+                foreach (Type type in assembly.GetTypes())
+                {
+                    if (type.IsClass == true & type.BaseType == typeof(PrintingCreator))
+                    {
+                        Creator = (PrintingCreator)Activator.CreateInstance(type);
+                        break;
+                    }
+                }
+                this.m_PrintingObject = Creator.PrintFactory();
+            }
+           
+            
+            //User Interface Culture (m_CultureName is set from the command line flag /culture)
+            //
+            //If passed, set that try that culture; fail over to Invariant Culture
+            if (m_CultureName != String.Empty)
+            {
+                try { Thread.CurrentThread.CurrentUICulture = new CultureInfo(m_CultureName); }
+                catch (CultureNotFoundException) { Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; }
+            }
+            //otherwise, use the Current Computer Culture, EVEN IF (!!) the UI Culture is different.
+            //this allows localization even if Windows still displays messages in English.
+            else
+            {
+                Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
+            }
+
+            //Create global dataset
+			_current.m_dsGlobal = new DataSet("GlobalDataSet");
+
+			//Version info
+            // Table #1
+            setProgressDelegate(1);
+			setStatusDelegate("Getting Version Info from Server...");
+
+            DataTable ver = _dal.GetVersion("BSDX");
+            ver.TableName = "VersionInfo";
+            m_dsGlobal.Tables.Add(ver);
+                
+			//How to extract the version numbers:
+            DataTable dtVersion = m_dsGlobal.Tables["VersionInfo"];
+            Debug.Assert(dtVersion.Rows.Count == 1);
+            DataRow rVersion = dtVersion.Rows[0];
+            string sMajor = rVersion["MAJOR_VERSION"].ToString();
+            string sMinor = rVersion["MINOR_VERSION"].ToString();
+            string sBuild = rVersion["BUILD"].ToString();
+            decimal fBuild = Convert.ToDecimal(sBuild);
+
+            //Make sure that the server is running the same version the client is.
+            Version x = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
+
+            //if version numbers mismatch, don't continue.
+            if (!(x.Major.ToString() == sMajor && x.Minor.ToString() == sMinor))
+            {
+                MessageBox.Show(
+                    "Server runs version " + sMajor + "." + sMinor + "\r\n" +
+                    "You are running " + x.ToString() + "\r\n\r\n" +
+                    "Major, Minor and Build versions must match",
+                    "Version Mismatch");
+                closeSplashDelegate();
+                return false;
+            }
+ 
+
+            //Change encoding
+            // Call #2
+            setProgressDelegate(2);
+            setStatusDelegate("Setting encoding...");
+
+            if (m_Encoding == String.Empty)
+            {
+                string utf8_server_support = m_ConnectInfo.bmxNetLib.TransmitRPC("BMX UTF-8", "");
+                if (utf8_server_support == "1")
+                    m_ConnectInfo.bmxNetLib.Encoder = System.Text.UTF8Encoding.UTF8;
+            }
+			
+            //Set application context
+            // Call #3
+            setProgressDelegate(3);
+			setStatusDelegate("Setting Application Context to BSDXRPC...");
+			m_ConnectInfo.AppContext = "BSDXRPC";
+
+            //User Preferences Object
+            setProgressDelegate(4); //next number is 6 b/c two calls
+            setStatusDelegate("Getting User Preferences from the Server...");
+
+            _current.UserPreferences = new UserPreferences(); // Does the calling to do that...
+            
+            //Load global recordsets
+            string statusConst = "Loading VistA data tables...";
+			setStatusDelegate(statusConst);
+
+            string sCommandText;
+
+            //Schedule User Info
+            // Table #4
+            setProgressDelegate(6);
+            setStatusDelegate(statusConst + " Schedule User");
+            DataTable dtUser = _dal.GetUserInfo(m_ConnectInfo.DUZ);
+            dtUser.TableName = "SchedulingUser";
+            m_dsGlobal.Tables.Add(dtUser);
+            Debug.Assert(dtUser.Rows.Count == 1);
+
+            // Only one row and one column named "MANAGER". Set local var m_bSchedManager to true if Manager.
+            DataRow rUser = dtUser.Rows[0];
+            Object oUser = rUser["MANAGER"];
+            string sUser = oUser.ToString();
+            m_bSchedManager = (sUser == "YES") ? true : false;
+
+            //Get Access Types
+            // Table #5
+            setProgressDelegate(7);
+            setStatusDelegate(statusConst + " Access Types");
+            DataTable dtAccessTypes = _dal.GetAccessTypes();
+            dtAccessTypes.TableName = "AccessTypes";
+            m_dsGlobal.Tables.Add(dtAccessTypes);
+
+            //Get Access Groups
+            // Table #6
+            setProgressDelegate(8);
+            setStatusDelegate(statusConst + " Access Groups");
+            LoadAccessGroupsTable();
+
+            //Build Primary Key for AccessGroup table
+            DataTable dtGroups = m_dsGlobal.Tables["AccessGroup"];
+            DataColumn dcKey = dtGroups.Columns["ACCESS_GROUP"];
+            DataColumn[] dcKeys = new DataColumn[1];
+            dcKeys[0] = dcKey;
+            dtGroups.PrimaryKey = dcKeys;
+
+            //Get Access Group Types (Combines Access Types and Groups)
+            //Optimization Note: Can eliminate Access type and Access Group Table
+            // But they are heavily referenced throughout the code.
+            // Table #7
+            setProgressDelegate(9);
+            setStatusDelegate(statusConst + " Access Group Types");
+            LoadAccessGroupTypesTable();
+
+            //Build Primary Key for AccessGroupType table
+            DataTable dtAGTypes = m_dsGlobal.Tables["AccessGroupType"];
+            DataColumn dcGTKey = dtAGTypes.Columns["ACCESS_GROUP_TYPEID"];
+            DataColumn[] dcGTKeys = new DataColumn[1];
+            dcGTKeys[0] = dcGTKey;
+            dtAGTypes.PrimaryKey = dcGTKeys;
+
+            //Build Data Relationship between AccessGroupType and AccessTypes tables
+            DataRelation dr = new DataRelation("AccessGroupType",	//Relation Name
+                m_dsGlobal.Tables["AccessGroup"].Columns["BMXIEN"],	//Parent
+                m_dsGlobal.Tables["AccessGroupType"].Columns["ACCESS_GROUP_ID"]);	//Child
+            m_dsGlobal.Relations.Add(dr);
+
+            //ResourceGroup Table (Resource Groups by User)
+            // Table #8
+            // What shows up on the tree. The groups the user has access to.
+            setProgressDelegate(10);
+            setStatusDelegate(statusConst + " Resource Groups By User");
+            LoadResourceGroupTable();
+
+            //Resources by user
+            // Table #9
+            // Individual Resources
+            setProgressDelegate(11);
+            setStatusDelegate(statusConst + " Resources By User");
+            LoadBSDXResourcesTable();
+
+            //Build Primary Key for Resources table
+            DataColumn[] dc = new DataColumn[1];
+            dc[0] = m_dsGlobal.Tables["Resources"].Columns["RESOURCEID"];
+            m_dsGlobal.Tables["Resources"].PrimaryKey = dc;
+
+            //GroupResources table
+            // Table #10
+            // Resource Groups and Indivdual Resources together
+            setProgressDelegate(12);
+            setStatusDelegate(statusConst + " Group Resources");
+            LoadGroupResourcesTable();
+
+            //Build Primary Key for ResourceGroup table
+            dc = new DataColumn[1];
+            dc[0] = m_dsGlobal.Tables["ResourceGroup"].Columns["RESOURCE_GROUP"];
+            m_dsGlobal.Tables["ResourceGroup"].PrimaryKey = dc;
+
+            //Build Data Relationships between ResourceGroup and GroupResources tables
+            dr = new DataRelation("GroupResource",	//Relation Name
+                m_dsGlobal.Tables["ResourceGroup"].Columns["RESOURCE_GROUP"],	//Parent
+                m_dsGlobal.Tables["GroupResources"].Columns["RESOURCE_GROUP"]);	//Child
+
+            m_dsGlobal.Relations.Add(dr);
+
+            //HospitalLocation table
+            //Table #11
+            setProgressDelegate(13);
+            setStatusDelegate(statusConst + " Clinics");
+            //cmd.CommandText = "SELECT BMXIEN 'HOSPITAL_LOCATION_ID', NAME 'HOSPITAL_LOCATION', DEFAULT_PROVIDER, STOP_CODE_NUMBER, INACTIVATE_DATE, REACTIVATE_DATE FROM HOSPITAL_LOCATION";
+            sCommandText = "BSDX HOSPITAL LOCATION";
+            ConnectInfo.RPMSDataTable(sCommandText, "HospitalLocation", m_dsGlobal);
+            Debug.Write("LoadGlobalRecordsets -- HospitalLocation loaded\n");
+
+            //Build Primary Key for HospitalLocation table
+            dc = new DataColumn[1];
+            DataTable dtTemp = m_dsGlobal.Tables["HospitalLocation"];
+            dc[0] = dtTemp.Columns["HOSPITAL_LOCATION_ID"];
+            m_dsGlobal.Tables["HospitalLocation"].PrimaryKey = dc;
+
+            //Build Data Relationships between Resources and HospitalLocation tables
+            dr = new DataRelation("HospitalLocationResource",	//Relation Name
+                m_dsGlobal.Tables["HospitalLocation"].Columns["HOSPITAL_LOCATION_ID"],	//Parent
+                m_dsGlobal.Tables["Resources"].Columns["HOSPITAL_LOCATION_ID"], false);	//Child
+            m_dsGlobal.Relations.Add(dr);
+
+            //Build ScheduleUser table
+            //Table #12
+            setProgressDelegate(14);
+            setStatusDelegate(statusConst + " Schedule User");
+            this.LoadScheduleUserTable();
+
+            //Build Primary Key for ScheduleUser table
+            dc = new DataColumn[1];
+            dtTemp = m_dsGlobal.Tables["ScheduleUser"];
+            dc[0] = dtTemp.Columns["USERID"];
+            m_dsGlobal.Tables["ScheduleUser"].PrimaryKey = dc;
+
+            //Build ResourceUser table
+            //Table #13
+            //Acess to Resources by [this] User
+            setProgressDelegate(15);
+            setStatusDelegate(statusConst + " Resource User");
+            this.LoadResourceUserTable();
+
+            //Build Primary Key for ResourceUser table
+            dc = new DataColumn[1];
+            dtTemp = m_dsGlobal.Tables["ResourceUser"];
+            dc[0] = dtTemp.Columns["RESOURCEUSER_ID"];
+            m_dsGlobal.Tables["ResourceUser"].PrimaryKey = dc;
+
+            //Create relation between BSDX Resource and BSDX Resource User tables
+            dr = new DataRelation("ResourceUser",	//Relation Name
+                m_dsGlobal.Tables["Resources"].Columns["RESOURCEID"],	//Parent
+                m_dsGlobal.Tables["ResourceUser"].Columns["RESOURCEID"]);	//Child
+            m_dsGlobal.Relations.Add(dr);
+
+            //Build active provider table
+            //Table #14
+            //TODO: Lazy load the provider table; no need to load in advance.
+            setProgressDelegate(16);
+            setStatusDelegate(statusConst + " Providers");
+            sCommandText = "SELECT BMXIEN, NAME FROM NEW_PERSON WHERE INACTIVE_DATE = '' AND BMXIEN > 1";
+            ConnectInfo.RPMSDataTable(sCommandText, "Provider", m_dsGlobal);
+            Debug.Write("LoadGlobalRecordsets -- Provider loaded\n");
+
+            //Build the HOLIDAY table
+            //Table #15
+            setProgressDelegate(17);
+            setStatusDelegate(statusConst + " Holiday");
+            sCommandText = "SELECT NAME, DATE FROM HOLIDAY WHERE INTERNAL[DATE] > '" + FMDateTime.Create(DateTime.Today).DateOnly.FMDateString + "'";
+            ConnectInfo.RPMSDataTable(sCommandText, "HOLIDAY", m_dsGlobal);
+            Debug.Write("LoadingGlobalRecordsets -- Holidays loaded\n");
+
+
+            //Save the xml schema
+            //m_dsGlobal.WriteXmlSchema(@"..\..\csSchema20060526.xsd");
+            //----------------------------------------------
+
+            setStatusDelegate("Setting Receive Timeout");
+            _current.m_ConnectInfo.ReceiveTimeout = 30000; //30-second timeout
+
+#if DEBUG
+            _current.m_ConnectInfo.ReceiveTimeout = 600000; //longer timeout for debugging
+#endif 
+			// Event Subsriptions
+            setStatusDelegate("Subscribing to Server Events");
+            //Table #16
+            setProgressDelegate(18);
+            _current.m_ConnectInfo.SubscribeEvent("BSDX SCHEDULE");
+			//Table #17
+            setProgressDelegate(19);
+            _current.m_ConnectInfo.SubscribeEvent("BSDX CALL WORKSTATIONS");
+			//Table #18
+            setProgressDelegate(20);
+            _current.m_ConnectInfo.SubscribeEvent("BSDX ADMIN MESSAGE");
+			//Table #19
+            setProgressDelegate(21);
+            _current.m_ConnectInfo.SubscribeEvent("BSDX ADMIN SHUTDOWN");
+
+			_current.m_ConnectInfo.EventPollingInterval = 5000; //in milliseconds
+			_current.m_ConnectInfo.EventPollingEnabled = true;
+			_current.m_ConnectInfo.AutoFire = 12; //AutoFire every 12*5 seconds
+
+            //Close Splash Screen
+            closeSplashDelegate();
+
+            return true;
+			
+		}
+
+
+
+		public void LoadAccessGroupsTable()
+		{
+			string sCommandText = "SELECT * FROM BSDX_ACCESS_GROUP";
+			ConnectInfo.RPMSDataTable(sCommandText, "AccessGroup", m_dsGlobal);
+			Debug.Write("LoadGlobalRecordsets -- AccessGroups loaded\n");
+		}
+
+		public void LoadAccessGroupTypesTable()
+		{
+			string sCommandText = "BSDX GET ACCESS GROUP TYPES";
+			ConnectInfo.RPMSDataTable(sCommandText, "AccessGroupType", m_dsGlobal);
+			Debug.Write("LoadGlobalRecordsets -- AccessGroupTypes loaded\n");
+		}
+
+		public void LoadBSDXResourcesTable()
+		{
+			string sCommandText = "BSDX RESOURCES^" + m_ConnectInfo.DUZ;
+			ConnectInfo.RPMSDataTable(sCommandText, "Resources", m_dsGlobal);
+			Debug.Write("LoadGlobalRecordsets -- Resources loaded\n");
+		}
+		
+		public void LoadResourceGroupTable()
+		{
+			//ResourceGroup Table (Resource Groups by User)
+			//Table "ResourceGroup" contains all resource group names
+			//to which user has access
+			//Fields are: RESOURCE_GROUPID, RESOURCE_GROUP
+			string sCommandText = "BSDX RESOURCE GROUPS BY USER^" + m_ConnectInfo.DUZ;
+			ConnectInfo.RPMSDataTable(sCommandText, "ResourceGroup", m_dsGlobal);
+			Debug.Write("LoadGlobalRecordsets -- ResourceGroup loaded\n");
+		}
+
+		public void LoadGroupResourcesTable()
+		{
+			//Table "GroupResources" contains all active GROUP/RESOURCE combinations
+			//to which user has access based on entries in BSDX RESOURCE USER file
+			//If user has BSDXZMGR or XUPROGMODE keys, then ALL Group/Resource combinstions
+			//are returned.
+			//Fields are: RESOURCE_GROUPID, RESOURCE_GROUP, RESOURCE_GROUP_ITEMID, RESOURCE_NAME, RESOURCE_ID
+			string sCommandText = "BSDX GROUP RESOURCE^" + m_ConnectInfo.DUZ;
+			ConnectInfo.RPMSDataTable(sCommandText, "GroupResources", m_dsGlobal);
+			Debug.Write("LoadGlobalRecordsets -- GroupResources loaded\n");
+		}
+
+		public void LoadScheduleUserTable()
+		{
+			//Table "ScheduleUser" contains an entry for each user in File 200 (NEW PERSON)
+			//who possesses the BSDXZMENU security key.
+			string sCommandText = "BSDX SCHEDULE USER";
+			ConnectInfo.RPMSDataTable(sCommandText, "ScheduleUser", m_dsGlobal);
+			Debug.Write("LoadGlobalRecordsets -- ScheduleUser loaded\n");
+		}
+
+		public void LoadResourceUserTable()
+		{
+			//Table "ResourceUser" duplicates the BSDX RESOURCE USER File.
+			//NOTE: Column names are RESOURCEUSER_ID, RESOURCEID, 
+			//						 OVERBOOK, MODIFY_SCHEDULE, USERID, USERID1
+			//string sCommandText = "SELECT BMXIEN RESOURCEUSER_ID, INTERNAL[RESOURCENAME] RESOURCEID, OVERBOOK, MODIFY_SCHEDULE, USERNAME USERID, INTERNAL[USERNAME] FROM BSDX_RESOURCE_USER";
+			LoadResourceUserTable(false);
+		}
+
+		public void LoadResourceUserTable(bool bAllUsers)
+		{
+            string sCommandText = @"SELECT BMXIEN RESOURCEUSER_ID, RESOURCENAME, INTERNAL[RESOURCENAME] RESOURCEID, OVERBOOK, MODIFY_SCHEDULE, MODIFY_APPOINTMENTS, USERNAME, INTERNAL[USERNAME] USERID FROM BSDX_RESOURCE_USER"; // WHERE INTERNAL[INSTITUTION]=" + m_ConnectInfo.DUZ2;
+            
+            if (!bAllUsers)
+            {
+                sCommandText += String.Format(" WHERE INTERNAL[USERNAME] = {0}", m_ConnectInfo.DUZ);
+            }
+
+			ConnectInfo.RPMSDataTable(sCommandText, "ResourceUser", m_dsGlobal);
+			Debug.Write("LoadGlobalRecordsets -- ResourceUser loaded\n");
+		}
+
+
+		public void RegisterDocumentView(CGDocument doc, CGView view)
+		{			
+			//Store the view in the list of views
+			this.Views.Add(view, doc);
+
+			//Hook into the view's 'closed' event
+			view.Closed += new EventHandler(ViewClosed);
+
+			//Hook into the view's mnuRPMSServer.Click event
+			view.mnuRPMSServer.Click += new EventHandler(mnuRPMSServer_Click);
+
+			//Hook into the view's mnuRPMSLogin.Click event
+			view.mnuRPMSLogin.Click += new EventHandler(mnuRPMSLogin_Click);
+
+		}
+
+		public void RegisterAVDocumentView(CGAVDocument doc, CGAVView view)
+		{
+			//Store the view in the list of views
+			this.AvailabilityViews.Add(view, doc);
+
+			//Hook into the view's 'closed' event
+			view.Closed += new EventHandler(AVViewClosed);
+		}
+
+		public CGAVView GetAVViewByResource(ArrayList sResourceArray)
+		{
+			if (sResourceArray == null)
+				return null;
+
+			bool bEqual = true;
+			foreach (CGAVView v in m_AVViews.Keys)
+			{
+				CGAVDocument d = v.Document;
+
+				bEqual = false;
+				if (d.Resources.Count == sResourceArray.Count)
+				{
+					bEqual = true;
+					for (int j = 0; j < sResourceArray.Count; j++)
+					{
+						if (sResourceArray.Contains(d.Resources[j]) == false)
+						{
+							bEqual = false;
+							break;
+						}
+						if (d.Resources.Contains(sResourceArray[j]) == false)
+						{
+							bEqual = false;
+							break;
+						}
+					}					
+					if (bEqual == true)
+						return v;
+				}
+			}
+			return null;
+		}
+		/// <summary>
+		/// Return the first view having a resource array matching sResourceArray
+		/// </summary>
+		/// <param name="sResourceArray"></param>
+		/// <returns></returns>
+		public CGView GetViewByResource(ArrayList sResourceArray)
+		{
+			if (sResourceArray == null)
+				return null;
+
+			bool bEqual = true;
+			foreach (CGView v in _views.Keys)
+			{
+				CGDocument d = v.Document;
+
+				bEqual = false;
+				if (d.Resources.Count == sResourceArray.Count)
+				{
+					bEqual = true;
+					for (int j = 0; j < sResourceArray.Count; j++)
+					{
+						if (sResourceArray.Contains(d.Resources[j]) == false)
+						{
+							bEqual = false;
+							break;
+						}
+						if (d.Resources.Contains(sResourceArray[j]) == false)
+						{
+							bEqual = false;
+							break;
+						}
+					}					
+					if (bEqual == true)
+						return v;
+				}
+			}
+			return null;
+		}
+
+        /// <summary>
+        /// Removes view and Handles Disconnection from Database if no views are left.
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+		private void ViewClosed(object sender, EventArgs e)
+		{
+			//Remove the sender from our document list
+			Views.Remove(sender);
+
+			//If no documents left, then close RPMS connection & exit the application
+			if ((Views.Count == 0)&&(this.AvailabilityViews.Count == 0)&&(m_bExitOK == true))
+			{
+				m_ConnectInfo.EventPollingEnabled = false;
+				m_ConnectInfo.UnSubscribeEvent("BSDX SCHEDULE");
+				m_ConnectInfo.CloseConnection();
+				Application.Exit();
+			}
+		}
+
+		private void AVViewClosed(object sender, EventArgs e)
+		{
+			//Remove the sender from our document list
+			this.AvailabilityViews.Remove(sender);
+
+			//If no documents left, then close RPMS connection & exit the application
+			if ((Views.Count == 0)&&(this.AvailabilityViews.Count == 0)&&(m_bExitOK == true))
+			{
+				m_ConnectInfo.bmxNetLib.CloseConnection();
+				Application.Exit();
+			}
+		}
+
+        /// <summary>
+        /// Not used
+        /// </summary>
+		private void KeepAlive()
+		{
+			foreach (CGView v in _views.Keys)
+			{
+				CGDocument d = v.Document;
+				DateTime dNow = DateTime.Now;
+				DateTime dLast = d.LastRefreshed;
+				TimeSpan tsDiff = dNow - dLast;
+				if (tsDiff.Seconds > 180)
+				{				
+					for (int j = 0; j < d.Resources.Count; j++)
+					{
+						v.RaiseRPMSEvent("SCHEDULE-" + d.Resources[j].ToString(), "");
+					}
+
+					break;
+				}
+			}		
+		}
+
+		/// <summary>
+		/// Propogate availability updates to all sRresource's doc/views 
+		/// </summary>
+		public void UpdateViews(string sResource, string sOldResource)
+		{
+			if (sResource == null)
+				return;
+			foreach (CGView v in _views.Keys)
+			{
+				CGDocument d = v.Document;
+				for (int j = 0; j < d.Resources.Count; j++)
+				{
+					if ((sResource == "") || (sResource == ((string) d.Resources[j])) || (sOldResource == ((string) d.Resources[j])))
+					{
+						d.RefreshDocument();
+						break;
+					}
+				}
+				v.UpdateTree();
+			}
+		}
+		
+		/// <summary>
+		/// Propogate availability updates to all doc/views 
+		/// </summary>
+		public void UpdateViews()
+		{
+			UpdateViews("","");
+			foreach (CGView v in _views.Keys)
+			{
+				v.UpdateTree();
+			}
+		}
+
+		/// <summary>
+		/// Calls each view associated with document Doc and closes it.
+		/// </summary>		
+		public void CloseAllViews(CGDocument doc)
+		{
+			//iterate through all views and call update.
+			Hashtable h = CGDocumentManager.Current.Views;
+			
+			CGDocument d;
+			int nTempCount = h.Count;
+			do
+			{
+				nTempCount = h.Count;
+				foreach (CGView v in h.Keys)
+				{
+					d = (CGDocument) h[v];
+					if (d == doc)
+					{
+						v.Close();
+						break;
+					}
+				}
+			} while ((h.Count > 0) && (nTempCount != h.Count));
+		}
+
+		/// <summary>
+		/// Calls each view associated with Availability Doc and closes it.
+		/// </summary>		
+		public void CloseAllViews(CGAVDocument doc)
+		{
+			//iterate through all views and call update.
+			Hashtable h = CGDocumentManager.Current.AvailabilityViews;
+			
+			CGAVDocument d;
+			int nTempCount = h.Count;
+			do
+			{
+				nTempCount = h.Count;
+				foreach (CGAVView v in h.Keys)
+				{
+					d = (CGAVDocument) h[v];
+					if (d == doc)
+					{
+						v.Close();
+						break;
+					}
+				}
+			} while ((h.Count > 0) && (nTempCount != h.Count));
+
+
+		}
+
+        /// <summary>
+        /// Accomplishes Changing the Server to which you connect
+        /// </summary>
+        /// <remarks>
+        /// Parameter relog-in for InitializeApp forces initialize app to use
+        /// 1. The server the user just picked and then BMX saved off to User Preferences
+        /// 2. A new access and verify code pair
+        /// </remarks>
+        /// <param name="sender">unused</param>
+        /// <param name="e">unused</param>
+		private void mnuRPMSServer_Click(object sender, EventArgs e)
+		{
+			//Warn that changing servers will close all schedules
+			if (MessageBox.Show("Are you sure you want to close all schedules and connect to a different VistA server?", "Clinical Scheduling", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) != DialogResult.OK)
+				return;
+
+			//Reconnect to RPMS and recreate all global recordsets
+			try
+			{
+                // Close All, but tell the Close All method not to call Applicaiton.Exit since we still plan to continue.
+                // Close All does not call Application.Exit, but CGView_Close handler does
+				m_bExitOK = false;
+                CloseAll();
+                m_bExitOK = true;
+                
+                //Used in Do loop
+                bool bRetry = true;
+				
+                // Do Loop to deal with changing the server and the vagaries of user choices.
+				do
+				{
+					try
+					{
+                        //ChangeServerInfo does not re-login the user
+                        //It only changes the saved server information in the %APPDATA% folder
+                        //so it can be re-used when BMX tries to log in again.
+                        //Access and Verify code are prompted for in InitializeApp
+						m_ConnectInfo.ChangeServerInfo();
+						bRetry = false;
+					}
+					catch (Exception ex)
+					{
+						if (ex.Message == "User cancelled.")
+						{
+							bRetry = false;
+                            Application.Exit();
+							return;
+						}
+						if (MessageBox.Show("Unable to connect to VistA.  " + ex.Message , "Clinical Scheduling", MessageBoxButtons.RetryCancel) == DialogResult.Retry)
+						{
+							bRetry = true;
+						}
+						else
+						{
+							bRetry = false;
+                            Application.Exit();
+							return;
+						}
+					}
+				} while (bRetry == true);
+
+                //Parameter for initialize app tells it that this is a re-login and forces a new access and verify code.
+                bool isEverythingOkay = this.InitializeApp(true);
+
+                //if an error occurred, break out. This time we need to call Application.Exit since it's already running.
+                if (!isEverythingOkay)
+                {
+                    Application.Exit();
+                    return;
+                }
+
+                //Otherwise, everything is okay. So open document and view, then show and activate view.
+                CGDocument doc = new CGDocument();
+                doc.DocManager = _current;
+
+                CGView view = new CGView();
+                view.InitializeDocView(doc, _current, doc.StartDate, _current.WindowText);
+
+                view.Show();
+                view.Activate();
+
+                //Application.Run need not be called b/c it is already running.
+			}
+			catch (Exception ex)
+			{
+				throw ex;
+			}
+	
+		}
+
+        /// <summary>
+        /// Accomplishes Re-login into RPMS/VISTA. Now all logic is in this event handler.
+        /// </summary>
+        /// <param name="sender">not used</param>
+        /// <param name="e">not used</param>
+		private void mnuRPMSLogin_Click(object sender, EventArgs e)
+		{
+			//Warn that changing login will close all schedules
+			if (MessageBox.Show("Are you sure you want to close all schedules and login to VistA?", "Clinical Scheduling", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) != DialogResult.OK)
+				return;
+
+			//Reconnect to RPMS and recreate all global recordsets
+			try
+			{
+                // Close All, but tell the Close All method not to call Applicaiton.Exit since we still plan to continue.
+                // Close All does not call Application.Exit, but CGView_Close handler does
+				m_bExitOK = false;
+				CloseAll();
+				m_bExitOK = true;
+
+                //Parameter for initialize app tells it that this is a re-login and forces a new access and verify code.
+                bool isEverythingOkay = this.InitializeApp(true);
+
+                //if an error occurred, break out. This time we need to call Application.Exit since it's already running.
+                if (!isEverythingOkay)
+                {
+                    Application.Exit();
+                    return;
+                }
+
+                //Otherwise, everything is okay. So open document and view, then show and activate view.
+                CGDocument doc = new CGDocument();
+                doc.DocManager = _current;
+
+                CGView view = new CGView();
+                view.InitializeDocView(doc, _current, doc.StartDate, _current.WindowText);
+
+                view.Show();
+                view.Activate();
+
+                //Application.Run need not be called b/c it is already running.
+			}
+			catch (Exception ex)
+			{
+				throw ex;
+			}
+	
+		}
+
+		delegate void CloseAllDelegate(string sMsg);
+		
+		private void CloseAll(string sMsg)
+		{
+			if (sMsg == "")
+			{
+				sMsg = "Scheduling System Shutting Down Immediately for Maintenance.";
+			}
+
+			MessageBox.Show(sMsg, "Clinical Scheduling Administrator -- System Shutdown Notification", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+
+			CloseAll();
+		}
+
+		private void CloseAll()
+		{
+			//Close all documents, views and connections
+			Hashtable h = CGDocumentManager.Current.Views;
+			int nTempCount = h.Count;
+			do
+			{
+				nTempCount = h.Count;
+				foreach (CGView v in h.Keys)
+				{
+					v.Close();
+					break;
+				}
+			} while ((h.Count > 0) && (nTempCount != h.Count));
+
+			h = CGDocumentManager.Current.AvailabilityViews;
+			nTempCount = h.Count;
+			do
+			{
+				nTempCount = h.Count;
+				foreach (CGAVView v in h.Keys)
+				{
+					v.Close();
+					break;
+				}
+			} while ((h.Count > 0) && (nTempCount != h.Count));
+
+		}
+
+		public delegate DataTable RPMSDataTableDelegate(string CommandString, string TableName);
+
+		public DataTable RPMSDataTable(string sSQL, string sTableName)
+		{
+			//Retrieves a recordset from RPMS
+			string			sErrorMessage = "";
+            DataTable dtOut;
+
+			try
+			{
+				//System.IntPtr pHandle = this.Handle;
+				RPMSDataTableDelegate rdtd = new RPMSDataTableDelegate(ConnectInfo.RPMSDataTable);
+				//dtOut = (DataTable) this.Invoke(rdtd, new object[] {sSQL, sTableName});
+                dtOut = rdtd.Invoke(sSQL, sTableName);
+			}
+
+			catch (Exception ex)
+			{
+				sErrorMessage = "CGDocumentManager.RPMSDataTable error: " + ex.Message;
+				throw ex;
+			}
+
+            return dtOut;
+
+		}
+
+		public void ChangeDivision(System.Windows.Forms.Form frmCaller)
+		{
+			this.ConnectInfo.ChangeDivision(frmCaller);
+			foreach (CGView v in _views.Keys)
+			{
+				v.InitializeDocView(v.Document.DocName);
+				v.Document.RefreshDocument();
+			}
+		}
+
+		public void ViewRefresh()
+		{
+			foreach (CGView v in _views.Keys)
+			{
+				try
+				{
+					v.Document.RefreshDocument();
+				}
+				catch (Exception ex)
+				{
+					Debug.Write("CGDocumentManager.ViewRefresh Exception: " + ex.Message + "\n");
+				}
+				finally
+				{
+				}
+			}
+			Debug.Write("DocManager refreshed all views.\n");
+		}
+
+		#endregion Methods & Events
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGDocumentManager.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGDocumentManager.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGDocumentManager.resx	(revision 1134)
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.Name">
+    <value>CGDocumentManager</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGRange.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGRange.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGRange.cs	(revision 1134)
@@ -0,0 +1,109 @@
+﻿namespace IndianHealthService.ClinicalScheduling
+{
+    using System;
+    /// <summary>
+    /// This class was regenerated from Calendargrid.dll using Reflector.exe
+    /// by Sam Habiel for WorldVista. The original source code is lost.
+    /// </summary>
+    public class CGRange
+    {
+        private CGCells m_Cells;
+        private CGCell m_gcEnd;
+        private CGCell m_gcStart;
+
+        public CGRange()
+        {
+            this.m_Cells = new CGCells();
+        }
+
+        public CGRange(CGCells gridCells, CGCell gcStart, CGCell gcEnd)
+        {
+            this.CreateRange(gridCells, gcStart, gcEnd);
+        }
+
+        public void AppendCell(CGCells gridCells, CGCell aCell)
+        {
+            if ((aCell != this.StartCell) && (aCell.CellColumn == this.StartCell.CellColumn))
+            {
+                CGCell startCell = this.StartCell;
+                this.m_Cells.ClearAllCells();
+                this.CreateRange(gridCells, startCell, aCell);
+            }
+        }
+
+        public bool CellIsInRange(CGCell cgCell)
+        {
+            return this.m_Cells.CellHashTable.ContainsKey(cgCell.Key);
+        }
+
+        public void CreateRange(CGCells gridCells, CGCell sCell, CGCell eCell)
+        {
+            this.m_Cells.ClearAllCells();
+            this.m_Cells.AddCell(sCell);
+            this.m_gcStart = sCell;
+            this.m_gcEnd = eCell;
+            if (sCell != eCell)
+            {
+                int num;
+                CGCell r = null;
+                if (sCell.CellRow < eCell.CellRow)
+                {
+                    for (num = sCell.CellRow + 1; num <= eCell.CellRow; num++)
+                    {
+                        r = gridCells.GetCellFromRowCol(num, eCell.CellColumn);
+                        this.m_Cells.AddCell(r);
+                    }
+                }
+                else
+                {
+                    for (num = sCell.CellRow - 1; num >= eCell.CellRow; num--)
+                    {
+                        r = gridCells.GetCellFromRowCol(num, eCell.CellColumn);
+                        this.m_Cells.AddCell(r);
+                    }
+                }
+            }
+        }
+
+        public void SubtractCell(CGCells gridCells, CGCell aCell, bool bUp)
+        {
+            int nRow = bUp ? (this.m_gcEnd.CellRow - 1) : (this.m_gcEnd.CellRow + 1);
+            int cellColumn = this.m_gcEnd.CellColumn;
+            this.Cells.RemoveCell(this.m_gcEnd.Key);
+            this.m_gcEnd = gridCells.GetCellFromRowCol(nRow, cellColumn);
+        }
+
+        public CGCells Cells
+        {
+            get
+            {
+                return this.m_Cells;
+            }
+        }
+
+        public CGCell EndCell
+        {
+            get
+            {
+                return this.m_gcEnd;
+            }
+            set
+            {
+                this.m_gcEnd = value;
+            }
+        }
+
+        public CGCell StartCell
+        {
+            get
+            {
+                return this.m_gcStart;
+            }
+            set
+            {
+                this.m_gcStart = value;
+            }
+        }
+    }
+}
+
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGResource.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGResource.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGResource.cs	(revision 1134)
@@ -0,0 +1,129 @@
+﻿namespace IndianHealthService.ClinicalScheduling
+{
+    using System;
+    /// <summary>
+    /// This class was regenerated from Calendargrid.dll using Reflector.exe
+    /// by Sam Habiel for WorldVista. The original source code is lost.
+    /// </summary>
+    public class CGResource
+    {
+        private bool m_bInactive = false;
+        private int m_nHospitalLocationID = 0;
+        private int m_nResourceID = 0;
+        private int m_nTimeScale = 15;
+        private string m_sCancellationLetterText;
+        private string m_sHospitalLocation = "";
+        private string m_sLetterText;
+        private string m_sNoShowLetterText;
+        private string m_sResourceName = "";
+
+        public string CancellationLetterText
+        {
+            get
+            {
+                return this.m_sCancellationLetterText;
+            }
+            set
+            {
+                this.m_sCancellationLetterText = value;
+            }
+        }
+
+        public string HospitalLocation
+        {
+            get
+            {
+                return this.m_sHospitalLocation;
+            }
+            set
+            {
+                this.m_sHospitalLocation = value;
+            }
+        }
+
+        public int HospitalLocationID
+        {
+            get
+            {
+                return this.m_nHospitalLocationID;
+            }
+            set
+            {
+                this.m_nHospitalLocationID = value;
+            }
+        }
+
+        public bool Inactive
+        {
+            get
+            {
+                return this.m_bInactive;
+            }
+            set
+            {
+                this.m_bInactive = value;
+            }
+        }
+
+        public string LetterText
+        {
+            get
+            {
+                return this.m_sLetterText;
+            }
+            set
+            {
+                this.m_sLetterText = value;
+            }
+        }
+
+        public string NoShowLetterText
+        {
+            get
+            {
+                return this.m_sNoShowLetterText;
+            }
+            set
+            {
+                this.m_sNoShowLetterText = value;
+            }
+        }
+
+        public int ResourceID
+        {
+            get
+            {
+                return this.m_nResourceID;
+            }
+            set
+            {
+                this.m_nResourceID = value;
+            }
+        }
+
+        public string ResourceName
+        {
+            get
+            {
+                return this.m_sResourceName;
+            }
+            set
+            {
+                this.m_sResourceName = value;
+            }
+        }
+
+        public int TimeScale
+        {
+            get
+            {
+                return this.m_nTimeScale;
+            }
+            set
+            {
+                this.m_nTimeScale = value;
+            }
+        }
+    }
+}
+
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGSchedLib.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGSchedLib.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGSchedLib.cs	(revision 1134)
@@ -0,0 +1,1071 @@
+using System;
+using System.Data;
+using System.Collections;
+using System.Diagnostics;
+using System.Drawing;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	public enum ScheduleType 
+	{
+		Resource,
+		Clinic
+	}
+
+	/// <summary>
+	/// CGSchedLib contains static functions that are called from throughout the 
+	/// scheduling application.
+	/// </summary>
+	public static class CGSchedLib
+	{
+        /// <summary>
+        /// Gets appointments from VISTA to display in Grid
+        /// </summary>
+        /// <param name="docManager">God Class</param>
+        /// <param name="saryResNames">Resource Names Array</param>
+        /// <param name="StartTime">Self Explanatory</param>
+        /// <param name="EndTime">Self Explanatory</param>
+        /// <returns></returns>
+		public static DataTable CreateAppointmentSchedule(CGDocumentManager docManager, ArrayList saryResNames, DateTime StartTime, DateTime EndTime)
+		{
+            string sResName = string.Join("|", saryResNames.ToArray());			
+            string sStart = FMDateTime.Create(StartTime).DateOnly.FMDateString;
+            string sEnd = FMDateTime.Create(EndTime).FMDateString;
+			string sSql = "BSDX CREATE APPT SCHEDULE^" + sResName + "^" + sStart + "^" + sEnd ;
+			DataTable dtRet = docManager.RPMSDataTable(sSql, "AppointmentSchedule");
+			return dtRet;
+		}
+
+
+        /// <summary>
+        /// Gets all Availabilities and Appointments, then substracts Appointments from availabilities.
+        /// </summary>
+        /// <param name="docManager">God Class</param>
+        /// <param name="saryResourceNames">Resource Array (ArrayList)</param>
+        /// <param name="StartTime">Self-Explanatory</param>
+        /// <param name="EndTime">Self-Explanatory</param>
+        /// <param name="saryApptTypes">Array of Access Type IDs</param>
+        /// <param name="stType">Not used</param>
+        /// <param name="sSearchInfo">Specific Search Parameters</param>
+        /// <returns></returns>
+        public static DataTable CreateAvailabilitySchedule(CGDocumentManager docManager,
+            ArrayList saryResourceNames, DateTime StartTime, DateTime EndTime,
+            ArrayList saryApptTypes,/**/ ScheduleType stType, string sSearchInfo)
+        {
+            DataTable rsOut = new DataTable("AvailabilitySchedule");
+            if (saryResourceNames.Count == 0) return rsOut;
+            string sResNames = string.Join("|", saryResourceNames.ToArray());
+            string sApptTypeIDs = string.Join("|", saryApptTypes.ToArray());
+            string sStart = FMDateTime.Create(StartTime).DateOnly.FMDateString;
+            string sEnd = FMDateTime.Create(EndTime).FMDateString;
+            string sSql = "BSDX CREATE ASGND SLOT SCHED^" + sResNames + "^" + sStart + "^" + sEnd + "^" + sApptTypeIDs + "^" + sSearchInfo; //+ "^" + sSTType ;
+            rsOut = docManager.RPMSDataTable(sSql, "AssignedSlotSchedule");
+
+            return rsOut;
+        }
+
+            /*NOT USED ANYMORE
+            //TODO: Optimize: no need to keep looping through resources.
+            // for each resource
+			for (int i = 0; i < nSize; i++) 
+			{
+				sResName = saryResourceNames[i].ToString();
+                //Gets all the slots (or Availabities, or AV Blocks if you like)
+				rsSlotSchedule = CGSchedLib.CreateAssignedSlotSchedule(docManager, sResName, StartTime, EndTime, saryApptTypes, stType, sSearchInfo);
+                rsTemp1 = rsSlotSchedule;
+
+                //if we have slots
+                if (rsSlotSchedule.Rows.Count > 0 ) 
+                {
+                    // Get appointment count to substract from the slots
+                    rsApptSchedule = CGSchedLib.CreateAppointmentSlotSchedule(docManager, sResName, StartTime, EndTime, stType);
+
+                    // Perform the substraction
+                    rsTemp1 = CGSchedLib.SubtractSlotsRS2(rsSlotSchedule, rsApptSchedule, sResName);
+
+                }
+                //otherwise, just return the slot schedule we have.
+                else 
+                {
+                    rsTemp1 = rsSlotSchedule;
+
+                }
+
+
+                // if only one resource was passed in, its availablility is what we want
+				if (i == 0) 
+				{
+					rsOut = rsTemp1;
+
+				} 
+                // if more than one resource, merge them together
+				else 
+				{
+					rsOut = CGSchedLib.UnionBlocks(rsTemp1, rsOut);
+				}
+			}
+			return rsOut;
+		}		
+                */
+
+        /* NOT USED ANYMORE!!!
+		public static DataTable CreateAssignedTypeSchedule(CGDocumentManager docManager, string sResourceName, DateTime StartTime, DateTime EndTime, ScheduleType stType)
+		{
+
+            string sStart = FMDateTime.Create(StartTime).DateOnly.FMDateString;
+			string sEnd = FMDateTime.Create(EndTime).DateOnly.FMDateString;
+            string sSql = "BSDX TYPE BLOCKS OVERLAP^" + sStart + "^" + sEnd + "^" + sResourceName;
+
+			DataTable rs = docManager.RPMSDataTable(sSql, "AssignedTypeSchedule");
+
+			if (rs.Rows.Count == 0)
+				return rs;
+
+			DataTable rsCopy = new DataTable("rsCopy");			
+			DataColumn dCol = new DataColumn();
+			dCol.DataType = Type.GetType("System.DateTime");
+			dCol.ColumnName = "StartTime";
+			dCol.ReadOnly = true;
+			dCol.AllowDBNull = false;
+			dCol.Unique = false;
+			rsCopy.Columns.Add(dCol);
+
+			dCol = new DataColumn();
+			dCol.DataType = Type.GetType("System.DateTime");
+			dCol.ColumnName = "EndTime";
+			dCol.ReadOnly = true;
+			dCol.AllowDBNull = false;
+			dCol.Unique = false;
+			rsCopy.Columns.Add(dCol);
+
+			dCol = new DataColumn();
+			dCol.DataType = Type.GetType("System.Int16");
+			dCol.ColumnName = "AppointmentTypeID";
+			dCol.ReadOnly = true;
+			dCol.AllowDBNull = false;
+			dCol.Unique = false;
+			rsCopy.Columns.Add(dCol);
+
+			dCol = new DataColumn();
+            dCol.DataType = Type.GetType("System.Int32");
+            dCol.ColumnName = "AvailabilityID";
+			dCol.ReadOnly = true;
+			dCol.AllowDBNull = false;
+			dCol.Unique = false;
+			rsCopy.Columns.Add(dCol);
+
+			dCol = new DataColumn();
+			dCol.DataType = Type.GetType("System.String");
+			dCol.ColumnName = "ResourceName";
+			dCol.ReadOnly = true;
+			dCol.AllowDBNull = false;
+			dCol.Unique = false;
+			rsCopy.Columns.Add(dCol);
+
+
+			DateTime dLastEnd;
+			DateTime dStart;
+			DateTime dEnd;
+			DataRow rNew; //Temporary Holding place for first or last row
+
+            // Get Last Date from final row
+			rNew = rs.Rows[rs.Rows.Count - 1];
+			dLastEnd = (DateTime) rNew["EndTime"];
+            // Get First Date from first row
+			rNew = rs.Rows[0];
+			dStart = (DateTime) rNew["StartTime"];
+
+			long UNSPECIFIED_TYPE = 10;
+			long UNSPECIFIED_ID = 0;
+
+			//if first block in vgetrows starts later than StartTime,
+			// then pad with a new block
+
+            // if First Row time is later than the StartTime param (should always be true)
+            // then make a new row whose time starts from StartTime and ends with dStart
+			if (dStart > StartTime) 
+			{
+				dEnd = dStart;
+				rNew = rsCopy.NewRow();
+				rNew["StartTime"] = StartTime;
+				rNew["EndTime"] = dEnd;
+				rNew["AppointmentTypeID"] = UNSPECIFIED_TYPE;
+				rNew["AvailabilityID"] = UNSPECIFIED_ID;
+				rNew["ResourceName"] = sResourceName;
+				rsCopy.Rows.Add(rNew);
+			}	
+			
+			//if first block start time is < StartTime then trim (shouldn't happen)
+			if (dStart < StartTime) 
+			{
+				rNew = rs.Rows[0];
+				rNew["StartTime"] = StartTime;
+				dStart = StartTime;
+			}	
+
+			int nAppointmentTypeID;
+			int nAvailabilityID;
+
+            //dStart holds the first date for the availabilities returned from RPMS
+			dEnd = dStart;
+			foreach (DataRow rEach in rs.Rows)
+			{
+				dStart = (DateTime) rEach["StartTime"];
+				if (dStart > dEnd) 
+				{
+					rNew = rsCopy.NewRow();
+					rNew["StartTime"] = dEnd;
+					rNew["EndTime"] = dStart;
+					rNew["AppointmentTypeID"] = 0;
+					rNew["AvailabilityID"] = UNSPECIFIED_ID;
+					rNew["ResourceName"] = sResourceName;
+					rsCopy.Rows.Add(rNew);
+				}
+
+                //dEnd now EndTime for AV Block
+				dEnd = (DateTime) rEach["EndTime"];
+
+                // if dEnd is greater than endime, set dEnd to be the same as EndTime.
+                if (dEnd > EndTime) { dEnd = EndTime; }
+
+
+				nAppointmentTypeID = (int) rEach["AppointmentTypeID"];
+				nAvailabilityID = (int) rEach["AvailabilityID"];
+				
+				rNew = rsCopy.NewRow();
+				rNew["StartTime"] = dStart;
+				rNew["EndTime"] = dEnd;
+				rNew["AppointmentTypeID"] = nAppointmentTypeID;
+				rNew["AvailabilityID"] = nAvailabilityID;
+				rNew["ResourceName"] = sResourceName;
+				rsCopy.Rows.Add(rNew);
+			}
+
+			//Pad the end if necessary
+			if (dLastEnd < EndTime) 
+			{
+				rNew = rsCopy.NewRow();
+				rNew["StartTime"] = dLastEnd;
+				rNew["EndTime"] = EndTime;
+				rNew["AppointmentTypeID"] = UNSPECIFIED_TYPE;
+				rNew["AvailabilityID"] = UNSPECIFIED_ID;
+				rNew["ResourceName"] = sResourceName;
+				rsCopy.Rows.Add(rNew);		
+			}
+			
+			return rsCopy;
+		}
+        */
+
+        /// <summary>
+        /// Gets the Availability Slots from the Server
+        /// </summary>
+        /// <param name="docManager">God Class</param>
+        /// <param name="sResourceName">Resource for which to get slots</param>
+        /// <param name="StartTime"></param>
+        /// <param name="EndTime"></param>
+        /// <param name="rsaryApptTypeIDs">Access Type IDs to retrieve</param>
+        /// <param name="stType">Not used</param>
+        /// <param name="sSearchInfo">If performing a slot search (i.e. for empty appointments), has search info here. Used by Find Appointments</param>
+        /// <returns>DataTable with the following Columns:
+        /// D00030START_TIME^D00030END_TIME^I00010SLOTS^T00030RESOURCE^T00010ACCESS_TYPE^T00250NOTE^I00030AVAILABILITYID
+        /// </returns>
+		/*
+         * public static DataTable CreateAssignedSlotSchedule(CGDocumentManager docManager, string sResourceName, DateTime StartTime, 
+            DateTime EndTime, ArrayList rsaryApptTypeIDs, ScheduleType stType, string sSearchInfo) 
+		{
+            //Appointment type ids is now always "" so that all appointment types are returned.
+            string sApptTypeIDs = string.Join("|", rsaryApptTypeIDs.ToArray());
+            string sStart = FMDateTime.Create(StartTime).DateOnly.FMDateString;
+            string sEnd = FMDateTime.Create(EndTime).FMDateString;
+			string sSql = "BSDX CREATE ASGND SLOT SCHED^" + sResourceName + "^" + sStart + "^" + sEnd + "^" + sApptTypeIDs + "^" + sSearchInfo; //+ "^" + sSTType ;
+			DataTable dtRet = docManager.RPMSDataTable(sSql, "AssignedSlotSchedule");
+
+            return dtRet;
+		}
+        */
+
+        /*
+		public static DataTable CreateCopyTable()
+		{
+			DataTable dtCopy = new DataTable("dtCopy");			
+			DataColumn dCol = new DataColumn();
+			dCol.DataType = Type.GetType("System.DateTime");
+			dCol.ColumnName = "START_TIME";
+			dCol.ReadOnly = true;
+			dCol.AllowDBNull = false;
+			dCol.Unique = false;
+			dtCopy.Columns.Add(dCol);
+
+			dCol = new DataColumn();
+			dCol.DataType = Type.GetType("System.DateTime");
+			dCol.ColumnName = "END_TIME";
+			dCol.ReadOnly = true;
+			dCol.AllowDBNull = false;
+			dCol.Unique = false;
+			dtCopy.Columns.Add(dCol);
+
+			dCol = new DataColumn();
+			dCol.DataType = Type.GetType("System.Int16");
+			dCol.ColumnName = "SLOTS";
+			dCol.ReadOnly = true;
+			dCol.AllowDBNull = false;
+			dCol.Unique = false;
+			dtCopy.Columns.Add(dCol);
+
+			dCol = new DataColumn();
+			dCol.DataType = Type.GetType("System.String");
+			dCol.ColumnName = "RESOURCE";
+			dCol.ReadOnly = true;
+			dCol.AllowDBNull = true;
+			dCol.Unique = false;
+			dtCopy.Columns.Add(dCol);
+
+			dCol = new DataColumn();
+			dCol.DataType = Type.GetType("System.String");
+			dCol.ColumnName = "ACCESS_TYPE";
+			dCol.ReadOnly = true;
+			dCol.AllowDBNull = true;
+			dCol.Unique = false;
+			dtCopy.Columns.Add(dCol);
+
+			dCol = new DataColumn();
+			dCol.DataType = Type.GetType("System.String");
+			dCol.ColumnName = "NOTE";
+			dCol.ReadOnly = true;
+			dCol.AllowDBNull = true;
+			dCol.Unique = false;
+			dtCopy.Columns.Add(dCol);
+
+
+			return dtCopy;
+		}
+         */
+
+        /// <summary>
+        /// This gets a datatable which shows the appointments between start and end time, one row per appointment
+        /// </summary>
+        /// <param name="docManager"></param>
+        /// <param name="sResourceName"></param>
+        /// <param name="StartTime"></param>
+        /// <param name="EndTime"></param>
+        /// <param name="stType"></param>
+        /// <returns>DataTable with 4 columns: START_TIME, END_TIME, SLOTS, RESOURCE </returns>
+		/*
+        public static DataTable CreateAppointmentSlotSchedule(CGDocumentManager docManager, string sResourceName, DateTime StartTime, DateTime EndTime, ScheduleType stType)
+		{
+            //Change Dates to FM Format
+            string sStart = FMDateTime.Create(StartTime).DateOnly.FMDateString;
+			string sEnd = FMDateTime.Create(EndTime).DateOnly.FMDateString;
+			
+            string sSTType = (stType == ScheduleType.Resource ? "ST_RESOURCE" : "ST_CLINIC");
+			string sSql = "BSDX APPT BLOCKS OVERLAP^" + sStart + "^" + sEnd + "^" + sResourceName ;//+ "^"  + sSTType;
+
+            //This gets you a table with 2 columns containing start and end time for each appt
+            //Each appt gets its own row
+			DataTable dtRet = docManager.RPMSDataTable(sSql, "AppointmentSlotSchedule");
+			
+			if (dtRet.Rows.Count < 1)
+				return dtRet;
+			
+			//Create CDateTimeArray & load records from rsOut
+			int nRC = dtRet.Rows.Count;     // nRC is row count from Appointments table just retrieved
+			ArrayList cdtArray = new ArrayList();
+			cdtArray.Capacity = (nRC * 2); //new ArrayList has capacity double that of appointment table
+			DateTime v;
+			int i = 0;
+
+			//for each row in the Appointment Table, ArrayList cdtArray gets 2 entries: Start and End times
+            foreach (DataRow r in dtRet.Rows) 
+			{
+				v = (DateTime) r[dtRet.Columns["START_TIME"]];
+				cdtArray.Add(v);
+				v = (DateTime) r[dtRet.Columns["END_TIME"]];
+				cdtArray.Add(v);
+			}
+
+            //Sort start and end times (for use in ScheduleFromArray method)
+			cdtArray.Sort();
+
+			//Create a CTimeBlockArray and load it from rsOut
+		
+            //Now, create a new ArrayList with the size of the appointment table to hold availabilities
+			ArrayList ctbAppointments = new ArrayList(nRC);
+			CGAvailability cTB;
+			i = 0;
+            //For each appointment, create an availability
+			foreach (DataRow r in dtRet.Rows) 
+			{
+				cTB = new CGAvailability();
+				cTB.StartTime = (DateTime) r[dtRet.Columns["START_TIME"]];
+				cTB.EndTime = (DateTime) r[dtRet.Columns["END_TIME"]];
+				ctbAppointments.Add(cTB);
+			}			
+			
+			//Create a TimeBlock Array from the data in the DateTime array
+			ArrayList ctbApptSchedule = new ArrayList();
+
+            //Convert Appointments to Availabilities, where all appointments become squeezed together.
+			ScheduleFromArray(cdtArray, StartTime, EndTime, ref ctbApptSchedule);
+
+            So far, we have the following:
+             * dtRet -> List of Appointments Start and End times, one row per appointment
+             * cdtArray -> Linear 1 dimensional Array of dtRet Start and End times, sorted
+             * ctbAppointments -> Arraylist of dtRet as Availabilities
+             * ctbApptSchedule -> Arraylist of dtRet as Availabilities with no overlapping boundaries
+             *      (overlaps in appointments get converted into availabilties themselves: so
+             *      2 appts as 10:10-10:30 and 10:20-10:40 get converted into 10:10-10:20,
+             *      10:20-10:30, 10:30-10:40).
+            
+
+            //Find number of TimeBlocks in ctbApptSchedule that overlap the TimeBlocks in ctbAppointments
+			ArrayList ctbApptSchedule2 = new ArrayList();
+			CGAvailability cTB2;
+			int nSlots = 0;
+			for (i=0; i< ctbApptSchedule.Count; i++)    //for each non-overlapping appts as availabilities
+			{
+				cTB = (CGAvailability) ctbApptSchedule[i];
+                //How many times does the non-overlapping part show up in an appointment slot?
+				nSlots = BlocksOverlap(cTB, ctbAppointments);   
+				cTB2 = new CGAvailability();
+				cTB2.Create(cTB.StartTime, cTB.EndTime, nSlots);
+				ctbApptSchedule2.Add(cTB2);
+			}
+			
+			ConsolidateBlocks(ctbApptSchedule2);
+			
+			DataTable dtCopy = new DataTable("dtCopy");			
+			DataColumn dCol = new DataColumn();
+			dCol.DataType = Type.GetType("System.DateTime");
+			dCol.ColumnName = "START_TIME";
+			dCol.ReadOnly = true;
+			dCol.AllowDBNull = false;
+			dCol.Unique = false;
+			dtCopy.Columns.Add(dCol);
+
+			dCol = new DataColumn();
+			dCol.DataType = Type.GetType("System.DateTime");
+			dCol.ColumnName = "END_TIME";
+			dCol.ReadOnly = true;
+			dCol.AllowDBNull = false;
+			dCol.Unique = false;
+			dtCopy.Columns.Add(dCol);
+
+			dCol = new DataColumn();
+			dCol.DataType = Type.GetType("System.Int16");
+			dCol.ColumnName = "SLOTS";
+			dCol.ReadOnly = true;
+			dCol.AllowDBNull = false;
+			dCol.Unique = false;
+			dtCopy.Columns.Add(dCol);
+			
+			dCol = new DataColumn();
+			dCol.DataType = Type.GetType("System.String");
+			dCol.ColumnName = "RESOURCE";
+			dCol.ReadOnly = true;
+			dCol.AllowDBNull = false;
+			dCol.Unique = false;
+			dtCopy.Columns.Add(dCol);
+
+			for (int k=0; k < ctbApptSchedule2.Count; k++) 
+			{
+				cTB = (CGAvailability) ctbApptSchedule2[k];
+				DataRow newRow;
+				newRow = dtCopy.NewRow();
+				newRow["START_TIME"] = cTB.StartTime;
+				newRow["END_TIME"] = cTB.EndTime;
+				newRow["SLOTS"] = cTB.Slots;
+				newRow["RESOURCE"] = sResourceName;
+				dtCopy.Rows.Add(newRow);
+			}
+
+			return dtCopy;
+
+		}
+        */
+
+        /*
+		public static int BlocksOverlap(CGAvailability rBlock, ArrayList rTBArray)
+		{
+			//this overload implements default false for bCountSlots
+			return CGSchedLib.BlocksOverlap(rBlock, rTBArray, false);
+		}
+		public static int BlocksOverlap(CGAvailability rBlock, ArrayList rTBArray, bool bCountSlots)
+		{
+			//If bCountSlots == true, then returns
+			//sum of Slots in overlapping blocks 
+			//instead of the count of overlapping blocks
+
+			DateTime dStart1;
+			DateTime dStart2;
+			DateTime dEnd1;
+			DateTime dEnd2;
+			int nSlots;
+			int nCount = 0;
+			CGAvailability cBlock;
+
+			dStart1 = rBlock.StartTime;
+			dEnd1 = rBlock.EndTime;
+
+			for (int j=0; j< rTBArray.Count; j++) 
+			{
+				cBlock = (CGAvailability) rTBArray[j];
+				dStart2 = cBlock.StartTime;
+				dEnd2 = cBlock.EndTime;
+				nSlots = cBlock.Slots;
+				if (TimesOverlap(dStart1, dEnd1, dStart2, dEnd2)) 
+				{
+					if (bCountSlots == true) 
+					{
+						nCount += nSlots;
+					}
+					else 
+					{
+						nCount++;
+					}
+				}
+			}
+
+			return nCount;
+		}
+        */
+
+		/// <summary>
+		/// Does an appointment overlap with another appointment in the same day?
+		/// </summary>
+		/// <param name="dStart1">Start Time of First Appt</param>
+		/// <param name="dEnd1">End Time of First Appt</param>
+        /// <param name="dStart2">Start Time of Second Appt</param>
+		/// <param name="dEnd2">End Time of Second Appt</param>
+		/// <returns>true or false</returns>
+        /// <remarks>Draws 2 rectangles and sees if they overlap using minutes from 1980 as the start point</remarks>
+		/*
+        public static bool TimesOverlap(DateTime dStart1, DateTime dEnd1, DateTime dStart2, DateTime dEnd2)
+		{
+			Rectangle rect1 = new Rectangle();
+			Rectangle rect2 = new Rectangle();
+			rect1.X = 0;
+			rect2.X = 0;
+			rect1.Width = 1;
+			rect2.Width = 1;
+
+			rect1.Y = CGSchedLib.MinSince80(dStart1);
+			rect1.Height = CGSchedLib.MinSince80(dEnd1) - rect1.Y;
+			rect2.Y = CGSchedLib.MinSince80(dStart2);
+			rect2.Height = CGSchedLib.MinSince80(dEnd2) - rect2.Y;
+			bool bRet = rect2.IntersectsWith(rect1);
+			return bRet;
+		}
+        */
+
+        /*
+		public static void ConsolidateBlocks(ArrayList rTBArray)
+		{
+			//TODO: Test this function
+
+			int j = 0;
+			bool bDirty = false;
+			CGAvailability cBlockA;
+			CGAvailability cBlockB;
+			CGAvailability cTemp1;
+			if (rTBArray.Count < 2)
+				return;
+			do 
+			{
+				bDirty = false;
+				for (j = 0; j < (rTBArray.Count - 1); j++) //TODO: why minus 1?
+				{
+					cBlockA = (CGAvailability) rTBArray[j];
+					cBlockB = (CGAvailability) rTBArray[j+1];
+					if ((cBlockA.EndTime == cBlockB.StartTime) 
+						&& (cBlockA.Slots == cBlockB.Slots)
+						&& (cBlockA.ResourceList == cBlockB.ResourceList)
+						&& (cBlockA.AccessRuleList == cBlockB.AccessRuleList)
+						) 
+					{
+						cTemp1 = new CGAvailability();
+						cTemp1.StartTime = cBlockA.StartTime;
+						cTemp1.EndTime = cBlockB.EndTime;
+						cTemp1.Slots = cBlockA.Slots;
+						cTemp1.AccessRuleList = cBlockA.AccessRuleList;
+						cTemp1.ResourceList = cBlockA.ResourceList;
+						rTBArray.Insert(j, cTemp1);
+						rTBArray.RemoveRange(j+1, 2);
+						bDirty = true;
+						break;
+					}
+				}
+			}
+			while (!((bDirty == false) || (rTBArray.Count == 1)));
+		} */
+
+        /// <summary>
+        /// My guess is that this calculates remaining slots
+        /// </summary>
+        /// <param name="rsBlocks1"></param>
+        /// <param name="rsBlocks2"></param>
+        /// <param name="sResource"></param>
+        /// <returns></returns>
+		/*
+        public static DataTable SubtractSlotsRS2(DataTable rsBlocks1, DataTable rsBlocks2, string sResource)
+		{
+			//Subtract slots in rsBlocks2 from rsBlocks1
+			//7-16-01 SUBCLINIC data field in rsBlocks1 persists thru routine.
+			//7-18-01 RESOURCE and ACCESS_TYPE fields presisted
+
+			if ((rsBlocks2.Rows.Count == 0) || (rsBlocks1.Rows.Count == 0))
+				return rsBlocks1;
+
+
+			//Create an array of the start and end times of blocks2
+			ArrayList cdtArray = new ArrayList(2*(rsBlocks1.Rows.Count + rsBlocks2.Rows.Count));
+
+			foreach (DataRow r in rsBlocks1.Rows) 
+			{
+				cdtArray.Add(r[rsBlocks1.Columns["START_TIME"]]);
+				cdtArray.Add(r[rsBlocks1.Columns["END_TIME"]]);
+			}
+
+			foreach (DataRow r in rsBlocks2.Rows) 
+			{
+				cdtArray.Add(r[rsBlocks2.Columns["START_TIME"]]);
+				cdtArray.Add(r[rsBlocks2.Columns["END_TIME"]]);
+			}
+
+			cdtArray.Sort();
+
+			ArrayList ctbReturn = new ArrayList();
+			DateTime cDate = new DateTime();
+			ScheduleFromArray(cdtArray, cDate, cDate, ref ctbReturn);
+
+			//Set up return table
+			DataTable rsCopy = CGSchedLib.CreateCopyTable();	//TODO: There's a datatable method that does this.	
+			long nSlots = 0;
+			CGAvailability cTB;
+
+			for (int j=0; j < (ctbReturn.Count -1); j++) //TODO: why minus 1?
+			{
+				cTB = (CGAvailability) ctbReturn[j];
+				nSlots = SlotsInBlock(cTB, rsBlocks1) - SlotsInBlock(cTB, rsBlocks2);
+				string sResourceList = "";
+				string sAccessRuleList = "";
+				string sNote = "";
+
+				if (nSlots > 0) 
+				{
+					bool bRet = ResourceRulesInBlock(cTB, rsBlocks1, ref sResourceList, ref sAccessRuleList, ref sNote);
+				}
+				DataRow newRow;
+				newRow = rsCopy.NewRow();
+				newRow["START_TIME"] = cTB.StartTime;
+				newRow["END_TIME"] = cTB.EndTime;
+				newRow["SLOTS"] = nSlots;
+				//Subclinic, Access Rule and Resource are null in subtractedSlot sets
+				newRow["RESOURCE"] = sResource;
+				newRow["ACCESS_TYPE"] = sAccessRuleList;
+
+				newRow["NOTE"] = sNote;
+
+				rsCopy.Rows.Add(newRow);
+			}
+			return rsCopy;
+
+		}
+         */
+
+        /*
+		public static DataTable UnionBlocks(DataTable rs1, DataTable rs2)
+		{
+			//Test input tables
+			Debug.Assert(rs1 != null);
+			Debug.Assert(rs2 != null);
+			
+			DataTable rsCopy;
+			DataRow dr;
+			if (rs1.Columns.Count >= rs2.Columns.Count)
+			{
+				rsCopy = rs1.Copy();
+				foreach (DataRow dr2 in rs2.Rows)
+				{
+					dr = rsCopy.NewRow();
+					dr.ItemArray = dr2.ItemArray;
+					//dr["START_TIME"] = dr2["START_TIME"];
+					//dr["END_TIME"] = dr2["END_TIME"];
+					//dr["SLOTS"] = dr2["SLOTS"];
+					rsCopy.Rows.Add(dr);
+				}			
+			}
+			else
+			{
+				rsCopy = rs2.Copy();
+				foreach (DataRow dr2 in rs1.Rows)
+				{
+					dr = rsCopy.NewRow();
+					dr.ItemArray = dr2.ItemArray;
+					rsCopy.Rows.Add(dr);
+				}			
+			}
+			return rsCopy;
+		}
+        */
+
+        /*
+		public static DataTable IntersectBlocks(DataTable rs1, DataTable rs2)
+		{
+			DataTable rsCopy = CGSchedLib.CreateCopyTable();
+
+			//Test input tables
+
+			if ((rs1 == null) || (rs2 == null))
+				return rsCopy;
+
+			if ((rs1.Rows.Count == 0) || (rs2.Rows.Count == 0))
+				return rsCopy;
+
+			int nSlots1 = 0;
+			int nSlots2 = 0;
+			int nSlots3 = 0;
+			DateTime dStart1;
+			DateTime dStart2;
+			DateTime dStart3;
+			DateTime dEnd1;
+			DateTime dEnd2;
+			DateTime dEnd3;
+			string sClinic;
+			string sClinic2;
+//			Rectangle rect1 = new Rectangle();
+//			Rectangle rect2 = new Rectangle();
+//			rect1.X = 0;
+//			rect2.X = 0;
+//			rect1.Width = 1;
+//			rect2.Width = 1;
+
+			//			DataColumn cSlots = rs1.Columns["SLOTS"];
+			foreach (System.Data.DataRow r1 in rs1.Rows)
+			{
+				nSlots1 = (int) r1[rs1.Columns["SLOTS"]];
+				if (nSlots1 > 0) 
+				{
+					dStart1 = (DateTime) r1[rs1.Columns["START_TIME"]];
+					dEnd1 = (DateTime) r1[rs1.Columns["END_TIME"]];
+					sClinic = r1[rs1.Columns["SUBCLINIC"]].ToString();
+					if (sClinic == "NULL")
+						sClinic = "";
+//					rect1.Y = CGSchedLib.MinSince80(dStart1);
+//					rect1.Height = CGSchedLib.MinSince80(dEnd1) - rect1.Y;
+					foreach (System.Data.DataRow r2 in rs2.Rows) 
+					{
+						nSlots2 = (int) r2[rs2.Columns["SLOTS"]];
+
+						if (nSlots2 > 0) 
+						{
+							dStart2 = (DateTime) r2[rs2.Columns["START_TIME"]];
+							dEnd2 = (DateTime) r2[rs2.Columns["END_TIME"]];
+							sClinic2 = r2[rs2.Columns["SUBCLINIC"]].ToString();
+//							rect2.Y = CGSchedLib.MinSince80(dStart2);
+//							rect2.Height = CGSchedLib.MinSince80(dEnd2) - rect2.Y;
+							if (
+								/*(rect2.IntersectsWith(rect1) == true)
+								(CGSchedLib.TimesOverlap(dStart1, dEnd1, dStart2, dEnd2) == true)
+								&& 
+								((sClinic == sClinic2) || (sClinic == "NONE") || (sClinic2 == "NONE"))
+								)
+							{
+								dStart3 = (dStart1 >= dStart2) ? dStart1 : dStart2 ;
+								dEnd3 = (dEnd1 >= dEnd2) ? dEnd2 : dEnd1;
+								nSlots3 = (nSlots1 >= nSlots2) ? nSlots2 : nSlots1 ;
+
+								DataRow newRow;
+								newRow = rsCopy.NewRow();
+								newRow["START_TIME"] = dStart3;
+								newRow["END_TIME"] = dEnd3;
+								newRow["SLOTS"] = nSlots3;
+								newRow["SUBCLINIC"] = (sClinic == "NONE") ? sClinic2 : sClinic;
+								//Access Rule and Resource are null in interesected sets
+								newRow["ACCESS_TYPE"] = "";
+								newRow["RESOURCE"] = "";
+								rsCopy.Rows.Add(newRow);
+							}
+						}//nSlots2 > 0
+					}//foreach r2 in rs2.rows					
+				}//nSlots1 > 0
+			}//foreach r1 in rs1.rows
+			return rsCopy;
+		}//end IntersectBlocks
+        */
+        
+        /// <summary>
+        /// Number of minutes since Jan 1 1980
+        /// </summary>
+        /// <param name="d">Date to compare</param>
+        /// <returns>Minutes as integer</returns>
+		/*
+        public static int MinSince80(DateTime d)
+		{
+			//Returns the total minutes between d and 1 Jan 1980
+			DateTime y = new DateTime(1980,1,1,0,0,0);
+			Debug.Assert(d > y);
+			TimeSpan ts = d - y;
+			//Assure ts.TotalMinutes within int range so that cast on next line works
+			Debug.Assert(ts.TotalMinutes < 2147483646); 
+			int nMinutes = (int) ts.TotalMinutes;
+			return nMinutes;
+		}
+        */
+
+        /*
+        /// <summary>
+        /// Converts an Array of Times like this:
+        /// 10:00 10:00 10:20 10:20 10:30 10:30 10:30 10:40
+        /// To an array of availabilities like this:
+        /// 12:00-10:00 10:00-10:20 10:20-10:30 10:30-10:40
+        /// Where the 12:00 comes from the start time
+        /// </summary>
+        /// <param name="cdtArray">ArrayList containing start and end times of Appointments combmined and sorted</param>
+        /// <param name="dStartTime">Start Time for Schedule</param>
+        /// <param name="dEndTime">End Time for Schedule</param>
+        /// <param name="rTBArray">Output of Availabilities: Pass Empty</param>
+		public static void ScheduleFromArray(ArrayList cdtArray, DateTime dStartTime, DateTime dEndTime, 
+            ref ArrayList rTBArray)
+		{
+			int j = 0;
+			CGAvailability cTB;
+
+			if (cdtArray.Count == 0)
+				return;
+
+			Debug.Assert(cdtArray.Count > 0);
+			Debug.Assert(cdtArray[0].GetType() == typeof(DateTime));
+
+			//If StartTime passed in, then adjust for it
+			if (dStartTime.Ticks > 0) 
+			{
+				// if first Array Entry greater than start time, then create an availability
+                // with the start time as dStartTime, and end time as the first array entry, and 0 slots
+                // then add this to the output array
+                if ((DateTime) cdtArray[0] > dStartTime) 
+				{
+					cTB = new CGAvailability();
+					cTB.Create(dStartTime, (DateTime) cdtArray[0], 0);
+					rTBArray.Add(cTB);
+				}
+
+                // if first Array Entry less than start time (shouldn't happen),
+                // convert all input array's times less than the start time to all be the start time
+				if ((DateTime) cdtArray[0] < dStartTime) 
+				{
+					for (j = 0; j < cdtArray.Count; j++) 
+					{
+						if ((DateTime) cdtArray[j] < dStartTime)
+							cdtArray[j] = dStartTime;
+					}
+				}
+			}
+
+			//Trim the end if necessary
+            //If end time is passed, set all the times in the original array greater
+            //than the end time to be the end time (Shouldn't happen).
+			if (dEndTime.Ticks > 0) 
+			{
+				for (j = 0; j < cdtArray.Count; j++) 
+				{
+					if ((DateTime) cdtArray[j] > dEndTime)
+						cdtArray[j] = dEndTime;
+				}
+			}
+
+			//build the schedule in rTBArray
+			DateTime dTemp = new DateTime(); //hold previous appt time.
+			DateTime dStart;
+			DateTime dEnd;
+			int k = 0;
+            //for each time in appointment array
+			for (j = 0; j < (cdtArray.Count -1); j++) // -1 b/c k below starts with j+1.
+			{
+				if ((DateTime) cdtArray[j] != dTemp) 
+				{
+					dStart =(DateTime) cdtArray[j];
+					dTemp = dStart;
+                    
+                    //for each time in appointment array, starting with the next one
+					for (k = j+1; k < cdtArray.Count; k++) 
+					{
+						dEnd = new DateTime();
+						if ((DateTime) cdtArray[k] != dStart) //if the next time isn't the same
+						{
+							dEnd = (DateTime) cdtArray[k]; // set the end to be the next time
+						}
+						if (dEnd.Ticks > 0) //make a new availability and add it to the output array.
+						{
+							cTB = new CGAvailability();
+							cTB.Create(dStart, dEnd, 0);
+							rTBArray.Add(cTB);
+							break;
+						}
+                        // if the end time is still empty, loop
+					}
+				}
+			}
+
+		}//end ScheduleFromArray
+        */
+		
+        /*
+        //long CResourceLink::SlotsInBlock(CTimeBlock &rTimeBlock, _RecordsetPtr rsBlock)
+		public static int SlotsInBlock(CGAvailability rTimeBlock, DataTable rsBlock)
+		{
+			DateTime dStart1;
+			DateTime dStart2;
+			DateTime dEnd1;
+			DateTime dEnd2;
+			int nSlots = 0;
+
+			if (rsBlock.Rows.Count == 0)
+				return nSlots;
+
+			Rectangle rect1 = new Rectangle();
+			Rectangle rect2 = new Rectangle();
+			rect1.X = 0;
+			rect2.X = 0;
+			rect1.Width = 1;
+			rect2.Width = 1;
+
+			dStart1 = rTimeBlock.StartTime;
+			dEnd1 = rTimeBlock.EndTime;
+			rect1.Y = CGSchedLib.MinSince80(dStart1);
+			rect1.Height = CGSchedLib.MinSince80(dEnd1) - rect1.Y;
+
+            //for each row in the availability schedule
+			foreach (DataRow r in rsBlock.Rows) 
+			{
+				dStart2 = (DateTime) r[rsBlock.Columns["START_TIME"]];
+				dEnd2 = (DateTime) r[rsBlock.Columns["END_TIME"]];
+
+				rect2.Y = CGSchedLib.MinSince80(dStart2);
+				rect2.Height = CGSchedLib.MinSince80(dEnd2) - rect2.Y;
+				if (rect2.IntersectsWith(rect1) == true)
+				{
+					string sSlots =  r[rsBlock.Columns["SLOTS"]].ToString();
+					nSlots = System.Convert.ToInt16(sSlots);
+//					nSlots = (int) r[rsBlock.Columns["SLOTS"]];
+					break;
+				}
+			}
+			return nSlots;
+		}//end SlotsInBlock
+        */
+
+        /*
+		public static string ClinicInBlock(CGAvailability rTimeBlock, DataTable rsBlock)
+		{
+			DateTime dStart1;
+			DateTime dStart2;
+			DateTime dEnd1;
+			DateTime dEnd2;
+			string sClinic = "";
+
+			if (rsBlock.Rows.Count == 0)
+				return sClinic;
+
+			Rectangle rect1 = new Rectangle();
+			Rectangle rect2 = new Rectangle();
+			rect1.X = 0;
+			rect2.X = 0;
+			rect1.Width = 1;
+			rect2.Width = 1;
+
+			dStart1 = rTimeBlock.StartTime;
+			dEnd1 = rTimeBlock.EndTime;
+			rect1.Y = CGSchedLib.MinSince80(dStart1);
+			rect1.Height = CGSchedLib.MinSince80(dEnd1) - rect1.Y;
+
+			foreach (DataRow r in rsBlock.Rows) 
+			{
+				dStart2 = (DateTime) r[rsBlock.Columns["START_TIME"]];
+				dEnd2 = (DateTime) r[rsBlock.Columns["END_TIME"]];
+
+				rect2.Y = CGSchedLib.MinSince80(dStart2);
+				rect2.Height = CGSchedLib.MinSince80(dEnd2) - rect2.Y;
+				if (rect2.IntersectsWith(rect1) == true)
+				{
+					sClinic =  r[rsBlock.Columns["SUBCLINIC"]].ToString();
+					break;
+				}
+			}
+			return sClinic;
+		}//end ClinicInBlock
+        */
+
+        /*
+		public static bool ResourceRulesInBlock(CGAvailability rTimeBlock, DataTable rsBlock, ref string sResourceList, ref string sAccessRuleList, ref string sNote)
+		{
+			DateTime dStart1;
+			DateTime dStart2;
+			DateTime dEnd1;
+			DateTime dEnd2;
+			string sResource;
+			string sAccessRule;
+
+			if (rsBlock.Rows.Count == 0)
+				return true;
+
+			Rectangle rect1 = new Rectangle();
+			Rectangle rect2 = new Rectangle();
+			rect1.X = 0;
+			rect2.X = 0;
+			rect1.Width = 1;
+			rect2.Width = 1;
+
+			dStart1 = rTimeBlock.StartTime;
+			dEnd1 = rTimeBlock.EndTime;
+			rect1.Y = CGSchedLib.MinSince80(dStart1);
+			rect1.Height = CGSchedLib.MinSince80(dEnd1) - rect1.Y;
+
+			foreach (DataRow r in rsBlock.Rows) 
+			{
+				dStart2 = (DateTime) r[rsBlock.Columns["START_TIME"]];
+				dEnd2 = (DateTime) r[rsBlock.Columns["END_TIME"]];
+
+				rect2.Y = CGSchedLib.MinSince80(dStart2);
+				rect2.Height = CGSchedLib.MinSince80(dEnd2) - rect2.Y;
+				if (rect2.IntersectsWith(rect1) == true)
+				{
+					sResource = r[rsBlock.Columns["RESOURCE"]].ToString();
+					if (sResource == "NULL")
+						sResource = "";
+					if (sResource != "") 
+					{
+						if (sResourceList == "") 
+						{
+							sResourceList += sResource;
+						}
+						else 
+						{
+							sResourceList += "^" + sResource;
+						}
+					}
+					sAccessRule = r[rsBlock.Columns["ACCESS_TYPE"]].ToString();
+					if (sAccessRule == "0")
+						sAccessRule = "";
+					if (sAccessRule != "") 
+					{
+						if (sAccessRuleList == "") 
+						{
+							sAccessRuleList += sAccessRule;
+						}
+						else 
+						{
+							sAccessRuleList += "^" + sAccessRule;
+						}
+					}
+					sNote = r[rsBlock.Columns["NOTE"]].ToString();
+
+				}
+			}
+			return true;
+		}//End ResourceRulesInBlock
+        */
+
+	
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGSelectionChangedArgs.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGSelectionChangedArgs.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGSelectionChangedArgs.cs	(revision 1134)
@@ -0,0 +1,18 @@
+﻿namespace IndianHealthService.ClinicalScheduling
+{
+    using System;
+    /// <summary>
+    /// Custom Event Args for SelectionChange. Don't know totally what it does yet.
+    /// Changed to automatic properties.
+    /// </summary>
+    [Serializable]
+    public class CGSelectionChangedArgs : EventArgs
+    {
+        public DateTime EndTime {get; set;}
+
+        public string Resource {get; set;}
+
+        public DateTime StartTime {get; set;}
+    }
+}
+
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGView.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGView.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGView.cs	(revision 1134)
@@ -0,0 +1,3551 @@
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Diagnostics;
+using System.Data;
+using System.Threading;
+using IndianHealthService.BMXNet;
+using System.Runtime.InteropServices;
+using System.Drawing.Printing;
+using System.Linq;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Main Form: Shows Tree of Clinics and Calendar Grid 
+	/// </summary>
+	public class CGView : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.MainMenu mainMenu1;
+		private System.Windows.Forms.MenuItem mnuFile;
+		private System.Windows.Forms.MenuItem mnuTest;
+		private System.Windows.Forms.MenuItem mnuAppointment;
+		private System.Windows.Forms.MenuItem mnuNewAppointment;
+		private System.Windows.Forms.MenuItem mnu1Day;
+		private System.Windows.Forms.MenuItem mnu7Day;
+		private System.Windows.Forms.MenuItem menuItem4;
+		private System.Windows.Forms.MenuItem mnu5Day;
+		private System.Windows.Forms.MenuItem mnu10Minute;
+		private System.Windows.Forms.MenuItem mnu20Minute;
+		private System.Windows.Forms.MenuItem mnu30Minute;
+		private System.Windows.Forms.MenuItem mnuTimeScale;
+		private System.Windows.Forms.MenuItem mnu15Minute;
+		private System.Windows.Forms.MenuItem mnuOpenSchedule;
+		private System.Windows.Forms.MenuItem menuItem1;
+		private System.Windows.Forms.TreeView tvSchedules;
+		private System.Windows.Forms.MenuItem mnuViewScheduleTree;
+		private System.Windows.Forms.MenuItem mnuDeleteAppointment;
+		private System.Windows.Forms.MenuItem mnuTest1;
+		private System.Windows.Forms.Splitter splitter1;
+		private System.Windows.Forms.Splitter splitter2;
+		private System.Windows.Forms.StatusBar statusBar1;
+		private System.Windows.Forms.DateTimePicker dateTimePicker1;
+		private System.Windows.Forms.MenuItem mnuViewRightPanel;
+		private System.Windows.Forms.Panel panelRight;
+		private System.Windows.Forms.Panel panelTop;
+		private System.Windows.Forms.Panel panelCenter;
+		private System.Windows.Forms.Panel panelBottom;
+		private System.Windows.Forms.Label lblResource;
+		private System.Windows.Forms.ContextMenu contextMenu1;
+		private System.Windows.Forms.MenuItem ctxOpenSchedule;
+		private System.Windows.Forms.MenuItem ctxEditAvailability;
+		private System.Windows.Forms.MenuItem ctxProperties;
+		private System.Windows.Forms.MenuItem mnuSchedulingManagment;
+		private System.Windows.Forms.MenuItem ctxFindAppt;
+		private System.Windows.Forms.MenuItem mnuFindAppt;
+		internal System.Windows.Forms.MenuItem mnuRPMSServer;
+		internal System.Windows.Forms.MenuItem mnuRPMSLogin;
+		private System.Windows.Forms.MenuItem mnuCheckIn;
+		private System.Windows.Forms.MenuItem menuItem3;
+		private System.Windows.Forms.MenuItem mnuHelpAbout;
+		private System.Windows.Forms.MenuItem mnuCalendar;
+		private System.Windows.Forms.MenuItem mnuHelp;
+		private System.Windows.Forms.MenuItem mnuClose;
+		private System.Windows.Forms.MenuItem mnuViewPatientAppts;
+		private IndianHealthService.ClinicalScheduling.CalendarGrid calendarGrid1;
+		private System.Windows.Forms.MenuItem mnuCopyAppointment;
+		private System.Windows.Forms.Panel panelClip;
+		private System.Windows.Forms.ListBox lstClip;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.ContextMenu ctxApptClipMenu;
+		private System.Windows.Forms.MenuItem mnuRemoveClipItem;
+		private System.Windows.Forms.MenuItem mnuClearClipItems;
+		private System.Windows.Forms.MenuItem mnuEditAppointment;
+		private System.Windows.Forms.ContextMenu ctxCalendarGrid;
+		private System.Windows.Forms.MenuItem ctxCalGridAdd;
+		private System.Windows.Forms.MenuItem ctxCalGridEdit;
+		private System.Windows.Forms.MenuItem ctxCalGridDelete;
+		private System.Windows.Forms.MenuItem ctxCalGridCheckIn;
+		private System.Windows.Forms.MenuItem menuItem6;
+		private System.Windows.Forms.MenuItem menuItem7;
+		private System.Windows.Forms.MenuItem mnuPrintReminderLetters;
+		private System.Windows.Forms.MenuItem mnuPrintPatientLetter;
+		private System.Windows.Forms.MenuItem mnuPrintClinicSchedules;
+		private System.Windows.Forms.MenuItem ctxCalGridNoShow;
+		private System.Windows.Forms.MenuItem ctxCalGridNoShowUndo;
+		private System.Windows.Forms.MenuItem mnuNoShow;
+		private System.Windows.Forms.MenuItem mnuNoShowUndo;
+		private System.Windows.Forms.MenuItem mnuPrintRebookLetters;
+		private System.Windows.Forms.MenuItem mnuPrintCancellationLetters;
+		private System.Windows.Forms.MenuItem mnuWalkIn;
+		private System.Windows.Forms.MenuItem menuItem5;
+		private System.Windows.Forms.MenuItem menuItem8;
+		private System.Windows.Forms.MenuItem ctxCalGridWalkin;
+		private System.Windows.Forms.MenuItem menuItem2;
+		private System.Windows.Forms.MenuItem menuItem9;
+		private System.Windows.Forms.MenuItem mnuOpenMultipleSchedules;
+		private System.Windows.Forms.MenuItem mnuDisplayWalkIns;
+        private System.Windows.Forms.MenuItem mnuRPMSDivision;
+        private MenuItem menuItem10;
+        private MenuItem ctxCalGridReprintApptSlip;
+        private MenuItem ctxCalGridUndoCheckin;
+        private MenuItem ctxPrintScheduleT0;
+        private MenuItem ctxPrintScheduleT1;
+        private MenuItem ctxPrintScheduleT3;
+        private MenuItem menuItem12;
+        private MenuItem mnuRefresh;
+        private IContainer components;
+
+        #region Initialization
+        public CGView()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			m_nSlots = 0;
+			m_alSelectedTreeResourceArray = new ArrayList();
+			m_ClipList = new CGAppointments();
+
+		}
+
+		public void InitializeDocView(string sText)
+		{
+			this.Text = this.DocManager.ConnectInfo.UserName;
+			if (sText != null)
+				this.Text += " - " + sText;
+			if (DocManager.ConnectInfo.DivisionName != null)
+				this.Text += " - " + DocManager.ConnectInfo.DivisionName;
+		}
+
+		public void InitializeDocView(CGDocument doc, 
+			CGDocumentManager docMgr,
+			DateTime dStartDate,
+			string sText)
+		{
+			System.IntPtr pHandle = this.Handle;
+			this.DocManager = docMgr;
+			this.StartDate = dStartDate;
+			this.Document = doc;
+            
+            //Rather strangely, this line is needed for God knows Why...
+            //Without it, the Grid tries to draw appointments, but can't.
+            //Making a constructor in the Calendar Grid itself didn't work. Don't know why.
+            //XXX: For later investigation.
+            this.Appointments = new CGAppointments();
+            
+
+            // Set username and division up top
+            this.Text = this.DocManager.ConnectInfo.UserName;
+			if (sText != null)
+				this.Text += " - " + sText;
+			if (DocManager.ConnectInfo.DivisionName != null)
+				this.Text += " - " + DocManager.ConnectInfo.DivisionName;
+
+			this.m_ConnectInfo = m_DocManager.ConnectInfo;
+			m_bmxDelegate = new BMXNetConnectInfo.BMXNetEventDelegate(BMXNetEventHandler);
+			m_ConnectInfo.BMXNetEvent += m_bmxDelegate;
+		}
+
+		private BMXNetConnectInfo.BMXNetEventDelegate m_bmxDelegate;
+		
+
+        #endregion initialization
+
+        #region Windows Form Designer generated code
+        /// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CGView));
+            this.mainMenu1 = new System.Windows.Forms.MainMenu(this.components);
+            this.mnuFile = new System.Windows.Forms.MenuItem();
+            this.mnuOpenSchedule = new System.Windows.Forms.MenuItem();
+            this.mnuOpenMultipleSchedules = new System.Windows.Forms.MenuItem();
+            this.menuItem1 = new System.Windows.Forms.MenuItem();
+            this.mnuRPMSServer = new System.Windows.Forms.MenuItem();
+            this.mnuRPMSLogin = new System.Windows.Forms.MenuItem();
+            this.mnuRPMSDivision = new System.Windows.Forms.MenuItem();
+            this.menuItem3 = new System.Windows.Forms.MenuItem();
+            this.mnuSchedulingManagment = new System.Windows.Forms.MenuItem();
+            this.menuItem6 = new System.Windows.Forms.MenuItem();
+            this.mnuPrintClinicSchedules = new System.Windows.Forms.MenuItem();
+            this.mnuPrintReminderLetters = new System.Windows.Forms.MenuItem();
+            this.mnuPrintRebookLetters = new System.Windows.Forms.MenuItem();
+            this.mnuPrintCancellationLetters = new System.Windows.Forms.MenuItem();
+            this.mnuPrintPatientLetter = new System.Windows.Forms.MenuItem();
+            this.menuItem7 = new System.Windows.Forms.MenuItem();
+            this.mnuClose = new System.Windows.Forms.MenuItem();
+            this.mnuAppointment = new System.Windows.Forms.MenuItem();
+            this.mnuNewAppointment = new System.Windows.Forms.MenuItem();
+            this.mnuEditAppointment = new System.Windows.Forms.MenuItem();
+            this.mnuDeleteAppointment = new System.Windows.Forms.MenuItem();
+            this.menuItem5 = new System.Windows.Forms.MenuItem();
+            this.mnuNoShow = new System.Windows.Forms.MenuItem();
+            this.mnuNoShowUndo = new System.Windows.Forms.MenuItem();
+            this.menuItem8 = new System.Windows.Forms.MenuItem();
+            this.mnuCopyAppointment = new System.Windows.Forms.MenuItem();
+            this.mnuWalkIn = new System.Windows.Forms.MenuItem();
+            this.mnuFindAppt = new System.Windows.Forms.MenuItem();
+            this.mnuCheckIn = new System.Windows.Forms.MenuItem();
+            this.mnuViewPatientAppts = new System.Windows.Forms.MenuItem();
+            this.mnuCalendar = new System.Windows.Forms.MenuItem();
+            this.mnuDisplayWalkIns = new System.Windows.Forms.MenuItem();
+            this.mnu1Day = new System.Windows.Forms.MenuItem();
+            this.mnu5Day = new System.Windows.Forms.MenuItem();
+            this.mnu7Day = new System.Windows.Forms.MenuItem();
+            this.menuItem4 = new System.Windows.Forms.MenuItem();
+            this.mnuTimeScale = new System.Windows.Forms.MenuItem();
+            this.mnu10Minute = new System.Windows.Forms.MenuItem();
+            this.mnu15Minute = new System.Windows.Forms.MenuItem();
+            this.mnu20Minute = new System.Windows.Forms.MenuItem();
+            this.mnu30Minute = new System.Windows.Forms.MenuItem();
+            this.mnuViewScheduleTree = new System.Windows.Forms.MenuItem();
+            this.mnuViewRightPanel = new System.Windows.Forms.MenuItem();
+            this.menuItem12 = new System.Windows.Forms.MenuItem();
+            this.mnuRefresh = new System.Windows.Forms.MenuItem();
+            this.mnuHelp = new System.Windows.Forms.MenuItem();
+            this.mnuHelpAbout = new System.Windows.Forms.MenuItem();
+            this.mnuTest = new System.Windows.Forms.MenuItem();
+            this.mnuTest1 = new System.Windows.Forms.MenuItem();
+            this.tvSchedules = new System.Windows.Forms.TreeView();
+            this.contextMenu1 = new System.Windows.Forms.ContextMenu();
+            this.ctxOpenSchedule = new System.Windows.Forms.MenuItem();
+            this.ctxEditAvailability = new System.Windows.Forms.MenuItem();
+            this.ctxProperties = new System.Windows.Forms.MenuItem();
+            this.ctxFindAppt = new System.Windows.Forms.MenuItem();
+            this.ctxPrintScheduleT0 = new System.Windows.Forms.MenuItem();
+            this.ctxPrintScheduleT1 = new System.Windows.Forms.MenuItem();
+            this.ctxPrintScheduleT3 = new System.Windows.Forms.MenuItem();
+            this.panelRight = new System.Windows.Forms.Panel();
+            this.panelClip = new System.Windows.Forms.Panel();
+            this.lstClip = new System.Windows.Forms.ListBox();
+            this.ctxApptClipMenu = new System.Windows.Forms.ContextMenu();
+            this.mnuRemoveClipItem = new System.Windows.Forms.MenuItem();
+            this.mnuClearClipItems = new System.Windows.Forms.MenuItem();
+            this.label1 = new System.Windows.Forms.Label();
+            this.panelTop = new System.Windows.Forms.Panel();
+            this.dateTimePicker1 = new System.Windows.Forms.DateTimePicker();
+            this.lblResource = new System.Windows.Forms.Label();
+            this.panelCenter = new System.Windows.Forms.Panel();
+            this.ctxCalendarGrid = new System.Windows.Forms.ContextMenu();
+            this.ctxCalGridAdd = new System.Windows.Forms.MenuItem();
+            this.ctxCalGridEdit = new System.Windows.Forms.MenuItem();
+            this.ctxCalGridDelete = new System.Windows.Forms.MenuItem();
+            this.ctxCalGridCheckIn = new System.Windows.Forms.MenuItem();
+            this.ctxCalGridUndoCheckin = new System.Windows.Forms.MenuItem();
+            this.menuItem2 = new System.Windows.Forms.MenuItem();
+            this.ctxCalGridNoShow = new System.Windows.Forms.MenuItem();
+            this.ctxCalGridNoShowUndo = new System.Windows.Forms.MenuItem();
+            this.menuItem9 = new System.Windows.Forms.MenuItem();
+            this.ctxCalGridWalkin = new System.Windows.Forms.MenuItem();
+            this.menuItem10 = new System.Windows.Forms.MenuItem();
+            this.ctxCalGridReprintApptSlip = new System.Windows.Forms.MenuItem();
+            this.panelBottom = new System.Windows.Forms.Panel();
+            this.statusBar1 = new System.Windows.Forms.StatusBar();
+            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();
+            this.panelTop.SuspendLayout();
+            this.panelCenter.SuspendLayout();
+            this.panelBottom.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // mainMenu1
+            // 
+            this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.mnuFile,
+            this.mnuAppointment,
+            this.mnuCalendar,
+            this.mnuHelp,
+            this.mnuTest});
+            // 
+            // mnuFile
+            // 
+            this.mnuFile.Index = 0;
+            this.mnuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.mnuOpenSchedule,
+            this.mnuOpenMultipleSchedules,
+            this.menuItem1,
+            this.mnuRPMSServer,
+            this.mnuRPMSLogin,
+            this.mnuRPMSDivision,
+            this.menuItem3,
+            this.mnuSchedulingManagment,
+            this.menuItem6,
+            this.mnuPrintClinicSchedules,
+            this.mnuPrintReminderLetters,
+            this.mnuPrintRebookLetters,
+            this.mnuPrintCancellationLetters,
+            this.mnuPrintPatientLetter,
+            this.menuItem7,
+            this.mnuClose});
+            this.mnuFile.Text = "&File";
+            this.mnuFile.Popup += new System.EventHandler(this.mnuFile_Popup);
+            // 
+            // mnuOpenSchedule
+            // 
+            this.mnuOpenSchedule.Enabled = false;
+            this.mnuOpenSchedule.Index = 0;
+            this.mnuOpenSchedule.Text = "&Open Schedule";
+            this.mnuOpenSchedule.Visible = false;
+            this.mnuOpenSchedule.Click += new System.EventHandler(this.mnuOpenSchedule_Click);
+            // 
+            // mnuOpenMultipleSchedules
+            // 
+            this.mnuOpenMultipleSchedules.Index = 1;
+            this.mnuOpenMultipleSchedules.Shortcut = System.Windows.Forms.Shortcut.CtrlM;
+            this.mnuOpenMultipleSchedules.Text = "Open M&ultiple Schedules";
+            this.mnuOpenMultipleSchedules.Click += new System.EventHandler(this.mnuOpenMultipleSchedules_Click);
+            // 
+            // menuItem1
+            // 
+            this.menuItem1.Index = 2;
+            this.menuItem1.Text = "-";
+            // 
+            // mnuRPMSServer
+            // 
+            this.mnuRPMSServer.Index = 3;
+            this.mnuRPMSServer.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftS;
+            this.mnuRPMSServer.Text = "Change VistA &Server";
+            this.mnuRPMSServer.Click += new System.EventHandler(this.mnuRPMSServer_Click);
+            // 
+            // mnuRPMSLogin
+            // 
+            this.mnuRPMSLogin.Index = 4;
+            this.mnuRPMSLogin.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftL;
+            this.mnuRPMSLogin.Text = "Change VistA &Login";
+            this.mnuRPMSLogin.Click += new System.EventHandler(this.mnuRPMSLogin_Click);
+            // 
+            // mnuRPMSDivision
+            // 
+            this.mnuRPMSDivision.Index = 5;
+            this.mnuRPMSDivision.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftD;
+            this.mnuRPMSDivision.Text = "Change VistA &Division";
+            this.mnuRPMSDivision.Click += new System.EventHandler(this.mnuRPMSDivision_Click);
+            // 
+            // menuItem3
+            // 
+            this.menuItem3.Index = 6;
+            this.menuItem3.Text = "-";
+            // 
+            // mnuSchedulingManagment
+            // 
+            this.mnuSchedulingManagment.Index = 7;
+            this.mnuSchedulingManagment.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftM;
+            this.mnuSchedulingManagment.Text = "Scheduling &Management";
+            this.mnuSchedulingManagment.Click += new System.EventHandler(this.mnuSchedulingManagment_Click);
+            // 
+            // menuItem6
+            // 
+            this.menuItem6.Index = 8;
+            this.menuItem6.Text = "-";
+            // 
+            // mnuPrintClinicSchedules
+            // 
+            this.mnuPrintClinicSchedules.Index = 9;
+            this.mnuPrintClinicSchedules.Shortcut = System.Windows.Forms.Shortcut.CtrlP;
+            this.mnuPrintClinicSchedules.Text = "&Print Clinic Schedules";
+            this.mnuPrintClinicSchedules.Click += new System.EventHandler(this.mnuPrintClinicSchedules_Click);
+            // 
+            // mnuPrintReminderLetters
+            // 
+            this.mnuPrintReminderLetters.Index = 10;
+            this.mnuPrintReminderLetters.Shortcut = System.Windows.Forms.Shortcut.CtrlI;
+            this.mnuPrintReminderLetters.Text = "Print Rem&inder Letters";
+            this.mnuPrintReminderLetters.Click += new System.EventHandler(this.mnuPrintReminderLetters_Click);
+            // 
+            // mnuPrintRebookLetters
+            // 
+            this.mnuPrintRebookLetters.Index = 11;
+            this.mnuPrintRebookLetters.Shortcut = System.Windows.Forms.Shortcut.CtrlR;
+            this.mnuPrintRebookLetters.Text = "Print &Rebook Letters";
+            this.mnuPrintRebookLetters.Click += new System.EventHandler(this.mnuPrintRebookLetters_Click);
+            // 
+            // mnuPrintCancellationLetters
+            // 
+            this.mnuPrintCancellationLetters.Index = 12;
+            this.mnuPrintCancellationLetters.Shortcut = System.Windows.Forms.Shortcut.CtrlShiftC;
+            this.mnuPrintCancellationLetters.Text = "Print C&ancellation Letters";
+            this.mnuPrintCancellationLetters.Click += new System.EventHandler(this.mnuPrintCancellationLetters_Click);
+            // 
+            // mnuPrintPatientLetter
+            // 
+            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);
+            // 
+            // menuItem7
+            // 
+            this.menuItem7.Index = 14;
+            this.menuItem7.Text = "-";
+            // 
+            // mnuClose
+            // 
+            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);
+            // 
+            // mnuAppointment
+            // 
+            this.mnuAppointment.Index = 1;
+            this.mnuAppointment.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.mnuNewAppointment,
+            this.mnuEditAppointment,
+            this.mnuDeleteAppointment,
+            this.menuItem5,
+            this.mnuNoShow,
+            this.mnuNoShowUndo,
+            this.menuItem8,
+            this.mnuCopyAppointment,
+            this.mnuWalkIn,
+            this.mnuFindAppt,
+            this.mnuCheckIn,
+            this.mnuViewPatientAppts});
+            this.mnuAppointment.Text = "&Appointment";
+            this.mnuAppointment.Popup += new System.EventHandler(this.mnuAppointment_Popup);
+            // 
+            // mnuNewAppointment
+            // 
+            this.mnuNewAppointment.Index = 0;
+            this.mnuNewAppointment.Text = "&New Appointment";
+            this.mnuNewAppointment.Click += new System.EventHandler(this.mnuNewAppointment_Click);
+            // 
+            // mnuEditAppointment
+            // 
+            this.mnuEditAppointment.Index = 1;
+            this.mnuEditAppointment.Text = "&Edit Appointment";
+            this.mnuEditAppointment.Click += new System.EventHandler(this.mnuEditAppointment_Click);
+            // 
+            // mnuDeleteAppointment
+            // 
+            this.mnuDeleteAppointment.Index = 2;
+            this.mnuDeleteAppointment.Text = "Cance&l Appointment";
+            this.mnuDeleteAppointment.Click += new System.EventHandler(this.mnuDeleteAppointment_Click);
+            // 
+            // menuItem5
+            // 
+            this.menuItem5.Index = 3;
+            this.menuItem5.Text = "-";
+            // 
+            // mnuNoShow
+            // 
+            this.mnuNoShow.Index = 4;
+            this.mnuNoShow.Text = "Mark as No Sho&w";
+            this.mnuNoShow.Click += new System.EventHandler(this.mnuNoShow_Click);
+            // 
+            // mnuNoShowUndo
+            // 
+            this.mnuNoShowUndo.Index = 5;
+            this.mnuNoShowUndo.Text = "&Undo No Show";
+            this.mnuNoShowUndo.Click += new System.EventHandler(this.mnuNoShowUndo_Click);
+            // 
+            // menuItem8
+            // 
+            this.menuItem8.Index = 6;
+            this.menuItem8.Text = "-";
+            // 
+            // mnuCopyAppointment
+            // 
+            this.mnuCopyAppointment.Index = 7;
+            this.mnuCopyAppointment.Text = "&Copy  Appointment to Clipboard";
+            this.mnuCopyAppointment.Click += new System.EventHandler(this.mnuCopyAppointment_Click);
+            // 
+            // mnuWalkIn
+            // 
+            this.mnuWalkIn.Index = 8;
+            this.mnuWalkIn.Text = "Create Wal&k-In Appointment";
+            this.mnuWalkIn.Click += new System.EventHandler(this.mnuWalkIn_Click);
+            // 
+            // mnuFindAppt
+            // 
+            this.mnuFindAppt.Index = 9;
+            this.mnuFindAppt.Shortcut = System.Windows.Forms.Shortcut.CtrlF;
+            this.mnuFindAppt.Text = "&Find Available Appointment";
+            this.mnuFindAppt.Click += new System.EventHandler(this.mnuFindAppt_Click);
+            // 
+            // mnuCheckIn
+            // 
+            this.mnuCheckIn.Index = 10;
+            this.mnuCheckIn.Text = "Check &In Patient";
+            this.mnuCheckIn.Click += new System.EventHandler(this.mnuCheckIn_Click);
+            // 
+            // mnuViewPatientAppts
+            // 
+            this.mnuViewPatientAppts.Index = 11;
+            this.mnuViewPatientAppts.Text = "&View Patient Appointments";
+            this.mnuViewPatientAppts.Click += new System.EventHandler(this.mnuViewPatientAppts_Click);
+            // 
+            // mnuCalendar
+            // 
+            this.mnuCalendar.Index = 2;
+            this.mnuCalendar.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.mnuDisplayWalkIns,
+            this.mnu1Day,
+            this.mnu5Day,
+            this.mnu7Day,
+            this.menuItem4,
+            this.mnuTimeScale,
+            this.mnuViewScheduleTree,
+            this.mnuViewRightPanel,
+            this.menuItem12,
+            this.mnuRefresh});
+            this.mnuCalendar.Text = "&View";
+            // 
+            // mnuDisplayWalkIns
+            // 
+            this.mnuDisplayWalkIns.Checked = true;
+            this.mnuDisplayWalkIns.Index = 0;
+            this.mnuDisplayWalkIns.Text = "&Display Walk-Ins";
+            this.mnuDisplayWalkIns.Click += new System.EventHandler(this.mnuDisplayWalkIns_Click);
+            // 
+            // mnu1Day
+            // 
+            this.mnu1Day.Index = 1;
+            this.mnu1Day.Shortcut = System.Windows.Forms.Shortcut.Ctrl1;
+            this.mnu1Day.Text = "&1-Day View";
+            this.mnu1Day.Click += new System.EventHandler(this.mnu1Day_Click);
+            // 
+            // mnu5Day
+            // 
+            this.mnu5Day.Index = 2;
+            this.mnu5Day.Shortcut = System.Windows.Forms.Shortcut.Ctrl5;
+            this.mnu5Day.Text = "&5-Day View";
+            this.mnu5Day.Click += new System.EventHandler(this.mnu5Day_Click);
+            // 
+            // mnu7Day
+            // 
+            this.mnu7Day.Index = 3;
+            this.mnu7Day.Shortcut = System.Windows.Forms.Shortcut.Ctrl7;
+            this.mnu7Day.Text = "&7-Day View";
+            this.mnu7Day.Click += new System.EventHandler(this.mnu7Day_Click);
+            // 
+            // menuItem4
+            // 
+            this.menuItem4.Index = 4;
+            this.menuItem4.Text = "-";
+            // 
+            // mnuTimeScale
+            // 
+            this.mnuTimeScale.Index = 5;
+            this.mnuTimeScale.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.mnu10Minute,
+            this.mnu15Minute,
+            this.mnu20Minute,
+            this.mnu30Minute});
+            this.mnuTimeScale.Text = "&Time Scale";
+            // 
+            // mnu10Minute
+            // 
+            this.mnu10Minute.Enabled = false;
+            this.mnu10Minute.Index = 0;
+            this.mnu10Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl0;
+            this.mnu10Minute.Text = "&10-Minute";
+            this.mnu10Minute.Click += new System.EventHandler(this.mnu10Minute_Click);
+            // 
+            // mnu15Minute
+            // 
+            this.mnu15Minute.Enabled = false;
+            this.mnu15Minute.Index = 1;
+            this.mnu15Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl4;
+            this.mnu15Minute.Text = "1&5-Minute";
+            this.mnu15Minute.Click += new System.EventHandler(this.mnu15Minute_Click);
+            // 
+            // mnu20Minute
+            // 
+            this.mnu20Minute.Enabled = false;
+            this.mnu20Minute.Index = 2;
+            this.mnu20Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl3;
+            this.mnu20Minute.Text = "&20-Minute";
+            this.mnu20Minute.Click += new System.EventHandler(this.mnu20Minute_Click);
+            // 
+            // mnu30Minute
+            // 
+            this.mnu30Minute.Enabled = false;
+            this.mnu30Minute.Index = 3;
+            this.mnu30Minute.Shortcut = System.Windows.Forms.Shortcut.Ctrl2;
+            this.mnu30Minute.Text = "&30-Minute";
+            this.mnu30Minute.Click += new System.EventHandler(this.mnu30Minute_Click);
+            // 
+            // mnuViewScheduleTree
+            // 
+            this.mnuViewScheduleTree.Index = 6;
+            this.mnuViewScheduleTree.Text = "&Schedule Tree";
+            this.mnuViewScheduleTree.Click += new System.EventHandler(this.mnuViewScheduleTree_Click);
+            // 
+            // mnuViewRightPanel
+            // 
+            this.mnuViewRightPanel.Index = 7;
+            this.mnuViewRightPanel.Text = "&Appointment Clipboard";
+            this.mnuViewRightPanel.Click += new System.EventHandler(this.mnuViewRightPanel_Click);
+            // 
+            // menuItem12
+            // 
+            this.menuItem12.Index = 8;
+            this.menuItem12.Text = "-";
+            // 
+            // mnuRefresh
+            // 
+            this.mnuRefresh.Index = 9;
+            this.mnuRefresh.Shortcut = System.Windows.Forms.Shortcut.F5;
+            this.mnuRefresh.Text = "Refresh Data";
+            this.mnuRefresh.Click += new System.EventHandler(this.mnuRefresh_Click);
+            // 
+            // mnuHelp
+            // 
+            this.mnuHelp.Index = 3;
+            this.mnuHelp.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.mnuHelpAbout});
+            this.mnuHelp.Text = "&Help";
+            // 
+            // mnuHelpAbout
+            // 
+            this.mnuHelpAbout.Index = 0;
+            this.mnuHelpAbout.Text = "&About";
+            this.mnuHelpAbout.Click += new System.EventHandler(this.mnuHelpAbout_Click);
+            // 
+            // mnuTest
+            // 
+            this.mnuTest.Enabled = false;
+            this.mnuTest.Index = 4;
+            this.mnuTest.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.mnuTest1});
+            this.mnuTest.Text = "&Test";
+            this.mnuTest.Visible = false;
+            // 
+            // mnuTest1
+            // 
+            this.mnuTest1.Index = 0;
+            this.mnuTest1.Text = "Test1";
+            this.mnuTest1.Click += new System.EventHandler(this.mnuTest1_Click);
+            // 
+            // tvSchedules
+            // 
+            this.tvSchedules.BackColor = System.Drawing.SystemColors.ControlLight;
+            this.tvSchedules.ContextMenu = this.contextMenu1;
+            this.tvSchedules.Dock = System.Windows.Forms.DockStyle.Left;
+            this.tvSchedules.HotTracking = true;
+            this.tvSchedules.Location = new System.Drawing.Point(0, 0);
+            this.tvSchedules.Name = "tvSchedules";
+            this.tvSchedules.Size = new System.Drawing.Size(128, 359);
+            this.tvSchedules.Sorted = true;
+            this.tvSchedules.TabIndex = 1;
+            this.tvSchedules.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvSchedules_AfterSelect);
+            this.tvSchedules.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.tvSchedules_NodeMouseClick);
+            this.tvSchedules.DoubleClick += new System.EventHandler(this.tvSchedules_DoubleClick);
+            this.tvSchedules.MouseEnter += new System.EventHandler(this.tvSchedules_MouseEnter);
+            // 
+            // contextMenu1
+            // 
+            this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.ctxOpenSchedule,
+            this.ctxEditAvailability,
+            this.ctxProperties,
+            this.ctxFindAppt,
+            this.ctxPrintScheduleT0,
+            this.ctxPrintScheduleT1,
+            this.ctxPrintScheduleT3});
+            this.contextMenu1.Popup += new System.EventHandler(this.contextMenu1_Popup);
+            // 
+            // ctxOpenSchedule
+            // 
+            this.ctxOpenSchedule.DefaultItem = true;
+            this.ctxOpenSchedule.Index = 0;
+            this.ctxOpenSchedule.Text = "&Open Schedule";
+            this.ctxOpenSchedule.Click += new System.EventHandler(this.ctxOpenSchedule_Click);
+            // 
+            // ctxEditAvailability
+            // 
+            this.ctxEditAvailability.Index = 1;
+            this.ctxEditAvailability.Text = "&Edit Resource Availability";
+            this.ctxEditAvailability.Click += new System.EventHandler(this.ctxEditAvailability_Click);
+            // 
+            // ctxProperties
+            // 
+            this.ctxProperties.Index = 2;
+            this.ctxProperties.Text = "P&roperties";
+            this.ctxProperties.Click += new System.EventHandler(this.ctxProperties_Click);
+            // 
+            // ctxFindAppt
+            // 
+            this.ctxFindAppt.Index = 3;
+            this.ctxFindAppt.Text = "&Find Available Appointment";
+            this.ctxFindAppt.Click += new System.EventHandler(this.ctxFindAppt_Click);
+            // 
+            // ctxPrintScheduleT0
+            // 
+            this.ctxPrintScheduleT0.Index = 4;
+            this.ctxPrintScheduleT0.Text = "Print Clinic Schedule(s) (T+&0)";
+            this.ctxPrintScheduleT0.Click += new System.EventHandler(this.ctxPrintScheduleT0_Click);
+            // 
+            // ctxPrintScheduleT1
+            // 
+            this.ctxPrintScheduleT1.Index = 5;
+            this.ctxPrintScheduleT1.Text = "Print Clinic Schedule(s) (T+&1)";
+            this.ctxPrintScheduleT1.Click += new System.EventHandler(this.ctxPrintScheduleT1_Click);
+            // 
+            // ctxPrintScheduleT3
+            // 
+            this.ctxPrintScheduleT3.Index = 6;
+            this.ctxPrintScheduleT3.Text = "Print Clinic Schedule(s) (T+&3)";
+            this.ctxPrintScheduleT3.Click += new System.EventHandler(this.ctxPrintScheduleT3_Click);
+            // 
+            // panelRight
+            // 
+            this.panelRight.Controls.Add(this.panelClip);
+            this.panelRight.Dock = System.Windows.Forms.DockStyle.Right;
+            this.panelRight.Location = new System.Drawing.Point(996, 0);
+            this.panelRight.Name = "panelRight";
+            this.panelRight.Size = new System.Drawing.Size(128, 359);
+            this.panelRight.TabIndex = 3;
+            this.panelRight.Visible = false;
+            // 
+            // panelClip
+            // 
+            this.panelClip.Controls.Add(this.lstClip);
+            this.panelClip.Controls.Add(this.label1);
+            this.panelClip.Dock = System.Windows.Forms.DockStyle.Top;
+            this.panelClip.Location = new System.Drawing.Point(0, 0);
+            this.panelClip.Name = "panelClip";
+            this.panelClip.Size = new System.Drawing.Size(128, 448);
+            this.panelClip.TabIndex = 0;
+            // 
+            // lstClip
+            // 
+            this.lstClip.AllowDrop = true;
+            this.lstClip.ContextMenu = this.ctxApptClipMenu;
+            this.lstClip.DisplayMember = "PatientName";
+            this.lstClip.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lstClip.Location = new System.Drawing.Point(0, 32);
+            this.lstClip.Name = "lstClip";
+            this.lstClip.Size = new System.Drawing.Size(128, 416);
+            this.lstClip.TabIndex = 0;
+            this.lstClip.SelectedIndexChanged += new System.EventHandler(this.lstClip_SelectedIndexChanged);
+            this.lstClip.DragDrop += new System.Windows.Forms.DragEventHandler(this.lstClip_DragDrop);
+            this.lstClip.DragEnter += new System.Windows.Forms.DragEventHandler(this.lstClip_DragEnter);
+            this.lstClip.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lstClip_MouseDown);
+            this.lstClip.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lstClip_MouseMove);
+            // 
+            // ctxApptClipMenu
+            // 
+            this.ctxApptClipMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.mnuRemoveClipItem,
+            this.mnuClearClipItems});
+            this.ctxApptClipMenu.Popup += new System.EventHandler(this.ctxApptClipMenu_Popup);
+            // 
+            // mnuRemoveClipItem
+            // 
+            this.mnuRemoveClipItem.Index = 0;
+            this.mnuRemoveClipItem.Text = "Remove Item";
+            this.mnuRemoveClipItem.Click += new System.EventHandler(this.mnuRemoveClipItem_Click);
+            // 
+            // mnuClearClipItems
+            // 
+            this.mnuClearClipItems.Index = 1;
+            this.mnuClearClipItems.Text = "Clear All";
+            this.mnuClearClipItems.Click += new System.EventHandler(this.mnuClearClipItems_Click);
+            // 
+            // label1
+            // 
+            this.label1.Dock = System.Windows.Forms.DockStyle.Top;
+            this.label1.Location = new System.Drawing.Point(0, 0);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(128, 32);
+            this.label1.TabIndex = 1;
+            this.label1.Text = "Appointment Clipboard";
+            this.label1.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
+            // 
+            // panelTop
+            // 
+            this.panelTop.Controls.Add(this.dateTimePicker1);
+            this.panelTop.Controls.Add(this.lblResource);
+            this.panelTop.Dock = System.Windows.Forms.DockStyle.Top;
+            this.panelTop.Location = new System.Drawing.Point(128, 0);
+            this.panelTop.Name = "panelTop";
+            this.panelTop.Size = new System.Drawing.Size(868, 24);
+            this.panelTop.TabIndex = 6;
+            // 
+            // dateTimePicker1
+            // 
+            this.dateTimePicker1.Dock = System.Windows.Forms.DockStyle.Right;
+            this.dateTimePicker1.DropDownAlign = System.Windows.Forms.LeftRightAlignment.Right;
+            this.dateTimePicker1.Location = new System.Drawing.Point(662, 0);
+            this.dateTimePicker1.Name = "dateTimePicker1";
+            this.dateTimePicker1.Size = new System.Drawing.Size(206, 20);
+            this.dateTimePicker1.TabIndex = 1;
+            this.dateTimePicker1.CloseUp += new System.EventHandler(this.dateTimePicker1_CloseUp);
+            this.dateTimePicker1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.dateTimePicker1_KeyPress);
+            this.dateTimePicker1.Leave += new System.EventHandler(this.dateTimePicker1_Leave);
+            // 
+            // lblResource
+            // 
+            this.lblResource.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.lblResource.ForeColor = System.Drawing.SystemColors.Highlight;
+            this.lblResource.Location = new System.Drawing.Point(8, 5);
+            this.lblResource.Name = "lblResource";
+            this.lblResource.Size = new System.Drawing.Size(456, 19);
+            this.lblResource.TabIndex = 2;
+            // 
+            // panelCenter
+            // 
+            this.panelCenter.Controls.Add(this.calendarGrid1);
+            this.panelCenter.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.panelCenter.Location = new System.Drawing.Point(136, 24);
+            this.panelCenter.Name = "panelCenter";
+            this.panelCenter.Size = new System.Drawing.Size(857, 311);
+            this.panelCenter.TabIndex = 7;
+            // 
+            // ctxCalendarGrid
+            // 
+            this.ctxCalendarGrid.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.ctxCalGridAdd,
+            this.ctxCalGridEdit,
+            this.ctxCalGridDelete,
+            this.ctxCalGridCheckIn,
+            this.ctxCalGridUndoCheckin,
+            this.menuItem2,
+            this.ctxCalGridNoShow,
+            this.ctxCalGridNoShowUndo,
+            this.menuItem9,
+            this.ctxCalGridWalkin,
+            this.menuItem10,
+            this.ctxCalGridReprintApptSlip});
+            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);
+            // 
+            // ctxCalGridUndoCheckin
+            // 
+            this.ctxCalGridUndoCheckin.Index = 4;
+            this.ctxCalGridUndoCheckin.Text = "&Undo Check In";
+            this.ctxCalGridUndoCheckin.Click += new System.EventHandler(this.ctxCalGridUndoCheckin_Click);
+            // 
+            // menuItem2
+            // 
+            this.menuItem2.Index = 5;
+            this.menuItem2.Text = "-";
+            // 
+            // ctxCalGridNoShow
+            // 
+            this.ctxCalGridNoShow.Index = 6;
+            this.ctxCalGridNoShow.Text = "Mark as No Show";
+            this.ctxCalGridNoShow.Click += new System.EventHandler(this.ctxCalGridNoShow_Click);
+            // 
+            // ctxCalGridNoShowUndo
+            // 
+            this.ctxCalGridNoShowUndo.Index = 7;
+            this.ctxCalGridNoShowUndo.Text = "Undo NoShow";
+            this.ctxCalGridNoShowUndo.Click += new System.EventHandler(this.ctxCalGridNoShowUndo_Click);
+            // 
+            // menuItem9
+            // 
+            this.menuItem9.Index = 8;
+            this.menuItem9.Text = "-";
+            // 
+            // ctxCalGridWalkin
+            // 
+            this.ctxCalGridWalkin.Index = 9;
+            this.ctxCalGridWalkin.Text = "Create Wal&k-In Appointment";
+            this.ctxCalGridWalkin.Click += new System.EventHandler(this.ctxCalGridWalkin_Click);
+            // 
+            // menuItem10
+            // 
+            this.menuItem10.Index = 10;
+            this.menuItem10.Text = "-";
+            // 
+            // ctxCalGridReprintApptSlip
+            // 
+            this.ctxCalGridReprintApptSlip.Index = 11;
+            this.ctxCalGridReprintApptSlip.Text = "&Reprint Appointment Slip";
+            this.ctxCalGridReprintApptSlip.Click += new System.EventHandler(this.ctxCalGridReprintApptSlip_Click);
+            // 
+            // panelBottom
+            // 
+            this.panelBottom.Controls.Add(this.statusBar1);
+            this.panelBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.panelBottom.Location = new System.Drawing.Point(136, 335);
+            this.panelBottom.Name = "panelBottom";
+            this.panelBottom.Size = new System.Drawing.Size(857, 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(857, 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, 335);
+            this.splitter1.TabIndex = 9;
+            this.splitter1.TabStop = false;
+            // 
+            // splitter2
+            // 
+            this.splitter2.Dock = System.Windows.Forms.DockStyle.Right;
+            this.splitter2.Location = new System.Drawing.Point(993, 24);
+            this.splitter2.Name = "splitter2";
+            this.splitter2.Size = new System.Drawing.Size(3, 335);
+            this.splitter2.TabIndex = 10;
+            this.splitter2.TabStop = false;
+            // 
+            // calendarGrid1
+            // 
+            this.calendarGrid1.AllowDrop = true;
+            this.calendarGrid1.Appointments = null;
+            this.calendarGrid1.ApptDragSource = null;
+            this.calendarGrid1.AutoScroll = true;
+            this.calendarGrid1.AutoScrollMinSize = new System.Drawing.Size(600, 1898);
+            this.calendarGrid1.AvailabilityArray = null;
+            this.calendarGrid1.BackColor = System.Drawing.SystemColors.Window;
+            this.calendarGrid1.Columns = 5;
+            this.calendarGrid1.ContextMenu = this.ctxCalendarGrid;
+            this.calendarGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.calendarGrid1.DrawWalkIns = true;
+            this.calendarGrid1.GridBackColor = null;
+            this.calendarGrid1.GridEnter = false;
+            this.calendarGrid1.Location = new System.Drawing.Point(0, 0);
+            this.calendarGrid1.Name = "calendarGrid1";
+            this.calendarGrid1.Resources = ((System.Collections.ArrayList)(resources.GetObject("calendarGrid1.Resources")));
+            this.calendarGrid1.SelectedAppointment = 0;
+            this.calendarGrid1.Size = new System.Drawing.Size(857, 311);
+            this.calendarGrid1.StartDate = new System.DateTime(2003, 1, 27, 0, 0, 0, 0);
+            this.calendarGrid1.TabIndex = 0;
+            this.calendarGrid1.TimeScale = 20;
+            this.calendarGrid1.CGAppointmentChanged += new IndianHealthService.ClinicalScheduling.CalendarGrid.CGAppointmentChangedHandler(this.calendarGrid1_CGAppointmentChanged);
+            this.calendarGrid1.CGAppointmentAdded += new IndianHealthService.ClinicalScheduling.CalendarGrid.CGAppointmentChangedHandler(this.calendarGrid1_CGAppointmentAdded);
+            this.calendarGrid1.CGSelectionChanged += new IndianHealthService.ClinicalScheduling.CalendarGrid.CGSelectionChangedHandler(this.calendarGrid1_CGSelectionChanged);
+            this.calendarGrid1.DoubleClick += new System.EventHandler(this.calendarGrid1_DoubleClick);
+            this.calendarGrid1.MouseEnter += new System.EventHandler(this.calendarGrid1_MouseEnter);
+            // 
+            // CGView
+            // 
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.ClientSize = new System.Drawing.Size(1124, 359);
+            this.Controls.Add(this.panelCenter);
+            this.Controls.Add(this.panelBottom);
+            this.Controls.Add(this.splitter2);
+            this.Controls.Add(this.splitter1);
+            this.Controls.Add(this.panelTop);
+            this.Controls.Add(this.panelRight);
+            this.Controls.Add(this.tvSchedules);
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.Menu = this.mainMenu1;
+            this.Name = "CGView";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "CGView";
+            this.Activated += new System.EventHandler(this.CGView_Activated);
+            this.Closing += new System.ComponentModel.CancelEventHandler(this.CGView_Closing);
+            this.Load += new System.EventHandler(this.CGView_Load);
+            this.CursorChanged += new System.EventHandler(this.CGView_CursorChanged);
+            this.panelRight.ResumeLayout(false);
+            this.panelClip.ResumeLayout(false);
+            this.panelTop.ResumeLayout(false);
+            this.panelCenter.ResumeLayout(false);
+            this.panelBottom.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		#region Fields
+
+		private	CGDocument			m_Document;
+		private CGDocumentManager	m_DocManager;
+		private int					m_nSlots;
+		private ArrayList			m_alSelectedTreeResourceArray = new ArrayList();
+		private string				m_sDocName;
+		private CGAppointments		m_ClipList;
+		private bool				m_bDragDropStart = false;
+		private Hashtable			m_htOverbook;
+		private Hashtable			m_htModifySchedule;
+		private Hashtable			m_htChangeAppts;
+		private BMXNetConnectInfo	m_ConnectInfo = null;
+		public BMXNetConnectInfo.BMXNetEventDelegate	BMXNetEvent;
+
+		#endregion Fields
+
+		#region Properties
+
+		/// <summary>
+		/// Access the CalendarGrid associated with this view
+		/// </summary>
+		public CalendarGrid CGrid
+		{
+			get
+			{
+				return this.calendarGrid1;
+			}
+		}
+
+		/// <summary>
+		/// Accesses the document associated with this view
+		/// </summary>
+		public CGDocument Document
+		{
+			get
+			{
+				return this.m_Document;
+			}
+			set
+			{
+				this.m_Document = value;
+			}
+		}
+
+		public CGDocumentManager DocManager
+		{
+			get
+			{
+				return m_DocManager;
+			}
+			set
+			{
+				m_DocManager = value;
+			}
+		}
+
+		public DateTime StartDate
+		{
+			get
+			{
+				return this.calendarGrid1.StartDate;
+			}
+			set
+			{
+				this.calendarGrid1.StartDate = value;
+			}
+		}
+
+		public CGAppointments Appointments
+		{
+			get
+			{
+				return this.calendarGrid1.Appointments;
+			}
+			set
+			{
+				this.calendarGrid1.Appointments = value;
+			}
+		}
+
+
+		#endregion
+
+
+		#region AppointmentMenu Handlers
+
+		private void mnuAppointment_Popup(object sender, System.EventArgs e)
+		{
+			bool bEnabled = (this.Document.Resources.Count > 0)? true : false ;
+			this.mnuFindAppt.Enabled = bEnabled;
+
+			//Toggle availability of make, edit, checkin and delete appointments
+			//based on whether a range is selected.
+
+			mnuNewAppointment.Enabled = AddAppointmentEnabled();
+			this.mnuWalkIn.Enabled = mnuNewAppointment.Enabled;
+			bool bEditAppointments = this.EditAppointmentEnabled();
+
+			mnuDeleteAppointment.Enabled = bEditAppointments;
+			mnuCheckIn.Enabled = bEditAppointments;
+			mnuEditAppointment.Enabled = bEditAppointments;
+			mnuNoShow.Enabled = bEditAppointments;
+			mnuNoShowUndo.Enabled = bEditAppointments;
+		}
+
+		private void mnuCheckIn_Click(object sender, System.EventArgs e)
+		{
+			AppointmentCheckIn();
+		}
+
+		private void mnuCopyAppointment_Click(object sender, System.EventArgs e)
+		{
+			//For each appointment in the grid's selected list,
+			//add to the clip list
+			//and add to m_ClipList
+			try
+			{
+				foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
+				{
+					if (m_ClipList.AppointmentTable.Contains((int) a.AppointmentKey))
+					{
+						return;
+					}
+					m_ClipList.AddAppointment(a);
+					lstClip.Items.Add(a.PatientName);
+				}
+			}
+			catch (Exception ex)
+			{
+				string s = ex.Message;
+				Debug.Write(s);
+				return;
+			}
+		}
+
+		private void mnuDeleteAppointment_Click(object sender, System.EventArgs e)
+		{
+			AppointmentDelete();
+		}
+
+		private void mnuEditAppointment_Click(object sender, System.EventArgs e)
+		{
+			AppointmentEdit();
+		}
+
+		private void mnuNewAppointment_Click(object sender, System.EventArgs e)
+		{
+			AppointmentAddNew();
+		}
+
+		private void mnuNoShow_Click(object sender, System.EventArgs e)
+		{
+			AppointmentNoShow(true);
+		}
+
+		private void mnuNoShowUndo_Click(object sender, System.EventArgs e)
+		{
+			AppointmentNoShow(false);
+		}
+
+        private void ctxCalGridUndoCheckin_Click(object sender, EventArgs e)
+        {
+            AppointmentUndoCheckin();
+        }
+
+		#endregion AppointmentMenu Handlers
+
+		#region ContextMenu1 Handlers
+
+		private void contextMenu1_Popup(object sender, System.EventArgs e)
+		{
+			//Enable/disable OpenSchedule and Find Appointment options
+			bool bEnabled = (m_alSelectedTreeResourceArray.Count > 0)? true : false ;
+			this.ctxOpenSchedule.Enabled = bEnabled;
+			this.ctxFindAppt.Enabled = bEnabled;
+            this.ctxPrintScheduleT0.Enabled = bEnabled;
+            this.ctxPrintScheduleT1.Enabled = bEnabled;
+            this.ctxPrintScheduleT3.Enabled = bEnabled;
+
+			//properties not supported now
+			this.ctxProperties.Enabled = false;
+			this.ctxProperties.Visible = false;
+
+			//Enable/disable Availability menu option
+			if (m_alSelectedTreeResourceArray.Count != 1)
+			{
+				this.ctxEditAvailability.Enabled = false;
+				return;
+			}
+			
+			if (this.DocManager.ScheduleManager == true)
+			{
+				ctxEditAvailability.Enabled = true;
+				return;
+			}
+
+			string sResource = (string) m_alSelectedTreeResourceArray[0];
+			DataTable dt = this.DocManager.GlobalDataSet.Tables["ResourceUser"];
+			DataView dv = new DataView(dt, "", "RESOURCENAME ASC", DataViewRowState.OriginalRows);
+			string sDuz = this.DocManager.ConnectInfo.DUZ;
+			bool bModSchedule = false;
+			DataRowView[] drvA = dv.FindRows(sResource);
+			if (drvA.Length == 0)
+			{
+				this.ctxEditAvailability.Enabled = false;
+			}
+			else
+			{
+				string sModSchedule = "NO";
+				foreach (DataRowView drv in drvA)
+				{
+					if (drv["USERID"].ToString() == sDuz)
+					{
+						sModSchedule = drv["MODIFY_SCHEDULE"].ToString();
+						break;
+					}
+				}
+
+				bModSchedule = (sModSchedule == "YES")?true:false;
+				this.ctxEditAvailability.Enabled = bModSchedule;
+			}
+		}
+
+		private void ctxEditAvailability_Click(object sender, System.EventArgs e)
+		{
+			this.EditScheduleAvailability();
+		}
+
+		private void ctxOpenSchedule_Click(object sender, System.EventArgs e)
+		{
+			OpenSelectedSchedule(m_alSelectedTreeResourceArray, DateTime.Today);
+		}
+
+        private void ctxPrintScheduleT0_Click(object sender, EventArgs e)
+        {
+            PrintClinicSchedule(DateTime.Today, DateTime.Today);
+        }
+
+        private void ctxPrintScheduleT1_Click(object sender, EventArgs e)
+        {
+            PrintClinicSchedule(DateTime.Today.AddDays(1), DateTime.Today.AddDays(1));
+        }
+
+        private void ctxPrintScheduleT3_Click(object sender, EventArgs e)
+        {
+            PrintClinicSchedule(DateTime.Today.AddDays(3), DateTime.Today.AddDays(3));
+        }
+
+		private void ctxProperties_Click(object sender, System.EventArgs e)
+		{
+			//TODO: Implement Properties dialog
+			MessageBox.Show("TODO: Implement Properties dialog");
+		}
+
+		private void ctxFindAppt_Click(object sender, System.EventArgs e)
+		{
+			FindAvailableAppointment(m_alSelectedTreeResourceArray);
+		}
+
+		#endregion ContextMenu1 Handlers
+
+		#region ctxApptClipMenu Handlers
+
+		private void mnuClearClipItems_Click(object sender, System.EventArgs e)
+		{
+			this.m_ClipList.ClearAllAppointments();
+			lstClip.Items.Clear();
+		}
+
+		private void mnuRemoveClipItem_Click(object sender, System.EventArgs e)
+		{
+			int i = lstClip.SelectedIndex;
+			CGAppointment a = (CGAppointment) lstClip.SelectedItem;
+			int nKey = a.AppointmentKey;
+			if (i > -1)
+			{
+				m_ClipList.RemoveAppointment(nKey);
+				lstClip.Items.RemoveAt(i);
+			}
+		}
+
+		private void ctxApptClipMenu_Popup(object sender, System.EventArgs e)
+		{
+			mnuClearClipItems.Enabled = (m_ClipList.AppointmentTable.Count > 0);
+			mnuRemoveClipItem.Enabled = (lstClip.SelectedIndex > -1);
+		}
+
+		#endregion ctxApptClipMenu Handlers
+
+		#region ctxCalGridMenu Handlers
+
+		private void ctxCalendarGrid_Popup(object sender, System.EventArgs e)
+		{
+			//Toggle availability of make, edit, checkin and delete appointments
+			//based on whether appropriate element is selected.
+			ctxCalGridAdd.Enabled = AddAppointmentEnabled();
+			bool bEditAppointments = (EditAppointmentEnabled() && (calendarGrid1.SelectedAppointment > 0)) ;
+			ctxCalGridDelete.Enabled = bEditAppointments;
+			ctxCalGridEdit.Enabled = bEditAppointments;
+			ctxCalGridCheckIn.Enabled = bEditAppointments;
+			ctxCalGridNoShow.Enabled = NoShowEnabled();
+            ctxCalGridNoShowUndo.Enabled = !NoShowEnabled() && calendarGrid1.SelectedAppointment > 0;
+			ctxCalGridWalkin.Enabled = ctxCalGridAdd.Enabled;
+            //smh new code
+            ctxCalGridReprintApptSlip.Enabled = bEditAppointments;
+            ctxCalGridUndoCheckin.Enabled = UndoCheckinEnabled();
+            //end new code
+        }
+
+		private void ctxCalGridAdd_Click(object sender, System.EventArgs e)
+		{
+			AppointmentAddNew();
+		}
+
+		private void calendarGrid1_DoubleClick(object sender, System.EventArgs e)
+		{
+			if (calendarGrid1.SelectedAppointment > 0)
+				AppointmentEdit();
+		}
+
+		private void ctxCalGridEdit_Click(object sender, System.EventArgs e)
+		{
+			AppointmentEdit();
+		}
+
+		private void ctxCalGridDelete_Click(object sender, System.EventArgs e)
+		{
+			AppointmentDelete();
+		}
+
+		private void ctxCalGridCheckIn_Click(object sender, System.EventArgs e)
+		{
+			AppointmentCheckIn();
+		}
+
+		private void ctxCalGridNoShow_Click(object sender, System.EventArgs e)
+		{
+			AppointmentNoShow(true);
+		}
+
+		private void ctxCalGridNoShowUndo_Click(object sender, System.EventArgs e)
+		{
+			AppointmentNoShow(false);
+		}
+
+        //new code smh
+        private void ctxCalGridReprintApptSlip_Click(object sender, EventArgs e)
+        {
+            int apptID = this.CGrid.SelectedAppointment;
+            if (apptID <= 0) return;
+
+            CGAppointment a = (CGAppointment) this.Appointments.AppointmentTable[apptID];
+
+            PrintAppointmentSlip(a);
+        }
+        //end new code
+
+		#endregion ctxCalGridMenu Handlers
+
+		#region Methods
+
+        private bool EditAppointmentEnabled()
+        {
+            try
+            {
+                //Call here if there is a selected appointment in the grid
+                if (calendarGrid1.SelectedAppointment < 1)
+                    return false;
+                CGAppointment appt = (CGAppointment)this.Appointments.AppointmentTable[calendarGrid1.SelectedAppointment];
+                string sResource = appt.Resource;
+                return EditAppointmentEnabled(sResource);
+
+            }
+            catch (Exception ex)
+            {
+                string sMsg = ex.Message;
+                return false;
+            }
+        }
+
+        private bool EditAppointmentEnabled(string sResource)
+        {
+
+            bool bManager = this.DocManager.ScheduleManager;
+            if (bManager == true)
+            {
+                return (true);
+            }
+            else
+            {
+                bool bModAppts;
+                bModAppts = (bool)this.m_htChangeAppts[sResource];
+                return bModAppts;
+            }
+        }
+
+        private bool AddAppointmentEnabled()
+        {
+            if (this.calendarGrid1.SelectedRange.Cells.CellCount < 1)
+                return false;
+
+            bool bManager = this.DocManager.ScheduleManager;
+            if (bManager == true)
+            {
+                return (true);
+            }
+            else
+            {
+                DateTime dStart = DateTime.Today;
+                DateTime dEnd = DateTime.Today;
+                string sResource = "";
+                bool bRet = this.calendarGrid1.GetSelectedTime(out dStart, out dEnd, out sResource);
+                if (bRet == false)
+                {
+                    return false;
+                }
+                bool bSlotsAvailable;
+                bool bOverbook;
+                bool bModSchedule;
+                bool bModAppts;
+                bOverbook = (bool)this.m_htOverbook[sResource];
+                bModSchedule = (bool)this.m_htModifySchedule[sResource];
+                bModAppts = (bool)this.m_htChangeAppts[sResource];
+                if (bModAppts == false)
+                    return false;
+
+                bSlotsAvailable = (this.m_nSlots > 0);
+                return ((bSlotsAvailable) || (bModSchedule) || (bOverbook));
+            }
+        }
+
+        private bool NoShowEnabled()
+        {
+            if (calendarGrid1.SelectedAppointment < 1)
+                return false;
+            CGAppointment appt = (CGAppointment)this.Appointments.AppointmentTable[calendarGrid1.SelectedAppointment];
+            return !appt.NoShow;
+        }
+
+        private bool UndoCheckinEnabled()
+        {
+            if (calendarGrid1.SelectedAppointment < 1) return false;
+            CGAppointment appt = (CGAppointment)this.Appointments.AppointmentTable[calendarGrid1.SelectedAppointment];
+            return appt.CheckInTime.Ticks > 0;
+        }
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		void UpdateStatusBar(DateTime dStart, DateTime dEnd, CGAvailability av)
+		{
+            System.Text.StringBuilder sbMsg = new System.Text.StringBuilder(100);
+		    sbMsg.Append(dStart.ToShortTimeString() + " to " + dEnd.ToShortTimeString());
+			if (av != null && m_nSlots > 0)
+			{
+                sbMsg.Append(String.Format(" has {0} slot(s) available for {1}. ", m_nSlots.ToString(), av.AccessTypeName));
+            }
+			else
+			{
+				sbMsg.Append(": No appointment slots available. ");
+			}
+
+            if (av != null)
+            {
+                sbMsg.Append(String.Format("Source Block: {0} to {1} with {2} slot(s) of type {3}",
+                    av.StartTime.ToShortTimeString(),
+                    av.EndTime.ToShortTimeString(),
+                    av.Slots.ToString(),
+                    av.AccessTypeName));
+
+                sbMsg.Append(". ");
+
+                if (av.Note.Trim().Length > 0) sbMsg.Append("Note: " + av.Note + ".");
+            }
+
+            this.statusBar1.Text = sbMsg.ToString();
+		}
+
+		private void EditScheduleAvailability()
+		{
+			CGAVDocument doc = new CGAVDocument();
+			try 
+			{
+				//If resource already open, then navigate to its window
+				CGAVView v =this.DocManager.GetAVViewByResource(m_alSelectedTreeResourceArray);
+			
+				if (v != null) 
+				{
+					v.Activate();
+				}
+				else 
+				{
+					//If not already open, get a lock and open it
+					doc.DocManager = this.DocManager;
+					for (int j=0; j < m_alSelectedTreeResourceArray.Count; j++)
+					{
+						doc.AddResource((string) m_alSelectedTreeResourceArray[j]);
+					}
+					doc.DocName = this.m_sDocName;
+
+					//Get preferred time scale from resource info
+
+					DataTable dt = this.DocManager.GlobalDataSet.Tables["Resources"];
+					DataView dv = new DataView(dt, "", "RESOURCE_NAME ASC", DataViewRowState.OriginalRows);
+					int nScale = 60;
+					int nTest=0;
+					string sResource;
+					int nDataRow;
+					DataRowView drv;
+					string sResourceID="";
+					for (int j=0; j < m_alSelectedTreeResourceArray.Count; j++)
+					{
+						sResource = (string) m_alSelectedTreeResourceArray[j];
+						nDataRow = dv.Find(sResource);
+						Debug.Assert(nDataRow != -1);
+						drv = dv[nDataRow];
+						if (drv["TIMESCALE"].ToString() == "")
+						{
+							nTest = 15; //15 minute default
+						}
+						else
+						{
+							nTest = (int) drv["TIMESCALE"];
+						}
+						nScale = (nTest < nScale)?nTest : nScale ;
+						sResourceID = drv["RESOURCEID"].ToString();
+					}
+					
+					doc.ResourceID = Convert.ToInt32(sResourceID);
+
+					bool bLock = DocManager.ConnectInfo.bmxNetLib.Lock("^BSDXRES(" + sResourceID + ")", "+");
+					if (bLock == false)
+					{
+						throw new BMXNetException("Another user is currently editing availability for this resource.  Try later.");
+					}					
+					
+					doc.OnOpenDocument();
+					v =this.DocManager.GetAVViewByResource(m_alSelectedTreeResourceArray);
+					CalendarGrid cg = v.CGrid;
+
+					cg.TimeScale = nScale;
+
+					//Position grid to 0700
+					cg.PositionGrid(7);
+				}
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show("Unable to edit availability for " + m_sDocName + " schedule.  " +  ex.Message, "Clinical Scheduling");
+				this.m_DocManager.CloseAllViews(doc);
+				return;
+			}
+		}
+
+        /// <summary>
+        /// Opens a view of the Schedule a user requested to open at a specific date
+        /// </summary>
+        /// <param name="sSelectedTreeResourceArray">A set of resources to open (?pending more investigation)</param>
+        /// <param name="dDate">Date at which to show the Grid</param>
+		private void OpenSelectedSchedule(ArrayList sSelectedTreeResourceArray, DateTime dDate)
+		{
+			//If resource already open, then navigate to its window
+			CGView v = this.DocManager.GetViewByResource(sSelectedTreeResourceArray);
+			if (v != null) 
+			{
+				v.Activate();
+				v.dateTimePicker1.Value = dDate;
+                v.RequestRefreshGrid();
+                return;
+			}
+
+            //So if it is not a view that's already open, it means we have to grab the data for
+            //So we tell the user to wait wait wait
+            this.Cursor = Cursors.WaitCursor;
+            this.LoadSplash();  //Open "Loading" splash
+            
+            
+            //If this Document has no resources then use it (happens when the GUI has nothing open, typically after log-in)
+			//Else, create a new document
+            CGDocument doc;
+            if (this.Document.m_sResourcesArray.Count == 0)
+			{
+                doc = this.Document;
+			}
+			else 
+			{
+                doc = new CGDocument();
+                doc.DocManager = this.DocManager;				
+			}
+
+            //Add resources to Document
+			for (int j=0; j < sSelectedTreeResourceArray.Count; j++)
+			{
+				doc.AddResource((string) sSelectedTreeResourceArray[j]);
+			}
+
+			doc.DocName = this.m_sDocName;
+				
+            try
+			{
+				doc.OnOpenDocument(dDate); //this typically creates a new view
+			}
+				
+            catch (Exception ex)
+			{
+				MessageBox.Show("Unable to open " + m_sDocName + " schedule.  " +  ex.Message, "Clinical Scheduling");
+				this.m_DocManager.CloseAllViews(doc);
+				return;
+			}
+
+            //We are doing this--again--to fetch the view we just opened in OnOpenDocument
+            //XXX: Yes, I know, this totally sucks. But I don't fully grasp the whole thing yet to refactor it.
+			v =this.DocManager.GetViewByResource(sSelectedTreeResourceArray);
+			
+            //Position the Grid to start at a certain day.
+            //XXX: This must be a better way to do this.
+            v.dateTimePicker1.Value = dDate;
+            v.StartDate = doc.StartDate;
+
+			//Get preferred time scale from resource info
+			//If more than one resource, get smallest time scale
+			CalendarGrid cg = v.CGrid;
+			DataTable dt = this.DocManager.GlobalDataSet.Tables["Resources"];
+			DataView dv = new DataView(dt, "", "RESOURCE_NAME ASC", DataViewRowState.OriginalRows);
+			int nScale = 60;
+			int nTest=0;
+			string sResource;
+			int nDataRow;
+			DataRowView drv;
+			for (int j=0; j < sSelectedTreeResourceArray.Count; j++)
+			{
+				sResource = (string) sSelectedTreeResourceArray[j];
+				nDataRow = dv.Find(sResource);
+				Debug.Assert(nDataRow != -1);
+				drv = dv[nDataRow];
+				if (drv["TIMESCALE"].ToString() == "")
+				{
+					nTest = 15; //15 minute default
+				}
+				else
+				{
+					nTest = (int) drv["TIMESCALE"];
+				}
+				nScale = (nTest < nScale)?nTest : nScale ;
+			}
+
+			cg.TimeScale = nScale;
+
+			cg.PositionGrid(7);
+
+            //new code for v 1.5 //smh
+            //Disable entries that would make time scale smaller b/c users should not be able to
+            //make appointments for smaller time scales
+            if (nScale >= 10)
+            {
+                v.mnu10Minute.Enabled = true;
+                v.mnu15Minute.Enabled = true;
+                v.mnu20Minute.Enabled = true;
+                v.mnu30Minute.Enabled = true;
+            }
+            if (nScale >= 15)
+            {
+                v.mnu10Minute.Enabled = false;
+                v.mnu15Minute.Enabled = true;
+                v.mnu20Minute.Enabled = true;
+                v.mnu30Minute.Enabled = true;
+            }
+            if (nScale >= 20)
+            {
+                v.mnu10Minute.Enabled = false;
+                v.mnu15Minute.Enabled = false;
+                v.mnu20Minute.Enabled = true;
+                v.mnu30Minute.Enabled = true;
+            }
+            if (nScale >= 30)
+            {
+                v.mnu10Minute.Enabled = false;
+                v.mnu15Minute.Enabled = false;
+                v.mnu20Minute.Enabled = false;
+                v.mnu30Minute.Enabled = true;
+            }
+            if (nScale >= 60)
+            {
+                v.mnu10Minute.Enabled = false;
+                v.mnu15Minute.Enabled = false;
+                v.mnu20Minute.Enabled = false;
+                v.mnu30Minute.Enabled = false;
+            }
+            //end new code
+
+			//Get the OverBook and ModifySchedule permissions from ResourceUser table
+			//and populate the hashtables
+			string	sOverbook;
+			string	sModSchedule;
+			string	sModAppts;
+			bool	bOverbook;
+			bool	bModSchedule;
+			bool	bModAppts;
+			v.m_htOverbook = new Hashtable(sSelectedTreeResourceArray.Count);
+			v.m_htModifySchedule = new Hashtable(sSelectedTreeResourceArray.Count);
+			v.m_htChangeAppts = new Hashtable(sSelectedTreeResourceArray.Count);
+			dt = this.DocManager.GlobalDataSet.Tables["ResourceUser"];
+			dv = new DataView(dt, "", "RESOURCENAME ASC", DataViewRowState.OriginalRows);
+			dv.RowFilter = "USERNAME = '" + this.DocManager.ConnectInfo.UserName + "'";
+			for (int j=0; j < dv.Count; j++)
+			{
+				drv = dv[j];
+				sResource = drv["RESOURCENAME"].ToString();
+				sOverbook = drv["OVERBOOK"].ToString();
+				bOverbook = (sOverbook == "YES")?true:false;
+				sModSchedule = drv["MODIFY_SCHEDULE"].ToString();
+				bModSchedule = (sModSchedule == "YES")?true:false;
+				sModAppts = drv["MODIFY_APPOINTMENTS"].ToString();
+				bModAppts = (sModAppts == "YES")?true:false;
+				v.m_htOverbook[sResource] = bOverbook;
+				v.m_htModifySchedule[sResource] = bModSchedule;
+				v.m_htChangeAppts[sResource] = bModAppts;
+			}
+
+			//For programmers and scheduling managers, set all permissions for all resources
+			if (this.DocManager.ScheduleManager == true)
+			{
+				dt = this.DocManager.GlobalDataSet.Tables["Resources"];
+				foreach (DataRow dr in dt.Rows)
+				{
+					sResource = dr["RESOURCE_NAME"].ToString();
+					v.m_htOverbook[sResource] = true;
+					v.m_htModifySchedule[sResource] = true;
+					v.m_htChangeAppts[sResource] = true;
+				}
+			}
+
+			v.calendarGrid1.SetOverlapTable();
+			v.calendarGrid1.Refresh();
+
+            // Set cursor back and stop splash screen
+            this.Cursor = Cursors.Default;
+            StopSplash();
+		}
+
+		private void LoadTree()
+		{
+			//Navigate from ResourceGroup table to Resources table
+			DataRow[] arrRows;
+			DataRelation dr = DocManager.GlobalDataSet.Relations["GroupResource"];
+			string sGroup;
+			string sResource;
+			int nIndex = 0;
+			foreach (DataRow r in DocManager.GlobalDataSet.Tables["ResourceGroup"].Rows)
+			{
+				sGroup = r["RESOURCE_GROUP"].ToString();
+				TreeNode deptNode = new TreeNode(sGroup);
+				nIndex = this.tvSchedules.Nodes.Add(deptNode);
+				tvSchedules.Nodes[nIndex].Tag = "Dept";
+				arrRows = r.GetChildRows(dr);
+				for (int i=0; i< arrRows.Length; i++) 
+				{
+					sResource = arrRows[i]["RESOURCE_NAME"].ToString();
+					TreeNode resNode = new TreeNode(sResource);
+					int nResIndex = deptNode.Nodes.Add(resNode);
+					deptNode.Nodes[nResIndex].Tag = "Resource";
+				}
+			}
+		}
+
+		public void CreateNewSchedule()
+		{				
+			//Create a new document and open it
+			CGDocument doc = new CGDocument();
+			doc.DocManager = this.DocManager;
+			try
+			{
+				doc.OnOpenDocument(DateTime.Today);
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show("Unable to open " + m_sDocName + " schedule.  " +  ex.Message, "Clinical Scheduling");
+				this.m_DocManager.CloseAllViews(doc);
+				return;
+			}
+		}
+
+		private void AppointmentEdit()
+		{
+			try
+			{
+				int nApptID = this.calendarGrid1.SelectedAppointment;
+				Debug.Assert(nApptID != 0);
+			
+				CGAppointment a = (CGAppointment) this.Appointments.AppointmentTable[nApptID];
+
+				DAppointPage dAppt = new DAppointPage();			
+				dAppt.DocManager = this.m_DocManager;
+				dAppt.InitializePage(a);
+
+				calendarGrid1.CGToolTip.Active = false;
+
+				if (dAppt.ShowDialog(this) == DialogResult.Cancel)
+				{
+					calendarGrid1.CGToolTip.Active = true;
+					return;
+				}
+				calendarGrid1.CGToolTip.Active = true;
+
+				string sNote = dAppt.Note;
+
+				//Call Document to edit appointment
+				this.Document.EditAppointment(a, sNote);
+
+			}
+			catch (Exception ex)
+			{
+				Debug.Write("CGView.AppointmentEdit Failed:  " + ex.Message);
+			}
+		}
+
+		/// <summary>
+        /// Marks all selected appointments as No Show from this.calendarGrid1.SelectedAppointments
+		/// </summary>
+		/// <param name="bNoShow">True - Mark as noshow; False - undo noshow</param>
+		private void AppointmentNoShow(bool bNoShow)
+		{
+
+			//bNoShow indicates whether to mark or un-mark as noshow
+			bool			bMarked = false;	//Indicates at least one attempt to mark as noshow succeeded
+			bool			bRebook = false;	//Stores user's response to auto-rebook dialog question
+			CGAppointments	alRebookList = new CGAppointments();  // list of appointments to rebook
+
+		    DNoShow dlg = new DNoShow(); // no show dialog
+
+			if (bNoShow == true)  // if noshowing, show the dialog to ask the user
+			{
+				if (dlg.ShowDialog(this) == DialogResult.Cancel)
+				{
+					return;
+				}
+			}
+
+			bRebook = dlg.AutoRebook;
+
+			foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
+			{
+				int nApptID = a.AppointmentKey;
+				Debug.Assert(nApptID != 0);
+				try
+				{
+					if ((bNoShow == true)  // if no-showing
+						&&
+						(a.StartTime.Date > DateTime.Today.Date)
+						&&
+						(MessageBox.Show(this, "The appointment for " + a.PatientName + " is in the future.  Are you sure you want to No-Show?", "Windows Scheduling", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK))
+					{
+					}
+					else  // otherwise, make or undo show
+					{
+						string sError = Document.AppointmentNoShow(a, bNoShow);
+						if (sError != "1")
+							throw new Exception(sError);
+
+						bMarked = true;
+					}
+				}
+				catch (Exception ex)
+				{
+					MessageBox.Show("Unable to mark appointment No Show: " +  ex.Message, "Clinical Scheduling");
+				}
+
+				if (bRebook == true)
+				{
+					try
+					{
+						CGAppointment aRebook;
+						int nMinimumdays = dlg.RebookStartDays;
+						int nMaximumdays = dlg.RebookMaxDays;
+						int nAccessType = dlg.RebookAccessType;
+						//-1 means use current type
+
+						if (nAccessType == -1)
+						{
+							//Get access type from grid
+							int nRow = 0;
+							int nCol = 0;
+							CGCell cgCell = new CGCell();
+							this.calendarGrid1.GetCellFromTime(a.StartTime, ref nRow, ref nCol, true , a.Resource);
+							cgCell.CellColumn = nCol;
+							cgCell.CellRow = nRow;
+							this.calendarGrid1.GetTypeFromCell(cgCell, out nAccessType);
+							a.AccessTypeID = nAccessType;
+						}
+						string sResult = Document.AutoRebook(a, nAccessType, nMinimumdays, nMaximumdays, out aRebook);
+						if (sResult == "1")
+						{
+							//Add appointment to list of rebooked appointments
+							alRebookList.AddAppointment(a);
+						}
+						else
+						{
+							MessageBox.Show("Unable to rebook this patient: " + a.PatientName);
+						}
+
+					}
+					catch (Exception ex)
+					{
+						MessageBox.Show("Unable to rebook: " + ex.Message);
+					}
+				}
+
+                if (bMarked == true)
+                {
+                    //Notify other scheduling users that this schedule has changed
+                    try
+                    {
+                        //this.Document.RefreshDocument(); no need for this; event raised back and prompts refresh itself.
+                        RaiseRPMSEvent("BSDX SCHEDULE", a.Resource);
+                    }
+                    catch (Exception ex)
+                    {
+                        Debug.Write(ex.Message);
+                    }
+                    this.calendarGrid1.Invalidate();
+                }						
+            }
+            AutoRebookFromList(alRebookList);
+		}
+		
+        /// <summary>
+        /// Prints Auto Rebook Letters; does nothing else to DB!!!
+        /// </summary>
+        /// <param name="alRebookList">List of appointments</param>
+		private void AutoRebookFromList(CGAppointments alRebookList)
+		{
+			//Print AutoRebook letters.
+			if (alRebookList.AppointmentCount > 0)
+			{
+				//build |-delimited list of ApptIDs to pass to BSDX REBOOK LIST
+				string sApptIDList = "";
+
+				System.Collections.ArrayList a = new ArrayList();
+
+				foreach (CGAppointment appt in alRebookList.AppointmentTable.Values)
+				{
+					string sApptID = appt.AppointmentKey.ToString() + "|";
+					sApptIDList += sApptID;
+					if (a.Contains(appt.Resource) == false)
+						a.Add(appt.Resource);
+				}
+
+                // Print rebooks
+				string sClinicList = "";
+				foreach (string sRes in a)
+				{
+					sClinicList = sClinicList + sRes + "|";	
+				}
+				DPatientLetter dpl = new DPatientLetter();					
+				dpl.InitializeFormRebookLetters(this.DocManager, sClinicList, sApptIDList);
+				dpl.ShowDialog(this);
+			}		
+		}
+
+		/// <summary>
+		/// Delete appointment ApptID
+		/// </summary>
+		/// <param name="nApptID"></param>
+		/// <returns></returns>
+		private string AppointmentDeleteOne(int nApptID)
+		{
+			return Document.DeleteAppointment(nApptID);
+		}
+
+		/// <summary>
+		/// Delete all selected appointments
+		/// </summary>
+        private void AppointmentDelete()
+        {
+            calendarGrid1.CGToolTip.Active = false;
+            CGAppointments alRebookList = new CGAppointments();
+
+            // check to see if any appointment is checked in first
+            foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
+            {
+                if (a.CheckInTime.Ticks > 0)
+                {
+                    MessageBox.Show("You must Un-checkin the appointment first before removing it.");
+                    return;
+                }
+            }
+
+            DCancelAppt dCancel = new DCancelAppt();
+            dCancel.InitializePage(this.m_DocManager);
+            if (dCancel.ShowDialog(this) != DialogResult.OK)
+            {
+                calendarGrid1.CGToolTip.Active = true;
+                return;
+            }
+
+            bool bClinic = dCancel.ClinicCancelled;
+            int nReason = dCancel.CancelReason;
+            string sRemarks = dCancel.CancelRemarks;
+            bool bRebook = dCancel.AutoRebook;
+            int nRebookStart = dCancel.RebookStartDays;
+            int nRebookMax = dCancel.RebookMaxDays;
+            int nRebookAccessType = dCancel.RebookAccessType;
+
+            calendarGrid1.CGToolTip.Active = true;
+
+            foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
+            {
+                
+                int nApptID = a.AppointmentKey;
+                Debug.Assert(nApptID != 0);
+                try
+                {
+                    string sError = Document.DeleteAppointment(nApptID, bClinic, nReason, sRemarks);
+                    if (sError != "")
+                        throw new Exception(sError);
+
+                    this.UpdateArrays(); //Redraw this calendar grid
+
+                    if (bRebook == true)
+                    {
+                        try
+                        {
+                            //TODO: Parameterize  or dialogize the minum and maximum rebook days
+                            CGAppointment aRebook;
+                            int nMinimumdays = nRebookStart;
+                            int nMaximumdays = nRebookMax;
+                            string sResult = Document.AutoRebook(a, nRebookAccessType, nMinimumdays, nMaximumdays, out aRebook);
+                            if (sResult == "1")
+                            {
+                                //Add appointment to list of rebooked appointments
+                                alRebookList.AddAppointment(a);
+                            }
+
+                        }
+                        catch (Exception ex)
+                        {
+                            MessageBox.Show("Unable to rebook: " + ex.Message);
+                        }
+                    }
+
+                    RaiseRPMSEvent("BSDX SCHEDULE", a.Resource);
+                }
+                catch (Exception ex)
+                {
+                    MessageBox.Show("Unable to delete appointment.  " + ex.Message, "Clinical Scheduling");
+                }
+
+
+                if (alRebookList.AppointmentCount > 0)
+                {
+                    AutoRebookFromList(alRebookList);
+                }
+            }
+        }
+
+		private void AppointmentCheckIn()
+		{
+			int nApptID = this.calendarGrid1.SelectedAppointment;
+			Debug.Assert(nApptID != 0);
+
+            //smh
+			//CGAppointment a = (CGAppointment) this.Appointments.AppointmentTable[nApptID];
+            CGAppointment a = (CGAppointment)this.Document.Appointments.AppointmentTable[nApptID];
+			try
+			{
+				bool bAlreadyCheckedIn = false;
+				if (a.CheckInTime.Ticks > 0)
+					bAlreadyCheckedIn = true;
+
+				if ((bAlreadyCheckedIn == false)
+					&&
+					(a.StartTime.Date > DateTime.Today.Date))
+				{
+					MessageBox.Show(this, "It is too early to check in " + a.PatientName, "Windows Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+					return;
+				}
+
+				DCheckIn dlgCheckin = new DCheckIn();
+				dlgCheckin.InitializePage(a);
+				calendarGrid1.CGToolTip.Active = false;
+				if (dlgCheckin.ShowDialog(this) != DialogResult.OK)
+				{
+					calendarGrid1.CGToolTip.Active = true;
+					return;
+				}
+				calendarGrid1.CGToolTip.Active = true;
+
+                if (bAlreadyCheckedIn != true)
+                {
+                    DateTime dtCheckIn = dlgCheckin.CheckInTime;
+
+                    //Tell appointment that it is checked in, for proper coloring;
+                    //When you refresh from the DB, it will have this property.
+                    a.CheckInTime = DateTime.Now;
+
+                    //Save to Database
+                    this.Document.CheckInAppointment(nApptID, dtCheckIn);
+                }
+                
+                //Get Provider (XXXXXXXX: NOT SAVED TO THE DATABASE RIGHT NOW)
+                a.Provider = dlgCheckin.Provider;
+
+                // Print Routing Slip if user checks that box...
+                if (dlgCheckin.PrintRouteSlip)
+                    this.PrintRoutingSlip(a);
+
+                //redraw grid
+				this.calendarGrid1.Invalidate();
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show("Error checking in patient:  " +  ex.Message, "Clinical Scheduling");
+			}
+
+		}
+
+        private void AppointmentUndoCheckin()
+        {
+            Debug.Assert(calendarGrid1.SelectedAppointment > 0);
+
+            foreach (CGAppointment a in this.calendarGrid1.SelectedAppointments.AppointmentTable.Values)
+            {
+
+                string msg; //out var
+                bool didweSucceed = Document.AppointmentUndoCheckin(a, out msg);
+
+                if (!didweSucceed)
+                {
+                    MessageBox.Show("Error: " + msg);
+                    continue;
+                }
+
+                RaiseRPMSEvent("BSDX SCHEDULE", a.Resource);
+            }
+            
+            this.UpdateArrays();
+        }
+
+		private void AppointmentAddWalkin()
+		{
+			try
+			{
+
+			
+				//Get Time and Resource from Selected Cell
+				DateTime dStart = DateTime.Today;
+				DateTime dEnd = DateTime.Today;
+				string sResource = "";
+				bool bRet = this.calendarGrid1.GetSelectedTime(out dStart, out dEnd, out sResource);
+				if (bRet == false)
+					return;
+
+				TimeSpan tsDuration = dEnd - dStart;
+				int nDuration = (int) tsDuration.TotalMinutes;
+				Debug.Assert(nDuration > 0);
+
+				/*
+				 * 8-10-05 Added check to prevent walkin from being created
+				 * on a date later than today.
+				 */
+
+				if (dStart.Date > DateTime.Today.Date)
+				{
+					MessageBox.Show(this, "You cannot create a walk-in appointment for a date in the future.\n Select today's date and try again.", "Windows Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+					return;
+				}
+
+                // Added check for making Walk-ins in the past. 9/28/2010
+                if (dStart.Date < DateTime.Today.Date)
+                {
+                    var result = MessageBox.Show("Are you sure you want to make a Walk-in in the past?", "Windows Scheduling", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
+                    if (result == DialogResult.No) return;
+                }
+
+				/*
+				 * 8-10-05 Added overbook prompt for walkin
+				*/
+                //SMH: Takes too long to do.
+				//this.Document.RefreshDocument();
+                CGAvailability resultantAvail;
+
+				m_nSlots = m_Document.SlotsAvailable(dStart, dEnd, sResource, this.calendarGrid1.TimeScale, out resultantAvail);
+
+				if (m_nSlots < 1)
+				{
+					DialogResult dr = MessageBox.Show(this, "There are no slots available at the selected time.  Do you want to overbook this appointment?", "Clinical Scheduling",MessageBoxButtons.YesNo);
+					if (dr != DialogResult.Yes)
+					{
+						return;
+					}
+				}
+
+				//Display a dialog to collect Patient Name
+				DPatientLookup dPat = new DPatientLookup();
+				dPat.DocManager = m_DocManager;
+				
+				int nAccessTypeID = 0;
+				bRet = calendarGrid1.GetSelectedType(out nAccessTypeID);
+
+				if (dPat.ShowDialog(this) == DialogResult.Cancel)
+				{
+					return;
+				}
+
+                CGAppointment appt = new CGAppointment();
+				appt.PatientID = Convert.ToInt32(dPat.PatientIEN);
+				appt.PatientName = dPat.PatientName;
+				appt.StartTime = dStart;
+				appt.EndTime = dEnd;
+				appt.Resource = sResource;
+				appt.HealthRecordNumber = dPat.HealthRecordNumber;
+
+                appt.Patient = new Patient
+                {
+                    DFN = Convert.ToInt32(dPat.PatientIEN),
+                    ID = dPat.PatientPID,
+                    Name = dPat.PatientName,
+                    HRN = dPat.HealthRecordNumber,
+                    DOB = dPat.PatientDOB
+                };
+
+                //smh: Takes too long
+				//this.Document.RefreshDocument();
+
+				//Call Document to add a walkin appointment
+				int nApptID = this.Document.CreateAppointment(appt, true);
+
+				//Now check them in.
+				calendarGrid1.SelectedAppointment = nApptID;
+				AppointmentCheckIn();
+
+                //Show the new set of appointments by calling UpdateArrays.
+                this.UpdateArrays();
+
+                RaiseRPMSEvent("BSDX SCHEDULE", appt.Resource);
+			}
+			catch (Exception ex)
+			{
+                string msg;
+                if (BMXNetLib.Piece(ex.Message, "~", 1) == "-10") // -10 means that BSDXAPI reported an error.
+                    msg = BMXNetLib.Piece(ex.Message, "~", 4);
+                else
+                    msg = ex.Message;
+
+                MessageBox.Show("VISTA says: \r\n" + msg, "Unable to Make Walk-in Appointment");
+                return;
+			}
+		}
+
+		private void AppointmentAddNew() 
+		{
+			try
+			{
+				//Get Time and Resource from Selected Cell
+				DateTime dStart = DateTime.Today;
+				DateTime dEnd = DateTime.Today;
+				string sResource = "";
+				bool bRet = this.calendarGrid1.GetSelectedTime(out dStart, out dEnd, out sResource);
+				if (bRet == false)
+					return;
+
+                // Added check for making Walk-ins in the past. 9/28/2010
+                if (dStart.Date < DateTime.Today.Date)
+                {
+                    var result = MessageBox.Show("Are you sure you want to make an appointment in the past?", "Windows Scheduling", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
+                    if (result == DialogResult.No) return;
+                }
+
+				//Test dStart for Holiday
+				DataView dvHoliday = new DataView(this.DocManager.GlobalDataSet.Tables["HOLIDAY"]);
+				dvHoliday.Sort="DATE ASC";
+				int nFind = dvHoliday.Find(dStart.Date);
+				if (nFind > -1)
+				{
+					string sHoliday = "";
+					DataRowView drv = dvHoliday[nFind];
+					sHoliday = drv["NAME"].ToString();
+					if (MessageBox.Show(this, dStart.ToShortDateString() + " is a holiday (" + sHoliday + ").  Are you sure you want to make this appointment?","Clinical Scheduling", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
+						return;
+				}
+				
+                //Sam: takes too long. Remove this call; deal with the issue of concurrent appointments another way.
+                //this.Document.RefreshDocument();
+                CGAvailability resultantAvail;
+                m_nSlots = m_Document.SlotsAvailable(dStart, dEnd, sResource, this.calendarGrid1.TimeScale, out resultantAvail);
+
+				if (m_nSlots < 1)
+				{
+					DialogResult dr = MessageBox.Show(this, "There are no slots available at the selected time.  Do you want to overbook this appointment?", "Clinical Scheduling",MessageBoxButtons.YesNo);
+					if (dr != DialogResult.Yes)
+					{
+						return;
+					}
+				}
+
+				//Display a dialog to collect Patient Name
+				DPatientLookup dPat = new DPatientLookup();
+				dPat.DocManager = m_DocManager;
+				
+				int nAccessTypeID = 0;
+				bRet = calendarGrid1.GetSelectedType(out nAccessTypeID);
+
+				if (dPat.ShowDialog(this) == DialogResult.Cancel)
+				{
+					return;
+				}
+
+				//Call the appointment dialog to collect the appointment info
+				Debug.Assert(dPat.PatientIEN != "");
+				DAppointPage dAppt = new DAppointPage();			
+				dAppt.DocManager = this.m_DocManager;
+				string sNote = "";
+                dAppt.InitializePage(dPat.PatientIEN, dStart, dEnd, sResource, sNote, nAccessTypeID);
+
+				if (dAppt.ShowDialog(this) == DialogResult.Cancel)
+				{
+					return;
+				}
+
+                CGAppointment appt = dAppt.Appointment;
+                    
+                // old way of making an appointment
+                    /*new CGAppointment();
+				appt.PatientID = Convert.ToInt32(dPat.PatientIEN);
+				appt.PatientName = dPat.PatientName;
+				appt.StartTime = dStart;
+				appt.EndTime = dEnd;
+				appt.Resource = sResource;
+				appt.Note = dAppt.Note;
+				appt.HealthRecordNumber = dPat.HealthRecordNumber;
+				appt.AccessTypeID = nAccessTypeID;
+                    */
+
+				//Call Document to add a new appointment. Document adds appointment to CGAppointments array.
+				this.Document.CreateAppointment(appt);
+
+                
+                if (dAppt.PrintAppointmentSlip)
+                {
+                    PrintAppointmentSlip(appt);
+                }
+
+                //Show the new set of appointments by calling UpdateArrays. Fetches Document's CGAppointments
+                this.UpdateArrays();
+
+                RaiseRPMSEvent("BSDX SCHEDULE", appt.Resource);
+			}
+			catch (Exception ex)
+			{   
+                string msg;
+                if (BMXNetLib.Piece(ex.Message, "~", 1) == "-10") // -10 means that BSDXAPI reported an error.
+                    msg = BMXNetLib.Piece(ex.Message, "~", 4);
+                else
+                    msg = ex.Message;
+
+				MessageBox.Show("VISTA says: \r\n" + msg, "Unable to Make Appointment");
+				return;
+			}
+		}
+
+        #region BMX Event Processing and Callbacks
+        /// <summary>
+        /// Loosely typed delegate used several times below.
+        /// </summary>
+        delegate void OnUpdateScheduleDelegate();
+        
+        /// <summary>
+        /// Subscription point for each CGView to process BMX events polled from the server
+        /// </summary>
+        /// <param name="obj">Not used</param>
+        /// <param name="e">BMXEvent Args: 
+        /// e.BMXEvent is free text for Event Type; e.BMXParam is free text for Event Arguments</param>
+        private void BMXNetEventHandler(Object obj, BMXNet.BMXNetEventArgs e)
+        {
+            try
+            {
+                // if this class is undefined (e.g. if the user just closed the form, do nothing
+                if (this == null) return;
+
+                // if event is Autofire event
+                if (e.BMXEvent == "BMXNet AutoFire")
+                {
+                    Debug.Write("CGView caught AutoFire event.\n");
+                   
+                    //Create a delegate to OnUpdateSchedule and call Async
+                    //Once Async Call is done, go to OnUpdateScheduleCallback
+                    OnUpdateScheduleDelegate ousd = new OnUpdateScheduleDelegate(OnUpdateSchedule);
+                    ousd.BeginInvoke(OnUpdateScheduleCallback, null);
+
+                    return;
+                }
+
+                // if event is BSDX SCHEDULE
+                else if (e.BMXEvent == "BSDX SCHEDULE")
+                {
+                    //See if any of the resources in the event argument matches BSDX Schedule.
+                    //If yes, fire off the delegate
+                    string sResourceName;
+                    for (int j = 0; j < m_Document.m_sResourcesArray.Count; j++)
+                    {
+                        sResourceName = m_Document.m_sResourcesArray[j].ToString();
+                        if (e.BMXParam == sResourceName)
+                        {
+                            Debug.Write("CGView caught BSDX SCHEDULE event.\n");
+
+                            //Create a delegate to OnUpdateSchedule and call Async
+                            //Once Async Call is done, go to OnUpdateScheduleCallb
+                            OnUpdateScheduleDelegate ousd = new OnUpdateScheduleDelegate(OnUpdateSchedule);
+                            ousd.BeginInvoke(OnUpdateScheduleCallback, null);
+                            
+                            break;
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Debug.Write(ex.Message);
+            }
+        }
+
+        /// <summary>
+        /// Update Appointments and Availabilites using Document.RefreshDocumentAsync on a different thread
+        /// </summary>
+        /// <remarks>
+        /// This method is expected to be called asynchornously.
+        /// </remarks>
+		public void OnUpdateSchedule()
+		{
+			try
+			{
+				m_Document.RefreshDocumentAsync(); //new
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show("Unable to refresh document " +  ex.Message, "Clinical Scheduling");
+			}
+		}
+
+        /// <summary>
+        /// Callback for when OnUpdateSchedule is done. Triggers the Grid to redraw itself by calling UpdateArrays.
+        /// </summary>
+        /// <param name="itfAR">not used</param>
+        /// <remarks>Calls UpdateArrays via this.Invoke to make sure that the grid is redrawn on the UI thread</remarks>
+        private void OnUpdateScheduleCallback(IAsyncResult itfAR)
+        {
+            OnUpdateScheduleDelegate d = new OnUpdateScheduleDelegate(UpdateArrays);
+            
+            //try catch just in case that the view closed in the meantime.
+            try
+            {
+                this.Invoke(d);
+            }
+            catch (InvalidOperationException)
+            {
+                return;
+            }
+        }
+
+        /// <summary>
+        /// Create a new event in RPMS. Wrapper around BMXConnectInfo.RaiseEvent
+        /// </summary>
+        /// <param name="sEvent">Name of Event to Raise</param>
+        /// <param name="sParams">Parameter of Event to Raise</param>
+        public void RaiseRPMSEvent(string sEvent, string sParams)
+        {
+            try
+            {
+                //Signal RPMS to raise an event
+                m_ConnectInfo.RaiseEvent(sEvent, sParams, false);
+            }
+            catch (Exception ex)
+            {
+                Debug.Write(ex.Message);
+            }
+        }
+
+        #endregion
+
+        /// <summary>
+        /// This is how you set how the grid will look
+        /// </summary>
+		public void UpdateArrays()
+		{
+            // Make sure that we are called synchronously
+			Debug.Assert(this.InvokeRequired == false,"CGView.UpdateArrays InvokeRequired");
+            // This is where you set how the grid will look
+
+            //Create Deep copy of Availability Array
+            ArrayList availArrayCopy = new ArrayList();
+            foreach (CGAvailability av in this.m_Document.AvailabilityArray)
+                availArrayCopy.Add(av);
+
+			try 
+			{
+                //Tell the grid about Avails, Appts, and Resources.
+                this.calendarGrid1.AvailabilityArray = availArrayCopy;
+                //Appts are cloned b/c if we tie into  the class directly, we shoot off errors when we manipulate it.
+                this.calendarGrid1.Appointments = (CGAppointments)this.m_Document.Appointments.Clone();
+				this.calendarGrid1.Resources = this.m_Document.Resources;
+                //Redraw the calendar grid
+				this.calendarGrid1.OnUpdateArrays(); // this draws the Calendar
+				this.lblResource.Text = this.m_Document.DocName;
+				this.calendarGrid1.Invalidate();
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show("Unable to update arrays " +  ex.Message, "Clinical Scheduling");
+			}
+		}
+
+        private void SchedulingManagement()
+        {
+            try
+            {
+                bool bLock = DocManager.ConnectInfo.Lock("^BSDXMGR", "+", "");
+                if (bLock == false)
+                {
+                    throw new Exception("Another user is currently in Scheduling Management.  Try later.");
+                }
+
+                DManagement dMgm = new DManagement();
+                dMgm.InitializeDialog(this.m_DocManager);
+
+                if (dMgm.ShowDialog(this) == DialogResult.Cancel)
+                {
+                }
+
+                m_DocManager.GlobalDataSet.Tables["ResourceUser"].Clear();
+                m_DocManager.LoadResourceUserTable(false);
+                bLock = DocManager.ConnectInfo.bmxNetLib.Lock("^BSDXMGR", "-");
+            }
+            catch (ApplicationException aex)
+            {
+                string sMsg = aex.Message;
+                MessageBox.Show("Unable to acquire transmit lock.  Try later.");
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show("Scheduling Management Error:  " + ex.Message, "Clinical Scheduling");
+            }
+        }
+
+        public void UpdateTree()
+        {
+            this.tvSchedules.Nodes.Clear();
+            this.LoadTree();
+        }
+
+        public void ViewPatientAppointments()
+        {
+            try
+            {
+                //Display a dialog to collect Patient Name
+                DPatientLookup dPat = new DPatientLookup();
+                dPat.DocManager = m_DocManager;
+                if (dPat.ShowDialog(this) == DialogResult.Cancel)
+                {
+                    return;
+                }
+
+                Debug.Assert(dPat.PatientIEN != "");
+                int nPatientID = Convert.ToInt32(dPat.PatientIEN);
+                ViewPatientAppointments(nPatientID);
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+            }
+        }
+
+        public void ViewPatientAppointments(int PatientID)
+        {
+            DPatientApptDisplay dPa = new DPatientApptDisplay();
+
+            dPa.InitializeForm(this.DocManager, PatientID);
+
+
+            if (dPa.ShowDialog(this) != DialogResult.Cancel)
+            {
+
+            }
+
+        }
+
+        private void FindAvailableAppointment(ArrayList alResourceArray)
+        {
+            DApptSearch dSearch = new DApptSearch();
+            dSearch.InitializePage(alResourceArray, this.m_DocManager);
+            if (dSearch.ShowDialog(this) == DialogResult.Cancel)
+                return;
+
+            CGAvailability av = dSearch.SelectedAvailability;
+
+            ArrayList alResource = new ArrayList();
+            alResource.Add(av.ResourceList);
+            DateTime sDate = av.StartTime;
+            m_sDocName = av.ResourceList;
+            OpenSelectedSchedule(alResource, sDate);
+
+        }
+
+        #endregion Methods
+
+		#region Events
+
+        /// <summary>
+        /// Special import to get the GetActiveWindow method from Win32
+        /// </summary>
+        /// <returns>Windows Handle number for Foregreound Active Window</returns>
+        [DllImport("user32.dll")]
+        static extern IntPtr GetActiveWindow();
+
+        /// <summary>
+        /// If a mouse enters the grid, check if the grid is on the active form first before stealing the focus
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void calendarGrid1_MouseEnter(object sender, EventArgs e)
+        {
+            if (GetActiveWindow() == this.Handle)
+                calendarGrid1.Focus();
+        }
+
+        /// <summary>
+        /// If mouse enters the Tree Section, check if the grid is on the active form first before stealing the focus
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void tvSchedules_MouseEnter(object sender, EventArgs e)
+        {
+            if (GetActiveWindow() == this.Handle)
+                tvSchedules.Focus();
+        }
+        
+        private void CGView_Load(object sender, System.EventArgs e)
+		{
+			Debug.Assert (this.Document != null);
+
+			//Register the view
+			CGDocumentManager.Current.RegisterDocumentView(this.Document, this);
+
+			//Load the Group-Resource treeview
+			LoadTree();
+
+			this.SetDesktopLocation(this.DesktopLocation.X + 10, this.DesktopLocation.Y + 10);
+
+            //Show the Form
+            this.Activate();
+
+            //Set focus on the calendar grid
+            this.calendarGrid1.Focus();
+		}
+
+		private void mnuOpenSchedule_Click(object sender, System.EventArgs e)
+		{
+			CreateNewSchedule();
+		}
+
+		private void mnu1Day_Click(object sender, System.EventArgs e)
+		{
+			DateTime dtPicker = dateTimePicker1.Value;
+			DateTime DayOnly = new DateTime(dtPicker.Year, dtPicker.Month, dtPicker.Day);
+			this.calendarGrid1.StartDate = DayOnly;
+			this.calendarGrid1.Columns = 1;
+		}
+
+		private void mnu5Day_Click(object sender, System.EventArgs e)
+		{
+			if (this.calendarGrid1.Columns == 1)
+			{
+				this.StartDate = this.Document.StartDate;
+			}
+
+			this.calendarGrid1.Columns = 5;
+            this.Document.m_nColumnCount = 5; // MJL 1/17/2007
+            //this.Document.UpdateAllViews();
+            //TODO: Is there a way to just reuse the existing arrays? How far in the future do they go?
+            RequestRefreshGrid();
+		}
+
+		private void mnu7Day_Click(object sender, System.EventArgs e)
+		{
+			this.calendarGrid1.Columns = 7;
+            this.Document.m_nColumnCount = 7; // MJL 1/17/2007
+            //TODO: Is there a way to just reuse the existing arrays? How far in the future do they go?
+            RequestRefreshGrid();
+        }
+
+		private void mnu10Minute_Click(object sender, System.EventArgs e)
+		{
+			CalendarGrid cg = this.calendarGrid1;
+			cg.TimeScale = 10;
+			cg.PositionGrid(7);
+		}
+
+		private void mnu15Minute_Click(object sender, System.EventArgs e)
+		{
+			CalendarGrid cg = this.calendarGrid1;
+			cg.TimeScale = 15;
+			cg.PositionGrid(7);
+		}
+
+		private void mnu20Minute_Click(object sender, System.EventArgs e)
+		{
+			CalendarGrid cg = this.calendarGrid1;
+			cg.TimeScale = 20;
+			cg.PositionGrid(7);
+		}
+
+		private void mnu30Minute_Click(object sender, System.EventArgs e)
+		{
+			CalendarGrid cg = this.calendarGrid1;
+			cg.TimeScale = 30;
+			cg.PositionGrid(7);
+		}
+
+		private void mnuViewScheduleTree_Click(object sender, System.EventArgs e)
+		{
+			this.mnuViewScheduleTree.Checked = this.tvSchedules.Visible;
+			this.tvSchedules.Visible = !(this.tvSchedules.Visible);
+			this.mnuViewScheduleTree.Checked = !(this.mnuViewScheduleTree.Checked);
+		}
+
+
+
+		private void tvSchedules_DoubleClick(object sender, System.EventArgs e)
+		{
+			if (m_alSelectedTreeResourceArray == null)
+				return;
+			if (m_alSelectedTreeResourceArray.Count < 1)
+			{
+				if (this.tvSchedules.SelectedNode.Text != "")
+				{
+					SetResourceArrayFromGroup(tvSchedules.SelectedNode.Text);
+				}
+				else
+				{
+					return;
+				}
+			}
+			OpenSelectedSchedule(m_alSelectedTreeResourceArray, DateTime.Today);
+		}
+
+		//20041109 Added
+		private void SetResourceArrayFromGroup(string sGroup)
+		{
+			//Navigate from ResourceGroup table to Resources table
+			DataRow[] arrRows;
+			DataRelation dr = DocManager.GlobalDataSet.Relations["GroupResource"];
+			DataRow r = DocManager.GlobalDataSet.Tables["ResourceGroup"].Rows.Find(sGroup);
+			arrRows = r.GetChildRows(dr);
+			for (int i=0; i< arrRows.Length; i++) 
+			{
+				string sResource = arrRows[i]["RESOURCE_NAME"].ToString();
+				m_alSelectedTreeResourceArray.Add(sResource);
+			}
+			m_sDocName = sGroup;
+		}
+
+		public void SyncTree()
+		{
+
+        }
+
+
+		private void tvSchedules_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
+		{	
+			m_alSelectedTreeResourceArray = new ArrayList();
+			string sResource = e.Node.FullPath;
+			string[] ss = sResource.Split((char) 92);
+			int l = ss.GetUpperBound(0);
+
+			if (l == 0) //a resource group was checked, so get all underying resources 
+			{
+				SetResourceArrayFromGroup(ss[0]);
+			}
+			else 
+			{
+				sResource = ss[l];
+				m_alSelectedTreeResourceArray.Add(ss[1]);
+			}
+
+			m_sDocName = ss[l];
+			return;
+
+		}
+
+        /// <summary>
+        /// Makes sure that the node gets selected no matter where we click.
+        /// Incidentally, Invokes AfterSelect event.
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void tvSchedules_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
+        {
+            e.Node.TreeView.SelectedNode = e.Node;
+        }
+
+        /// <summary>
+        /// Useless code now... Good place to test something.
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+		private void mnuTest1_Click(object sender, System.EventArgs e)
+		{
+			ReaderWriterLock m_rwl = this.DocManager.ConnectInfo.bmxNetLib.BMXRWL;
+			try
+			{
+				m_rwl.AcquireWriterLock(50);
+				Debug.Write("\nTest Button 1 Acquired first lock\n");
+				m_rwl.AcquireWriterLock(50);
+				Debug.Write("Test Button 1 Acquired second lock\n");
+				this.DocManager.ViewRefresh();
+				Thread.Sleep(5000);
+				try
+				{
+				}
+				catch
+				{
+				}
+				finally
+				{
+					m_rwl.ReleaseWriterLock();
+					Debug.Write ("Test Button 1 released first lock.\n");
+					m_rwl.ReleaseWriterLock();
+					Debug.Write ("Test Button 1 released second lock.\n");
+				}
+
+				return;
+			}
+			catch (Exception ex)
+			{
+				Debug.Write("Test Button 1 exception: " + ex.Message + "\n");
+			}
+		}
+
+		private void CGView_Closing(object sender, System.ComponentModel.CancelEventArgs e)
+		{
+			try
+			{
+				m_ConnectInfo.BMXNetEvent -= m_bmxDelegate;
+				this.calendarGrid1.CloseGrid();
+			}
+			catch (Exception ex)
+			{
+				Debug.Write("CGView_Closing exception: " + ex.Message + "\n");
+			}
+		}
+
+		private void mnuViewRightPanel_Click(object sender, System.EventArgs e)
+		{
+			this.mnuViewRightPanel.Checked = this.panelRight.Visible;
+			this.panelRight.Visible = !(this.panelRight.Visible);
+			this.mnuViewRightPanel.Checked = !(this.mnuViewRightPanel.Checked);
+		}
+
+
+		private void calendarGrid1_CGSelectionChanged(object sender, IndianHealthService.ClinicalScheduling.CGSelectionChangedArgs e)
+		{
+            CGAvailability resultantAvail;
+            m_nSlots = m_Document.SlotsAvailable(e.StartTime, e.EndTime, e.Resource, this.calendarGrid1.TimeScale, out resultantAvail);
+			UpdateStatusBar(e.StartTime, e.EndTime, resultantAvail);
+		}
+
+        /// <summary>
+        /// Fired during drag and drop, on the drop action.
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+		private void calendarGrid1_CGAppointmentChanged(object sender, IndianHealthService.ClinicalScheduling.CGAppointmentChangedArgs e)
+		{
+			try
+			{
+				if (e.Appointment.CheckInTime.Ticks > 0)
+				{
+					MessageBox.Show("You cannot change the appointment time because the patient has already checked in.", "Clinical Scheduling",  MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
+					return;
+				}
+
+                // Added check for making Walk-ins/appts in the past. 9/28/2010 //smh
+                if (e.StartTime < DateTime.Today.Date)
+                {
+                    var result = MessageBox.Show("Are you sure you want to make an appointment in the past?", "Windows Scheduling", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
+                    if (result == DialogResult.No) return;
+                }
+
+                //Can user edit destination resource?
+				if (EditAppointmentEnabled(e.Resource) == false)
+					return;
+                
+                //Can user edit original schedule?
+				if (EditAppointmentEnabled(e.Appointment.Resource) == false)
+					return;
+
+				if (MessageBox.Show("Are you sure you want to move this appointment?", "Clinical Scheduling",  MessageBoxButtons.YesNo) != DialogResult.Yes)
+					return;
+
+				//20040909 Cherokee Replaced this block with following
+				//				if (m_Document.SlotsAvailable(e.StartTime, e.EndTime, e.Resource, out sAccessType, out sAvailabilityMessage) < 1)
+				//				{
+				//					MessageBox.Show("There are no appointment slots available for the selected time.");
+				//					return;
+				//				}
+				bool bOverbook =false;
+				if (m_htOverbook.Count > 0)
+				{
+					bOverbook = (bool) this.m_htOverbook[e.Resource.ToString()];
+				}
+				bool bModSchedule =false;
+				if (m_htModifySchedule.Count > 0)
+				{
+					bModSchedule =  (bool) this.m_htModifySchedule[e.Resource.ToString()];
+				}
+                CGAvailability resultantAvail;
+                bool bSlotsAvailable = (m_Document.SlotsAvailable(e.StartTime, e.EndTime, e.Resource, this.calendarGrid1.TimeScale, out resultantAvail) > 0);
+				if (!((bSlotsAvailable) || (bModSchedule) || (bOverbook) ))
+				{
+					MessageBox.Show("There are no appointment slots available for the selected time.");
+					return;
+				}
+
+				/*
+				 * 7-19-05 Added overbook prompt
+				*/
+				if (bSlotsAvailable == false)
+				{
+					DialogResult dr = MessageBox.Show(this, "There are no slots available at the selected time.  Do you want to overbook this appointment?", "Clinical Scheduling",MessageBoxButtons.YesNo);
+					if (dr != DialogResult.Yes)
+					{
+						return;
+					}
+				}
+
+                //Create a new appointment using old data for patient demographics and note and new data
+                //for StartTime, EndTime, Resource, AccessTypeID
+                CGAppointment appt = new CGAppointment();
+                appt.PatientID = e.Appointment.PatientID;
+                appt.PatientName = e.Appointment.PatientName;
+                appt.StartTime = e.StartTime;
+                appt.EndTime = e.EndTime;
+                appt.Resource = e.Resource;
+                appt.Note = e.Appointment.Note;
+                appt.HealthRecordNumber = e.Appointment.HealthRecordNumber;
+                appt.AccessTypeID = e.AccessTypeID;
+                this.Document.CreateAppointment(appt);
+
+                //CGAppointment a = new CGAppointment();
+                //a.StartTime = e.StartTime;
+                ////e.Appointment.StartTime = e.StartTime
+                //a.EndTime = e.EndTime;
+                ////e.Appointment.EndTime = e.EndTime;
+                //a.Resource = e.Resource;
+                ////e.Appointment.Resource = e.Resource;
+                //a.AccessTypeID = e.AccessTypeID;
+                ////e.Appointment.AccessTypeID = e.AccessTypeID;
+                //m_Document.CreateAppointment(a);
+			
+				
+                string sError = AppointmentDeleteOne(e.Appointment.AppointmentKey);
+                if (sError != "")
+				{
+					MessageBox.Show(sError);
+					return;
+				}
+
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show("Unable to change appointment  " +  ex.Message, "Clinical Scheduling");
+				//this.m_DocManager.UpdateViews();
+				return;
+			}
+			finally
+			{
+                this.UpdateArrays();
+            }
+			try
+			{
+				RaiseRPMSEvent("BSDX SCHEDULE"  , e.Resource);
+				if (e.Resource != e.OldResource)
+					RaiseRPMSEvent("BSDX SCHEDULE", e.OldResource);
+				
+                //That will take too long. Don't do it. Try and see what happens when you come
+                //this.m_DocManager.UpdateViews(e.Resource, e.OldResource);
+			}
+			catch (Exception ex)
+			{
+				Debug.Write(ex.Message);
+			}
+		}
+
+		private void mnuSchedulingManagment_Click(object sender, System.EventArgs e)
+		{
+			SchedulingManagement();
+		}
+
+		private void mnuFile_Popup(object sender, System.EventArgs e)
+		{
+			this.mnuSchedulingManagment.Enabled = DocManager.ScheduleManager;
+		}
+
+		private void mnuFindAppt_Click(object sender, System.EventArgs e)
+		{
+			FindAvailableAppointment(this.Document.Resources);
+		}
+
+		private void mnuRPMSServer_Click(object sender, System.EventArgs e)
+		{
+			//Handled by DocumentManager class
+		}
+
+		private void mnuRPMSLogin_Click(object sender, System.EventArgs e)
+		{
+			//Handled by DocumentManager class
+		}
+
+		private void CGView_Activated(object sender, System.EventArgs e)
+		{
+			calendarGrid1.GridEnter = true;
+		}
+
+		private void mnuHelpAbout_Click(object sender, System.EventArgs e)
+		{
+			MessageBox.Show("Clinical Scheduling Version " + Application.ProductVersion, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Information);	
+		}
+
+		private void ImplementMsg()
+		{
+			MessageBox.Show("Clinical Scheduling", "TODO: Implement this function");
+		}
+
+		private void mnuClose_Click(object sender, System.EventArgs e)
+		{
+			DialogResult dr = MessageBox.Show("Are you sure you want to close this schedule?", Application.ProductName, MessageBoxButtons.OKCancel);
+			if (dr != DialogResult.OK)
+				return;
+
+			this.Close();
+		}
+
+		private void mnuViewPatientAppts_Click(object sender, System.EventArgs e)
+		{
+			ViewPatientAppointments();
+		}
+
+		private void lstClip_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
+		{
+			bool b = e.Data.GetDataPresent(typeof(CGAppointment));
+			if (b == true)
+			{
+				e.Effect = DragDropEffects.Move;
+			}
+			else
+			{
+				e.Effect = DragDropEffects.None;
+			}
+
+		}
+
+		private void lstClip_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
+		{
+			try
+			{
+				CGAppointment a = (CGAppointment) e.Data.GetData(typeof(CGAppointment));
+				if (m_ClipList.AppointmentTable.Contains((int) a.AppointmentKey))
+				{
+					return;
+				}
+				m_ClipList.AddAppointment(a);
+				lstClip.Items.Add(a);
+			}
+			catch(Exception ex)
+			{
+				Debug.Write(ex.Message);
+			}
+
+		}
+
+		private void lstClip_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
+		{
+			m_bDragDropStart = false;
+		}
+
+		private void lstClip_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
+		{
+			try
+			{
+				if ((m_bDragDropStart == false)&&(lstClip.SelectedIndex > -1))
+				{
+					CGAppointment a = (CGAppointment) lstClip.Items[lstClip.SelectedIndex];
+					this.calendarGrid1.ApptDragSource = "list";
+					DragDropEffects effect = DoDragDrop(a, DragDropEffects.Move);
+					m_bDragDropStart = true;
+				}
+			}
+			catch (Exception ex)
+			{
+				Debug.Write(ex.Message);
+			}
+		}
+
+		private void calendarGrid1_CGAppointmentAdded(object sender, IndianHealthService.ClinicalScheduling.CGAppointmentChangedArgs e)
+		{
+			try
+			{
+				bool	bSlotsAvailable;
+				bool	bOverbook;
+				bool	bModSchedule;
+				bool	bModAppts;
+
+				if (this.EditAppointmentEnabled(e.Appointment.Resource) == false)
+					return;
+				
+				bModAppts = (bool) this.m_htChangeAppts[e.Resource.ToString()];
+				if (bModAppts == false)
+					return;
+
+                // Added check for making Walk-ins/appts in the past. 9/28/2010 //smh
+                if (e.StartTime < DateTime.Today.Date)
+                {
+                    var result = MessageBox.Show("Are you sure you want to make an appointment in the past?", "Windows Scheduling", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
+                    if (result == DialogResult.No) return;
+                }
+
+
+				bOverbook = (bool) this.m_htOverbook[e.Resource.ToString()];
+				bModSchedule =  (bool) this.m_htModifySchedule[e.Resource.ToString()];
+                CGAvailability resultantAvail;
+
+                bSlotsAvailable = (m_Document.SlotsAvailable(e.StartTime, e.EndTime, e.Resource, this.calendarGrid1.TimeScale, out resultantAvail) > 0);
+
+				if (!((bSlotsAvailable) || (bModSchedule) || (bOverbook) ))
+				{
+					MessageBox.Show("There are no appointment slots available for the selected time.");
+					return;
+				}
+
+				/*
+				 * 7-19-05 Added overbook prompt
+				*/
+				if (bSlotsAvailable == false)
+				{
+					DialogResult dr = MessageBox.Show(this, "There are no slots available at the selected time.  Do you want to overbook this appointment?", "Clinical Scheduling",MessageBoxButtons.YesNo);
+					if (dr != DialogResult.Yes)
+					{
+						return;
+					}
+				}
+
+				e.Appointment.StartTime = e.StartTime;
+				e.Appointment.EndTime = e.EndTime;
+				e.Appointment.Resource = e.Resource;
+				e.Appointment.AccessTypeID = e.AccessTypeID;
+				m_Document.CreateAppointment(e.Appointment);
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show("Unable to add new appointment  " +  ex.Message, "Clinical Scheduling");
+				return;
+			}
+			try
+			{
+				RaiseRPMSEvent("BSDX SCHEDULE"  , e.Resource);
+				if (e.Resource != e.OldResource)
+					RaiseRPMSEvent("BSDX SCHEDULE", e.OldResource);
+				this.m_DocManager.UpdateViews(e.Resource, e.OldResource);
+			}
+			catch (Exception ex)
+			{
+				Debug.Write(ex.Message);
+			}
+		}
+
+		private void lstClip_SelectedIndexChanged(object sender, System.EventArgs e)
+		{
+
+		}
+
+		private void mnuPrintClinicSchedules_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				DSelectLetterClinics ds = new DSelectLetterClinics();
+				ds.InitializePage(this.m_DocManager.GlobalDataSet, "Print Clinic Schedules");
+				ds.SetupForReports();
+				if (ds.ShowDialog(this) != DialogResult.OK)
+					return;
+
+				//get the resource names and call the letter printer
+
+				string sClinics = ds.SelectedClinics;
+				DateTime dtBegin = ds.BeginDate;
+				DateTime dtEnd = ds.EndDate;
+
+				DPatientLetter dpl = new DPatientLetter();
+				dpl.InitializeFormClinicSchedule(this.DocManager, sClinics, dtBegin, dtEnd);
+				dpl.ShowDialog(this);
+
+			}
+			catch(Exception ex)
+			{
+				MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+			}
+		}
+
+		private void mnuPrintReminderLetters_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				DSelectLetterClinics ds = new DSelectLetterClinics();
+				ds.InitializePage(this.m_DocManager.GlobalDataSet, "Print Reminder Letters");
+				if (ds.ShowDialog(this) != DialogResult.OK)
+					return;
+
+				//get the resource names and call the letter printer
+
+				string sClinics = ds.SelectedClinics;
+				DateTime dtBegin = ds.BeginDate;
+				DateTime dtEnd = ds.EndDate;
+
+				DPatientLetter dpl = new DPatientLetter();
+				dpl.InitializeFormPatientReminderLetters(this.DocManager, sClinics, dtBegin, dtEnd);
+				dpl.ShowDialog(this);
+
+			}
+			catch(Exception ex)
+			{
+				MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+			}
+			
+		}
+
+		private void mnuPrintRebookLetters_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				DSelectLetterClinics ds = new DSelectLetterClinics();
+				ds.InitializePage(this.m_DocManager.GlobalDataSet, "Print Clinic Rebook Letters");
+				if (ds.ShowDialog(this) != DialogResult.OK)
+					return;
+
+				//Call the letter printer
+				DPatientLetter dpl = new DPatientLetter();
+                dpl.InitializeFormRebookLetters(this.DocManager, ds.SelectedClinics, ds.BeginDate, ds.EndDate);
+				dpl.ShowDialog(this);
+
+			}
+			catch(Exception ex)
+			{
+				MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+			}		
+		}
+
+		private void mnuPrintPatientLetter_Click(object sender, System.EventArgs e)
+		{
+			ViewPatientAppointments();
+		}
+
+		private void mnuRPMSDivision_Click(object sender, System.EventArgs e)
+		{
+			this.DocManager.ChangeDivision(this);
+		}
+
+		private void CGView_CursorChanged(object sender, System.EventArgs e)
+		{
+
+		}
+
+		private void mnuDisplayWalkIns_Click(object sender, System.EventArgs e)
+		{
+			calendarGrid1.DrawWalkIns = !(calendarGrid1.DrawWalkIns);
+			mnuDisplayWalkIns.Checked = calendarGrid1.DrawWalkIns;
+			calendarGrid1.SetOverlapTable();
+			calendarGrid1.Refresh();
+		}
+
+		private void mnuOpenMultipleSchedules_Click(object sender, System.EventArgs e)
+		{
+			
+			try
+			{
+				DSelectSchedules ds = new DSelectSchedules();
+				ds.InitializePage(this.m_DocManager.GlobalDataSet, "Open Multiple Schedules");
+				if (ds.ShowDialog(this) != DialogResult.OK)
+					return;
+
+				//get the resource names and open schedules
+
+				ArrayList sResources = ds.SelectedClinics;
+				if (ds.SingleWindow == true)
+				{
+					m_sDocName = (ds.GroupWindowName == "")?"Multiple Selected Schedules":ds.GroupWindowName;
+					OpenSelectedSchedule( sResources, DateTime.Today);
+				}
+				else
+				{
+					foreach (string sResource in sResources)
+					{
+						ArrayList alSingle = new ArrayList(1);
+						alSingle.Add(sResource);
+						m_sDocName = sResource;
+						OpenSelectedSchedule( alSingle, DateTime.Today);
+					}
+				}
+				return;
+
+			}
+			catch(Exception ex)
+			{
+				MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+			}
+
+		}
+
+		private void ctxCalGridWalkin_Click(object sender, System.EventArgs e)
+		{
+			AppointmentAddWalkin();
+		}
+
+		private void mnuWalkIn_Click(object sender, System.EventArgs e)
+		{
+			AppointmentAddWalkin();
+		}
+
+		private void mnuPrintCancellationLetters_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				DSelectLetterClinics ds = new DSelectLetterClinics();
+				ds.InitializePage(this.m_DocManager.GlobalDataSet, "Print Clinic Cancellation Letters");
+				if (ds.ShowDialog(this) != DialogResult.OK)
+					return;
+
+				//get the resource names and call the letter printer
+
+				string sClinics = ds.SelectedClinics;
+				DateTime dtBegin = ds.BeginDate;
+				DateTime dtEnd = ds.EndDate;
+
+				DPatientLetter dpl = new DPatientLetter();
+				
+				dpl.InitializeFormCancellationLetters(this.DocManager, sClinics, dtBegin, dtEnd);
+				dpl.ShowDialog(this);
+			}
+			catch(Exception ex)
+			{
+				MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+			}
+        }
+
+        private void PrintRoutingSlip(CGAppointment appt)
+        {
+            //get this appointment's order
+            //Today's appointments
+            var todaysAppts = (from lkappts in this.Document.Appointments.AppointmentTable.Values.Cast<CGAppointment>()
+                               where lkappts.StartTime > appt.StartTime.Date && lkappts.StartTime < appt.StartTime.AddDays(1).Date && lkappts.Resource == appt.Resource
+                              orderby lkappts.StartTime
+                              select lkappts).ToList();
+            
+            //Find the order of the appointment
+            int apptOrder = todaysAppts.FindIndex(eachappt => eachappt.StartTime == appt.StartTime && eachappt.PatientID == appt.PatientID);
+ 
+            //Index is zero based, so add 1
+            apptOrder++;
+
+            //Send that to the routing slip as a parameter
+            PrintDocument pd = new PrintDocument() { DocumentName = "Routing Slip for Appt " + appt.AppointmentKey };
+            pd.PrintPage += (object s, System.Drawing.Printing.PrintPageEventArgs e) => CGDocumentManager.Current.PrintingObject.PrintRoutingSlip(appt, apptOrder, e);
+            pd.Print();
+        }
+
+        private void PrintAppointmentSlip(CGAppointment appt)
+        {
+            PrintDocument pd = new PrintDocument() { DocumentName = "Appointment Slip for Appt " + appt.AppointmentKey };  //Autoinit for DocName
+            pd.PrintPage += (object s, System.Drawing.Printing.PrintPageEventArgs e) => CGDocumentManager.Current.PrintingObject.PrintAppointmentSlip(appt, e);
+            pd.Print();
+        }
+
+        
+        /// <summary>
+        /// Update Selection of date if user does not pick a date/time
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void dateTimePicker1_Leave(object sender, EventArgs e)
+        {
+            if (this.Document.SelectedDate != dateTimePicker1.Value.Date)
+                RequestRefreshGrid();
+        }
+
+        /// <summary>
+        /// Handle Selection of Date via mouse from datetimepicker dropdown
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void dateTimePicker1_CloseUp(object sender, EventArgs e)
+        {
+            if (this.Document.SelectedDate != dateTimePicker1.Value.Date)
+                RequestRefreshGrid();
+        }
+
+        /// <summary>
+        /// Handle Enter and Escape key on dateTimePicker
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void dateTimePicker1_KeyPress(object sender, KeyPressEventArgs e)
+        {
+            //if enter key is pressed:
+            //  Tell windows that we are handling this
+            //  Request a Refresh Grid if the date is different
+            //  Set-Focus to Calendar Grid
+            if (e.KeyChar == (char)Keys.Enter)
+            {
+                e.Handled = true;
+
+                if (this.Document.SelectedDate != dateTimePicker1.Value.Date)
+                    RequestRefreshGrid();
+                
+                this.CGrid.Focus();
+            }
+
+            //if escape key is pressed:
+            //  Tell windows that we are handling this
+            //  Set-Focus to Calendar Grid
+            if (e.KeyChar == (char)Keys.Escape)
+            {
+                e.Handled = true;
+                this.CGrid.Focus();
+            }
+        }
+
+        private void mnuRefresh_Click(object sender, EventArgs e)
+        {
+            ForceRefreshGrid();
+        }
+
+        #endregion events
+
+        /// <summary>
+        /// Refresh grid if needed. 
+        /// </summary>
+        void RequestRefreshGrid()
+        {
+            DateTime dDate = dateTimePicker1.Value.Date;
+            // Change Date on Document
+            this.Document.SelectedDate = dDate;
+
+            // Do we need to update?
+            bool isRefreshNeeded = this.Document.IsRefreshNeeded();
+
+            //Splash when loading and change Cursor
+            if (isRefreshNeeded)
+            {
+                this.Cursor = Cursors.WaitCursor;
+                LoadSplash();
+                this.Document.RefreshDocument();
+                StopSplash();
+                this.Cursor = Cursors.Default;
+            }
+
+
+            if (this.Document.Resources.Count == 1)
+            {
+                if (this.calendarGrid1.Columns > 1)
+                {
+                    this.StartDate = this.Document.StartDate;
+                }
+                else
+                {
+                    this.StartDate = this.Document.SelectedDate;
+                }
+            }
+            else
+            {
+                this.StartDate = this.Document.SelectedDate;
+            }
+
+            //Is this needed? -- Yes it is. There is a bug in the drawing code for the calendar
+            //First time it draws, it draws appointments, but not availability slots
+            //Second time it draws, it both appointments and availabilites
+            //XXX: Need to investigate
+            this.Document.UpdateAllViews();
+        }
+
+        /// <summary>
+        /// This forces a grid refresh.
+        /// </summary>
+        void ForceRefreshGrid()
+        {
+            if (this.Document.m_sResourcesArray.Count == 0) return;
+            this.Cursor = Cursors.WaitCursor;
+            LoadSplash();
+            this.Document.RefreshSchedule();
+            this.UpdateArrays();
+            StopSplash();
+            this.Cursor = Cursors.Default;
+        }
+
+        LoadingSplash _loadingSplash; // Splash object a data point in class
+
+        /// <summary>
+        /// Loads a splash that says "Loading"
+        /// </summary>
+        private void LoadSplash()
+        {
+            _loadingSplash = new LoadingSplash();
+            _loadingSplash.StartPosition = FormStartPosition.CenterScreen;  //XXX: Don't like this, but will do for now.
+            _loadingSplash.UseWaitCursor = true;    // tell user we are working
+            Thread threadSplash = new Thread(new ThreadStart(() => _loadingSplash.ShowDialog())); // lambda
+            threadSplash.IsBackground = true; //expendable thread -- exit even if still running.
+            threadSplash.Name = "Loading Thread";
+            threadSplash.Start();
+        }
+
+        private void StopSplash()
+        {
+            _loadingSplash.RemoteClose();
+        }
+
+
+        private void PrintClinicSchedule(DateTime dStart, DateTime dEnd)
+        {
+            DPatientLetter dpl = new DPatientLetter();
+
+            int[] resourceIENs = (from resource in CGDocumentManager.Current.GlobalDataSet.Tables["Resources"].AsEnumerable()
+                                  join resource_name in m_alSelectedTreeResourceArray.Cast<string>() on resource.Field<string>("RESOURCE_NAME") equals resource_name
+                                  select resource.Field<int>("RESOURCEID")
+                               ).ToArray<int>();
+
+            // + | is an oddity in the Mumps code which I haven't investigated yet.
+            dpl.InitializeFormClinicSchedule(this.DocManager, string.Join("|", resourceIENs) + "|", dStart, dEnd);
+            dpl.ShowDialog(this);
+        }
+
+
+
+
+
+    }//End class
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGView.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGView.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGView.resx	(revision 1134)
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="mainMenu1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="contextMenu1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>126, 17</value>
+  </metadata>
+  <metadata name="ctxApptClipMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>248, 17</value>
+  </metadata>
+  <metadata name="ctxCalendarGrid.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>382, 17</value>
+  </metadata>
+  <data name="calendarGrid1.Resources" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0AwAAAAZfaXRl
+        bXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAAAAAAAAAAAQAgAAAAAAAAAL
+</value>
+  </data>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>75</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAMAICAQAAAAAADoAgAANgAAABAQEAAAAAAAKAEAAB4DAAAwMBAAAAAAAGgGAABGBAAAKAAAACAA
+        AABAAAAAAQAEAAAAAACAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA
+        AACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARE
+        QP////////////////AERED////////////////wCIiA8ADwAPAA8ADwAPAA8AREQP//////////////
+        //AERED////////////////wCIiA8ADwAPAA8ADwAPAA8AREQP////////////////AERED/////////
+        ///////wCIiA8ADwAPAA8ADwAPAA8AREQP////////////////AERED////////////////wCIiA8ADw
+        APAA8ADwAPAA8AREQP////////////////AERED////////////////wCIiA8ADwAPAA8ADwAPAA8ARE
+        QP////////////////AERED////////////////wBERAAAAAAAAAAAAAAAAAAARERESERIREhESERIRE
+        hEAEREREhESERIREhESERIRABERERIREhESERIREhESEQARERESERIREhESERIREhEAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAD/////////////////////KAAAABAAAAAgAAAAAQAEAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAIAAAIAAAACAgACAAAAAgACAAICAAADAwMAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
+        /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdw//////AABEDw8PDw8AAHcP/////wAARA8PDw8PAAB3
+        D/////8AAEQPDw8PDwAAdw//////AABEAAAAAAAAAERHR0dHRwAAREdHR0dHAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP//AAD//wAAgAEAAIABAAiAAcAAgAEAAIABAACAAQAIgAHAAIABAACAAQAAgAEACIAB
+        AACAAQAA//8AAP//AAgoAAAAMAAAAGAAAAABAAQAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        gAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABE
+        REQP////////////////////////8ABEREQP////////////////////////8ABEREQP////////////
+        ////////////8ABIiIQP8AAP8AAP8AAP8AAP8AAP8AAP8ABEREQP////////////////////////8ABE
+        REQP////////////////////////8ABEREQP////////////////////////8ABIiIQP8AAP8AAP8AAP
+        8AAP8AAP8AAP8ABEREQP////////////////////////8ABEREQP////////////////////////8ABE
+        REQP////////////////////////8ABIiIQP8AAP8AAP8AAP8AAP8AAP8AAP8ABEREQP////////////
+        ////////////8ABEREQP////////////////////////8ABEREQP////////////////////////8ABI
+        iIQP8AAP8AAP8AAP8AAP8AAP8AAP8ABEREQP////////////////////////8ABEREQP////////////
+        ////////////8ABEREQP////////////////////////8ABIiIQP8AAP8AAP8AAP8AAP8AAP8AAP8ABE
+        REQP////////////////////////8ABEREQP////////////////////////8ABEREQP////////////
+        ////////////8ABEREQAAAAAAAAAAAAAAAAAAAAAAAAAAABEREREREREREREREREREREREREREREQABE
+        RERERIRERIRERIRERIRERIRERIREQABERERERIRERIRERIRERIRERIRERIREQABERERERIRERIRERIRE
+        RIRERIRERIREQABERERERIRERIRERIRERIRERIRERIREQABEREREREREREREREREREREREREREREQAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP//
+        /////wAA////////AAD///////8AAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAA
+        AACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAA
+        AAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAA
+        AACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAA
+        AAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAD///////8AAP///////wAA////////
+        AAD///////8AAP///////wAA////////AAD///////8AAA==
+</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGViewOld.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGViewOld.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CGViewOld.resx	(revision 1134)
@@ -0,0 +1,592 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="mainMenu1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mainMenu1.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </data>
+  <data name="mainMenu1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuFile.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuFile.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuOpenSchedule.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuOpenSchedule.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="menuItem1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="menuItem1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuRPMSServer.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Assembly</value>
+  </data>
+  <data name="mnuRPMSServer.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuRPMSLogin.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Assembly</value>
+  </data>
+  <data name="mnuRPMSLogin.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="menuItem3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="menuItem3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuSchedulingManagment.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuSchedulingManagment.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuPrint.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuPrint.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuClose.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuClose.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuAppointment.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuAppointment.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuNewAppointment.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuNewAppointment.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuEditAppointment.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuEditAppointment.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuDeleteAppointment.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuDeleteAppointment.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuCopyAppointment.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuCopyAppointment.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="menuItem2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="menuItem2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuFindAppt.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuFindAppt.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuCheckIn.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuCheckIn.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuViewPatientAppts.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuViewPatientAppts.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuCalendar.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuCalendar.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnu1Day.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnu1Day.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnu5Day.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnu5Day.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnu7Day.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnu7Day.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="menuItem4.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="menuItem4.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuTimeScale.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuTimeScale.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnu10Minute.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnu10Minute.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnu15Minute.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnu15Minute.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnu20Minute.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnu20Minute.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnu30Minute.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnu30Minute.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuViewScheduleTree.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuViewScheduleTree.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuViewRightPanel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuViewRightPanel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuHelp.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuHelp.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuHelpAbout.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuHelpAbout.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuTest.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuTest.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuTest1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuTest1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tvSchedules.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tvSchedules.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="tvSchedules.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="contextMenu1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="contextMenu1.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>126, 17</value>
+  </data>
+  <data name="contextMenu1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxOpenSchedule.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxOpenSchedule.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxEditAvailability.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxEditAvailability.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxProperties.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxProperties.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxFindAppt.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxFindAppt.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panelRight.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="panelRight.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panelRight.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panelRight.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="panelRight.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="panelRight.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panelClip.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="panelClip.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panelClip.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panelClip.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="panelClip.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="panelClip.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lstClip.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lstClip.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="lstClip.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxApptClipMenu.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxApptClipMenu.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>248, 17</value>
+  </data>
+  <data name="ctxApptClipMenu.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuRemoveClipItem.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuRemoveClipItem.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuClearClipItems.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="mnuClearClipItems.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panelTop.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="panelTop.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panelTop.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panelTop.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="panelTop.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="panelTop.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="dateTimePicker1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="dateTimePicker1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="dateTimePicker1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="lblResource.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="lblResource.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lblResource.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panelCenter.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="panelCenter.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panelCenter.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panelCenter.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="panelCenter.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panelCenter.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxCalendarGrid.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxCalendarGrid.Location" type="System.Drawing.Point, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>382, 17</value>
+  </data>
+  <data name="ctxCalendarGrid.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxCalGridAdd.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxCalGridAdd.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxCalGridEdit.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxCalGridEdit.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxCalGridDelete.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxCalGridDelete.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxCalGridCheckIn.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="ctxCalGridCheckIn.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panelBottom.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="panelBottom.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panelBottom.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panelBottom.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="panelBottom.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="panelBottom.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="statusBar1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="statusBar1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="statusBar1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="splitter1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="splitter1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="splitter1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="splitter2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="splitter2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="splitter2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.Name">
+    <value>CGView</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>75</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CalendarGrid.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CalendarGrid.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/CalendarGrid.cs	(revision 1134)
@@ -0,0 +1,1460 @@
+﻿namespace IndianHealthService.ClinicalScheduling
+{
+    using System;
+    using System.Collections;
+    using System.ComponentModel;
+    using System.Drawing;
+    using System.Globalization;
+    using System.Runtime.CompilerServices;
+    using System.Runtime.InteropServices;
+    using System.Windows.Forms;
+
+    /// <summary>
+    /// This class is reponsible for rendering the Calendar Grid.
+    /// </summary>
+    public class CalendarGrid : ScrollableControl
+    {
+        private IContainer components;
+        private Font fontArial10;
+        private Font fontArial8;
+        private CGAppointments m_Appointments;
+        private Hashtable m_ApptOverlapTable;
+        private bool m_bAutoDrag = true;
+        private bool m_bDragDropStart;
+        private bool m_bDrawWalkIns = true;
+        private bool m_bGridEnter;
+        //private bool m_bInitialUpdate;
+        private bool m_bMouseDown;
+        private bool m_bScroll;
+        private bool m_bScrollDown;
+        private bool m_bSelectingRange;
+        private int m_cellHeight;
+        private int m_cellWidth;
+        private int m_col0Width;
+        private Hashtable m_ColumnInfoTable;
+        private CGCell m_currentCell;
+        private DateTime m_dtStart;
+        private Font m_fCell;
+        private string m_GridBackColor;
+        private CGCells m_gridCells;
+        private int m_nColumns = 5;
+        private int m_nSelectID;
+        private int m_nTimeScale = 20;
+        private ArrayList m_pAvArray;
+        private string m_sDragSource;
+        private CGAppointments m_SelectedAppointments;
+        private CGRange m_selectedRange;
+        private StringFormat m_sf;
+        private StringFormat m_sfHour;
+        private StringFormat m_sfRight;
+        private ArrayList m_sResourcesArray;
+        private Timer m_Timer;                  // Timer used in Drag and Drop Operations
+        private ToolTip m_toolTip;
+        private const int WM_HSCROLL = 0x114;       // Horizontal Scrolling Windows Message
+        private const int WM_VSCROLL = 0x115;       // Vertical Scrolling Windows Message
+        private const int WM_MOUSEWHEEL = 0x20a;    // Windows Mouse Scrolling Message
+        private System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
+
+
+        public delegate void CGAppointmentChangedHandler(object sender, CGAppointmentChangedArgs e);
+        public event CGAppointmentChangedHandler CGAppointmentChanged;
+        public event CGAppointmentChangedHandler CGAppointmentAdded;
+
+        public delegate void CGSelectionChangedHandler(object sender, CGSelectionChangedArgs e);
+        public event CGSelectionChangedHandler CGSelectionChanged;
+
+        public CalendarGrid()
+        {
+            this.InitializeComponent();
+            base.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+            base.SetStyle(ControlStyles.UserPaint, true);
+            base.SetStyle(ControlStyles.DoubleBuffer, true);
+            this.m_nColumns = 5;
+            this.m_gridCells = new CGCells();
+            this.m_selectedRange = new CGRange();
+            this.m_SelectedAppointments = new CGAppointments();
+            //this.m_Appointments = new CGAppointments();
+            this.m_dtStart = new DateTime(2003, 1, 27);
+            this.m_ApptOverlapTable = new Hashtable();
+            this.m_ColumnInfoTable = new Hashtable();
+            this.m_sResourcesArray = new ArrayList();
+            base.ResizeRedraw = true;
+            this.m_col0Width = 100;
+            this.fontArial8 = new Font("Arial", 8f);
+            this.fontArial10 = new Font("Arial", 10f);
+            this.m_fCell = this.fontArial10;
+            this.m_sf = new StringFormat();
+            this.m_sfRight = new StringFormat();
+            this.m_sfHour = new StringFormat();
+            this.m_sf.LineAlignment = StringAlignment.Center;
+            this.m_sfRight.LineAlignment = StringAlignment.Center;
+            this.m_sfRight.Alignment = StringAlignment.Far;
+            this.m_sfHour.LineAlignment = StringAlignment.Center;
+            this.m_sfHour.Alignment = StringAlignment.Far;
+            // this.m_bInitialUpdate = false;
+        }
+
+        private Rectangle AdjustRectForOverlap()
+        {
+            return new Rectangle();
+        }
+
+        private void AutoDragStart()
+        {
+            this.m_bAutoDrag = true;
+            this.m_Timer = new Timer();
+            this.m_Timer.Interval = 5;
+            this.m_Timer.Tick += new EventHandler(this.tickEventHandler);
+            this.m_Timer.Start();
+        }
+
+        private void AutoDragStop()
+        {
+            this.m_bAutoDrag = false;
+            if (this.m_Timer != null)
+            {
+                this.m_Timer.Stop();
+                this.m_Timer.Tick -= new EventHandler(this.tickEventHandler);
+                this.m_Timer.Dispose();
+                this.m_Timer = null;
+            }
+        }
+
+        private void BuildGridCellsArray(Graphics g)
+        {
+            try
+            {
+                SizeF ef = g.MeasureString("Test", this.m_fCell);
+                this.m_cellHeight = ((int) ef.Height) + 4;
+                int nColumns = this.m_nColumns;
+                int num2 = 60 / this.m_nTimeScale;
+                int num3 = 24 * num2;
+                nColumns++;
+                num3++;
+                this.m_cellWidth = 600 / nColumns;
+                if (base.ClientRectangle.Width > 600)
+                {
+                    this.m_cellWidth = (base.ClientRectangle.Width - this.m_col0Width) / (nColumns - 1);
+                }
+                if (this.m_nColumns == 1)
+                {
+                    this.m_cellWidth = base.ClientRectangle.Width - this.m_col0Width;
+                }
+                g.TranslateTransform((float) base.AutoScrollPosition.X, (float) base.AutoScrollPosition.Y);
+                for (int i = num3; i > -1; i--)
+                {
+                    for (int j = 1; j < nColumns; j++)
+                    {
+                        int x = 0;
+                        if (j == 1)
+                        {
+                            x = this.m_col0Width;
+                        }
+                        if (j > 1)
+                        {
+                            x = this.m_col0Width + (this.m_cellWidth * (j - 1));
+                        }
+                        Point point = new Point(x, i * this.m_cellHeight);
+                        Rectangle r = new Rectangle(point.X, point.Y, this.m_cellWidth, this.m_cellHeight);
+                        if (i != 0)
+                        {
+                            CGCell cell = null;
+                            cell = new CGCell(r, i, j);
+                            this.m_gridCells.AddCell(cell);
+                        }
+                    }
+                }
+            }
+            catch (Exception exception)
+            {
+                string message = exception.Message;
+            }
+        }
+
+        private void CalendarGrid_DragDrop(object Sender, DragEventArgs e)
+        {
+            CGAppointment data = (CGAppointment) e.Data.GetData(typeof(CGAppointment));
+            Point point = base.PointToClient(new Point(e.X, e.Y));
+            int x = point.X - base.AutoScrollPosition.X;
+            int y = point.Y - base.AutoScrollPosition.Y;
+            Point pt = new Point(x, y);
+            foreach (DictionaryEntry entry in this.m_gridCells.CellHashTable)
+            {
+                CGCell cgCell = (CGCell) entry.Value;
+                if (cgCell.CellRectangle.Contains(pt))
+                {
+                    DateTime timeFromCell = this.GetTimeFromCell(cgCell);
+                    string resourceFromColumn = this.GetResourceFromColumn(cgCell.CellColumn);
+                    int duration = data.Duration;
+                    TimeSpan span = new TimeSpan(0, duration, 0);
+                    DateTime time2 = timeFromCell + span;
+                    data.Selected = false;
+                    this.m_nSelectID = 0;
+                    CGAppointmentChangedArgs args = new CGAppointmentChangedArgs();
+                    args.Appointment = data;
+                    args.StartTime = timeFromCell;
+                    args.EndTime = time2;
+                    args.Resource = resourceFromColumn;
+                    args.OldResource = data.Resource;
+                    args.AccessTypeID = data.AccessTypeID;
+                    args.Slots = data.Slots;
+                    if (this.ApptDragSource == "grid")
+                    {
+                        this.CGAppointmentChanged(this, args);
+                    }
+                    else
+                    {
+                        this.CGAppointmentAdded(this, args);
+                    }
+                    break;
+                }
+            }
+            this.SetOverlapTable();
+            base.Invalidate();
+        }
+
+        private void CalendarGrid_DragEnter(object Sender, DragEventArgs e)
+        {
+            if (e.Data.GetDataPresent(typeof(CGAppointment)))
+            {
+                if ((e.KeyState & 8) == 8)
+                {
+                    e.Effect = DragDropEffects.Copy;
+                }
+                else
+                {
+                    e.Effect = DragDropEffects.Move;
+                }
+            }
+            else
+            {
+                e.Effect = DragDropEffects.None;
+            }
+        }
+
+        private void CalendarGrid_MouseDown(object sender, MouseEventArgs e)
+        {
+            //watch.Restart();
+            if (e.Button == MouseButtons.Left)
+            {
+                foreach (DictionaryEntry entry in this.m_gridCells.CellHashTable)
+                {
+                    CGCell cell = (CGCell) entry.Value;
+                    cell.IsSelected = false;
+                }
+                this.m_selectedRange.Cells.ClearAllCells();
+                this.m_bMouseDown = true;
+                this.OnLButtonDown(e.X, e.Y, true);
+            }
+        }
+
+        private void CalendarGrid_MouseMove(object Sender, MouseEventArgs e)
+        {
+            //test
+            //System.Diagnostics.Debug.Write(watch.ElapsedMilliseconds + "\n");
+            //test
+
+            //if the left mouse button is down and we are moving the mouse...
+            if (this.m_bMouseDown)
+            {
+                //if Y axis is outside the top or bottom
+                if ((e.Y >= base.ClientRectangle.Bottom) || (e.Y <= base.ClientRectangle.Top))
+                {
+                    //start auto scrolling. m_bScrollDown decides whether we scroll up or down.
+                    this.m_bScrollDown = e.Y >= base.ClientRectangle.Bottom;
+                    AutoDragStart();
+                }
+
+                //if Y axis within client rectagle, stop dragging (whether you started or not)
+                if ((e.Y < base.ClientRectangle.Bottom) && (e.Y > base.ClientRectangle.Top))
+                {
+                    AutoDragStop();
+                }
+                if (this.m_bSelectingRange)
+                {
+                    this.OnLButtonDown(e.X, e.Y, false);
+                }
+                if (this.m_nSelectID != 0)
+                {
+                    if (this.m_bGridEnter)
+                    {
+                        this.m_bGridEnter = false;
+                    }
+                    else if (!this.m_bDragDropStart)
+                    {
+                        CGAppointment data = (CGAppointment) this.m_Appointments.AppointmentTable[this.m_nSelectID];
+                        this.ApptDragSource = "grid";
+                        base.DoDragDrop(data, DragDropEffects.Move);
+                        this.m_bDragDropStart = true;
+                    }
+                }
+            }
+            else
+            {
+                //test
+                AutoDragStop(); //is this needed?
+                //test
+                int y = e.Y - base.AutoScrollPosition.Y;
+                int x = e.X - base.AutoScrollPosition.X;
+                Point pt = new Point(x, y);
+                foreach (CGAppointment appointment2 in this.m_Appointments.AppointmentTable.Values)
+                {
+                    if (appointment2.GridRectangle.Contains(pt))
+                    {
+                        this.m_toolTip.SetToolTip(this, appointment2.ToString());
+                        return;
+                    }
+                }
+                this.m_toolTip.RemoveAll();
+
+                ////smh new code -- select cell
+                //int nRow = -1;
+                //int nCol = -1;
+
+                ////Is the mouse over a known cell? If so, highlight cell
+                //if (this.HitTest(x, y, ref nRow, ref nCol))
+                //{
+                //    CGCell cellFromRowCol = this.m_gridCells.GetCellFromRowCol(nRow, nCol);
+                //    if (cellFromRowCol != null)
+                //    {
+                //        this.m_currentCell = cellFromRowCol;
+                //        this.m_selectedRange.StartCell = null;
+                //        this.m_selectedRange.EndCell = null;
+                //        this.m_selectedRange.CreateRange(this.m_gridCells, cellFromRowCol, cellFromRowCol);
+                //        this.m_bSelectingRange = true;
+                //        cellFromRowCol.IsSelected = true;
+                //        base.Invalidate(this.m_currentCell.CellRectangle);
+                //        //base.Invalidate();
+                //    }
+                //}
+
+
+            }
+        }
+
+        private void CalendarGrid_MouseUp(object Sender, MouseEventArgs e)
+        {
+            if (this.m_bAutoDrag)
+            {
+                this.m_bAutoDrag = false;
+                this.AutoDragStop();
+            }
+            this.m_bMouseDown = false;
+            if (this.m_bSelectingRange)
+            {
+                CGSelectionChangedArgs args = new CGSelectionChangedArgs();
+                args.StartTime = this.GetTimeFromCell(this.m_selectedRange.StartCell);
+                args.EndTime = this.GetTimeFromCell(this.m_selectedRange.EndCell);
+                args.Resource = this.GetResourceFromColumn(this.m_selectedRange.StartCell.CellColumn);
+                if (args.EndTime < args.StartTime)
+                {
+                    DateTime startTime = args.StartTime;
+                    args.StartTime = args.EndTime;
+                    args.EndTime = startTime;
+                }
+                TimeSpan span = new TimeSpan(0, 0, this.m_nTimeScale, 0, 0);
+                args.EndTime += span;
+                this.CGSelectionChanged(this, args);
+                this.m_bSelectingRange = false;
+            }
+        }
+
+        private void CalendarGrid_Paint(object sender, PaintEventArgs e)
+        {
+            if (e.Graphics != null)
+            {
+                this.DrawGrid(e.Graphics);
+                /*
+                if (!this.m_bInitialUpdate)
+                {
+                    this.SetAppointmentTypes();
+                    base.Invalidate();
+                    this.m_bInitialUpdate = true;
+                }
+                 */
+            }
+        }
+
+        public void CloseGrid()
+        {
+            foreach (CGAppointment appointment in this.m_Appointments.AppointmentTable.Values)
+            {
+                appointment.Selected = false;
+            }
+            this.m_nSelectID = 0;
+        }
+
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (this.components != null))
+            {
+                this.components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        private void DrawAppointments(Graphics g, int col0Width, int cellWidth, int cellHeight)
+        {
+            if (!base.DesignMode && (this.m_Appointments != null))
+            {
+                int num = 0;
+                int num2 = 0;
+                int x = 0;
+                ArrayList list = new ArrayList();
+                foreach (CGAppointment appointment in this.m_Appointments.AppointmentTable.Values)
+                {
+                    bool bRet = false;
+                    Rectangle rect = this.GetAppointmentRect(appointment, col0Width, cellWidth, cellHeight, out bRet);
+                    if (bRet && (!appointment.WalkIn || this.m_bDrawWalkIns))
+                    {
+                        rect.Inflate(-10, 0);
+                        num = (int) this.m_ApptOverlapTable[appointment.m_nKey];
+                        num2 = rect.Right - rect.Left;
+                        x = num2 / (num + 1);
+                        rect.Width = x;
+                        if (num > 0)
+                        {
+                            foreach (object obj2 in list)
+                            {
+                                Rectangle rectangle2 = (Rectangle) obj2;
+                                if (rect.IntersectsWith(rectangle2))
+                                {
+                                    rect.Offset(x, 0);
+                                }
+                            }
+                        }
+                        appointment.GridRectangle = rect;
+                        if (appointment.Selected)
+                        {
+                            Pen pen = new Pen(Brushes.Black, 5f);
+                            g.DrawRectangle(pen, rect);
+                            pen.Dispose();
+                        }
+                        else
+                        {
+                            g.DrawRectangle(Pens.Blue, rect);
+                        }
+                        string s = appointment.ToString();
+                        Rectangle rectangle3 = new Rectangle(rect.X + 1, rect.Y + 1, rect.Width - 1, rect.Height - 1);
+                        g.FillRectangle(Brushes.White, rectangle3);
+                        Brush black = Brushes.Black;
+                        if (appointment.CheckInTime.Ticks > 0L)
+                        {
+                            black = Brushes.Green;
+                            g.FillRectangle(Brushes.LightGreen, rectangle3);
+                        }
+                        if (appointment.NoShow)
+                        {
+                            black = Brushes.Red;
+                            g.FillRectangle(Brushes.LightPink, rectangle3);
+                        }
+                        if (appointment.WalkIn)
+                        {
+                            black = Brushes.Blue;
+                            g.FillRectangle(Brushes.LightSteelBlue, rectangle3);
+                        }
+                        g.DrawString(s, this.fontArial8, black, rectangle3);
+                        list.Add(rect);
+                    }
+                }
+            }
+        }
+
+        private void DrawGrid(Graphics g)
+        {
+            //Default color of grid lines is black
+            Pen pen = new Pen(Color.Black);
+
+            //each cell's height is Height of Arial Font 10pt + 10 pixels (by default 26 pixels)
+            SizeF ef = g.MeasureString("Test", this.m_fCell);
+            int num = 10;
+            this.m_cellHeight = ((int) ef.Height) + num;
+
+            // Number of columns is dynamic based on user of Grid. See Property Columns. Default 5 in init.
+            int nColumns = this.m_nColumns;
+
+            //Time scale is also dynamic. Property TimeScale. Default 20 (minutes)
+            //num3 stands for number of cells per hour
+            int num3 = 60 / this.m_nTimeScale;
+            //num4 stands for number of cells per day (aka rows in the grid)
+            int num4 = 24 * num3;
+            //Add extra column to hold time in the left hand corner
+            nColumns++;
+            //add extra row to represent dates or resources (depending on which view we are in)
+            //Not sure of which variable controls view yet.
+            num4++;
+
+            // 100 px is reserved no matter our column sizes for displaying the time scale
+
+            // Minimum cell width is 600/columns (100 px by default)
+            this.m_cellWidth = 600 / nColumns;
+
+            // if we happen to have more than 600 pixels in our Client Window then cell
+            // is (Width-100) / (number of date columns)
+            if (base.ClientRectangle.Width > 600)
+            {
+                this.m_cellWidth = (base.ClientRectangle.Width - this.m_col0Width) / (nColumns - 1);
+            }
+
+            // If we have one column, the cell width is the itself - 100
+            if (this.m_nColumns == 1)
+            {
+                this.m_cellWidth = base.ClientRectangle.Width - this.m_col0Width;
+            }
+
+            // Our rectangle will start scrolling if width is less than 600 and height less than  height of all cells comb
+            // Of course Height will scroll all the time unless you have a humungous screen
+            base.AutoScrollMinSize = new Size(600, this.m_cellHeight * num4);
+
+            // Default Rectangle is Gray
+            g.FillRectangle(Brushes.LightGray, base.ClientRectangle);
+            
+            int num5 = 0; //Minutes (start at 0)
+            int num6 = 0; //Hour (starts at 0)
+            
+            // flag is true only if there are no cells what so ever in the screen
+            // Only true when no resource is selected.
+            bool flag = this.m_gridCells.CellCount == 0;
+
+            // Move the base point from the client screen to the scrolling region top-left corner.
+            g.TranslateTransform((float) base.AutoScrollPosition.X, (float) base.AutoScrollPosition.Y);
+
+            // This for loop draws the time scale (although I haven't completely traced it out)
+            // For each row except the first one (i starts from 1 rather than zero)
+            for (int i = 1; i < num4; i++)
+            {
+                int x = 0;
+                //point is (0, 1st Cell Start) then (0, 2nd Cell Start) until we run out
+                Point point = new Point(x, i * this.m_cellHeight);
+                //rectangle2 represents each cell rectangle
+                Rectangle rectangle2 = new Rectangle(point.X, point.Y, this.m_cellWidth, this.m_cellHeight);
+                //rect stands for the time scale rectangle; width is 100px; Height is length of the hour on grid
+                Rectangle rect = new Rectangle(0, rectangle2.Y, this.m_col0Width, rectangle2.Height * num3);
+                //height is length of hour
+                int height = rect.Height;
+                //Min font height is 25 pixels (100/4)--see below where it's used
+                height = (height > (this.m_col0Width / 4)) ? (this.m_col0Width / 4) : height;
+
+                //if we are the top of the time scale (at hour:00) -- num5 is min
+                if (num5 == 0)
+                {
+                    // Fill time scale triangle with Gray (remember, this is the whole hour!)
+                    g.FillRectangle(Brushes.LightGray, rect);
+                    // Draw Rectangle
+                    g.DrawRectangle(pen, rect.X, rect.Y, rect.Width, rect.Height);
+                    //Pad time with at least one zero to make it 2 digits
+                    string str = string.Format("{0}", num6).PadLeft(2, '0');
+                    //Font height using pixels. Min is 25 pixels
+                    Font font = new Font("Arial", (float) height, FontStyle.Bold, GraphicsUnit.Pixel);
+                    // rectangle3 is the left half of the time rectangle
+                    Rectangle rectangle3 = new Rectangle(rect.X, rect.Y, rect.Width / 2, rect.Height);
+                    // In this left half, draw the hours (m_sfHour is the stringformat:
+                    // Horizontal Center and Right Justified to rectangle3
+                    g.DrawString(str, font, Brushes.Black, rectangle3, this.m_sfHour);
+                    // Increment hour
+                    num6++;
+                    font.Dispose();
+                }
+                
+                // Pad minutes with zeros to be 2 digits long
+                string s = string.Format("{0}", num5);
+                s = ":" + s.PadLeft(2, '0');
+                // Rectangle starts at 
+                // X: 2/3rds of width of Time Rectangle
+                // Y: Top of the current time slot cell
+                // Width: 1/3rd of the width of the Time Rectangle
+                // Height: Height of a time slot
+                Rectangle layoutRectangle = new Rectangle(rect.X + ((rect.Width * 2) / 3), rectangle2.Top, rect.Width / 3, rectangle2.Height);
+                // At in this rectangle, write the minutes. Horizontal Ctr and Right Justified to Rectangle
+                g.DrawString(s, this.m_fCell, Brushes.Black, layoutRectangle, this.m_sfRight);
+                // Draw Line from two points, just under the time we have just written
+                Point point2 = new Point(rect.X + ((rect.Width * 2) / 3), rectangle2.Bottom);
+                Point point3 = new Point(rect.Right, rectangle2.Bottom);
+                g.DrawLine(pen, point2, point3);
+                // Increment the minutes with the time scale
+                num5 += this.m_nTimeScale;
+                // If miniutes reaches 60, reset to zero
+                num5 = (num5 >= 60) ? 0 : num5;
+                // When we reach the bottom (num4 - 1 is # of rows) and we are not scrolling
+                if ((i == (num4 - 1)) && !this.m_bScroll)
+                {
+                    // Fill the last cell with Gray (?)
+                    g.TranslateTransform((float) -base.AutoScrollPosition.X, (float) -base.AutoScrollPosition.Y);
+                    rect = new Rectangle(0, 0, this.m_col0Width, this.m_cellHeight);
+                    g.FillRectangle(Brushes.LightGray, rect);
+                    g.DrawRectangle(pen, rect);
+                    g.TranslateTransform((float) base.AutoScrollPosition.X, (float) base.AutoScrollPosition.Y);
+                }
+            }
+            
+            //This for loop draws the cells
+            //Start from the bottom (num4 is # of rows) and go down to the zeroth row (ie date row/resource row)
+            for (int j = num4; j > -1; j--)
+            {
+                // For each column - 1 (we start at 1, not zero-->We drew the first column anyways in the 1st loop)
+                for (int k = 1; k < nColumns; k++)
+                {
+                    int num12 = 0;  // X-axis position
+                    if (k == 1)     // If we are at the first column, start at 100px (default)
+                    {
+                        num12 = this.m_col0Width;
+                    }
+                    if (k > 1)      // 
+                    {
+                        num12 = this.m_col0Width + (this.m_cellWidth * (k - 1));
+                    }
+                    Point point4 = new Point(num12, j * this.m_cellHeight);
+                    Rectangle r = new Rectangle(point4.X, point4.Y, this.m_cellWidth, this.m_cellHeight);
+                    if (j != 0)
+                    {
+                        CGCell cellFromRowCol = null;
+                        if (flag)
+                        {
+                            cellFromRowCol = new CGCell(r, j, k);
+                            this.m_gridCells.AddCell(cellFromRowCol);
+                        }
+                        else
+                        {
+                            cellFromRowCol = this.m_gridCells.GetCellFromRowCol(j, k);
+                            cellFromRowCol.CellRectangle = r;
+                        }
+                        if (this.m_sResourcesArray.Count > 0)
+                        {
+                            //IMP
+                            //this is the place where we the selected cells are drawn in Light Light Blue.
+                            //IMP
+                            if (this.m_selectedRange.CellIsInRange(cellFromRowCol))
+                            {
+                                g.FillRectangle(Brushes.Aquamarine, r);
+                                //g.FillRectangle(Brushes.AntiqueWhite, r);
+                            }
+                            else
+                            {
+                                g.FillRectangle(cellFromRowCol.AppointmentTypeColor, r);
+                            }
+                            g.DrawRectangle(pen, r.X, r.Y, r.Width, r.Height);
+                            if (j == 1)
+                            {
+                                this.DrawAppointments(g, this.m_col0Width, this.m_cellWidth, this.m_cellHeight);
+                            }
+                        }
+                        continue;
+                    }
+                    if (!this.m_bScroll)
+                    {
+                        g.TranslateTransform(0f, (float) -base.AutoScrollPosition.Y);
+                        Rectangle rectangle6 = r;
+                        g.FillRectangle(Brushes.LightBlue, rectangle6);
+                        g.DrawRectangle(pen, rectangle6.X, rectangle6.Y, rectangle6.Width, rectangle6.Height);
+                        string str3 = "";
+                        if (this.m_sResourcesArray.Count > 1)
+                        {
+                            foreach (DictionaryEntry entry in this.m_ColumnInfoTable)
+                            {
+                                int num13 = (int) entry.Value;
+                                num13++;
+                                if (num13 == k)
+                                {
+                                    str3 = entry.Key.ToString();
+                                    break;
+                                }
+                            }
+                        }
+                        else
+                        {
+                            DateTime dtStart = this.m_dtStart;
+                            if (k > 1)
+                            {
+                                dtStart = dtStart.AddDays((double) (k - 1));
+                            }
+                            string format = "ddd, MMM d";
+                            str3 = dtStart.ToString(format, DateTimeFormatInfo.InvariantInfo);
+                        }
+                        g.DrawString(str3, this.m_fCell, Brushes.Black, rectangle6, this.m_sf);
+                        g.TranslateTransform(0f, (float) base.AutoScrollPosition.Y);
+                    }
+                }
+            }
+            this.m_bScroll = false;
+            pen.Dispose();
+        }
+
+        public Rectangle GetAppointmentRect(CGAppointment a, int col0Width, int cellWidth, int cellHeight, out bool bRet)
+        {
+            DateTime startTime = a.StartTime;
+            DateTime endTime = a.EndTime;
+            string resource = a.Resource;
+            int originX = 0;
+            int originY = 0;
+            int recHeight = 0;
+            int recWidth = 0;
+            int columnToPutAppt = 0;
+            Rectangle rectangle = new Rectangle();
+            int startTotalMinutesoffset = (int) startTime.TimeOfDay.TotalMinutes;
+            int endTotalMinutesoffset = (int) endTime.TimeOfDay.TotalMinutes;
+            
+            // To fix a bug with 1 day view: if the start time of appt is before Calendar Start Date, don't draw anything.
+            if (startTime < this.m_dtStart)
+            {
+                bRet = false;
+                return rectangle;
+            }
+            
+            // if grid has more than one reource
+            if (this.m_sResourcesArray.Count > 1)
+            {
+                // get zero based index
+                columnToPutAppt = (int) this.m_ColumnInfoTable[resource];
+                // increment to 1 based index
+                columnToPutAppt++;
+            }
+            else
+            {
+                columnToPutAppt = (startTime - this.m_dtStart).Days + 1;
+            }
+            // this if should not get tripped; it did the same function as the new first if check. 
+            //if (columnToPutAppt < 1)
+            //{
+            //    bRet = false;
+            //    return rectangle;
+            //}
+            originX = col0Width + (cellWidth * (columnToPutAppt - 1));
+            int num8 = startTotalMinutesoffset + this.m_nTimeScale;
+            int num9 = (endTotalMinutesoffset > 0) ? endTotalMinutesoffset : 0x5a0;
+            num9 -= startTotalMinutesoffset;
+            originY = (cellHeight * num8) / this.m_nTimeScale;
+            recHeight = (cellHeight * num9) / this.m_nTimeScale;
+            recWidth = cellWidth;
+            rectangle.X = originX;
+            rectangle.Y = originY;
+            rectangle.Width = recWidth;
+            rectangle.Height = recHeight;
+            bRet = true;
+            return rectangle;
+        }
+
+        /// <summary>
+        /// Translates a StartTime into a Cell, for coloring
+        /// </summary>
+        /// <param name="dDate"></param>
+        /// <param name="nRow"></param>
+        /// <param name="nCol"></param>
+        /// <param name="bStartCell"></param>
+        /// <param name="sResource"></param>
+        /// <returns></returns>
+        public bool GetCellFromTime(DateTime dDate, ref int nRow, ref int nCol, bool bStartCell, string sResource)
+        {
+            int num = (dDate.Hour * 60) + dDate.Minute;
+            nRow = num / this.m_nTimeScale;
+            if (bStartCell)
+            {
+                nRow++;
+            }
+            if (this.m_sResourcesArray.Count > 1)
+            {
+                if (sResource == "")
+                {
+                    sResource = this.m_sResourcesArray[0].ToString();
+                }
+                nCol = (int) this.m_ColumnInfoTable[sResource];
+                nCol++;
+                return true;
+            }
+            DateTime time = new DateTime(dDate.Year, dDate.Month, dDate.Day);
+            TimeSpan span = (TimeSpan) (time - this.StartDate);
+            int totalDays = 0;
+            totalDays = (int) span.TotalDays;
+            nCol = totalDays;
+            nCol++;
+            return true;
+        }
+
+        private string GetResourceFromColumn(int nCol)
+        {
+            if (this.m_sResourcesArray.Count == 1)
+            {
+                return this.m_sResourcesArray[0].ToString();
+            }
+            foreach (DictionaryEntry entry in this.m_ColumnInfoTable)
+            {
+                int num = (int) entry.Value;
+                num++;
+                if (num == nCol)
+                {
+                    return entry.Key.ToString();
+                }
+            }
+            return "";
+        }
+
+        public bool GetSelectedTime(out DateTime dStart, out DateTime dEnd, out string sResource)
+        {
+            if (this.m_selectedRange.Cells.CellCount == 0)
+            {
+                dEnd = new DateTime();
+                dStart = dEnd;
+                sResource = "";
+                return false;
+            }
+            CGCell startCell = this.m_selectedRange.StartCell;
+            CGCell endCell = this.m_selectedRange.EndCell;
+            if (startCell.CellRow > endCell.CellRow)
+            {
+                CGCell cell3 = startCell;
+                startCell = endCell;
+                endCell = cell3;
+            }
+            dStart = this.GetTimeFromCell(startCell);
+            dEnd = this.GetTimeFromCell(endCell);
+            dEnd = dEnd.AddMinutes((double) this.m_nTimeScale);
+            sResource = this.GetResourceFromColumn(startCell.CellColumn);
+            return true;
+        }
+
+        public bool GetSelectedType(out int nAccessTypeID)
+        {
+            nAccessTypeID = 0;
+            if (this.m_selectedRange.Cells.CellCount == 0)
+            {
+                return false;
+            }
+            CGCell startCell = this.m_selectedRange.StartCell;
+            CGCell endCell = this.m_selectedRange.EndCell;
+            if (startCell.CellRow > endCell.CellRow)
+            {
+                CGCell cell3 = startCell;
+                startCell = endCell;
+                endCell = cell3;
+            }
+            DateTime timeFromCell = this.GetTimeFromCell(startCell);
+            DateTime time2 = this.GetTimeFromCell(endCell).AddMinutes((double) this.m_nTimeScale);
+            foreach (CGAvailability availability in this.m_pAvArray)
+            {
+                if (TimesOverlap(availability.StartTime, availability.EndTime, timeFromCell, time2))
+                {
+                    nAccessTypeID = availability.AvailabilityType;
+                    break;
+                }
+            }
+            return (nAccessTypeID > 0);
+        }
+
+        public DateTime GetTimeFromCell(CGCell cgCell)
+        {
+            int cellRow = cgCell.CellRow;
+            int cellColumn = cgCell.CellColumn;
+            DateTime dtStart = this.m_dtStart;
+            int num3 = (cellRow - 1) * this.m_nTimeScale;
+            int num4 = num3 / 60;
+            if (num4 > 0)
+            {
+                num3 = num3 % (num4 * 60);
+            }
+            dtStart = dtStart.AddHours((double) num4).AddMinutes((double) num3);
+            if (this.m_sResourcesArray.Count == 1)
+            {
+                dtStart = dtStart.AddDays((double) (cellColumn - 1));
+            }
+            return dtStart;
+        }
+
+        public bool GetTypeFromCell(CGCell cgCell, out int nAccessTypeID)
+        {
+            nAccessTypeID = 0;
+            CGCell cell = cgCell;
+            CGCell cell2 = cgCell;
+            if (cell.CellRow > cell2.CellRow)
+            {
+                CGCell cell3 = cell;
+                cell = cell2;
+                cell2 = cell3;
+            }
+            DateTime timeFromCell = this.GetTimeFromCell(cell);
+            DateTime time2 = this.GetTimeFromCell(cell2).AddMinutes((double) this.m_nTimeScale);
+            foreach (CGAvailability availability in this.m_pAvArray)
+            {
+                if (TimesOverlap(availability.StartTime, availability.EndTime, timeFromCell, time2))
+                {
+                    nAccessTypeID = availability.AvailabilityType;
+                    break;
+                }
+            }
+            return (nAccessTypeID > 0);
+        }
+
+        private bool HitTest(int X, int Y, ref int nRow, ref int nCol)
+        {
+            Y -= base.AutoScrollPosition.Y;
+            X -= base.AutoScrollPosition.X;
+            foreach (DictionaryEntry entry in this.m_gridCells)
+            {
+                CGCell cell = (CGCell) entry.Value;
+                if (cell.CellRectangle.Contains(X, Y))
+                {
+                    nRow = cell.CellRow;
+                    nCol = cell.CellColumn;
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public void InitializeCalendarGrid()
+        {
+            this.AllowDrop = true;
+        }
+
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            this.m_toolTip = new System.Windows.Forms.ToolTip(this.components);
+            this.SuspendLayout();
+            // 
+            // CalendarGrid
+            // 
+            this.AutoScroll = true;
+            this.AutoScrollMinSize = new System.Drawing.Size(600, 400);
+            this.BackColor = System.Drawing.SystemColors.Window;
+            this.Paint += new System.Windows.Forms.PaintEventHandler(this.CalendarGrid_Paint);
+            this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.CalendarGrid_MouseMove);
+            this.DragDrop += new System.Windows.Forms.DragEventHandler(this.CalendarGrid_DragDrop);
+            this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.CalendarGrid_MouseDown);
+            this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.CalendarGrid_MouseUp);
+            this.DragEnter += new System.Windows.Forms.DragEventHandler(this.CalendarGrid_DragEnter);
+            this.ResumeLayout(false);
+
+        }
+
+        private static int MinSince80(DateTime d)
+        {
+            DateTime time = new DateTime(1980, 1, 1, 0, 0, 0);
+            TimeSpan span = (TimeSpan) (d - time);
+            return (int) span.TotalMinutes;
+        }
+
+        private void OnLButtonDown(int X, int Y, bool bStart)
+        {
+            this.m_bDragDropStart = false;
+            this.m_nSelectID = 0;
+            if (!this.m_bSelectingRange)
+            {
+                int y = Y - base.AutoScrollPosition.Y;
+                int x = X - base.AutoScrollPosition.X;
+                Point pt = new Point(x, y);
+                if (Control.ModifierKeys == Keys.Control)
+                {
+                    this.m_bMouseDown = false;
+                    foreach (CGAppointment appointment in this.m_Appointments.AppointmentTable.Values)
+                    {
+                        if (!appointment.GridRectangle.Contains(pt))
+                        {
+                            continue;
+                        }
+                        if (this.m_SelectedAppointments.AppointmentTable.ContainsKey(appointment.AppointmentKey))
+                        {
+                            this.m_SelectedAppointments.RemoveAppointment(appointment.AppointmentKey);
+                            if (this.m_SelectedAppointments.AppointmentTable.Count == 0)
+                            {
+                                this.m_nSelectID = 0;
+                            }
+                            else
+                            {
+                                foreach (CGAppointment appointment2 in this.m_Appointments.AppointmentTable.Values)
+                                {
+                                    this.m_nSelectID = appointment2.AppointmentKey;
+                                }
+                            }
+                        }
+                        else
+                        {
+                            this.m_SelectedAppointments.AddAppointment(appointment);
+                            this.m_nSelectID = appointment.AppointmentKey;
+                        }
+                        appointment.Selected = !appointment.Selected;
+                        break;
+                    }
+                    base.Invalidate();
+                    return;
+                }
+                foreach (CGAppointment appointment3 in this.m_Appointments.AppointmentTable.Values)
+                {
+                    if (!appointment3.GridRectangle.Contains(pt))
+                    {
+                        continue;
+                    }
+                    this.m_bMouseDown = false;
+                    if (appointment3.Selected)
+                    {
+                        appointment3.Selected = false;
+                        this.m_SelectedAppointments.ClearAllAppointments();
+                        this.m_nSelectID = 0;
+                    }
+                    else
+                    {
+                        foreach (CGAppointment appointment4 in this.m_Appointments.AppointmentTable.Values)
+                        {
+                            appointment4.Selected = false;
+                        }
+                        this.m_SelectedAppointments.ClearAllAppointments();
+                        this.m_SelectedAppointments.AddAppointment(appointment3);
+                        appointment3.Selected = true;
+                        this.m_nSelectID = appointment3.AppointmentKey;
+                        this.m_bMouseDown = true;
+                        this.m_bGridEnter = true;
+                    }
+                    base.Invalidate();
+                    return;
+                }
+            }
+            int nRow = -1;
+            int nCol = -1;
+            if (this.HitTest(X, Y, ref nRow, ref nCol))
+            {
+                CGCell cellFromRowCol = this.m_gridCells.GetCellFromRowCol(nRow, nCol);
+                if (cellFromRowCol != null)
+                {
+                    if (bStart)
+                    {
+                        this.m_currentCell = cellFromRowCol;
+                        this.m_selectedRange.StartCell = null;
+                        this.m_selectedRange.EndCell = null;
+                        this.m_selectedRange.CreateRange(this.m_gridCells, cellFromRowCol, cellFromRowCol);
+                        bStart = false;
+                        this.m_bMouseDown = true;
+                        this.m_bSelectingRange = true;
+                    }
+                    else if (cellFromRowCol != this.m_currentCell)
+                    {
+                        if (!this.m_selectedRange.Cells.CellHashTable.ContainsKey(cellFromRowCol.Key))
+                        {
+                            this.m_selectedRange.AppendCell(this.m_gridCells, cellFromRowCol);
+                        }
+                        else
+                        {
+                            bool bUp = cellFromRowCol.CellRow < this.m_currentCell.CellRow;
+                            this.m_selectedRange.SubtractCell(this.m_gridCells, cellFromRowCol, bUp);
+                        }
+                        this.m_currentCell = cellFromRowCol;
+                    }
+                    cellFromRowCol.IsSelected = true;
+                    base.Invalidate();
+                }
+            }
+        }
+
+        public void OnUpdateArrays()
+        {
+            try
+            {
+                this.m_gridCells.ClearAllCells();
+                this.SetColumnInfo();
+                this.SetOverlapTable();
+                Graphics g = base.CreateGraphics();
+                this.BuildGridCellsArray(g);
+                this.SetAppointmentTypes();
+            }
+            catch (Exception exception)
+            {
+                string message = exception.Message;
+            }
+        }
+
+        /// <summary>
+        /// Draws Availabilities. Draws Some of the Empty cells (don't know where the rest go) with the Khaki color
+        /// </summary>
+        private void SetAppointmentTypes()
+        {
+            if (this.m_gridCells.CellCount != 0)
+            {
+                foreach (DictionaryEntry entry in this.m_gridCells.CellHashTable)
+                {
+                    CGCell cell = (CGCell) entry.Value;
+                    cell.AppointmentTypeColor = (this.m_GridBackColor == "blue") ? Brushes.CornflowerBlue : Brushes.Khaki;
+                }
+                if ((this.m_pAvArray != null) && (this.m_pAvArray.Count != 0))
+                {
+                    foreach (CGAvailability availability in this.m_pAvArray)
+                    {
+                        int nRow = 0;
+                        int nCol = 0;
+                        int num3 = 0;
+                        int num4 = 0;
+                        Brush brush = new SolidBrush(Color.FromArgb(availability.Red, availability.Green, availability.Blue));
+                        this.GetCellFromTime(availability.StartTime, ref nRow, ref nCol, true, availability.ResourceList);
+                        this.GetCellFromTime(availability.EndTime, ref num3, ref num4, false, availability.ResourceList);
+                        for (int i = nCol; i <= num4; i++)
+                        {
+                            for (int j = nRow; (i == num4) && (j <= num3); j++)
+                            {
+                                string str = "r" + j.ToString() + "c" + i.ToString();
+                                CGCell cell2 = (CGCell) this.m_gridCells.CellHashTable[str];
+                                if (cell2 != null)
+                                {
+                                    cell2.AppointmentTypeColor = brush;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        private void SetColumnInfo()
+        {
+            this.m_ColumnInfoTable.Clear();
+            for (int i = 0; i < this.m_sResourcesArray.Count; i++)
+            {
+                this.m_ColumnInfoTable.Add(this.m_sResourcesArray[i], i);
+            }
+            if (this.m_sResourcesArray.Count > 1)
+            {
+                this.m_nColumns = this.m_sResourcesArray.Count;
+            }
+        }
+
+        public void SetOverlapTable()
+        {
+            Hashtable hashtable = new Hashtable();
+            int y = 0;
+            int num2 = 0;
+            int x = 0;
+            foreach (CGAppointment appointment in this.m_Appointments.AppointmentTable.Values)
+            {
+                if (!appointment.WalkIn || this.m_bDrawWalkIns)
+                {
+                    string resource = appointment.Resource;
+                    y = appointment.StartTime.Minute + (60 * appointment.StartTime.Hour);
+                    num2 = appointment.EndTime.Minute + (60 * appointment.EndTime.Hour);
+                    x = (this.m_sResourcesArray.Count > 1) ? (((int) this.m_ColumnInfoTable[resource]) + 1) : appointment.StartTime.DayOfYear;
+                    Rectangle rectangle = new Rectangle(x, y, 1, num2 - y);
+                    hashtable.Add(appointment.m_nKey, rectangle);
+                }
+            }
+            this.m_ApptOverlapTable.Clear();
+            foreach (int num4 in hashtable.Keys)
+            {
+                this.m_ApptOverlapTable.Add(num4, 0);
+            }
+            // Here it draws the Dates on Top
+            if (this.m_ApptOverlapTable.Count != 0)
+            {
+                int num5 = (this.m_sResourcesArray.Count > 1) ? 1 : this.StartDate.DayOfYear;
+                int num6 = (this.m_sResourcesArray.Count > 1) ? (this.m_sResourcesArray.Count + 1) : (this.Columns + this.StartDate.DayOfYear);
+                for (int i = num5; i < num6; i++)
+                {
+                    ArrayList list = new ArrayList();
+                    for (int j = 1; j < this.Rows; j++)
+                    {
+                        Rectangle rectangle2 = new Rectangle(i, j * this.m_nTimeScale, 1, this.m_nTimeScale);
+                        int num9 = -1;
+                        list.Clear();
+                        foreach (int num10 in hashtable.Keys)
+                        {
+                            Rectangle rect = (Rectangle) hashtable[num10];
+                            if (rectangle2.IntersectsWith(rect))
+                            {
+                                num9++;
+                                list.Add(num10);
+                            }
+                        }
+                        if (num9 > 0)
+                        {
+                            foreach (object obj2 in list)
+                            {
+                                int num11 = (int) obj2;
+                                if (((int) this.m_ApptOverlapTable[num11]) < num9)
+                                {
+                                    this.m_ApptOverlapTable[num11] = num9;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// Handles scrolling when the mouse button is down
+        /// </summary>
+        /// <param name="o"></param>
+        /// <param name="e"></param>
+        private void tickEventHandler(object o, EventArgs e)
+        {
+            //if there are still WM_TIME messages in the Queue after the timer is dead, don't do anything.
+            if (this.m_Timer == null) return;
+
+            Point point = new Point(base.AutoScrollPosition.X, base.AutoScrollPosition.Y);
+            int x = point.X;
+            int num = point.Y * -1;
+            num = this.m_bScrollDown ? (num + 2) : (num - 2);
+            point.Y = num;
+            base.AutoScrollPosition = point;
+            base.Invalidate();
+        }
+
+        /// <summary>
+        /// Do 2 time ranges overlap each other?
+        /// </summary>
+        /// <param name="dStart1">First Start Time</param>
+        /// <param name="dEnd1">First End Time</param>
+        /// <param name="dStart2">Second Start Time</param>
+        /// <param name="dEnd2">Second End Time</param>
+        /// <returns>True or False</returns>
+        public static bool TimesOverlap(DateTime dStart1, DateTime dEnd1, DateTime dStart2, DateTime dEnd2)
+        {
+            long ticks = dEnd1.Ticks - dStart1.Ticks;
+            TimeSpan ts = new TimeSpan(ticks);
+            ticks = dEnd2.Ticks - dStart2.Ticks;
+            new TimeSpan(ticks).Subtract(ts);
+            Rectangle rect = new Rectangle();
+            Rectangle rectangle2 = new Rectangle();
+            rect.X = 0;
+            rectangle2.X = 0;
+            rect.Width = 1;
+            rectangle2.Width = 1;
+            rect.Y = MinSince80(dStart1);
+            rect.Height = MinSince80(dEnd1) - rect.Y;
+            rectangle2.Y = MinSince80(dStart2);
+            rectangle2.Height = MinSince80(dEnd2) - rectangle2.Y;
+            return rectangle2.IntersectsWith(rect);
+        }
+
+        public void PositionGrid(int nHour)
+        {
+            //Position grid to nHour
+            int nRow = 0, nCol = 0;
+            DateTime dStart = DateTime.Today;
+            dStart = dStart.AddHours(nHour);
+            this.GetCellFromTime(dStart, ref nRow, ref nCol, false, "");
+            int nHeight = this.CellHeight + 10;
+            nHeight *= nRow;
+            this.AutoScrollPosition = new Point(50, nHeight);
+            this.Invalidate();
+        }
+
+
+        /// <summary>
+        /// The purpose of this is to properly draw the date boxes at the top of the calendar grid.
+        /// Otherwise, when scrolling, it gets garbled.
+        /// </summary>
+        /// <param name="msg">Handles three messages:
+        /// WM_VSCROLL (0x115 - Vertical Scrolling)
+        /// WM_HSCROLL (0x114 - Horizontal Scrolling)
+        /// WM_MOUSEWHEEL (0x20a - Mouse Wheel Movement)
+        /// </param>
+        protected override void WndProc(ref Message msg)
+        {
+            try
+            {
+                if (msg.Msg == WM_VSCROLL || msg.Msg == WM_MOUSEWHEEL)
+                {
+                    this.m_bScroll = true;
+                    base.Invalidate(false);
+                    this.m_bScroll = false;
+                }
+                if (msg.Msg == WM_HSCROLL)
+                {
+                    base.Invalidate(false);
+                }
+                base.WndProc(ref msg);
+            }
+            catch (Exception exception)
+            {
+                MessageBox.Show("CalendarGrid::WndProc:  " + exception.Message + "\nStack: " + exception.StackTrace);
+            }
+        }
+
+        public CGAppointments Appointments
+        {
+            get
+            {
+                return this.m_Appointments;
+            }
+            set
+            {
+                this.m_Appointments = value;
+            }
+        }
+
+        public string ApptDragSource
+        {
+            get
+            {
+                return this.m_sDragSource;
+            }
+            set
+            {
+                this.m_sDragSource = value;
+            }
+        }
+
+        public ArrayList AvailabilityArray
+        {
+            get
+            {
+                return this.m_pAvArray;
+            }
+            set
+            {
+                this.m_pAvArray = value;
+            }
+        }
+
+        public int CellHeight
+        {
+            get
+            {
+                return this.m_cellHeight;
+            }
+        }
+
+        public ToolTip CGToolTip
+        {
+            get
+            {
+                return this.m_toolTip;
+            }
+        }
+
+        public int Columns
+        {
+            get
+            {
+                return this.m_nColumns;
+            }
+            set
+            {
+                if ((value > 0) && (value < 11))
+                {
+                    this.m_nColumns = value;
+                    this.m_gridCells.ClearAllCells();
+                    this.m_selectedRange.Cells.ClearAllCells();
+                    Graphics g = base.CreateGraphics();
+                    this.BuildGridCellsArray(g);
+                    this.SetAppointmentTypes();
+                    base.Invalidate();
+                }
+            }
+        }
+
+        public bool DrawWalkIns
+        {
+            get
+            {
+                return this.m_bDrawWalkIns;
+            }
+            set
+            {
+                this.m_bDrawWalkIns = value;
+            }
+        }
+
+        public string GridBackColor
+        {
+            get
+            {
+                return this.m_GridBackColor;
+            }
+            set
+            {
+                this.m_GridBackColor = value;
+            }
+        }
+
+        public bool GridEnter
+        {
+            get
+            {
+                return this.m_bGridEnter;
+            }
+            set
+            {
+                this.m_bGridEnter = value;
+            }
+        }
+
+        public ArrayList Resources
+        {
+            get
+            {
+                return this.m_sResourcesArray;
+            }
+            set
+            {
+                this.m_sResourcesArray = value;
+            }
+        }
+
+        public int Rows
+        {
+            get
+            {
+                return (0x5a0 / this.m_nTimeScale);
+            }
+        }
+
+        public int SelectedAppointment
+        {
+            get
+            {
+                return this.m_nSelectID;
+            }
+            set
+            {
+                this.m_nSelectID = value;
+            }
+        }
+
+        public CGAppointments SelectedAppointments
+        {
+            get
+            {
+                return this.m_SelectedAppointments;
+            }
+        }
+
+        public CGRange SelectedRange
+        {
+            get
+            {
+                return this.m_selectedRange;
+            }
+        }
+
+        public DateTime StartDate
+        {
+            get
+            {
+                return this.m_dtStart;
+            }
+            set
+            {
+                //this.m_dtStart = value;
+                this.m_dtStart = value.Date; // only date portion!!!//smh
+            }
+        }
+
+        public int TimeScale
+        {
+            get
+            {
+                return this.m_nTimeScale;
+            }
+            set
+            {
+                if ((((value == 5) || (value == 10)) || ((value == 15) || (value == 20))) || ((value == 30) || (value == 60)))
+                {
+                    this.m_nTimeScale = value;
+                    this.m_gridCells.ClearAllCells();
+                    this.m_selectedRange.Cells.ClearAllCells();
+                    Graphics g = base.CreateGraphics();
+                    this.BuildGridCellsArray(g);
+                    this.SetAppointmentTypes();
+                    base.Invalidate();
+                }
+            }
+        }
+
+    }
+}
+
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/ClinicalScheduling.csproj
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/ClinicalScheduling.csproj	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/ClinicalScheduling.csproj	(revision 1134)
@@ -0,0 +1,484 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8C05C4F7-FE81-479F-87A0-44E04C7F6E0F}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>hwIco281.ICO</ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>ClinicalScheduling</AssemblyName>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>IndianHealthService.ClinicalScheduling</RootNamespace>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <StartupObject>IndianHealthService.ClinicalScheduling.CGDocumentManager</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <SccProjectName>
+    </SccProjectName>
+    <SccLocalPath>
+    </SccLocalPath>
+    <SccAuxPath>
+    </SccAuxPath>
+    <SccProvider>
+    </SccProvider>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <ManifestCertificateThumbprint>3202DD11CA9F64F7E52CF7BBED5F17D6E8A1B395</ManifestCertificateThumbprint>
+    <ManifestKeyFile>ClinicalScheduling_TemporaryKey.pfx</ManifestKeyFile>
+    <GenerateManifests>false</GenerateManifests>
+    <SignManifests>false</SignManifests>
+    <TargetZone>LocalIntranet</TargetZone>
+    <NoWin32Manifest>true</NoWin32Manifest>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>1</ApplicationRevision>
+    <ApplicationVersion>2.1.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <PublishWizardCompleted>true</PublishWizardCompleted>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn>
+    </NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>
+    </DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn>
+    </NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.configuration" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing">
+      <Name>System.Drawing</Name>
+    </Reference>
+    <Reference Include="System.Web.Extensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Web.Services">
+      <Name>System.Web.Services</Name>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <Name>System.Windows.Forms</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Provider.cs" />
+    <Compile Include="strings.ar.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>strings.ar.resx</DependentUpon>
+    </Compile>
+    <Compile Include="strings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>strings.resx</DependentUpon>
+    </Compile>
+    <Compile Include="UserPreferences.cs" />
+    <None Include="app.config" />
+    <None Include="dsPatientApptDisplay2.xsc">
+      <DependentUpon>dsPatientApptDisplay2.xsd</DependentUpon>
+    </None>
+    <None Include="dsPatientApptDisplay2.xss">
+      <DependentUpon>dsPatientApptDisplay2.xsd</DependentUpon>
+    </None>
+    <None Include="dsPatientApptDisplay2.xsx">
+      <DependentUpon>dsPatientApptDisplay2.xsd</DependentUpon>
+    </None>
+    <None Include="dsRebookAppts.xsc">
+      <DependentUpon>dsRebookAppts.xsd</DependentUpon>
+    </None>
+    <None Include="dsRebookAppts.xss">
+      <DependentUpon>dsRebookAppts.xsd</DependentUpon>
+    </None>
+    <None Include="dsRebookAppts.xsx">
+      <DependentUpon>dsRebookAppts.xsd</DependentUpon>
+    </None>
+    <Content Include="dsPatientApptDisplay2.xsd">
+      <Generator>MSDataSetGenerator</Generator>
+      <LastGenOutput>dsPatientApptDisplay2.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </Content>
+    <Content Include="dsRebookAppts.xsd">
+      <Generator>MSDataSetGenerator</Generator>
+      <LastGenOutput>dsRebookAppts.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </Content>
+    <Content Include="hwIco281.ICO" />
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="CalendarGrid.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="CGAppointment.cs" />
+    <Compile Include="CGAppointmentChangedArgs.cs" />
+    <Compile Include="CGAppointments.cs" />
+    <Compile Include="CGAvailability.cs" />
+    <Compile Include="CGAVDocument.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="CGAVView.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="CGCell.cs" />
+    <Compile Include="CGCells.cs" />
+    <Compile Include="CGDocument.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="CGDocumentManager.cs" />
+    <Compile Include="CGRange.cs" />
+    <Compile Include="CGResource.cs" />
+    <Compile Include="CGSchedLib.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="CGSelectionChangedArgs.cs" />
+    <Compile Include="CGView.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Printing.cs" />
+    <Compile Include="DAccessBlock.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DAccessGroup.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DAccessGroupItem.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DAccessTemplate.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DAccessType.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DAL.cs" />
+    <Compile Include="DAppointPage.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DApptSearch.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DCancelAppt.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DCheckIn.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DCopyAppts.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="dInputText.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DManagement.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DNoShow.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DPatientApptDisplay.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DPatientLetter.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DPatientLookup.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DResource.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DResourceGroup.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DResourceGroupItem.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DResourceUser.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DSelectLetterClinics.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DSelectSchedules.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="dsPatientApptDisplay2.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>dsPatientApptDisplay2.xsd</DependentUpon>
+    </Compile>
+    <Compile Include="DSplash.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="dsRebookAppts.cs">
+      <DependentUpon>dsRebookAppts.xsd</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="dsRebookAppts.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>dsRebookAppts.xsd</DependentUpon>
+    </Compile>
+    <Compile Include="FMDateTime.cs">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Compile>
+    <Compile Include="DMassSlotDelete.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DMassSlotDelete.Designer.cs">
+      <DependentUpon>DMassSlotDelete.cs</DependentUpon>
+    </Compile>
+    <Compile Include="LoadingSplash.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="LoadingSplash.Designer.cs">
+      <DependentUpon>LoadingSplash.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Options.cs" />
+    <Compile Include="Patient.cs" />
+    <Compile Include="UCPatientAppts.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="UCPatientAppts.Designer.cs">
+      <DependentUpon>UCPatientAppts.cs</DependentUpon>
+    </Compile>
+    <EmbeddedResource Include="CGAVView.resx">
+      <DependentUpon>CGAVView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="CGDocumentManager.resx">
+      <DependentUpon>CGDocumentManager.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="CGView.resx">
+      <DependentUpon>CGView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DAccessGroup.resx">
+      <DependentUpon>DAccessGroup.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DAccessGroupItem.resx">
+      <DependentUpon>DAccessGroupItem.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DAccessTemplate.resx">
+      <DependentUpon>DAccessTemplate.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DAccessType.resx">
+      <DependentUpon>DAccessType.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DAppointPage.resx">
+      <DependentUpon>DAppointPage.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DApptSearch.resx">
+      <DependentUpon>DApptSearch.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DCancelAppt.resx">
+      <DependentUpon>DCancelAppt.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DCheckIn.resx">
+      <DependentUpon>DCheckIn.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DCopyAppts.resx">
+      <DependentUpon>DCopyAppts.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="dInputText.resx">
+      <DependentUpon>dInputText.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DManagement.resx">
+      <DependentUpon>DManagement.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DMassSlotDelete.resx">
+      <DependentUpon>DMassSlotDelete.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DNoShow.resx">
+      <DependentUpon>DNoShow.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DPatientLetter.resx">
+      <DependentUpon>DPatientLetter.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DPatientLookup.resx">
+      <DependentUpon>DPatientLookup.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DResource.resx">
+      <DependentUpon>DResource.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DResourceGroup.resx">
+      <DependentUpon>DResourceGroup.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DResourceGroupItem.resx">
+      <DependentUpon>DResourceGroupItem.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DResourceUser.resx">
+      <DependentUpon>DResourceUser.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DSelectLetterClinics.resx">
+      <DependentUpon>DSelectLetterClinics.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DSelectSchedules.resx">
+      <DependentUpon>DSelectSchedules.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DSplash.resx">
+      <DependentUpon>DSplash.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="LoadingSplash.resx">
+      <DependentUpon>LoadingSplash.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="strings.ar.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>strings.ar.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <EmbeddedResource Include="strings.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>strings.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <EmbeddedResource Include="UCPatientAppts.resx">
+      <DependentUpon>UCPatientAppts.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{967B4E0D-AD0C-4609-AB67-0FA40C0206D8}" />
+    <Service Include="{CF845C55-C321-4742-B673-E6212D061ED9}" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\bmx\BMXNet\BMXNet.csproj">
+      <Project>{DE8E4CC9-4F3A-4E32-8DFE-EE5692E8FC45}</Project>
+      <Name>BMXNet</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/ClinicalScheduling.csproj.user
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/ClinicalScheduling.csproj.user	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/ClinicalScheduling.csproj.user	(revision 1134)
@@ -0,0 +1,70 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <LastOpenVersion>7.10.3077</LastOpenVersion>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ReferencePath>
+    </ReferencePath>
+    <CopyProjectDestinationFolder>
+    </CopyProjectDestinationFolder>
+    <CopyProjectUncPath>
+    </CopyProjectUncPath>
+    <CopyProjectOption>0</CopyProjectOption>
+    <ProjectView>ProjectFiles</ProjectView>
+    <ProjectTrust>0</ProjectTrust>
+    <PublishUrlHistory>publish\</PublishUrlHistory>
+    <InstallUrlHistory>
+    </InstallUrlHistory>
+    <SupportUrlHistory>
+    </SupportUrlHistory>
+    <UpdateUrlHistory>
+    </UpdateUrlHistory>
+    <BootstrapperUrlHistory>
+    </BootstrapperUrlHistory>
+    <ErrorReportUrlHistory>
+    </ErrorReportUrlHistory>
+    <FallbackCulture>en-US</FallbackCulture>
+    <VerifyUploadedFiles>false</VerifyUploadedFiles>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <EnableASPDebugging>false</EnableASPDebugging>
+    <EnableASPXDebugging>false</EnableASPXDebugging>
+    <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
+    <EnableSQLServerDebugging>false</EnableSQLServerDebugging>
+    <RemoteDebugEnabled>false</RemoteDebugEnabled>
+    <RemoteDebugMachine>
+    </RemoteDebugMachine>
+    <StartAction>Project</StartAction>
+    <StartArguments>/s=172.16.16.108 /p=9250 /a=BASMA.ALDWAIRI /v=SELEN.123</StartArguments>
+    <StartPage>
+    </StartPage>
+    <StartProgram>C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\IEExec.exe</StartProgram>
+    <StartURL>
+    </StartURL>
+    <StartWorkingDirectory>
+    </StartWorkingDirectory>
+    <StartWithIE>false</StartWithIE>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <EnableASPDebugging>false</EnableASPDebugging>
+    <EnableASPXDebugging>false</EnableASPXDebugging>
+    <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
+    <EnableSQLServerDebugging>false</EnableSQLServerDebugging>
+    <RemoteDebugEnabled>false</RemoteDebugEnabled>
+    <RemoteDebugMachine>
+    </RemoteDebugMachine>
+    <StartAction>Project</StartAction>
+    <StartArguments>
+    </StartArguments>
+    <StartPage>
+    </StartPage>
+    <StartProgram>
+    </StartProgram>
+    <StartURL>
+    </StartURL>
+    <StartWorkingDirectory>
+    </StartWorkingDirectory>
+    <StartWithIE>false</StartWithIE>
+  </PropertyGroup>
+</Project>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/ClinicalScheduling.sln
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/ClinicalScheduling.sln	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/ClinicalScheduling.sln	(revision 1134)
@@ -0,0 +1,25 @@
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual C# Express 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClinicalScheduling", "ClinicalScheduling.csproj", "{8C05C4F7-FE81-479F-87A0-44E04C7F6E0F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BMXNet", "..\bmx\BMXNet\BMXNet.csproj", "{DE8E4CC9-4F3A-4E32-8DFE-EE5692E8FC45}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{8C05C4F7-FE81-479F-87A0-44E04C7F6E0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8C05C4F7-FE81-479F-87A0-44E04C7F6E0F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8C05C4F7-FE81-479F-87A0-44E04C7F6E0F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8C05C4F7-FE81-479F-87A0-44E04C7F6E0F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DE8E4CC9-4F3A-4E32-8DFE-EE5692E8FC45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DE8E4CC9-4F3A-4E32-8DFE-EE5692E8FC45}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DE8E4CC9-4F3A-4E32-8DFE-EE5692E8FC45}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DE8E4CC9-4F3A-4E32-8DFE-EE5692E8FC45}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/ConnectInfo.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/ConnectInfo.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/ConnectInfo.cs	(revision 1134)
@@ -0,0 +1,270 @@
+using System;
+using System.Windows.Forms;
+//using RPX20Lib;
+using System.Data;
+//using System.Data.OleDb;
+using System.Text;
+using IndianHealthService.BMXNet;
+using System.Reflection;
+using System.Diagnostics;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Contains information about the RPMS connection
+	/// </summary>
+	public class CGConnectInfo
+	{
+		public CGConnectInfo()
+		{
+			// 
+			// TODO: Add constructor logic here
+			//
+		}
+
+		private	bool	m_bConnected;
+		string			m_sVerify;
+		string			m_sAccess;
+		string			m_sServerAddress;
+		int				m_nServerPort;
+		private	string	m_sDUZ;
+		private string	m_sDUZ2;
+		private	int		m_nDivisionCount = 0;
+		private	string	m_sUserName;
+		private	string	m_sDivision;
+
+
+
+		public bool Connected
+		{
+			get
+			{
+				return m_bConnected;
+			}
+		}
+
+		public bool LoadConnectInfo()
+		{
+			
+			//Returns True if able to connect to RPMS
+
+
+			//Step 1
+			//Get RPMS Server Address and Port from Registry.
+			//Prompt for them if they're not there.
+			//Return False if unable to get address/port
+
+
+
+///////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////
+			
+			//Old Version Below:
+			//Loads and decypts M Connection info from registry
+			//Tests connection
+			//Sets m_bConnected based on test
+			//returns m_bConnected
+
+			//(see ConnectInfo.cpp)
+
+			string sTempAddress;
+			sTempAddress = "127.0.0.1";
+//			sTempAddress = "161.223.91.10";
+			int nTempPort = 0;
+
+			// Load from registry (HKCU) 
+
+			// Decrypt Access and Verify codes
+
+			string sTempAccess2 = "HMWXXX8"; //TODO: Get from registry
+//			sTempAccess2 = "JANXXX1"; //TODO: Get from registry
+//			if (!DecryptString(pbAccessData, &lAccessSize, sTempAccess2))
+//				return FALSE;
+//
+			string sTempVerify2 = "MOLLYB8"; //TODO: Get from registry
+//			sTempVerify2 = "JANXXX2"; //TODO: Get from registry
+//			if (!DecryptString(pbVerifyData, &lVerifySize, sTempVerify2))
+//				return FALSE;
+
+			m_sAccess = sTempAccess2;
+			m_sVerify = sTempVerify2;
+			m_sServerAddress = sTempAddress;
+			if (m_sServerAddress == "") 
+			{
+				m_sServerAddress = "RPMSWindow";
+				m_sAccess = "";
+				m_sVerify = "";
+			}
+			m_nServerPort = nTempPort;
+			if (m_nServerPort == 0)
+				m_nServerPort = 9200;
+
+//			RPX20Lib.MConnect m;
+//			m = new MConnectClass();
+			BMXNetLib m = new BMXNetLib();
+			m.MServerPort = m_nServerPort;
+			m.AppContext="BMXRPC";
+			bool bRet = false;
+			try 
+			{
+				bRet = m.OpenConnection(sTempAddress, sTempAccess2, sTempVerify2);
+			}
+			catch (BMXNetException exBMX)
+			{
+				throw exBMX;
+			}
+			catch (Exception bmxEx)
+			{
+				string sMessage =  bmxEx.Message + bmxEx.StackTrace;
+				throw new BMXNetException(sMessage);
+			}
+
+			if (bRet == true){
+				try {
+					this.m_sAccess = sTempAccess2;
+					this.m_sVerify = sTempVerify2;
+					this.m_sServerAddress = sTempAddress;
+					this.m_nServerPort = m.MServerPort;
+					this.m_sDUZ = m.DUZ;
+
+					string sRpc = "BMX USER";
+					m_sUserName = m.TransmitRPC(sRpc, m_sDUZ);
+
+					
+					System.Data.DataTable rsDivisions;
+					rsDivisions =  this.GetUserDivisions(m_sAccess, m_sVerify, m_sServerAddress, m_nServerPort);
+					m_nDivisionCount = rsDivisions.Rows.Count;
+
+					foreach (System.Data.DataRow r in rsDivisions.Rows)
+					{
+						string sTemp = r["MOST_RECENT_LOOKUP"].ToString();
+						if (sTemp == "1")
+						{
+							this.m_sDivision = r["FACILITY_NAME"].ToString();
+							this.m_sDUZ2 = r["FACILITY_IEN"].ToString();
+							break;
+						}
+					}
+
+					m_bConnected = true;
+				}
+				catch(Exception bmxEx)
+				{
+					m_bConnected = false;
+					string sMessage =  bmxEx.Message + bmxEx.StackTrace;
+					throw new BMXNetException(sMessage);
+				}
+			}
+
+			return m_bConnected;
+		}
+
+		bool TestConnection(string sAccess, string sVerify, string sAddress, int nPort)
+		{
+			// Try RPMS Connection & set m_bconnected TRUE if successful
+//			RPX20Lib.MConnect m;
+//			m = new MConnectClass();
+			BMXNetLib m = new BMXNetLib();
+			bool bRet = false;
+			try 
+			{
+				//from old MServices->Login
+				m.MServerPort = nPort;
+				bRet = m.OpenConnection(sAddress, sAccess, sVerify);
+				this.m_sDUZ = m.DUZ;
+			}
+			catch(Exception ex)
+			{
+				Debug.Write("CConnectInfo::TestConnection: Error: " + ex.Message);
+				bRet = false;
+			}
+			finally
+			{
+				m.CloseConnection();
+			}
+			return bRet;
+		}
+
+		private DataTable GetUserDivisions(string sTempAccess2, string sTempVerify2, string sTempAddress, int MServerPort)
+		{
+			try
+			{
+				//Connection string model:
+				//"Provider=BMXODB.RPMS.1;Data source=127.0.0.1;Location=9200;Extended Properties=BMXRPC;Password=HMWXXX8^MOLLYB8"
+				string sConn;
+				sConn = "Data source=" + sTempAddress + ";Location=" + MServerPort.ToString() + ";Extended Properties=BMXRPC;Password=" + sTempAccess2 + "^" + sTempVerify2;
+				BMXNetConnection rpmsConn = new BMXNetConnection(sConn);
+				rpmsConn.Open();
+
+				BMXNetCommand cmd = (BMXNetCommand) rpmsConn.CreateCommand();
+				cmd.CommandText = "BMXGetFacRS^" + m_sDUZ;
+
+				BMXNetDataAdapter da = new BMXNetDataAdapter();
+				da.SelectCommand = cmd;
+
+				DataSet dsDivisions = new DataSet("Divisions");
+				da.Fill(dsDivisions, "DivisionTable");
+				DataTable tb = dsDivisions.Tables["DivisionTable"];
+				return tb;
+			}
+			catch (Exception bmxEx)
+			{
+				string sMessage =  bmxEx.Message + bmxEx.StackTrace;
+				throw new BMXNetException(sMessage);
+
+			}
+		}
+
+		public string UserName
+		{
+			get
+			{
+				return this.m_sUserName;
+			}
+		}
+
+		public string DivisionName
+		{
+			get
+			{
+				return this.m_sDivision;
+			}
+		}
+
+		public string GetDSN(string sAppContext)
+		{
+			string sDsn = "Data source=";
+			if (sAppContext == "")
+				sAppContext = "BMXRPC";
+
+			if (this.m_bConnected == false)
+				return sDsn.ToString();
+
+			sDsn += this.m_sServerAddress ;
+			sDsn += ";Location=";
+			sDsn += this.m_nServerPort.ToString();
+			sDsn += ";Extended Properties=";
+			sDsn += sAppContext;
+			sDsn += ";Password=";
+			sDsn += this.m_sAccess;
+			sDsn += "^";
+			sDsn += this.m_sVerify;
+			
+			return sDsn;
+		}
+
+		/// <summary>
+		/// String representation of DUZ
+		/// </summary>
+		public string DUZ
+		{
+			get
+			{
+				return m_sDUZ;
+			}
+		}
+
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAL.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAL.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAL.cs	(revision 1134)
@@ -0,0 +1,273 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Data;
+using System.Text;
+using System.Diagnostics;
+using IndianHealthService.BMXNet;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+    /// <summary>
+    /// Data Access Layer
+    /// </summary>
+    public class DAL
+    {
+        private BMXNetConnectInfo _thisConnection; // set in constructor
+        
+        delegate DataTable RPMSDataTableDelegate(string CommandString, string TableName); // for use in calling (Sync and Async)
+        delegate string TransmitRPCAsync(string RPCName, string Params); //same idea
+
+        /// <summary>
+        /// Constructor
+        /// </summary>
+        /// <param name="conn">The current connection to use</param>
+        public DAL(BMXNetConnectInfo conn)
+        {
+            this._thisConnection = conn;
+        }
+        
+        /// <summary>
+        /// Get Current version from ^ nmsp + APPL(1,0)
+        /// </summary>
+        /// <param name="nmsp">Namespace to ask for. Only "BMX" and "BSDX" are supported.</param>
+        /// <returns>Datatable with the following fields:
+        /// "T00030ERROR^T00030MAJOR_VERSION^T00030MINOR_VERSION^T00030BUILD</returns>
+        public DataTable GetVersion(string nmsp)
+        {
+            string cmd = String.Format("BMX VERSION INFO^{0}", nmsp);
+            return RPMSDataTable(cmd, "");
+        }
+
+        /// <summary>
+        /// Get Scheduling User Info
+        /// </summary>
+        /// <param name="DUZ">You should know what this is</param>
+        /// <returns>Datatable with one column: "MANAGER": One Row that's "YES" or "NO"</returns>
+        public DataTable GetUserInfo(string DUZ)
+        {
+            string cmd = String.Format("BSDX SCHEDULING USER INFO^{0}", DUZ);
+            return RPMSDataTable(cmd, "");
+        }
+
+        /// <summary>
+        /// Get all Access Types from the BSDX ACCESS TYPE file
+        /// </summary>
+        /// <returns>DataTable with the following fields (add _ for spaces) 
+        /// ACCESS TYPE NAME (RF), [0;1]
+        /// INACTIVE (S), [0;2]
+        /// DEPARTMENT NAME (P9002018.2'), [0;3]
+        /// DISPLAY COLOR (F), [0;4]
+        /// RED (NJ3,0), [0;5]
+        /// GREEN (NJ3,0), [0;6]
+        /// BLUE (NJ3,0), [0;7]
+        ///</returns>
+        public DataTable GetAccessTypes()
+        {
+            string sCommandText = "SELECT * FROM BSDX_ACCESS_TYPE";
+            DataTable table = RPMSDataTable(sCommandText, "");
+            DataColumn dcKey = table.Columns["BMXIEN"];
+            DataColumn[] dcKeys = new DataColumn[1];
+            dcKeys[0] = dcKey;
+            table.PrimaryKey = dcKeys;
+            return table;
+        }
+
+        /// <summary>
+        /// Get the Patients who have appointments in between dates for the clinics requested
+        /// </summary>
+        /// <param name="sClinicList">| delimited resource list (resource IENS, not names)</param>
+        /// <param name="BeginDate">Self Explanatory</param>
+        /// <param name="EndDate">Self Explanatory</param>
+        /// <returns>DataTable with the following columns:
+        /// T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030ApptDate^T00030Clinic^T00030TypeStatus
+        /// I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^
+        /// T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE
+        ///</returns>
+        ///<remarks>Mirrors dsPatientApptDisplay2.PatientAppts Schema in this project. Can merge table into schema.</remarks>
+        public DataTable GetClinicSchedules(string sClinicList, DateTime BeginDate, DateTime EndDate)
+        {
+            string sBegin = FMDateTime.Create(BeginDate).DateOnly.FMDateString;
+            string sEnd = FMDateTime.Create(EndDate).DateOnly.FMDateString;
+            string cmd = String.Format("BSDX CLINIC LETTERS^{0}^{1}^{2}", sClinicList, sBegin, sEnd);
+            return RPMSDataTable(cmd, "");
+        }
+
+        /// <summary>
+        /// Get the letter templates associated with the requested clinics (reminder letter, cancellation letter etc)
+        /// </summary>
+        /// <param name="sClinicList">| delimited resource list (resource IENS, not names)</param>
+        /// <returns>DataTable with the following columns:
+        /// I00010RESOURCEID^T00030RESOURCE_NAME^T00030LETTER_TEXT^T00030NO_SHOW_LETTER^T00030CLINIC_CANCELLATION_LETTER
+        /// </returns>
+        /// <remarks>Mirrors dsPatientApptDisplay2.BSDXResource Schema. Can merge table into schema.</remarks>
+        public DataTable GetResourceLetters(string sClinicList)
+        {
+            string cmd = String.Format("BSDX RESOURCE LETTERS^{0}", sClinicList);
+            return RPMSDataTable(cmd, "");
+        }
+
+        /// <summary>
+        /// Get the list of Patients who have Rebooked Appointments
+        /// </summary>
+        /// <param name="sClinicList">| delimited resource list (resource IENS, not names)</param>
+        /// <param name="BeginDate">Self Explanatory</param>
+        /// <param name="EndDate">Self Explanatory</param>
+        /// <returns>T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030NewApptDate^T00030Clinic^T00030TypeStatus
+        /// ^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY
+        /// ^T00030STATE^T00030ZIP^T00030HOMEPHONE^D00030OldApptDate
+        ///</returns>
+        /// <remarks>Mirrors dsRebookAppts.PatientAppt Schema. Can merge table into schema.</remarks>
+        public DataTable GetRebookedAppointments(string sClinicList, DateTime BeginDate, DateTime EndDate)
+        {
+            string sBegin = FMDateTime.Create(BeginDate).DateOnly.FMDateString;
+            string sEnd = FMDateTime.Create(EndDate).DateOnly.FMDateString;
+            string cmd = String.Format("BSDX REBOOK CLINIC LIST^{0}^{1}^{2}", sClinicList, sBegin, sEnd);
+            return RPMSDataTable(cmd, "");
+        }
+
+        /// <summary>
+        /// Should have documented this better when I remembered what this did!
+        /// </summary>
+        /// <param name="sApptList">| delimited list of appointment IENs in ^BSDXAPPT</param>
+        /// <returns>"T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030NewApptDate^T00030Clinic^T00030TypeStatus
+        /// ^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY
+        /// ^T00030STATE^T00030ZIP^T00030HOMEPHONE^D00030OldApptDate</returns>
+        public DataTable GetRebookedAppointments(string sApptList)
+        {
+            string cmd = String.Format("BSDX REBOOK LIST^{0}", sApptList);
+            return RPMSDataTable(cmd, "");
+        }
+
+        /// <summary>
+        /// Really does what it says! Gets them by going through the BSDX APPOITMENT file index 
+        /// between the specified dates for the Resource.
+        /// </summary>
+        /// <param name="sClinicList">| delmited list of Resource IENs in ^BSDXRES</param>
+        /// <param name="BeginDate"></param>
+        /// <param name="EndDate"></param>
+        /// <returns>"T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030NewApptDate^T00030Clinic^T00030TypeStatus
+        /// ^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY
+        /// ^T00030STATE^T00030ZIP^T00030HOMEPHONE^D00030OldApptDate</returns>
+        public DataTable GetCancelledAppointments(string sClinicList, DateTime BeginDate, DateTime EndDate)
+        {
+            string sBegin = FMDateTime.Create(BeginDate).DateOnly.FMDateString;
+            string sEnd = FMDateTime.Create(EndDate).DateOnly.FMDateString;
+            string cmd = String.Format("BSDX CANCEL CLINIC LIST^{0}^{1}^{2}", sClinicList, sBegin, sEnd);
+            return RPMSDataTable(cmd, "");
+        }
+
+        /// <summary>
+        /// Delete All Slots for a Resource
+        /// </summary>
+        /// <param name="sResourceID">Integer Resource IEN in BSDX RESOURCE</param>
+        /// <param name="BeginDate">Self-Explanatory</param>
+        /// <param name="EndDate">Self-Explanatory</param>
+        /// <returns>Table with 2 columns: ERRORID & ERRORTEXT
+        /// ErrorID of -1 is A OK (successful operation); anything else is bad.</returns>
+        public DataTable MassSlotDelete(string sResourceID, DateTime BeginDate, DateTime EndDate)
+        {
+            string sBegin = FMDateTime.Create(BeginDate).DateOnly.FMDateString;
+            string sEnd = FMDateTime.Create(EndDate).DateOnly.FMDateString;
+            string cmd = String.Format("BSDX CANCEL AV BY DATE^{0}^{1}^{2}", sResourceID, sBegin, sEnd);
+            return RPMSDataTable(cmd, "Cancelled");
+        }
+
+        /// <summary>
+        /// Remove the check-in for the appointment
+        /// </summary>
+        /// <param name="ApptID">Appointment IEN/Key</param>
+        /// <returns>Table with 1 columns: ERRORID. ErrorID of "0" is okay; 
+        /// any other (negative numbers plus text) is bad</returns>
+        public DataTable RemoveCheckIn(int ApptID)
+        {
+            string cmd = string.Format("BSDX REMOVE CHECK-IN^{0}", ApptID);
+            return RPMSDataTable(cmd, "");
+        }
+
+        /// <summary>
+        /// Save User Preference in DB For Printing Routing Slip
+        /// Uses Parameter BSDX AUTO PRINT RS
+        /// </summary>
+        /// <remarks>
+        /// Notice Code-Fu for Async Save...
+        /// </remarks>
+        public bool AutoPrintRoutingSlip
+        {
+            get
+            {
+                string val = _thisConnection.bmxNetLib.TransmitRPC("BSDX GET PARAM", "BSDX AUTO PRINT RS");  //1 = true; 0 = false; "" = not set
+                return val == "1" ? true : false;
+            }
+            set
+            {
+                TransmitRPCAsync _asyncTransmitter = new TransmitRPCAsync(_thisConnection.bmxNetLib.TransmitRPC);
+                // 0 = success; anything else is wrong. Not being tested here as its success is not critical to application use.
+                _asyncTransmitter.BeginInvoke("BSDX SET PARAM", String.Format("{0}^{1}", "BSDX AUTO PRINT RS", value ? "1" : "0"), null, null);
+            }
+        }
+
+        /// <summary>
+        /// Save User Preference in DB For Printing Routing Slip
+        /// Uses Parameter BSDX AUTO PRINT AS
+        /// </summary>
+        /// <remarks>
+        /// Notice Code-Fu for Async Save...
+        /// </remarks>
+        public bool AutoPrintAppointmentSlip
+        {
+            get
+            {
+                string val = _thisConnection.bmxNetLib.TransmitRPC("BSDX GET PARAM", "BSDX AUTO PRINT AS");  //1 = true; 0 = false; "" = not set
+                return val == "1" ? true : false;
+            }
+            set
+            {
+                TransmitRPCAsync _asyncTransmitter = new TransmitRPCAsync(_thisConnection.bmxNetLib.TransmitRPC);
+                // 0 = success; anything else is wrong. Not being tested here as its success is not critical to application use.
+                _asyncTransmitter.BeginInvoke("BSDX SET PARAM", String.Format("{0}^{1}", "BSDX AUTO PRINT AS", value ? "1" : "0"), null, null);
+            }
+        }
+
+
+
+        /// <summary>
+        /// Workhorse
+        /// </summary>
+        /// <param name="sSQL"></param>
+        /// <param name="sTableName"></param>
+        /// <returns></returns>
+        private DataTable RPMSDataTable(string sSQL, string sTableName)
+        {
+            //Retrieves a recordset from RPMS
+            string sErrorMessage = "";
+            DataTable dtOut;
+
+#if TRACE
+            DateTime sendTime = DateTime.Now;
+#endif
+            try
+            {
+                RPMSDataTableDelegate rdtd = new RPMSDataTableDelegate(_thisConnection.RPMSDataTable);
+                dtOut = (DataTable)rdtd.Invoke(sSQL, sTableName);
+            }
+
+            catch (Exception ex)
+            {
+                sErrorMessage = "DAL.RPMSDataTable error: " + ex.Message;
+                throw ex;
+            }
+
+#if TRACE
+            DateTime receiveTime = DateTime.Now;
+            TimeSpan executionTime = receiveTime - sendTime;
+            Debug.Write("RPMSDataTable Execution Time: " + executionTime.Milliseconds + " ms.\n");
+#endif
+
+            return dtOut;
+
+        }
+    }
+}
+    
+
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessBlock.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessBlock.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessBlock.cs	(revision 1134)
@@ -0,0 +1,421 @@
+﻿namespace IndianHealthService.ClinicalScheduling
+{
+    using System;
+    using System.ComponentModel;
+    using System.Data;
+    using System.Drawing;
+    using System.Windows.Forms;
+    using System.Xml;
+    /// <summary>
+    /// This class was regenerated from Calendargrid.dll using Reflector.exe
+    /// by Sam Habiel for WorldVista. The original source code is lost.
+    /// </summary>
+    public class DAccessBlock : Form
+    {
+        private ComboBox cboAccessTypeFilter;
+        private Button cmdCancel;
+        private Button cmdOK;
+        private Container components;
+        private Label label1;
+        private Label label15;
+        private Label label2;
+        private Label label3;
+        private Label label4;
+        private Label label6;
+        private Label label7;
+        private Label lblClinic;
+        private Label lblEndTime;
+        private Label lblStartTime;
+        private ListBox lstAccessTypes;
+        private DataSet m_dsGlobal;
+        private DataTable m_dtTypes;
+        private DataView m_dvTypes;
+        private CGAppointment m_pAppt;
+        private NumericUpDown nudSlots;
+        private Panel panel1;
+        private Panel panel2;
+        private TextBox txtNote;
+
+        public DAccessBlock()
+        {
+            this.InitializeComponent();
+        }
+
+        private void cboAccessTypeFilter_SelectionChangeCommitted(object sender, EventArgs e)
+        {
+            if (this.cboAccessTypeFilter.Text == "<Show All Access Types>")
+            {
+                this.LoadListBox("ALL");
+            }
+            else
+            {
+                this.LoadListBox("SELECTED");
+            }
+        }
+
+        private void cmdOK_Click(object sender, EventArgs e)
+        {
+            this.UpdateDialogData(false);
+        }
+
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (this.components != null))
+            {
+                this.components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        private void InitializeComponent()
+        {
+            this.panel1 = new Panel();
+            this.cmdCancel = new Button();
+            this.cmdOK = new Button();
+            this.panel2 = new Panel();
+            this.label4 = new Label();
+            this.cboAccessTypeFilter = new ComboBox();
+            this.lstAccessTypes = new ListBox();
+            this.nudSlots = new NumericUpDown();
+            this.label6 = new Label();
+            this.lblEndTime = new Label();
+            this.label7 = new Label();
+            this.label2 = new Label();
+            this.lblClinic = new Label();
+            this.label15 = new Label();
+            this.txtNote = new TextBox();
+            this.label1 = new Label();
+            this.lblStartTime = new Label();
+            this.label3 = new Label();
+            this.panel1.SuspendLayout();
+            this.panel2.SuspendLayout();
+            this.nudSlots.BeginInit();
+            base.SuspendLayout();
+            this.panel1.Controls.Add(this.cmdCancel);
+            this.panel1.Controls.Add(this.cmdOK);
+            this.panel1.Dock = DockStyle.Bottom;
+            this.panel1.Location = new Point(0, 0x14e);
+            this.panel1.Name = "panel1";
+            this.panel1.Size = new Size(0x192, 40);
+            this.panel1.TabIndex = 2;
+            this.cmdCancel.Location = new Point(0x120, 8);
+            this.cmdCancel.Name = "cmdCancel";
+            this.cmdCancel.Size = new Size(0x40, 0x18);
+            this.cmdCancel.TabIndex = 1;
+            this.cmdCancel.Text = "Cancel";
+
+            this.cmdOK.Location = new Point(0xd0, 8);
+            this.cmdOK.Name = "cmdOK";
+            this.cmdOK.Size = new Size(0x40, 0x18);
+            this.cmdOK.TabIndex = 0;
+            this.cmdOK.Text = "OK";
+            this.cmdOK.Click += new EventHandler(this.cmdOK_Click);
+            this.panel2.Controls.Add(this.label4);
+            this.panel2.Controls.Add(this.cboAccessTypeFilter);
+            this.panel2.Controls.Add(this.lstAccessTypes);
+            this.panel2.Controls.Add(this.nudSlots);
+            this.panel2.Controls.Add(this.label6);
+            this.panel2.Controls.Add(this.lblEndTime);
+            this.panel2.Controls.Add(this.label7);
+            this.panel2.Controls.Add(this.label2);
+            this.panel2.Controls.Add(this.lblClinic);
+            this.panel2.Controls.Add(this.label15);
+            this.panel2.Controls.Add(this.txtNote);
+            this.panel2.Controls.Add(this.label1);
+            this.panel2.Controls.Add(this.lblStartTime);
+            this.panel2.Controls.Add(this.label3);
+            this.panel2.Dock = DockStyle.Fill;
+            this.panel2.Location = new Point(0, 0);
+            this.panel2.Name = "panel2";
+            this.panel2.Size = new Size(0x192, 0x14e);
+            this.panel2.TabIndex = 3;
+            this.label4.Location = new Point(8, 0x88);
+            this.label4.Name = "label4";
+            this.label4.Size = new Size(80, 0x10);
+            this.label4.TabIndex = 0x29;
+            this.label4.Text = "Access Group:";
+            this.label4.TextAlign = ContentAlignment.MiddleRight;
+            this.cboAccessTypeFilter.DropDownStyle = ComboBoxStyle.DropDownList;
+            this.cboAccessTypeFilter.Location = new Point(0x58, 0x88);
+            this.cboAccessTypeFilter.Name = "cboAccessTypeFilter";
+            this.cboAccessTypeFilter.Size = new Size(0x128, 0x15);
+            this.cboAccessTypeFilter.TabIndex = 40;
+            this.cboAccessTypeFilter.SelectionChangeCommitted += new EventHandler(this.cboAccessTypeFilter_SelectionChangeCommitted);
+            this.lstAccessTypes.Location = new Point(0x58, 0xb0);
+            this.lstAccessTypes.Name = "lstAccessTypes";
+            this.lstAccessTypes.Size = new Size(0x128, 0x52);
+            this.lstAccessTypes.TabIndex = 0x26;
+            this.nudSlots.Location = new Point(0x58, 0x38);
+            int[] bits = new int[4];
+            bits[0] = 0x3e6;
+            this.nudSlots.Maximum = new decimal(bits);
+            this.nudSlots.Name = "nudSlots";
+            this.nudSlots.Size = new Size(40, 20);
+            this.nudSlots.TabIndex = 0x25;
+            int[] numArray2 = new int[4];
+            numArray2[0] = 1;
+            this.nudSlots.Value = new decimal(numArray2);
+            this.label6.Location = new Point(40, 0x38);
+            this.label6.Name = "label6";
+            this.label6.Size = new Size(40, 0x10);
+            this.label6.TabIndex = 0x24;
+            this.label6.Text = "Slots:";
+            this.label6.TextAlign = ContentAlignment.MiddleRight;
+            this.lblEndTime.BorderStyle = BorderStyle.Fixed3D;
+            this.lblEndTime.Location = new Point(0x110, 8);
+            this.lblEndTime.Name = "lblEndTime";
+            this.lblEndTime.Size = new Size(0x70, 0x10);
+            this.lblEndTime.TabIndex = 0x22;
+            this.label7.Location = new Point(0xd0, 8);
+            this.label7.Name = "label7";
+            this.label7.Size = new Size(0x40, 0x10);
+            this.label7.TabIndex = 0x21;
+            this.label7.Text = "End Time:";
+            this.label7.TextAlign = ContentAlignment.MiddleRight;
+            this.label2.Location = new Point(0x10, 0xb0);
+            this.label2.Name = "label2";
+            this.label2.Size = new Size(0x48, 0x10);
+            this.label2.TabIndex = 0x1d;
+            this.label2.Text = "Access Type:";
+            this.label2.TextAlign = ContentAlignment.MiddleRight;
+            this.lblClinic.BorderStyle = BorderStyle.Fixed3D;
+            this.lblClinic.Location = new Point(0x58, 0x20);
+            this.lblClinic.Name = "lblClinic";
+            this.lblClinic.Size = new Size(0x128, 0x10);
+            this.lblClinic.TabIndex = 0x1b;
+            this.label15.Location = new Point(40, 0x20);
+            this.label15.Name = "label15";
+            this.label15.Size = new Size(40, 0x10);
+            this.label15.TabIndex = 0x1a;
+            this.label15.Text = "Clinic:";
+            this.label15.TextAlign = ContentAlignment.MiddleRight;
+            this.txtNote.AcceptsReturn = true;
+            this.txtNote.Location = new Point(0x58, 80);
+            this.txtNote.Multiline = true;
+            this.txtNote.Name = "txtNote";
+            this.txtNote.Size = new Size(0x128, 0x30);
+            this.txtNote.TabIndex = 0x19;
+            this.label1.Location = new Point(0x18, 0x58);
+            this.label1.Name = "label1";
+            this.label1.Size = new Size(0x38, 0x10);
+            this.label1.TabIndex = 0x18;
+            this.label1.Text = "Note:";
+            this.label1.TextAlign = ContentAlignment.MiddleRight;
+            this.lblStartTime.BorderStyle = BorderStyle.Fixed3D;
+            this.lblStartTime.Location = new Point(0x58, 8);
+            this.lblStartTime.Name = "lblStartTime";
+            this.lblStartTime.Size = new Size(120, 0x10);
+            this.lblStartTime.TabIndex = 0x16;
+            this.label3.Location = new Point(0x18, 8);
+            this.label3.Name = "label3";
+            this.label3.Size = new Size(0x40, 0x10);
+            this.label3.TabIndex = 20;
+            this.label3.Text = "Start Time:";
+            this.label3.TextAlign = ContentAlignment.MiddleRight;
+            base.AcceptButton = this.cmdOK;
+            this.AutoScaleBaseSize = new Size(5, 13);
+            base.CancelButton = this.cmdCancel;
+            base.ClientSize = new Size(0x192, 0x176);
+            base.Controls.Add(this.panel2);
+            base.Controls.Add(this.panel1);
+            base.FormBorderStyle = FormBorderStyle.FixedDialog;
+            base.Name = "DAccessBlock";
+            base.StartPosition = FormStartPosition.CenterParent;
+            this.Text = "Access Block";
+            this.panel1.ResumeLayout(false);
+            this.panel2.ResumeLayout(false);
+            this.panel2.PerformLayout();
+            this.nudSlots.EndInit();
+            base.ResumeLayout(false);
+        }
+
+        public void InitializePage(CGAppointment pAppt, DataSet dsGlobal)
+        {
+            this.m_pAppt = new CGAppointment();
+            this.m_pAppt.StartTime = pAppt.StartTime;
+            this.m_pAppt.EndTime = pAppt.EndTime;
+            this.m_pAppt.Resource = pAppt.Resource;
+            this.m_pAppt.Note = pAppt.Note;
+            this.m_pAppt.Slots = pAppt.Slots;
+            this.m_pAppt.AccessTypeID = pAppt.AccessTypeID;
+            this.m_pAppt.AccessTypeName = pAppt.AccessTypeName;
+            this.m_dsGlobal = dsGlobal;
+            this.LoadListBox("ALL");
+            DataTable table = dsGlobal.Tables["AccessGroup"];
+            DataSet set = new DataSet("dsTemp");
+            set.Tables.Add(table.Copy());
+            DataTable table2 = set.Tables["AccessGroup"];
+            DataView view = new DataView(table2);
+            view.AddNew()["ACCESS_GROUP"] = "<Show All Access Types>";
+            view.Sort = "ACCESS_GROUP ASC";
+            this.cboAccessTypeFilter.DataSource = view;
+            this.cboAccessTypeFilter.DisplayMember = "ACCESS_GROUP";
+            this.cboAccessTypeFilter.SelectedIndex = this.cboAccessTypeFilter.Items.Count - 1;
+            this.cmdCancel.DialogResult = DialogResult.Cancel;
+            this.cmdOK.DialogResult = DialogResult.OK;
+            this.UpdateDialogData(true);
+        }
+
+        public void InitializePage(DateTime dStart, DateTime dEnd, string sClinic, string sNote, DataSet dsGlobal)
+        {
+            this.m_pAppt = new CGAppointment();
+            this.m_pAppt.StartTime = dStart;
+            this.m_pAppt.EndTime = dEnd;
+            this.m_pAppt.Resource = sClinic;
+            this.m_pAppt.Note = sNote;
+            this.m_pAppt.Slots = 1;
+            this.m_dsGlobal = dsGlobal;
+            this.LoadListBox("ALL");
+            DataTable table = dsGlobal.Tables["AccessGroup"];
+            DataSet set = new DataSet("dsTemp");
+            set.Tables.Add(table.Copy());
+            DataTable table2 = set.Tables["AccessGroup"];
+            DataView view = new DataView(table2);
+            view.AddNew()["ACCESS_GROUP"] = "<Show All Access Types>";
+            view.Sort = "ACCESS_GROUP ASC";
+            this.cboAccessTypeFilter.DataSource = view;
+            this.cboAccessTypeFilter.DisplayMember = "ACCESS_GROUP";
+            this.cboAccessTypeFilter.SelectedIndex = this.cboAccessTypeFilter.Items.Count - 1;
+            this.m_pAppt.AccessTypeID = 0;
+            this.cmdCancel.DialogResult = DialogResult.Cancel;
+            this.cmdOK.DialogResult = DialogResult.OK;
+            this.UpdateDialogData(true);
+        }
+
+        public void LoadListBox(string sGroup)
+        {
+            string str = "";
+            if (sGroup == "ALL")
+            {
+                this.m_dtTypes = this.m_dsGlobal.Tables["AccessTypes"];
+                this.m_dvTypes = new DataView(this.m_dtTypes);
+                str = "INACTIVE <> 'YES'";
+                this.m_dvTypes.RowFilter = str;
+                this.lstAccessTypes.DataSource = this.m_dvTypes;
+                this.lstAccessTypes.DisplayMember = "ACCESS_TYPE_NAME";
+                this.lstAccessTypes.ValueMember = "BMXIEN";
+            }
+            else
+            {
+                this.m_dtTypes = this.m_dsGlobal.Tables["AccessGroupType"];
+                this.m_dvTypes = new DataView(this.m_dtTypes);
+                str = "ACCESS_GROUP = '" + this.cboAccessTypeFilter.Text + "'";
+                this.m_dvTypes.RowFilter = str;
+                this.lstAccessTypes.DataSource = this.m_dvTypes;
+                this.lstAccessTypes.DisplayMember = "ACCESS_TYPE";
+                this.lstAccessTypes.ValueMember = "ACCESS_TYPE_ID";
+            }
+        }
+
+        private void UpdateDialogData(bool b)
+        {
+            if (b)
+            {
+                this.lblClinic.Text = this.m_pAppt.Resource;
+                this.lblEndTime.Text = this.m_pAppt.EndTime.ToShortDateString() + " " + this.m_pAppt.EndTime.ToShortTimeString();
+                this.lblStartTime.Text = this.m_pAppt.StartTime.ToShortDateString() + " " + this.m_pAppt.StartTime.ToShortTimeString();
+                this.txtNote.Text = this.m_pAppt.Note;
+                this.nudSlots.Value = this.m_pAppt.Slots;
+                if (this.m_pAppt.AccessTypeID != 0)
+                {
+                    this.lstAccessTypes.SelectedValue = this.m_pAppt.AccessTypeID;
+                }
+            }
+            else
+            {
+                this.m_pAppt.Note = this.txtNote.Text;
+                int selectedIndex = this.lstAccessTypes.SelectedIndex;
+                string str = this.lstAccessTypes.SelectedValue.ToString();
+                str = (str == "") ? "-1" : str;
+                int num = Convert.ToInt16(str);
+                this.m_pAppt.AccessTypeID = num;
+                this.m_pAppt.Slots = Convert.ToInt16(this.nudSlots.Value);
+            }
+        }
+
+        public int AccessTypeID
+        {
+            get
+            {
+                return this.m_pAppt.AccessTypeID;
+            }
+            set
+            {
+                this.m_pAppt.AccessTypeID = value;
+            }
+        }
+
+        public CGAppointment Appointment
+        {
+            get
+            {
+                return this.m_pAppt;
+            }
+            set
+            {
+                this.m_pAppt = value;
+            }
+        }
+
+        public DateTime EndTime
+        {
+            get
+            {
+                return this.m_pAppt.EndTime;
+            }
+            set
+            {
+                this.m_pAppt.EndTime = value;
+            }
+        }
+
+        public string Note
+        {
+            get
+            {
+                return this.m_pAppt.Note;
+            }
+            set
+            {
+                this.m_pAppt.Note = value;
+            }
+        }
+
+        public string Resource
+        {
+            get
+            {
+                return this.m_pAppt.Resource;
+            }
+            set
+            {
+                this.m_pAppt.Resource = value;
+            }
+        }
+
+        public int Slots
+        {
+            get
+            {
+                return this.m_pAppt.Slots;
+            }
+            set
+            {
+                this.m_pAppt.Slots = value;
+            }
+        }
+
+        public DateTime StartTime
+        {
+            get
+            {
+                return this.m_pAppt.StartTime;
+            }
+            set
+            {
+                this.m_pAppt.StartTime = value;
+            }
+        }
+    }
+}
+
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessGroup.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessGroup.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessGroup.cs	(revision 1134)
@@ -0,0 +1,204 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+//using System.Data.OleDb;
+using IndianHealthService.BMXNet;
+using System.Diagnostics;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DAccessGroup.
+	/// </summary>
+	public class DAccessGroup : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Panel pnlPageBottom;
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.Button cmdOK;
+		private System.Windows.Forms.TextBox txtAccessGroupName;
+		private System.Windows.Forms.Label label1;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public DAccessGroup()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+			m_sAccessGroupName = "";
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.pnlPageBottom = new System.Windows.Forms.Panel();
+			this.cmdCancel = new System.Windows.Forms.Button();
+			this.cmdOK = new System.Windows.Forms.Button();
+			this.txtAccessGroupName = new System.Windows.Forms.TextBox();
+			this.label1 = new System.Windows.Forms.Label();
+			this.pnlPageBottom.SuspendLayout();
+			this.SuspendLayout();
+			// 
+			// pnlPageBottom
+			// 
+			this.pnlPageBottom.Controls.Add(this.cmdCancel);
+			this.pnlPageBottom.Controls.Add(this.cmdOK);
+			this.pnlPageBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.pnlPageBottom.Location = new System.Drawing.Point(0, 158);
+			this.pnlPageBottom.Name = "pnlPageBottom";
+			this.pnlPageBottom.Size = new System.Drawing.Size(496, 40);
+			this.pnlPageBottom.TabIndex = 7;
+			// 
+			// cmdCancel
+			// 
+			this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.cmdCancel.Location = new System.Drawing.Point(376, 8);
+			this.cmdCancel.Name = "cmdCancel";
+			this.cmdCancel.Size = new System.Drawing.Size(56, 24);
+			this.cmdCancel.TabIndex = 2;
+			this.cmdCancel.Text = "Cancel";
+			// 
+			// cmdOK
+			// 
+			this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+			this.cmdOK.Enabled = false;
+			this.cmdOK.Location = new System.Drawing.Point(296, 8);
+			this.cmdOK.Name = "cmdOK";
+			this.cmdOK.Size = new System.Drawing.Size(64, 24);
+			this.cmdOK.TabIndex = 1;
+			this.cmdOK.Text = "OK";
+			this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
+			// 
+			// txtAccessGroupName
+			// 
+			this.txtAccessGroupName.Location = new System.Drawing.Point(184, 72);
+			this.txtAccessGroupName.Name = "txtAccessGroupName";
+			this.txtAccessGroupName.Size = new System.Drawing.Size(256, 20);
+			this.txtAccessGroupName.TabIndex = 0;
+			this.txtAccessGroupName.Text = "";
+			this.txtAccessGroupName.TextChanged += new System.EventHandler(this.txtAccessGroupName_TextChanged);
+			// 
+			// label1
+			// 
+			this.label1.Location = new System.Drawing.Point(48, 72);
+			this.label1.Name = "label1";
+			this.label1.Size = new System.Drawing.Size(136, 16);
+			this.label1.TabIndex = 9;
+			this.label1.Text = "Access Group Name:";
+			// 
+			// DAccessGroup
+			// 
+			this.AcceptButton = this.cmdOK;
+			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+			this.ClientSize = new System.Drawing.Size(496, 198);
+			this.Controls.Add(this.txtAccessGroupName);
+			this.Controls.Add(this.label1);
+			this.Controls.Add(this.pnlPageBottom);
+			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+			this.Name = "DAccessGroup";
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "Access Group";
+			this.pnlPageBottom.ResumeLayout(false);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		private string	m_sAccessGroupName;
+
+		public void InitializePage(int nSelectedRGID, DataSet dsGlobal)
+		{
+
+			if (nSelectedRGID < 0) //then we're in ADD mode
+			{
+				this.Text = "Add New Access Group";
+				this.cmdOK.Enabled = false;
+			}
+			else //we're in EDIT mode
+			{
+				this.Text = "Edit Access Group";
+			}
+			UpdateDialogData(true);
+		}
+
+
+		/// <summary>
+		/// If b is true, moves member vars into control data
+		/// otherwise, moves control data into member vars
+		/// </summary>
+		/// <param name="b"></param>
+		private void UpdateDialogData(bool b)
+		{
+			if (b == true)
+			{
+				txtAccessGroupName.Text = m_sAccessGroupName;
+			}
+			else
+			{
+				m_sAccessGroupName = txtAccessGroupName.Text;
+			}
+		}
+
+		private void txtAccessGroupName_TextChanged(object sender, System.EventArgs e)
+		{
+			string sText = txtAccessGroupName.Text;
+			if ((sText.Length > 2) && (sText.Length < 30))
+			{
+				cmdOK.Enabled = true;
+			}
+			else
+			{
+				cmdOK.Enabled = false;
+			}		
+		}
+
+		private void cmdOK_Click(object sender, System.EventArgs e)
+		{
+			UpdateDialogData(false);
+		}
+
+		/// <summary>
+		/// Gets the name of the Access Group;
+		/// </summary>
+		public string AccessGroupName
+		{
+			get
+			{
+				return m_sAccessGroupName;
+			}
+			set
+			{
+				m_sAccessGroupName = value;
+			}
+		}
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessGroup.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessGroup.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessGroup.resx	(revision 1134)
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="pnlPageBottom.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="pnlPageBottom.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="pnlPageBottom.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="pnlPageBottom.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="pnlPageBottom.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="pnlPageBottom.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdCancel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdCancel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdCancel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdOK.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtAccessGroupName.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtAccessGroupName.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="txtAccessGroupName.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.Name">
+    <value>DAccessGroup</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessGroupItem.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessGroupItem.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessGroupItem.cs	(revision 1134)
@@ -0,0 +1,214 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+//using System.Data.OleDb;
+using IndianHealthService.BMXNet;
+using System.Diagnostics;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DAccessGroupItem.
+	/// </summary>
+	public class DAccessGroupItem : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Panel pnlPageBottom;
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.Button cmdOK;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.ComboBox cboAccessType;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public DAccessGroupItem()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.pnlPageBottom = new System.Windows.Forms.Panel();
+            this.cmdCancel = new System.Windows.Forms.Button();
+            this.cmdOK = new System.Windows.Forms.Button();
+            this.label1 = new System.Windows.Forms.Label();
+            this.cboAccessType = new System.Windows.Forms.ComboBox();
+            this.pnlPageBottom.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // pnlPageBottom
+            // 
+            this.pnlPageBottom.Controls.Add(this.cmdCancel);
+            this.pnlPageBottom.Controls.Add(this.cmdOK);
+            this.pnlPageBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlPageBottom.Location = new System.Drawing.Point(0, 112);
+            this.pnlPageBottom.Name = "pnlPageBottom";
+            this.pnlPageBottom.Size = new System.Drawing.Size(472, 40);
+            this.pnlPageBottom.TabIndex = 6;
+            // 
+            // cmdCancel
+            // 
+            this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.cmdCancel.Location = new System.Drawing.Point(376, 8);
+            this.cmdCancel.Name = "cmdCancel";
+            this.cmdCancel.Size = new System.Drawing.Size(56, 24);
+            this.cmdCancel.TabIndex = 2;
+            this.cmdCancel.Text = "Cancel";
+            // 
+            // cmdOK
+            // 
+            this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.cmdOK.Location = new System.Drawing.Point(296, 8);
+            this.cmdOK.Name = "cmdOK";
+            this.cmdOK.Size = new System.Drawing.Size(64, 24);
+            this.cmdOK.TabIndex = 1;
+            this.cmdOK.Text = "OK";
+            this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(24, 40);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(120, 16);
+            this.label1.TabIndex = 10;
+            this.label1.Text = "Select Access Type:";
+            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // cboAccessType
+            // 
+            this.cboAccessType.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+            this.cboAccessType.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+            this.cboAccessType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cboAccessType.Location = new System.Drawing.Point(152, 40);
+            this.cboAccessType.Name = "cboAccessType";
+            this.cboAccessType.Size = new System.Drawing.Size(248, 21);
+            this.cboAccessType.TabIndex = 9;
+            // 
+            // DAccessGroupItem
+            // 
+            this.AcceptButton = this.cmdOK;
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.CancelButton = this.cmdCancel;
+            this.ClientSize = new System.Drawing.Size(472, 152);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.cboAccessType);
+            this.Controls.Add(this.pnlPageBottom);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.Name = "DAccessGroupItem";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "DAccessGroupItem";
+            this.pnlPageBottom.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		#region Fields
+		int		m_nAccessTypeID;
+		string	m_sAccessTypeName;
+		#endregion Fields
+
+
+		public void InitializePage(int nSelectedATID, DataSet dsGlobal)
+		{
+
+			//Datasource the ACCESS GROUP combo box
+			DataTable dtAccessType = dsGlobal.Tables["AccessTypes"];
+			DataView dvAccessType = new DataView(dtAccessType);
+            dvAccessType.Sort = "ACCESS_TYPE_NAME ASC";
+
+
+			cboAccessType.DataSource = dvAccessType;
+			cboAccessType.DisplayMember = "ACCESS_TYPE_NAME";
+			cboAccessType.ValueMember = "BMXIEN";
+
+			Debug.Assert(nSelectedATID == -1); //We're always in ADD mode
+
+			this.Text = "Add New Access Type to Group";
+			m_nAccessTypeID = 0;
+			m_sAccessTypeName = "";
+			UpdateDialogData(true);
+		}
+
+		/// <summary>
+		/// If b is true, moves member vars into control data
+		/// otherwise, moves control data into member vars
+		/// </summary>
+		/// <param name="b"></param>
+		private void UpdateDialogData(bool b)
+		{
+			if (b == true)
+			{
+				cboAccessType.SelectedValue = m_nAccessTypeID;
+			}
+			else
+			{
+				m_nAccessTypeID = Convert.ToInt16(cboAccessType.SelectedValue);
+				m_sAccessTypeName = cboAccessType.DisplayMember;
+			}
+		}
+
+		private void cmdOK_Click(object sender, System.EventArgs e)
+		{
+			UpdateDialogData(false);		
+		}
+
+		#region Properties
+
+		/// <summary>
+		/// Contains the IEN of the AccessType in the BSDX_ACCESS_TYPE file
+		/// </summary>
+		public int AccessTypeID
+		{
+			get
+			{
+				return m_nAccessTypeID;
+			}
+		}
+
+		/// <summary>
+		/// Contains the name of the AccessType
+		/// </summary>
+		public string AccessTypeName
+		{
+			get
+			{
+				return m_sAccessTypeName;
+			}
+		}
+		#endregion Properties
+
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessGroupItem.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessGroupItem.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessGroupItem.resx	(revision 1134)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessTemplate.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessTemplate.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessTemplate.cs	(revision 1134)
@@ -0,0 +1,387 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DAccessTemplate.
+	/// </summary>
+	public class DAccessTemplate : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Panel pnlPageBottom;
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.Button cmdOK;
+		private System.Windows.Forms.Panel pnlDescription;
+		private System.Windows.Forms.GroupBox grpDescriptionResourceGroup;
+		private System.Windows.Forms.Label lblDescriptionResourceGroup;
+		private System.Windows.Forms.Button cmdSelectTemplate;
+		private System.Windows.Forms.TextBox txtTemplate;
+		private System.Windows.Forms.DateTimePicker dtpStartDate;
+		private System.Windows.Forms.NumericUpDown udWeeksToApply;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.Label label2;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+
+		#region Methods
+
+		public void InitializePage()
+		{
+
+			UpdateDialogData(true);
+            //this.cmdSelectTemplate.Focus(); // Focus on first button on form
+		}
+
+		/// <summary>
+		/// If b is true, moves member vars into control data
+		/// otherwise, moves control data into member vars
+		/// </summary>
+		/// <param name="b"></param>
+		private void UpdateDialogData(bool b)
+		{
+			if (b == true)
+			{
+				udWeeksToApply.Value = 1;
+			}
+			else
+			{
+				//
+				m_nWeeksToApply = (int) udWeeksToApply.Value;
+				m_dtStart = dtpStartDate.Value;
+			}
+		}
+
+		public DAccessTemplate()
+		{
+			InitializeComponent();
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		private void cmdOK_Click(object sender, System.EventArgs e)
+		{
+            DateTime dtStart = dtpStartDate.Value;
+			if 	(dtStart < DateTime.Today)
+			{
+				MessageBox.Show("Please select a future day.");
+				m_bCancelOK = true;
+				return;
+			}
+
+			if (m_bSelectedFile == false)
+			{
+				MessageBox.Show("Please select a valid template file.");
+				m_bCancelOK = true;
+				return;
+			}
+
+			if ((this.udWeeksToApply.Value > 52)||(this.udWeeksToApply.Value < 1))
+			{
+				MessageBox.Show("For the number of weeks to apply the template, please select a number between 1 and 52.");
+				m_bCancelOK = true;
+				return;
+			}
+			m_bCancelOK = false;
+
+			//Send the values from the controls to the fields
+			this.UpdateDialogData(false);
+
+		}
+		
+		private void cmdSelectTemplate_Click(object sender, System.EventArgs e)
+		{
+			//Open the file dialog and pick a file
+			m_bSelectedFile = false;
+			OpenFileDialog openFileDialog1 = new OpenFileDialog();
+			openFileDialog1.Filter = "Schedule Template Files (*.bsdxa)|*.bsdxa|All files (*.*)|*.*" ;
+			openFileDialog1.FilterIndex = 0 ;
+			openFileDialog1.RestoreDirectory = true ;
+
+			if(openFileDialog1.ShowDialog() == DialogResult.OK)
+			{
+				m_bSelectedFile = true;
+				m_ofDialog = openFileDialog1;
+				this.txtTemplate.Text = openFileDialog1.FileName;
+
+			}
+		}		
+
+
+		#endregion Methods
+
+		#region Fields
+		private OpenFileDialog	m_ofDialog;
+		private DateTime		m_dtStart;
+		private int				m_nWeeksToApply;
+		private bool			m_bCancelOK = false;
+		private bool			m_bSelectedFile = false;
+
+		#endregion Fields
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.pnlPageBottom = new System.Windows.Forms.Panel();
+            this.cmdCancel = new System.Windows.Forms.Button();
+            this.cmdOK = new System.Windows.Forms.Button();
+            this.pnlDescription = new System.Windows.Forms.Panel();
+            this.grpDescriptionResourceGroup = new System.Windows.Forms.GroupBox();
+            this.lblDescriptionResourceGroup = new System.Windows.Forms.Label();
+            this.cmdSelectTemplate = new System.Windows.Forms.Button();
+            this.txtTemplate = new System.Windows.Forms.TextBox();
+            this.dtpStartDate = new System.Windows.Forms.DateTimePicker();
+            this.udWeeksToApply = new System.Windows.Forms.NumericUpDown();
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.pnlPageBottom.SuspendLayout();
+            this.pnlDescription.SuspendLayout();
+            this.grpDescriptionResourceGroup.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.udWeeksToApply)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // pnlPageBottom
+            // 
+            this.pnlPageBottom.Controls.Add(this.cmdCancel);
+            this.pnlPageBottom.Controls.Add(this.cmdOK);
+            this.pnlPageBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlPageBottom.Location = new System.Drawing.Point(0, 264);
+            this.pnlPageBottom.Name = "pnlPageBottom";
+            this.pnlPageBottom.Size = new System.Drawing.Size(440, 40);
+            this.pnlPageBottom.TabIndex = 7;
+            // 
+            // cmdCancel
+            // 
+            this.cmdCancel.CausesValidation = false;
+            this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.cmdCancel.Location = new System.Drawing.Point(360, 8);
+            this.cmdCancel.Name = "cmdCancel";
+            this.cmdCancel.Size = new System.Drawing.Size(56, 24);
+            this.cmdCancel.TabIndex = 5;
+            this.cmdCancel.Text = "Cancel";
+            // 
+            // cmdOK
+            // 
+            this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.cmdOK.Location = new System.Drawing.Point(280, 8);
+            this.cmdOK.Name = "cmdOK";
+            this.cmdOK.Size = new System.Drawing.Size(64, 24);
+            this.cmdOK.TabIndex = 4;
+            this.cmdOK.Text = "OK";
+            this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
+            // 
+            // pnlDescription
+            // 
+            this.pnlDescription.Controls.Add(this.grpDescriptionResourceGroup);
+            this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlDescription.Location = new System.Drawing.Point(0, 184);
+            this.pnlDescription.Name = "pnlDescription";
+            this.pnlDescription.Size = new System.Drawing.Size(440, 80);
+            this.pnlDescription.TabIndex = 8;
+            // 
+            // grpDescriptionResourceGroup
+            // 
+            this.grpDescriptionResourceGroup.Controls.Add(this.lblDescriptionResourceGroup);
+            this.grpDescriptionResourceGroup.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grpDescriptionResourceGroup.Location = new System.Drawing.Point(0, 0);
+            this.grpDescriptionResourceGroup.Name = "grpDescriptionResourceGroup";
+            this.grpDescriptionResourceGroup.Size = new System.Drawing.Size(440, 80);
+            this.grpDescriptionResourceGroup.TabIndex = 1;
+            this.grpDescriptionResourceGroup.TabStop = false;
+            this.grpDescriptionResourceGroup.Text = "Description";
+            // 
+            // lblDescriptionResourceGroup
+            // 
+            this.lblDescriptionResourceGroup.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lblDescriptionResourceGroup.Location = new System.Drawing.Point(3, 16);
+            this.lblDescriptionResourceGroup.Name = "lblDescriptionResourceGroup";
+            this.lblDescriptionResourceGroup.Size = new System.Drawing.Size(434, 61);
+            this.lblDescriptionResourceGroup.TabIndex = 0;
+            this.lblDescriptionResourceGroup.Text = "Use this panel to define an access pattern for future clinic availability.\r\nMAKE " +
+                "SURE TO SELECT 5 or 7 day view first depending on which view you used to save th" +
+                "e selected Access Template.";
+            // 
+            // cmdSelectTemplate
+            // 
+            this.cmdSelectTemplate.Location = new System.Drawing.Point(24, 40);
+            this.cmdSelectTemplate.Name = "cmdSelectTemplate";
+            this.cmdSelectTemplate.Size = new System.Drawing.Size(136, 32);
+            this.cmdSelectTemplate.TabIndex = 1;
+            this.cmdSelectTemplate.Text = "Select Access Template";
+            this.cmdSelectTemplate.Click += new System.EventHandler(this.cmdSelectTemplate_Click);
+            // 
+            // txtTemplate
+            // 
+            this.txtTemplate.Location = new System.Drawing.Point(176, 32);
+            this.txtTemplate.Multiline = true;
+            this.txtTemplate.Name = "txtTemplate";
+            this.txtTemplate.ReadOnly = true;
+            this.txtTemplate.Size = new System.Drawing.Size(248, 48);
+            this.txtTemplate.TabIndex = 10;
+            // 
+            // dtpStartDate
+            // 
+            this.dtpStartDate.AllowDrop = true;
+            this.dtpStartDate.Checked = false;
+            this.dtpStartDate.Location = new System.Drawing.Point(176, 104);
+            this.dtpStartDate.Name = "dtpStartDate";
+            this.dtpStartDate.Size = new System.Drawing.Size(184, 20);
+            this.dtpStartDate.TabIndex = 2;
+            // 
+            // udWeeksToApply
+            // 
+            this.udWeeksToApply.Location = new System.Drawing.Point(176, 144);
+            this.udWeeksToApply.Maximum = new decimal(new int[] {
+            52,
+            0,
+            0,
+            0});
+            this.udWeeksToApply.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+            this.udWeeksToApply.Name = "udWeeksToApply";
+            this.udWeeksToApply.Size = new System.Drawing.Size(96, 20);
+            this.udWeeksToApply.TabIndex = 3;
+            this.udWeeksToApply.Value = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(16, 104);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(152, 16);
+            this.label1.TabIndex = 13;
+            this.label1.Text = "Starting Week:";
+            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(16, 144);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(152, 16);
+            this.label2.TabIndex = 13;
+            this.label2.Text = "Number of Weeks to Apply:";
+            this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // DAccessTemplate
+            // 
+            this.AcceptButton = this.cmdOK;
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.CancelButton = this.cmdCancel;
+            this.ClientSize = new System.Drawing.Size(440, 304);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.udWeeksToApply);
+            this.Controls.Add(this.dtpStartDate);
+            this.Controls.Add(this.txtTemplate);
+            this.Controls.Add(this.cmdSelectTemplate);
+            this.Controls.Add(this.pnlDescription);
+            this.Controls.Add(this.pnlPageBottom);
+            this.Controls.Add(this.label2);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.Name = "DAccessTemplate";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Apply Access Template";
+            this.Closing += new System.ComponentModel.CancelEventHandler(this.DAccessTemplate_Closing);
+            this.pnlPageBottom.ResumeLayout(false);
+            this.pnlDescription.ResumeLayout(false);
+            this.grpDescriptionResourceGroup.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.udWeeksToApply)).EndInit();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+		}
+		#endregion
+
+
+		private void DAccessTemplate_Closing(object sender, System.ComponentModel.CancelEventArgs e)
+		{
+			if (m_bCancelOK == true)
+			{	
+				e.Cancel = true;
+				m_bCancelOK = false;
+			}
+			else
+			{
+				e.Cancel = false;
+			}
+		}
+
+
+		#region Properties
+
+
+		/// <summary>
+		/// Returns the open file dialog object
+		/// </summary>
+		public OpenFileDialog FileDialog
+		{
+			get
+			{
+				return m_ofDialog;
+			}
+		}
+
+		/// <summary>
+		/// Sets or returns the start date to apply the template
+		/// </summary>
+		public DateTime StartDate
+		{
+			get
+			{
+				return m_dtStart;
+			}
+			set
+			{
+				m_dtStart = value;
+			}
+		}
+
+		/// <summary>
+		/// Sets or returns the number of weeks to apply the template
+		/// </summary>
+		public int WeeksToApply
+		{
+			get
+			{
+				return m_nWeeksToApply;
+			}
+			set
+			{
+				m_nWeeksToApply = value;
+			}
+		}
+		#endregion Properties
+
+
+
+
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessTemplate.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessTemplate.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessTemplate.resx	(revision 1134)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessType.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessType.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessType.cs	(revision 1134)
@@ -0,0 +1,331 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+//using System.Data.OleDb;
+using IndianHealthService.BMXNet;
+using System.Diagnostics;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DAccessType.
+	/// </summary>
+	public class DAccessType : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Panel panel1;
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.Button cmdOK;
+		private System.Windows.Forms.Button cmdSelectColor;
+		private System.Windows.Forms.TextBox txtColor;
+		private System.Windows.Forms.CheckBox chkInactivate;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		private DataTable	m_dtTypes;
+		private string		m_sAccessIEN;
+		private string		m_sAccessName;
+		private string		m_sColor;
+		private int			m_nRed;
+		private int			m_nGreen;
+		private int			m_nBlue;
+		private bool		m_bInactive;
+		private System.Windows.Forms.TextBox txtAccessType;
+		private System.Windows.Forms.Label label1;
+
+		public DAccessType()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.panel1 = new System.Windows.Forms.Panel();
+			this.cmdCancel = new System.Windows.Forms.Button();
+			this.cmdOK = new System.Windows.Forms.Button();
+			this.cmdSelectColor = new System.Windows.Forms.Button();
+			this.txtColor = new System.Windows.Forms.TextBox();
+			this.chkInactivate = new System.Windows.Forms.CheckBox();
+			this.txtAccessType = new System.Windows.Forms.TextBox();
+			this.label1 = new System.Windows.Forms.Label();
+			this.panel1.SuspendLayout();
+			this.SuspendLayout();
+			// 
+			// panel1
+			// 
+			this.panel1.Controls.Add(this.cmdCancel);
+			this.panel1.Controls.Add(this.cmdOK);
+			this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.panel1.Location = new System.Drawing.Point(0, 144);
+			this.panel1.Name = "panel1";
+			this.panel1.Size = new System.Drawing.Size(370, 40);
+			this.panel1.TabIndex = 99;
+			// 
+			// cmdCancel
+			// 
+			this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.cmdCancel.Location = new System.Drawing.Point(288, 8);
+			this.cmdCancel.Name = "cmdCancel";
+			this.cmdCancel.Size = new System.Drawing.Size(64, 24);
+			this.cmdCancel.TabIndex = 4;
+			this.cmdCancel.Text = "Cancel";
+			this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click);
+			// 
+			// cmdOK
+			// 
+			this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+			this.cmdOK.Location = new System.Drawing.Point(208, 8);
+			this.cmdOK.Name = "cmdOK";
+			this.cmdOK.Size = new System.Drawing.Size(64, 24);
+			this.cmdOK.TabIndex = 3;
+			this.cmdOK.Text = "OK";
+			this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
+			// 
+			// cmdSelectColor
+			// 
+			this.cmdSelectColor.Location = new System.Drawing.Point(8, 48);
+			this.cmdSelectColor.Name = "cmdSelectColor";
+			this.cmdSelectColor.Size = new System.Drawing.Size(96, 32);
+			this.cmdSelectColor.TabIndex = 1;
+			this.cmdSelectColor.Text = "Select Display Color";
+			this.cmdSelectColor.Click += new System.EventHandler(this.cmdSelectColor_Click);
+			// 
+			// txtColor
+			// 
+			this.txtColor.BackColor = System.Drawing.SystemColors.Menu;
+			this.txtColor.BorderStyle = System.Windows.Forms.BorderStyle.None;
+			this.txtColor.ForeColor = System.Drawing.SystemColors.Window;
+			this.txtColor.Location = new System.Drawing.Point(128, 48);
+			this.txtColor.Multiline = true;
+			this.txtColor.Name = "txtColor";
+			this.txtColor.ReadOnly = true;
+			this.txtColor.Size = new System.Drawing.Size(144, 32);
+			this.txtColor.TabIndex = 31;
+			this.txtColor.TabStop = false;
+			this.txtColor.Text = "";
+			// 
+			// chkInactivate
+			// 
+			this.chkInactivate.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+			this.chkInactivate.Location = new System.Drawing.Point(56, 96);
+			this.chkInactivate.Name = "chkInactivate";
+			this.chkInactivate.Size = new System.Drawing.Size(88, 16);
+			this.chkInactivate.TabIndex = 2;
+			this.chkInactivate.Text = "Inactive:";
+			// 
+			// txtAccessType
+			// 
+			this.txtAccessType.Location = new System.Drawing.Point(128, 16);
+			this.txtAccessType.Name = "txtAccessType";
+			this.txtAccessType.Size = new System.Drawing.Size(144, 20);
+			this.txtAccessType.TabIndex = 0;
+			this.txtAccessType.Text = "";
+			// 
+			// label1
+			// 
+			this.label1.Location = new System.Drawing.Point(8, 16);
+			this.label1.Name = "label1";
+			this.label1.Size = new System.Drawing.Size(112, 16);
+			this.label1.TabIndex = 36;
+			this.label1.Text = "Access Type Name:";
+			this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+			// 
+			// DAccessType
+			// 
+			this.AcceptButton = this.cmdOK;
+			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+			this.CancelButton = this.cmdCancel;
+			this.ClientSize = new System.Drawing.Size(370, 184);
+			this.Controls.Add(this.label1);
+			this.Controls.Add(this.txtAccessType);
+			this.Controls.Add(this.chkInactivate);
+			this.Controls.Add(this.txtColor);
+			this.Controls.Add(this.cmdSelectColor);
+			this.Controls.Add(this.panel1);
+			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+			this.Name = "DAccessType";
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "Manage Access Types";
+			this.panel1.ResumeLayout(false);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		private void cmdSelectColor_Click(object sender, System.EventArgs e)
+		{
+			ColorDialog MyDialog = new ColorDialog();
+			// Keeps the user from selecting a custom color.
+			MyDialog.AllowFullOpen = true ;
+			// Allows the user to get help. (The default is false.)
+			MyDialog.ShowHelp = true ;
+			// Sets the initial color select to the current text color,
+			// so that if the user cancels out, the original color is restored.
+			MyDialog.Color = txtColor.BackColor ;
+			MyDialog.ShowDialog();
+			txtColor.BackColor =  MyDialog.Color;
+
+		}
+
+		public void InitializePage(int nRow, DataSet dsGlobal)
+		{
+
+			m_dtTypes = dsGlobal.Tables["AccessTypes"];
+
+			if (nRow < 0) //then we're in ADD mode
+			{
+				m_sAccessIEN = "";
+				m_sAccessName = "";
+				m_sColor = "Gray";
+				Color c = Color.FromKnownColor(KnownColor.AppWorkspace);
+				m_nRed = c.R;
+				m_nBlue = c.B;
+				m_nGreen = c.G;
+				m_bInactive = false;
+
+			}
+			else //we're in EDIT mode
+			{
+				string sTemp;
+				DataRow dr = m_dtTypes.Rows[nRow];
+				m_sAccessIEN = dr["BMXIEN"].ToString();
+				m_sAccessName = dr["ACCESS_TYPE_NAME"].ToString();
+				m_sColor = dr["DISPLAY_COLOR"].ToString();
+				sTemp = dr["RED"].ToString();
+				sTemp = (sTemp == "")?"0":sTemp;
+				m_nRed = Convert.ToInt16(sTemp);
+				sTemp = dr["GREEN"].ToString();
+				sTemp = (sTemp == "")?"0":sTemp;
+				m_nGreen = Convert.ToInt16(sTemp);
+				sTemp = dr["BLUE"].ToString();
+				sTemp = (sTemp == "")?"0":sTemp;
+				m_nBlue = Convert.ToInt16(sTemp);
+				string sInactive = dr["INACTIVE"].ToString();
+				m_bInactive = (sInactive == "YES")?true:false;
+			}
+			UpdateDialogData(true);
+
+		}
+	
+		/// <summary>
+		/// If b is true, moves member vars into control data
+		/// otherwise, moves control data into member vars
+		/// </summary>
+		/// <param name="b"></param>
+		private void UpdateDialogData(bool b)
+		{
+			if (b == true)
+			{
+				txtAccessType.Text = m_sAccessName;
+				this.chkInactivate.Checked = m_bInactive;
+				this.txtColor.BackColor = Color.FromArgb(m_nRed, m_nGreen, m_nBlue);
+			}
+			else
+			{
+				m_sAccessName = txtAccessType.Text;
+				m_bInactive = this.chkInactivate.Checked;
+				m_nRed = this.txtColor.BackColor.R;
+				m_nGreen = this.txtColor.BackColor.G;
+				m_nBlue = this.txtColor.BackColor.B;
+			}
+		}
+
+		private void cmdOK_Click(object sender, System.EventArgs e)
+		{
+			this.UpdateDialogData(false);
+		}
+
+		private void cmdCancel_Click(object sender, System.EventArgs e)
+		{
+		
+		}
+
+		public string AccessIEN
+		{
+			get
+			{
+				return m_sAccessIEN;
+			}
+		}
+
+		public string AccessTypeName
+		{
+			get
+			{
+				return m_sAccessName;
+			}
+		}
+
+		public string DisplayColor
+		{
+			get
+			{
+				return m_sColor;
+			}
+		}
+
+		public bool Inactive
+		{
+			get
+			{
+				return m_bInactive;
+			}
+		}
+
+		public int Red
+		{
+			get
+			{
+				return m_nRed;
+			}
+		}
+
+		public int Green
+		{
+			get
+			{
+				return m_nGreen;
+			}
+		}
+
+		public int Blue
+		{
+			get
+			{
+				return m_nBlue;
+			}
+		}
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessType.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessType.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAccessType.resx	(revision 1134)
@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="panel1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panel1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="panel1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panel1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panel1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="panel1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdCancel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdCancel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdCancel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdOK.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdSelectColor.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdSelectColor.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdSelectColor.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtColor.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtColor.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="txtColor.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="chkInactivate.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="chkInactivate.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="chkInactivate.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtAccessType.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtAccessType.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="txtAccessType.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Name">
+    <value>DAccessType</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAppointPage.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAppointPage.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAppointPage.cs	(revision 1134)
@@ -0,0 +1,880 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+//using System.Data.OleDb;
+using System.Diagnostics;
+using IndianHealthService.BMXNet;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Appointment Info Dialog
+	/// </summary>
+	public class DAppointPage : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.TabControl tabControl1;
+		private System.Windows.Forms.TabPage tabPatientInfo;
+		private System.Windows.Forms.TabPage tabAppointment;
+		private System.Windows.Forms.Panel panel1;
+		private System.Windows.Forms.Button cmdOK;
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.GroupBox groupBox2;
+		private System.Windows.Forms.TextBox txtCity;
+		private System.Windows.Forms.Label label8;
+		private System.Windows.Forms.Label label9;
+		private System.Windows.Forms.TextBox txtZip;
+		private System.Windows.Forms.Label label10;
+		private System.Windows.Forms.TextBox txtState;
+		private System.Windows.Forms.Label label11;
+		private System.Windows.Forms.TextBox txtStreet;
+		private System.Windows.Forms.Label label12;
+		private System.Windows.Forms.TextBox txtPhoneOffice;
+		private System.Windows.Forms.Label label13;
+		private System.Windows.Forms.TextBox txtPhoneHome;
+        private System.Windows.Forms.GroupBox groupBox1;
+		private System.Windows.Forms.Label label6;
+		private System.Windows.Forms.TextBox txtPID;
+		private System.Windows.Forms.Label label5;
+		private System.Windows.Forms.TextBox txtDOB;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.TextBox txtPatientName;
+		private System.Windows.Forms.GroupBox groupBox3;
+		private System.Windows.Forms.Label lblClinic;
+		private System.Windows.Forms.Label label15;
+		private System.Windows.Forms.TextBox txtNote;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.Label lblDuration;
+		private System.Windows.Forms.Label lblStartTime;
+		private System.Windows.Forms.Label label4;
+		private System.Windows.Forms.Label label3;
+		private System.Windows.Forms.Label label14;
+        private System.Windows.Forms.TextBox txtHRN;
+        private GroupBox groupBox4;
+        private BindingSource dsPatientApptDisplay2BindingSource;
+        private dsPatientApptDisplay2 dsPatientApptDisplay2;
+        private BindingSource patientApptsBindingSource;
+        private Label label17;
+        private TextBox txtEmail;
+        private Label label16;
+        private TextBox txtPhoneCell;
+        private Label label7;
+        private TextBox txtCountry;
+        private CheckBox chkPrint;
+        private Label label18;
+        private TextBox txtSex;
+        private IContainer components;
+
+		public DAppointPage()
+		{
+			InitializeComponent();
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.components = new System.ComponentModel.Container();
+            this.tabControl1 = new System.Windows.Forms.TabControl();
+            this.tabAppointment = new System.Windows.Forms.TabPage();
+            this.groupBox4 = new System.Windows.Forms.GroupBox();
+            this.groupBox3 = new System.Windows.Forms.GroupBox();
+            this.lblClinic = new System.Windows.Forms.Label();
+            this.label15 = new System.Windows.Forms.Label();
+            this.txtNote = new System.Windows.Forms.TextBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.lblDuration = new System.Windows.Forms.Label();
+            this.lblStartTime = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.txtSex = new System.Windows.Forms.TextBox();
+            this.label18 = new System.Windows.Forms.Label();
+            this.label14 = new System.Windows.Forms.Label();
+            this.txtHRN = new System.Windows.Forms.TextBox();
+            this.label6 = new System.Windows.Forms.Label();
+            this.txtPID = new System.Windows.Forms.TextBox();
+            this.label5 = new System.Windows.Forms.Label();
+            this.txtDOB = new System.Windows.Forms.TextBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.txtPatientName = new System.Windows.Forms.TextBox();
+            this.tabPatientInfo = new System.Windows.Forms.TabPage();
+            this.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.label17 = new System.Windows.Forms.Label();
+            this.txtEmail = new System.Windows.Forms.TextBox();
+            this.label16 = new System.Windows.Forms.Label();
+            this.txtPhoneCell = new System.Windows.Forms.TextBox();
+            this.label7 = new System.Windows.Forms.Label();
+            this.txtCountry = new System.Windows.Forms.TextBox();
+            this.label12 = new System.Windows.Forms.Label();
+            this.txtPhoneOffice = new System.Windows.Forms.TextBox();
+            this.label13 = new System.Windows.Forms.Label();
+            this.txtPhoneHome = new System.Windows.Forms.TextBox();
+            this.txtCity = new System.Windows.Forms.TextBox();
+            this.label8 = new System.Windows.Forms.Label();
+            this.label9 = new System.Windows.Forms.Label();
+            this.txtZip = new System.Windows.Forms.TextBox();
+            this.label10 = new System.Windows.Forms.Label();
+            this.txtState = new System.Windows.Forms.TextBox();
+            this.label11 = new System.Windows.Forms.Label();
+            this.txtStreet = new System.Windows.Forms.TextBox();
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.chkPrint = new System.Windows.Forms.CheckBox();
+            this.cmdCancel = new System.Windows.Forms.Button();
+            this.cmdOK = new System.Windows.Forms.Button();
+            this.patientApptsBindingSource = new System.Windows.Forms.BindingSource(this.components);
+            this.dsPatientApptDisplay2BindingSource = new System.Windows.Forms.BindingSource(this.components);
+            this.dsPatientApptDisplay2 = new IndianHealthService.ClinicalScheduling.dsPatientApptDisplay2();
+            this.tabControl1.SuspendLayout();
+            this.tabAppointment.SuspendLayout();
+            this.groupBox3.SuspendLayout();
+            this.groupBox1.SuspendLayout();
+            this.tabPatientInfo.SuspendLayout();
+            this.groupBox2.SuspendLayout();
+            this.panel1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.patientApptsBindingSource)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.dsPatientApptDisplay2BindingSource)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.dsPatientApptDisplay2)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // tabControl1
+            // 
+            this.tabControl1.Controls.Add(this.tabAppointment);
+            this.tabControl1.Controls.Add(this.tabPatientInfo);
+            this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.tabControl1.Location = new System.Drawing.Point(0, 0);
+            this.tabControl1.Name = "tabControl1";
+            this.tabControl1.SelectedIndex = 0;
+            this.tabControl1.Size = new System.Drawing.Size(471, 526);
+            this.tabControl1.TabIndex = 0;
+            // 
+            // tabAppointment
+            // 
+            this.tabAppointment.Controls.Add(this.groupBox4);
+            this.tabAppointment.Controls.Add(this.groupBox3);
+            this.tabAppointment.Controls.Add(this.groupBox1);
+            this.tabAppointment.Location = new System.Drawing.Point(4, 22);
+            this.tabAppointment.Name = "tabAppointment";
+            this.tabAppointment.Size = new System.Drawing.Size(463, 500);
+            this.tabAppointment.TabIndex = 1;
+            this.tabAppointment.Text = "Appointment";
+            // 
+            // groupBox4
+            // 
+            this.groupBox4.Location = new System.Drawing.Point(8, 254);
+            this.groupBox4.Name = "groupBox4";
+            this.groupBox4.Size = new System.Drawing.Size(439, 204);
+            this.groupBox4.TabIndex = 14;
+            this.groupBox4.TabStop = false;
+            this.groupBox4.Text = "Other Appointments";
+            // 
+            // groupBox3
+            // 
+            this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.groupBox3.Controls.Add(this.lblClinic);
+            this.groupBox3.Controls.Add(this.label15);
+            this.groupBox3.Controls.Add(this.txtNote);
+            this.groupBox3.Controls.Add(this.label1);
+            this.groupBox3.Controls.Add(this.lblDuration);
+            this.groupBox3.Controls.Add(this.lblStartTime);
+            this.groupBox3.Controls.Add(this.label4);
+            this.groupBox3.Controls.Add(this.label3);
+            this.groupBox3.Location = new System.Drawing.Point(8, 107);
+            this.groupBox3.Name = "groupBox3";
+            this.groupBox3.Size = new System.Drawing.Size(439, 141);
+            this.groupBox3.TabIndex = 13;
+            this.groupBox3.TabStop = false;
+            this.groupBox3.Text = "Appointment";
+            // 
+            // lblClinic
+            // 
+            this.lblClinic.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.lblClinic.Location = new System.Drawing.Point(200, 48);
+            this.lblClinic.Name = "lblClinic";
+            this.lblClinic.Size = new System.Drawing.Size(233, 16);
+            this.lblClinic.TabIndex = 19;
+            // 
+            // label15
+            // 
+            this.label15.Location = new System.Drawing.Point(152, 48);
+            this.label15.Name = "label15";
+            this.label15.Size = new System.Drawing.Size(40, 16);
+            this.label15.TabIndex = 18;
+            this.label15.Text = "Clinic:";
+            this.label15.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // txtNote
+            // 
+            this.txtNote.AcceptsReturn = true;
+            this.txtNote.Location = new System.Drawing.Point(80, 72);
+            this.txtNote.Multiline = true;
+            this.txtNote.Name = "txtNote";
+            this.txtNote.Size = new System.Drawing.Size(353, 60);
+            this.txtNote.TabIndex = 17;
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(4, 80);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(56, 16);
+            this.label1.TabIndex = 16;
+            this.label1.Text = "Notes:";
+            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // lblDuration
+            // 
+            this.lblDuration.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.lblDuration.Location = new System.Drawing.Point(80, 48);
+            this.lblDuration.Name = "lblDuration";
+            this.lblDuration.Size = new System.Drawing.Size(56, 16);
+            this.lblDuration.TabIndex = 15;
+            // 
+            // lblStartTime
+            // 
+            this.lblStartTime.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.lblStartTime.Location = new System.Drawing.Point(80, 24);
+            this.lblStartTime.Name = "lblStartTime";
+            this.lblStartTime.Size = new System.Drawing.Size(353, 16);
+            this.lblStartTime.TabIndex = 14;
+            // 
+            // label4
+            // 
+            this.label4.Location = new System.Drawing.Point(16, 48);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(56, 16);
+            this.label4.TabIndex = 13;
+            this.label4.Text = "Duration:";
+            this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // label3
+            // 
+            this.label3.Location = new System.Drawing.Point(8, 24);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(64, 16);
+            this.label3.TabIndex = 12;
+            this.label3.Text = "Start Time:";
+            this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.txtSex);
+            this.groupBox1.Controls.Add(this.label18);
+            this.groupBox1.Controls.Add(this.label14);
+            this.groupBox1.Controls.Add(this.txtHRN);
+            this.groupBox1.Controls.Add(this.label6);
+            this.groupBox1.Controls.Add(this.txtPID);
+            this.groupBox1.Controls.Add(this.label5);
+            this.groupBox1.Controls.Add(this.txtDOB);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.txtPatientName);
+            this.groupBox1.Location = new System.Drawing.Point(8, 8);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(439, 93);
+            this.groupBox1.TabIndex = 12;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Patient ID";
+            // 
+            // txtSex
+            // 
+            this.txtSex.BackColor = System.Drawing.SystemColors.Control;
+            this.txtSex.Location = new System.Drawing.Point(273, 41);
+            this.txtSex.Name = "txtSex";
+            this.txtSex.ReadOnly = true;
+            this.txtSex.Size = new System.Drawing.Size(160, 20);
+            this.txtSex.TabIndex = 15;
+            // 
+            // label18
+            // 
+            this.label18.AutoSize = true;
+            this.label18.Location = new System.Drawing.Point(238, 44);
+            this.label18.Name = "label18";
+            this.label18.Size = new System.Drawing.Size(29, 13);
+            this.label18.TabIndex = 14;
+            this.label18.Text = "Sex:";
+            // 
+            // label14
+            // 
+            this.label14.Location = new System.Drawing.Point(50, 64);
+            this.label14.Name = "label14";
+            this.label14.Size = new System.Drawing.Size(40, 16);
+            this.label14.TabIndex = 13;
+            this.label14.Text = "HRN:";
+            this.label14.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // txtHRN
+            // 
+            this.txtHRN.Location = new System.Drawing.Point(96, 64);
+            this.txtHRN.Name = "txtHRN";
+            this.txtHRN.ReadOnly = true;
+            this.txtHRN.Size = new System.Drawing.Size(120, 20);
+            this.txtHRN.TabIndex = 12;
+            // 
+            // label6
+            // 
+            this.label6.Location = new System.Drawing.Point(227, 65);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(40, 16);
+            this.label6.TabIndex = 9;
+            this.label6.Text = "ID:";
+            this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // txtPID
+            // 
+            this.txtPID.Location = new System.Drawing.Point(272, 63);
+            this.txtPID.Name = "txtPID";
+            this.txtPID.ReadOnly = true;
+            this.txtPID.Size = new System.Drawing.Size(161, 20);
+            this.txtPID.TabIndex = 8;
+            // 
+            // label5
+            // 
+            this.label5.Location = new System.Drawing.Point(58, 41);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(32, 16);
+            this.label5.TabIndex = 7;
+            this.label5.Text = "DOB:";
+            this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // txtDOB
+            // 
+            this.txtDOB.Location = new System.Drawing.Point(96, 40);
+            this.txtDOB.Name = "txtDOB";
+            this.txtDOB.ReadOnly = true;
+            this.txtDOB.Size = new System.Drawing.Size(120, 20);
+            this.txtDOB.TabIndex = 6;
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(50, 16);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(40, 16);
+            this.label2.TabIndex = 5;
+            this.label2.Text = "Name:";
+            this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // txtPatientName
+            // 
+            this.txtPatientName.Location = new System.Drawing.Point(96, 16);
+            this.txtPatientName.Name = "txtPatientName";
+            this.txtPatientName.ReadOnly = true;
+            this.txtPatientName.Size = new System.Drawing.Size(337, 20);
+            this.txtPatientName.TabIndex = 0;
+            // 
+            // tabPatientInfo
+            // 
+            this.tabPatientInfo.Controls.Add(this.groupBox2);
+            this.tabPatientInfo.Location = new System.Drawing.Point(4, 22);
+            this.tabPatientInfo.Name = "tabPatientInfo";
+            this.tabPatientInfo.Size = new System.Drawing.Size(463, 500);
+            this.tabPatientInfo.TabIndex = 0;
+            this.tabPatientInfo.Text = "Contact Information";
+            // 
+            // groupBox2
+            // 
+            this.groupBox2.Controls.Add(this.label17);
+            this.groupBox2.Controls.Add(this.txtEmail);
+            this.groupBox2.Controls.Add(this.label16);
+            this.groupBox2.Controls.Add(this.txtPhoneCell);
+            this.groupBox2.Controls.Add(this.label7);
+            this.groupBox2.Controls.Add(this.txtCountry);
+            this.groupBox2.Controls.Add(this.label12);
+            this.groupBox2.Controls.Add(this.txtPhoneOffice);
+            this.groupBox2.Controls.Add(this.label13);
+            this.groupBox2.Controls.Add(this.txtPhoneHome);
+            this.groupBox2.Controls.Add(this.txtCity);
+            this.groupBox2.Controls.Add(this.label8);
+            this.groupBox2.Controls.Add(this.label9);
+            this.groupBox2.Controls.Add(this.txtZip);
+            this.groupBox2.Controls.Add(this.label10);
+            this.groupBox2.Controls.Add(this.txtState);
+            this.groupBox2.Controls.Add(this.label11);
+            this.groupBox2.Controls.Add(this.txtStreet);
+            this.groupBox2.Location = new System.Drawing.Point(8, 16);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(444, 198);
+            this.groupBox2.TabIndex = 1;
+            this.groupBox2.TabStop = false;
+            this.groupBox2.Text = "Address";
+            // 
+            // label17
+            // 
+            this.label17.Location = new System.Drawing.Point(224, 94);
+            this.label17.Name = "label17";
+            this.label17.Size = new System.Drawing.Size(40, 16);
+            this.label17.TabIndex = 29;
+            this.label17.Text = "E-Mail:";
+            this.label17.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // txtEmail
+            // 
+            this.txtEmail.Location = new System.Drawing.Point(267, 94);
+            this.txtEmail.Name = "txtEmail";
+            this.txtEmail.ReadOnly = true;
+            this.txtEmail.Size = new System.Drawing.Size(166, 20);
+            this.txtEmail.TabIndex = 28;
+            // 
+            // label16
+            // 
+            this.label16.Location = new System.Drawing.Point(19, 142);
+            this.label16.Name = "label16";
+            this.label16.Size = new System.Drawing.Size(69, 16);
+            this.label16.TabIndex = 27;
+            this.label16.Text = "Cell/Mobile:";
+            this.label16.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // txtPhoneCell
+            // 
+            this.txtPhoneCell.Location = new System.Drawing.Point(91, 142);
+            this.txtPhoneCell.Name = "txtPhoneCell";
+            this.txtPhoneCell.ReadOnly = true;
+            this.txtPhoneCell.Size = new System.Drawing.Size(120, 20);
+            this.txtPhoneCell.TabIndex = 26;
+            // 
+            // label7
+            // 
+            this.label7.Location = new System.Drawing.Point(33, 94);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(55, 16);
+            this.label7.TabIndex = 25;
+            this.label7.Text = "Country:";
+            this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // txtCountry
+            // 
+            this.txtCountry.Location = new System.Drawing.Point(91, 94);
+            this.txtCountry.Name = "txtCountry";
+            this.txtCountry.ReadOnly = true;
+            this.txtCountry.Size = new System.Drawing.Size(120, 20);
+            this.txtCountry.TabIndex = 24;
+            // 
+            // label12
+            // 
+            this.label12.Location = new System.Drawing.Point(2, 166);
+            this.label12.Name = "label12";
+            this.label12.Size = new System.Drawing.Size(86, 14);
+            this.label12.TabIndex = 23;
+            this.label12.Text = "Phone (Office):";
+            this.label12.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // txtPhoneOffice
+            // 
+            this.txtPhoneOffice.Location = new System.Drawing.Point(91, 166);
+            this.txtPhoneOffice.Name = "txtPhoneOffice";
+            this.txtPhoneOffice.ReadOnly = true;
+            this.txtPhoneOffice.Size = new System.Drawing.Size(120, 20);
+            this.txtPhoneOffice.TabIndex = 22;
+            // 
+            // label13
+            // 
+            this.label13.Location = new System.Drawing.Point(5, 118);
+            this.label13.Name = "label13";
+            this.label13.Size = new System.Drawing.Size(83, 16);
+            this.label13.TabIndex = 21;
+            this.label13.Text = "Phone (Home):";
+            this.label13.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // txtPhoneHome
+            // 
+            this.txtPhoneHome.Location = new System.Drawing.Point(91, 118);
+            this.txtPhoneHome.Name = "txtPhoneHome";
+            this.txtPhoneHome.ReadOnly = true;
+            this.txtPhoneHome.Size = new System.Drawing.Size(120, 20);
+            this.txtPhoneHome.TabIndex = 20;
+            // 
+            // txtCity
+            // 
+            this.txtCity.Location = new System.Drawing.Point(91, 46);
+            this.txtCity.Name = "txtCity";
+            this.txtCity.ReadOnly = true;
+            this.txtCity.Size = new System.Drawing.Size(342, 20);
+            this.txtCity.TabIndex = 18;
+            // 
+            // label8
+            // 
+            this.label8.Location = new System.Drawing.Point(52, 46);
+            this.label8.Name = "label8";
+            this.label8.Size = new System.Drawing.Size(36, 16);
+            this.label8.TabIndex = 19;
+            this.label8.Text = "City:";
+            this.label8.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // label9
+            // 
+            this.label9.Location = new System.Drawing.Point(224, 70);
+            this.label9.Name = "label9";
+            this.label9.Size = new System.Drawing.Size(40, 16);
+            this.label9.TabIndex = 17;
+            this.label9.Text = "Zip:";
+            this.label9.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // txtZip
+            // 
+            this.txtZip.Location = new System.Drawing.Point(267, 70);
+            this.txtZip.Name = "txtZip";
+            this.txtZip.ReadOnly = true;
+            this.txtZip.Size = new System.Drawing.Size(166, 20);
+            this.txtZip.TabIndex = 16;
+            // 
+            // label10
+            // 
+            this.label10.Location = new System.Drawing.Point(47, 70);
+            this.label10.Name = "label10";
+            this.label10.Size = new System.Drawing.Size(41, 16);
+            this.label10.TabIndex = 15;
+            this.label10.Text = "State:";
+            this.label10.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // txtState
+            // 
+            this.txtState.Location = new System.Drawing.Point(91, 70);
+            this.txtState.Name = "txtState";
+            this.txtState.ReadOnly = true;
+            this.txtState.Size = new System.Drawing.Size(120, 20);
+            this.txtState.TabIndex = 14;
+            // 
+            // label11
+            // 
+            this.label11.Location = new System.Drawing.Point(47, 22);
+            this.label11.Name = "label11";
+            this.label11.Size = new System.Drawing.Size(41, 16);
+            this.label11.TabIndex = 13;
+            this.label11.Text = "Street:";
+            this.label11.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // txtStreet
+            // 
+            this.txtStreet.Location = new System.Drawing.Point(91, 22);
+            this.txtStreet.Name = "txtStreet";
+            this.txtStreet.ReadOnly = true;
+            this.txtStreet.Size = new System.Drawing.Size(342, 20);
+            this.txtStreet.TabIndex = 12;
+            // 
+            // panel1
+            // 
+            this.panel1.Controls.Add(this.chkPrint);
+            this.panel1.Controls.Add(this.cmdCancel);
+            this.panel1.Controls.Add(this.cmdOK);
+            this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.panel1.Location = new System.Drawing.Point(0, 486);
+            this.panel1.Name = "panel1";
+            this.panel1.Size = new System.Drawing.Size(471, 40);
+            this.panel1.TabIndex = 1;
+            // 
+            // chkPrint
+            // 
+            this.chkPrint.AutoSize = true;
+            this.chkPrint.Location = new System.Drawing.Point(13, 14);
+            this.chkPrint.Name = "chkPrint";
+            this.chkPrint.Size = new System.Drawing.Size(144, 17);
+            this.chkPrint.TabIndex = 2;
+            this.chkPrint.Text = "Print Appointment Letter";
+            this.chkPrint.UseVisualStyleBackColor = true;
+            this.chkPrint.CheckedChanged += new System.EventHandler(this.chkPrint_CheckedChanged);
+            // 
+            // cmdCancel
+            // 
+            this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.cmdCancel.Location = new System.Drawing.Point(387, 8);
+            this.cmdCancel.Name = "cmdCancel";
+            this.cmdCancel.Size = new System.Drawing.Size(64, 24);
+            this.cmdCancel.TabIndex = 1;
+            this.cmdCancel.Text = "Cancel";
+            // 
+            // cmdOK
+            // 
+            this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.cmdOK.Location = new System.Drawing.Point(317, 8);
+            this.cmdOK.Name = "cmdOK";
+            this.cmdOK.Size = new System.Drawing.Size(64, 24);
+            this.cmdOK.TabIndex = 0;
+            this.cmdOK.Text = "OK";
+            this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
+            // 
+            // patientApptsBindingSource
+            // 
+            this.patientApptsBindingSource.DataMember = "PatientAppts";
+            this.patientApptsBindingSource.DataSource = this.dsPatientApptDisplay2BindingSource;
+            // 
+            // dsPatientApptDisplay2BindingSource
+            // 
+            this.dsPatientApptDisplay2BindingSource.DataSource = this.dsPatientApptDisplay2;
+            this.dsPatientApptDisplay2BindingSource.Position = 0;
+            // 
+            // dsPatientApptDisplay2
+            // 
+            this.dsPatientApptDisplay2.DataSetName = "dsPatientApptDisplay2";
+            this.dsPatientApptDisplay2.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
+            // 
+            // DAppointPage
+            // 
+            this.AcceptButton = this.cmdOK;
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.CancelButton = this.cmdCancel;
+            this.ClientSize = new System.Drawing.Size(471, 526);
+            this.Controls.Add(this.panel1);
+            this.Controls.Add(this.tabControl1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.Name = "DAppointPage";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Patient Appointment";
+            this.tabControl1.ResumeLayout(false);
+            this.tabAppointment.ResumeLayout(false);
+            this.groupBox3.ResumeLayout(false);
+            this.groupBox3.PerformLayout();
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.tabPatientInfo.ResumeLayout(false);
+            this.groupBox2.ResumeLayout(false);
+            this.groupBox2.PerformLayout();
+            this.panel1.ResumeLayout(false);
+            this.panel1.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.patientApptsBindingSource)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.dsPatientApptDisplay2BindingSource)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.dsPatientApptDisplay2)).EndInit();
+            this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		#region Fields
+
+		private CGDocumentManager	m_DocManager;
+
+		private string			m_sPatientName;
+        private Sex             m_enumPatientSex;
+		private string			m_sPatientHRN;
+		private string			m_sPatientIEN;
+		private DateTime		m_dPatientDOB;
+		private string			m_sPatientPID;
+
+		private string			m_sCity;
+		private string			m_sPhoneHome;
+		private string			m_sPhoneOffice;
+		private string			m_sState;
+		private string			m_sStreet;
+		private string			m_sZip;
+
+		private string			m_sNote;
+		private	DateTime		m_dStartTime;
+        private DateTime        m_dEndTime;
+		private int				m_nDuration;
+		private string			m_sClinic;
+
+        private string          m_sPhoneCell;
+        private string          m_sEmail;
+        private string          m_sCountry;
+        private int          m_iAccessTypeID;
+        private bool _myCodeIsFiringIstheCheckBoxChangedEvent;
+
+		#endregion //fields
+
+		#region Methods
+
+		public void InitializePage(CGAppointment a)
+		{
+			InitializePage(a.PatientID.ToString(), a.StartTime, a.EndTime, "", a.Note, a.AccessTypeID);
+		}
+
+		public void InitializePage(string sPatientIEN, DateTime dStart, DateTime dEnd, string sClinic, string sNote, int iAccessTypeID)
+		{
+			m_dStartTime = dStart;
+            m_dEndTime = dEnd;
+			m_nDuration = (int)(dEnd - dStart).TotalMinutes;
+            m_iAccessTypeID = iAccessTypeID;
+			m_sClinic = sClinic;
+			m_sPatientIEN = sPatientIEN;
+			m_sNote = sNote;
+			try 
+			{
+				string sSql;
+				sSql = "BSDX GET BASIC REG INFO^" + m_sPatientIEN;
+
+				DataTable tb = m_DocManager.RPMSDataTable(sSql, "PatientRegInfo");
+
+				Debug.Assert(tb.Rows.Count == 1);
+				DataRow r = tb.Rows[0];
+				this.m_sPatientName = r["NAME"].ToString();
+                this.m_enumPatientSex = r["SEX"].ToString() == "MALE" ? Sex.Male : Sex.Female;
+				this.m_sPatientHRN = r["HRN"].ToString();
+				this.m_sPatientIEN = r["IEN"].ToString();
+                this.m_sPatientPID = r["PID"].ToString();
+				this.m_dPatientDOB = (DateTime) r["DOB"];
+				this.m_sStreet = r["STREET"].ToString();
+				this.m_sCity = r["CITY"].ToString();
+				this.m_sPhoneOffice = r["OFCPHONE"].ToString();
+				this.m_sState = r["STATE"].ToString();
+				this.m_sZip = r["ZIP"].ToString();
+				this.m_sPhoneHome = r["HOMEPHONE"].ToString();
+                this.m_sEmail = r["EMAIL ADDRESS"].ToString();
+                this.m_sPhoneCell = r["PHONE NUMBER [CELLULAR]"].ToString();
+                this.m_sCountry = r["COUNTRY"].ToString();
+				this.UpdateDialogData(true);
+                Control UC = new UCPatientAppts(m_DocManager, int.Parse(m_sPatientIEN));
+                UC.Dock = DockStyle.Fill;
+                groupBox4.Controls.Add(UC);
+
+                _myCodeIsFiringIstheCheckBoxChangedEvent = true;
+                chkPrint.Checked = CGDocumentManager.Current.UserPreferences.PrintAppointmentSlipAutomacially;
+                _myCodeIsFiringIstheCheckBoxChangedEvent = false;
+            }
+			catch(Exception e)
+			{
+				MessageBox.Show("DAppointPage::InitializePage -- Unable to retrieve patient information from VistA.  " + e.Message);
+			}
+
+		}
+		/// <summary>
+		/// Move data from member variables to controls (b == true)
+		/// or from controls to member variables (b == false)
+		/// </summary>
+		/// <param name="b"></param>
+		private void UpdateDialogData(bool b)
+		{
+			if (b == true) //move member vars into control data
+			{
+				lblClinic.Text = m_sClinic;
+				lblDuration.Text = m_nDuration.ToString();
+				lblStartTime.Text = m_dStartTime.ToShortDateString() + " " + m_dStartTime.ToShortTimeString();
+
+				txtCity.Text = this.m_sCity;
+				txtDOB.Text = this.m_dPatientDOB.ToShortDateString();
+				txtHRN.Text = this.m_sPatientHRN;
+				txtNote.Text = this.m_sNote;
+				txtPatientName.Text = m_sPatientName;
+                txtSex.Text = m_enumPatientSex.ToString();
+				txtPhoneHome.Text = this.m_sPhoneHome;
+				txtPhoneOffice.Text = this.m_sPhoneOffice;
+				txtPID.Text = this.m_sPatientPID;
+				txtState.Text = this.m_sState;
+				txtStreet.Text = this.m_sStreet;
+				txtZip.Text = this.m_sZip;
+                txtEmail.Text = this.m_sEmail;
+                txtPhoneCell.Text = this.m_sPhoneCell;
+                txtCountry.Text = this.m_sCountry;
+
+			}
+			else //move control data into member vars
+			{
+				string sNote = txtNote.Text;
+				sNote = sNote.Replace("^", " ");
+				this.m_sNote = sNote;
+			}
+			
+		}
+		private void cmdOK_Click(object sender, System.EventArgs e)
+		{
+			this.UpdateDialogData(false);
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+
+		#endregion //Methods
+
+		#region Properties
+	
+		public string Note
+		{
+			get
+			{
+				return m_sNote;
+			}
+			set
+			{
+				m_sNote = value;
+			}
+		}
+
+		public CGDocumentManager DocManager
+		{
+			get
+			{
+				return m_DocManager;
+			}
+			set
+			{
+				m_DocManager = value;
+			}
+		}
+
+        public bool PrintAppointmentSlip
+        {
+            get { return chkPrint.Checked; }
+        }
+
+        public CGAppointment Appointment
+        {
+            get
+            {
+                Patient pt = new Patient
+                {
+                    DFN = Int32.Parse(m_sPatientIEN),
+                    Name = m_sPatientName,
+                    Sex = m_enumPatientSex,
+                    DOB = m_dPatientDOB,
+                    ID = m_sPatientPID,
+                    HRN = m_sPatientHRN,
+                    Appointments = null, //for now
+                    Street = m_sStreet,
+                    City = m_sCity,
+                    State = m_sState,
+                    Zip = m_sZip,
+                    Country = m_sCountry,
+                    Email = m_sEmail,
+                    HomePhone = m_sPhoneHome,
+                    WorkPHone = m_sPhoneOffice,
+                    CellPhone = m_sPhoneCell
+                };
+
+                CGAppointment appt = new CGAppointment()
+                {
+                    PatientID = Convert.ToInt32(m_sPatientIEN),
+                    PatientName = m_sPatientName,
+                    StartTime = m_dStartTime,
+                    EndTime = m_dEndTime,
+                    Resource = m_sClinic,
+                    Note = m_sNote,
+                    HealthRecordNumber = m_sPatientHRN,
+                    AccessTypeID = m_iAccessTypeID,
+                    Patient = pt
+                };
+
+                return appt;
+            }
+        }
+		#endregion //Properties
+
+        /// <summary>
+        /// Save Print Slip preference in UserPreferences object.
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void chkPrint_CheckedChanged(object sender, EventArgs e)
+        {
+            if (_myCodeIsFiringIstheCheckBoxChangedEvent) return;
+
+            CGDocumentManager.Current.UserPreferences.PrintAppointmentSlipAutomacially = chkPrint.Checked;
+        }
+
+
+	} //end Class
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAppointPage.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAppointPage.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DAppointPage.resx	(revision 1134)
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="patientApptsBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>412, 17</value>
+  </metadata>
+  <metadata name="dsPatientApptDisplay2BindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>179, 17</value>
+  </metadata>
+  <metadata name="dsPatientApptDisplay2.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DApptSearch.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DApptSearch.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DApptSearch.cs	(revision 1134)
@@ -0,0 +1,993 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using System.Data;
+using System.Linq;
+//using System.Data.OleDb;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Modal Dialog for searching for Patient Slots
+	/// </summary>
+	public class DApptSearch : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Panel panel1;
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.Button btnAccept;
+		private System.Windows.Forms.Panel pnlDescription;
+		private System.Windows.Forms.GroupBox grpDescription;
+		private System.Windows.Forms.Label lblDescription;
+		private System.Windows.Forms.GroupBox groupBox1;
+		private System.Windows.Forms.Label label3;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.CheckedListBox lstAccessTypes;
+		private System.Windows.Forms.ComboBox cboAccessTypeFilter;
+		private System.Windows.Forms.GroupBox grpDayOfWeek;
+		private System.Windows.Forms.CheckBox chkSun;
+		private System.Windows.Forms.CheckBox chkSat;
+		private System.Windows.Forms.CheckBox chkFri;
+		private System.Windows.Forms.CheckBox chkThu;
+		private System.Windows.Forms.CheckBox chkWed;
+		private System.Windows.Forms.CheckBox chkTue;
+		private System.Windows.Forms.CheckBox chkMon;
+		private System.Windows.Forms.GroupBox grpTimeOfDay;
+		private System.Windows.Forms.RadioButton rdoBoth;
+		private System.Windows.Forms.RadioButton rdoPM;
+		private System.Windows.Forms.RadioButton rdoAM;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.GroupBox groupBox2;
+        private System.Windows.Forms.Button cmdSearch;
+        private ListView lstResults;
+        private ColumnHeader colStartTime;
+        private ColumnHeader colEndTime;
+        private ColumnHeader colResource;
+        private ColumnHeader colSlots;
+        private ColumnHeader colAccessType;
+        private ColumnHeader colDate;
+        private Label lblEnd;
+        private Label lblStart;
+        private DateTimePicker dtEnd;
+        private DateTimePicker dtStart;
+        private ColumnHeader colDOW;
+        private ColumnHeader colID;
+        private Label lblMessage;
+      
+        private System.ComponentModel.IContainer components;
+
+		public DApptSearch()
+		{
+			InitializeComponent();
+		}
+
+		#region Fields
+
+		private CGDocumentManager	m_DocManager;
+		
+		private DataSet	m_dsGlobal;
+		DataTable		m_dtTypes;
+		DataView		m_dvTypes;
+        List<CGAvailability> lstResultantAvailabilities;
+        private CGAvailability _selectedAvailability;
+		DateTime		m_dStart;
+		DateTime		m_dEnd;
+		ArrayList		m_alResources;
+		ArrayList		m_alAccessTypes;
+		string			m_sWeekDays; //only practical use now is for sending to server
+		string			m_sAmpm; // same here.
+
+		#endregion Fields
+
+        #region Methods
+
+        public void LoadListBox(string sGroup)
+		{
+			if (sGroup == "ALL")
+			{
+				//Load the Access Type list box with ALL access types
+				m_dtTypes = m_dsGlobal.Tables["AccessTypes"];
+				m_dvTypes = new DataView(m_dtTypes);
+				lstAccessTypes.DataSource = m_dvTypes;
+				lstAccessTypes.DisplayMember = "ACCESS_TYPE_NAME";
+				lstAccessTypes.Tag = 1; //This holds the column index of the ACCESS_TYPE_NAME column
+				lstAccessTypes.ValueMember = "BMXIEN";
+			}
+			else 
+			{
+				//Load the Access Type list box with active access types belonging
+				//to group sGroup
+
+				//Build AccessGroup table containing *active* AccessTypes and their Groups
+				m_dtTypes = m_dsGlobal.Tables["AccessGroupType"];
+				//Create a view that is filterable on Access Group
+				m_dvTypes = new DataView(m_dtTypes);
+				m_dvTypes.RowFilter = "ACCESS_GROUP = '" + this.cboAccessTypeFilter.Text + "'";
+				lstAccessTypes.DataSource = m_dvTypes;
+				lstAccessTypes.DisplayMember = "ACCESS_TYPE";
+				lstAccessTypes.ValueMember = "ACCESS_TYPE_ID";
+				lstAccessTypes.Tag = 4; //This holds the column index of the ACCESS_TYPE column
+			}
+		}
+
+		public void InitializePage(ArrayList alResources, CGDocumentManager docManager)
+		{
+
+            this.Text = "Searching for Appointments in: " + string.Join(" | ", alResources.Cast<string>());
+            
+            this.m_DocManager = docManager;
+			this.m_dsGlobal = m_DocManager.GlobalDataSet;
+			
+			LoadListBox("ALL");
+
+			m_dStart = DateTime.Today;
+			m_dEnd = new DateTime(9999);
+			this.m_alResources = alResources;
+			this.m_alAccessTypes = new ArrayList();
+			this.m_sAmpm="both";
+			this.m_sWeekDays = "";
+
+			//Load filter combo with list of access type groups
+			DataTable dtGroup = m_dsGlobal.Tables["AccessGroup"];
+			DataSet dsTemp = new DataSet("dsTemp");
+			dsTemp.Tables.Add(dtGroup.Copy());
+			DataTable dtTemp = dsTemp.Tables["AccessGroup"];
+			DataView dvGroup = new DataView(dtTemp);
+			DataRowView drv = dvGroup.AddNew();
+			drv["ACCESS_GROUP"]="<Show All Access Types>";
+			cboAccessTypeFilter.DataSource = dvGroup;
+			cboAccessTypeFilter.DisplayMember = "ACCESS_GROUP";
+			cboAccessTypeFilter.SelectedText = "<Show All Access Types>";
+			cboAccessTypeFilter.SelectedIndex = cboAccessTypeFilter.Items.Count - 1;
+			cboAccessTypeFilter.Refresh();
+
+
+            /* OLD CODE 
+            //Create DataGridTableStyle for Result grid
+			DataGridTableStyle tsResult = new DataGridTableStyle();
+			tsResult.MappingName = "Result";
+			tsResult.ReadOnly = true;
+
+			// Add START_TIME column style.
+			DataGridTextBoxColumn colStartTime = new DataGridTextBoxColumn();
+            colStartTime.MappingName = "StartTime";
+			colStartTime.HeaderText = "Start Time";
+			colStartTime.Width = 200;
+			colStartTime.Format = "f";
+			tsResult.GridColumnStyles.Add(colStartTime);
+			
+			// Add END_TIME column style.
+			DataGridTextBoxColumn colEndTime = new DataGridTextBoxColumn();
+            colEndTime.MappingName = "EndTime";
+			colEndTime.HeaderText = "End Time";
+			colEndTime.Width = 75;
+			colEndTime.Format = "h:mm tt";
+			tsResult.GridColumnStyles.Add(colEndTime);
+
+			// Add RESOURCE column style.
+			DataGridTextBoxColumn colResource = new DataGridTextBoxColumn();
+            colResource.MappingName = "ResourceList";
+			colResource.HeaderText = "Resource";
+			colResource.Width = 200;
+			tsResult.GridColumnStyles.Add(colResource);
+
+			// Add SLOTS column style.
+			DataGridTextBoxColumn colSlots = new DataGridTextBoxColumn();
+			colSlots.MappingName = "SLOTS";
+			colSlots.HeaderText = "Slots";
+			colSlots.Width = 50;
+			tsResult.GridColumnStyles.Add(colSlots);
+
+			// Add AMPM column style.
+			DataGridTextBoxColumn colAccess = new DataGridTextBoxColumn();
+			colAccess.MappingName = "ACCESSNAME";
+			colAccess.HeaderText = "Access Type";
+			colAccess.Width = 200;
+			tsResult.GridColumnStyles.Add(colAccess);
+			//grdResult.TableStyles.Add(tsResult);
+            */
+            
+			this.UpdateDialogData(true);
+		
+		}
+
+		/// <summary>
+		/// If b is true, moves member vars into control data
+		/// otherwise, moves control data into member vars
+		/// </summary>
+		/// <param name="b"></param>
+		private void UpdateDialogData(bool b)
+		{
+			if (b == true) //move member vars into controls
+			{
+
+			}
+			else //move control data into member vars
+			{
+
+				//Build AccessType list
+
+				this.m_alAccessTypes.Clear();
+				
+				for (int j = 0; j < this.lstAccessTypes.CheckedItems.Count; j++)
+				{
+					DataRowView drv = (DataRowView) lstAccessTypes.CheckedItems[j];
+					int nIndex = (int) lstAccessTypes.Tag;
+					string sItem = drv.Row.ItemArray[nIndex].ToString();
+					m_alAccessTypes.Add(sItem); 
+				}
+
+				//AM/PM
+				this.m_sAmpm = (this.rdoAM.Checked == true) ? "AM":"BOTH";
+				if (this.m_sAmpm != "AM")
+					this.m_sAmpm = (this.rdoPM.Checked == true) ? "PM":"BOTH";
+
+				
+				//Weekday
+				this.m_sWeekDays = ""; //any
+				if (chkMon.Checked == true)
+					m_sWeekDays += "Monday";
+				if (chkTue.Checked == true)
+					m_sWeekDays += "Tuesday";
+				if (chkWed.Checked == true)
+					m_sWeekDays += "Wednesday";
+				if (chkThu.Checked == true)
+					m_sWeekDays += "Thursday";
+				if (chkFri.Checked == true)
+					m_sWeekDays += "Friday";
+				if (chkSat.Checked == true)
+					m_sWeekDays += "Saturday";
+				if (chkSun.Checked == true)
+					m_sWeekDays += "Sunday";
+
+				//Start
+                this.m_dStart = this.dtStart.Value;
+
+				//End
+                this.m_dEnd = this.dtEnd.Value;
+			}		
+		}
+
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+        }
+
+        #endregion Methods
+
+        #region Windows Form Designer generated code
+        /// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.cmdSearch = new System.Windows.Forms.Button();
+            this.cmdCancel = new System.Windows.Forms.Button();
+            this.btnAccept = new System.Windows.Forms.Button();
+            this.pnlDescription = new System.Windows.Forms.Panel();
+            this.grpDescription = new System.Windows.Forms.GroupBox();
+            this.lblDescription = new System.Windows.Forms.Label();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.lblEnd = new System.Windows.Forms.Label();
+            this.lblStart = new System.Windows.Forms.Label();
+            this.dtEnd = new System.Windows.Forms.DateTimePicker();
+            this.dtStart = new System.Windows.Forms.DateTimePicker();
+            this.label3 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.lstAccessTypes = new System.Windows.Forms.CheckedListBox();
+            this.cboAccessTypeFilter = new System.Windows.Forms.ComboBox();
+            this.grpDayOfWeek = new System.Windows.Forms.GroupBox();
+            this.chkSun = new System.Windows.Forms.CheckBox();
+            this.chkSat = new System.Windows.Forms.CheckBox();
+            this.chkFri = new System.Windows.Forms.CheckBox();
+            this.chkThu = new System.Windows.Forms.CheckBox();
+            this.chkWed = new System.Windows.Forms.CheckBox();
+            this.chkTue = new System.Windows.Forms.CheckBox();
+            this.chkMon = new System.Windows.Forms.CheckBox();
+            this.grpTimeOfDay = new System.Windows.Forms.GroupBox();
+            this.rdoBoth = new System.Windows.Forms.RadioButton();
+            this.rdoPM = new System.Windows.Forms.RadioButton();
+            this.rdoAM = new System.Windows.Forms.RadioButton();
+            this.label1 = new System.Windows.Forms.Label();
+            this.groupBox2 = new System.Windows.Forms.GroupBox();
+            this.lstResults = new System.Windows.Forms.ListView();
+            this.colID = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.colDate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.colDOW = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.colStartTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.colEndTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.colResource = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.colSlots = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.colAccessType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+            this.lblMessage = new System.Windows.Forms.Label();
+            this.panel1.SuspendLayout();
+            this.pnlDescription.SuspendLayout();
+            this.grpDescription.SuspendLayout();
+            this.groupBox1.SuspendLayout();
+            this.grpDayOfWeek.SuspendLayout();
+            this.grpTimeOfDay.SuspendLayout();
+            this.groupBox2.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // panel1
+            // 
+            this.panel1.Controls.Add(this.lblMessage);
+            this.panel1.Controls.Add(this.cmdSearch);
+            this.panel1.Controls.Add(this.cmdCancel);
+            this.panel1.Controls.Add(this.btnAccept);
+            this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.panel1.Location = new System.Drawing.Point(0, 461);
+            this.panel1.Name = "panel1";
+            this.panel1.Size = new System.Drawing.Size(923, 40);
+            this.panel1.TabIndex = 4;
+            // 
+            // cmdSearch
+            // 
+            this.cmdSearch.Location = new System.Drawing.Point(33, 6);
+            this.cmdSearch.Name = "cmdSearch";
+            this.cmdSearch.Size = new System.Drawing.Size(72, 24);
+            this.cmdSearch.TabIndex = 2;
+            this.cmdSearch.Text = "Search";
+            this.cmdSearch.Click += new System.EventHandler(this.cmdSearch_Click);
+            // 
+            // cmdCancel
+            // 
+            this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.cmdCancel.Location = new System.Drawing.Point(828, 8);
+            this.cmdCancel.Name = "cmdCancel";
+            this.cmdCancel.Size = new System.Drawing.Size(64, 24);
+            this.cmdCancel.TabIndex = 1;
+            this.cmdCancel.Text = "Cancel";
+            // 
+            // btnAccept
+            // 
+            this.btnAccept.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.btnAccept.Location = new System.Drawing.Point(135, 8);
+            this.btnAccept.Name = "btnAccept";
+            this.btnAccept.Size = new System.Drawing.Size(176, 24);
+            this.btnAccept.TabIndex = 0;
+            this.btnAccept.Text = "Select Slot for Appointment";
+            this.btnAccept.Click += new System.EventHandler(this.btnAccept_Click);
+            // 
+            // pnlDescription
+            // 
+            this.pnlDescription.Controls.Add(this.grpDescription);
+            this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlDescription.Location = new System.Drawing.Point(0, 397);
+            this.pnlDescription.Name = "pnlDescription";
+            this.pnlDescription.Size = new System.Drawing.Size(923, 64);
+            this.pnlDescription.TabIndex = 47;
+            // 
+            // grpDescription
+            // 
+            this.grpDescription.Controls.Add(this.lblDescription);
+            this.grpDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grpDescription.Location = new System.Drawing.Point(0, 0);
+            this.grpDescription.Name = "grpDescription";
+            this.grpDescription.Size = new System.Drawing.Size(923, 64);
+            this.grpDescription.TabIndex = 0;
+            this.grpDescription.TabStop = false;
+            this.grpDescription.Text = "Description";
+            // 
+            // lblDescription
+            // 
+            this.lblDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lblDescription.Location = new System.Drawing.Point(3, 16);
+            this.lblDescription.Name = "lblDescription";
+            this.lblDescription.Size = new System.Drawing.Size(917, 45);
+            this.lblDescription.TabIndex = 1;
+            this.lblDescription.Text = "Search for available appointment times using this panel.  You may narrow your sea" +
+                "rch by selecting an access type or by selecting specific days of the week or tim" +
+                "es of day.";
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.lblEnd);
+            this.groupBox1.Controls.Add(this.lblStart);
+            this.groupBox1.Controls.Add(this.dtEnd);
+            this.groupBox1.Controls.Add(this.dtStart);
+            this.groupBox1.Controls.Add(this.label3);
+            this.groupBox1.Controls.Add(this.label2);
+            this.groupBox1.Controls.Add(this.lstAccessTypes);
+            this.groupBox1.Controls.Add(this.cboAccessTypeFilter);
+            this.groupBox1.Controls.Add(this.grpDayOfWeek);
+            this.groupBox1.Controls.Add(this.grpTimeOfDay);
+            this.groupBox1.Controls.Add(this.label1);
+            this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top;
+            this.groupBox1.Location = new System.Drawing.Point(0, 0);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(923, 208);
+            this.groupBox1.TabIndex = 56;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Search Parameters";
+            // 
+            // lblEnd
+            // 
+            this.lblEnd.AutoSize = true;
+            this.lblEnd.Location = new System.Drawing.Point(12, 124);
+            this.lblEnd.Name = "lblEnd";
+            this.lblEnd.Size = new System.Drawing.Size(153, 13);
+            this.lblEnd.TabIndex = 67;
+            this.lblEnd.Text = "End Date to Search (Inclusive)";
+            // 
+            // lblStart
+            // 
+            this.lblStart.AutoSize = true;
+            this.lblStart.Location = new System.Drawing.Point(12, 35);
+            this.lblStart.Name = "lblStart";
+            this.lblStart.Size = new System.Drawing.Size(159, 13);
+            this.lblStart.TabIndex = 66;
+            this.lblStart.Text = "Start Date to Search (Inclusive)";
+            // 
+            // dtEnd
+            // 
+            this.dtEnd.Location = new System.Drawing.Point(12, 141);
+            this.dtEnd.Name = "dtEnd";
+            this.dtEnd.Size = new System.Drawing.Size(200, 20);
+            this.dtEnd.TabIndex = 65;
+            this.dtEnd.ValueChanged += new System.EventHandler(this.dtEnd_ValueChanged);
+            // 
+            // dtStart
+            // 
+            this.dtStart.Location = new System.Drawing.Point(12, 54);
+            this.dtStart.Name = "dtStart";
+            this.dtStart.Size = new System.Drawing.Size(200, 20);
+            this.dtStart.TabIndex = 64;
+            this.dtStart.ValueChanged += new System.EventHandler(this.dtStart_ValueChanged);
+            // 
+            // label3
+            // 
+            this.label3.Location = new System.Drawing.Point(684, 64);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(80, 16);
+            this.label3.TabIndex = 63;
+            this.label3.Text = "Access Type:";
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(684, 21);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(104, 16);
+            this.label2.TabIndex = 62;
+            this.label2.Text = "Access Group:";
+            // 
+            // lstAccessTypes
+            // 
+            this.lstAccessTypes.CheckOnClick = true;
+            this.lstAccessTypes.HorizontalScrollbar = true;
+            this.lstAccessTypes.Location = new System.Drawing.Point(661, 88);
+            this.lstAccessTypes.MultiColumn = true;
+            this.lstAccessTypes.Name = "lstAccessTypes";
+            this.lstAccessTypes.Size = new System.Drawing.Size(250, 109);
+            this.lstAccessTypes.TabIndex = 61;
+            // 
+            // cboAccessTypeFilter
+            // 
+            this.cboAccessTypeFilter.Location = new System.Drawing.Point(661, 40);
+            this.cboAccessTypeFilter.Name = "cboAccessTypeFilter";
+            this.cboAccessTypeFilter.Size = new System.Drawing.Size(250, 21);
+            this.cboAccessTypeFilter.TabIndex = 60;
+            this.cboAccessTypeFilter.Text = "cboAccessTypeFilter";
+            this.cboAccessTypeFilter.SelectionChangeCommitted += new System.EventHandler(this.cboAccessTypeFilter_SelectionChangeCommitted);
+            // 
+            // grpDayOfWeek
+            // 
+            this.grpDayOfWeek.Controls.Add(this.chkSun);
+            this.grpDayOfWeek.Controls.Add(this.chkSat);
+            this.grpDayOfWeek.Controls.Add(this.chkFri);
+            this.grpDayOfWeek.Controls.Add(this.chkThu);
+            this.grpDayOfWeek.Controls.Add(this.chkWed);
+            this.grpDayOfWeek.Controls.Add(this.chkTue);
+            this.grpDayOfWeek.Controls.Add(this.chkMon);
+            this.grpDayOfWeek.Location = new System.Drawing.Point(311, 94);
+            this.grpDayOfWeek.Name = "grpDayOfWeek";
+            this.grpDayOfWeek.Size = new System.Drawing.Size(240, 101);
+            this.grpDayOfWeek.TabIndex = 59;
+            this.grpDayOfWeek.TabStop = false;
+            this.grpDayOfWeek.Text = "Day of the Week";
+            // 
+            // chkSun
+            // 
+            this.chkSun.Location = new System.Drawing.Point(176, 64);
+            this.chkSun.Name = "chkSun";
+            this.chkSun.Size = new System.Drawing.Size(48, 16);
+            this.chkSun.TabIndex = 6;
+            this.chkSun.Text = "Sun";
+            // 
+            // chkSat
+            // 
+            this.chkSat.Location = new System.Drawing.Point(128, 64);
+            this.chkSat.Name = "chkSat";
+            this.chkSat.Size = new System.Drawing.Size(48, 16);
+            this.chkSat.TabIndex = 5;
+            this.chkSat.Text = "Sat";
+            // 
+            // chkFri
+            // 
+            this.chkFri.Location = new System.Drawing.Point(72, 64);
+            this.chkFri.Name = "chkFri";
+            this.chkFri.Size = new System.Drawing.Size(48, 16);
+            this.chkFri.TabIndex = 4;
+            this.chkFri.Text = "Fri";
+            // 
+            // chkThu
+            // 
+            this.chkThu.Location = new System.Drawing.Point(16, 64);
+            this.chkThu.Name = "chkThu";
+            this.chkThu.Size = new System.Drawing.Size(48, 16);
+            this.chkThu.TabIndex = 3;
+            this.chkThu.Text = "Thu";
+            // 
+            // chkWed
+            // 
+            this.chkWed.Location = new System.Drawing.Point(128, 32);
+            this.chkWed.Name = "chkWed";
+            this.chkWed.Size = new System.Drawing.Size(48, 16);
+            this.chkWed.TabIndex = 2;
+            this.chkWed.Text = "Wed";
+            // 
+            // chkTue
+            // 
+            this.chkTue.Location = new System.Drawing.Point(72, 32);
+            this.chkTue.Name = "chkTue";
+            this.chkTue.Size = new System.Drawing.Size(48, 16);
+            this.chkTue.TabIndex = 1;
+            this.chkTue.Text = "Tue";
+            // 
+            // chkMon
+            // 
+            this.chkMon.Location = new System.Drawing.Point(16, 32);
+            this.chkMon.Name = "chkMon";
+            this.chkMon.Size = new System.Drawing.Size(48, 16);
+            this.chkMon.TabIndex = 0;
+            this.chkMon.Text = "Mon";
+            // 
+            // grpTimeOfDay
+            // 
+            this.grpTimeOfDay.Controls.Add(this.rdoBoth);
+            this.grpTimeOfDay.Controls.Add(this.rdoPM);
+            this.grpTimeOfDay.Controls.Add(this.rdoAM);
+            this.grpTimeOfDay.Location = new System.Drawing.Point(311, 32);
+            this.grpTimeOfDay.Name = "grpTimeOfDay";
+            this.grpTimeOfDay.Size = new System.Drawing.Size(240, 48);
+            this.grpTimeOfDay.TabIndex = 58;
+            this.grpTimeOfDay.TabStop = false;
+            this.grpTimeOfDay.Text = "Time of Day";
+            // 
+            // rdoBoth
+            // 
+            this.rdoBoth.Checked = true;
+            this.rdoBoth.Location = new System.Drawing.Point(176, 24);
+            this.rdoBoth.Name = "rdoBoth";
+            this.rdoBoth.Size = new System.Drawing.Size(48, 16);
+            this.rdoBoth.TabIndex = 2;
+            this.rdoBoth.TabStop = true;
+            this.rdoBoth.Text = "Both";
+            // 
+            // rdoPM
+            // 
+            this.rdoPM.Location = new System.Drawing.Point(96, 24);
+            this.rdoPM.Name = "rdoPM";
+            this.rdoPM.Size = new System.Drawing.Size(72, 16);
+            this.rdoPM.TabIndex = 1;
+            this.rdoPM.Text = "PM Only";
+            // 
+            // rdoAM
+            // 
+            this.rdoAM.Location = new System.Drawing.Point(16, 24);
+            this.rdoAM.Name = "rdoAM";
+            this.rdoAM.Size = new System.Drawing.Size(72, 16);
+            this.rdoAM.TabIndex = 0;
+            this.rdoAM.Text = "AM Only";
+            // 
+            // label1
+            // 
+            this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label1.Location = new System.Drawing.Point(6, 16);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(136, 16);
+            this.label1.TabIndex = 57;
+            this.label1.Text = "Date Range:";
+            // 
+            // groupBox2
+            // 
+            this.groupBox2.Controls.Add(this.lstResults);
+            this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.groupBox2.Location = new System.Drawing.Point(0, 208);
+            this.groupBox2.Name = "groupBox2";
+            this.groupBox2.Size = new System.Drawing.Size(923, 189);
+            this.groupBox2.TabIndex = 57;
+            this.groupBox2.TabStop = false;
+            this.groupBox2.Text = "Search Result";
+            // 
+            // lstResults
+            // 
+            this.lstResults.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.colID,
+            this.colDate,
+            this.colDOW,
+            this.colStartTime,
+            this.colEndTime,
+            this.colResource,
+            this.colSlots,
+            this.colAccessType});
+            this.lstResults.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lstResults.FullRowSelect = true;
+            this.lstResults.GridLines = true;
+            this.lstResults.Location = new System.Drawing.Point(3, 16);
+            this.lstResults.MultiSelect = false;
+            this.lstResults.Name = "lstResults";
+            this.lstResults.Size = new System.Drawing.Size(917, 170);
+            this.lstResults.TabIndex = 0;
+            this.lstResults.UseCompatibleStateImageBehavior = false;
+            this.lstResults.View = System.Windows.Forms.View.Details;
+            this.lstResults.DoubleClick += new System.EventHandler(this.lstResults_DoubleClick);
+            // 
+            // colID
+            // 
+            this.colID.Text = "ID";
+            this.colID.Width = 0;
+            // 
+            // colDate
+            // 
+            this.colDate.Text = "Date";
+            this.colDate.Width = 91;
+            // 
+            // colDOW
+            // 
+            this.colDOW.Text = "Day of Week";
+            this.colDOW.Width = 80;
+            // 
+            // colStartTime
+            // 
+            this.colStartTime.Text = "Start Time";
+            this.colStartTime.Width = 87;
+            // 
+            // colEndTime
+            // 
+            this.colEndTime.Text = "End Time";
+            this.colEndTime.Width = 116;
+            // 
+            // colResource
+            // 
+            this.colResource.Text = "Resource";
+            this.colResource.Width = 370;
+            // 
+            // colSlots
+            // 
+            this.colSlots.Text = "Slots";
+            this.colSlots.Width = 47;
+            // 
+            // colAccessType
+            // 
+            this.colAccessType.Text = "Access Type";
+            this.colAccessType.Width = 101;
+            // 
+            // lblMessage
+            // 
+            this.lblMessage.AutoSize = true;
+            this.lblMessage.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.lblMessage.ForeColor = System.Drawing.Color.Red;
+            this.lblMessage.Location = new System.Drawing.Point(337, 16);
+            this.lblMessage.Name = "lblMessage";
+            this.lblMessage.Size = new System.Drawing.Size(0, 16);
+            this.lblMessage.TabIndex = 3;
+            // 
+            // DApptSearch
+            // 
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.CancelButton = this.cmdCancel;
+            this.ClientSize = new System.Drawing.Size(923, 501);
+            this.Controls.Add(this.groupBox2);
+            this.Controls.Add(this.groupBox1);
+            this.Controls.Add(this.pnlDescription);
+            this.Controls.Add(this.panel1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.Name = "DApptSearch";
+            this.Text = "Find Clinic Availability";
+            this.panel1.ResumeLayout(false);
+            this.panel1.PerformLayout();
+            this.pnlDescription.ResumeLayout(false);
+            this.grpDescription.ResumeLayout(false);
+            this.groupBox1.ResumeLayout(false);
+            this.groupBox1.PerformLayout();
+            this.grpDayOfWeek.ResumeLayout(false);
+            this.grpTimeOfDay.ResumeLayout(false);
+            this.groupBox2.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+		}
+		#endregion
+
+        #region Event Handlers
+
+		private void cmdSearch_Click(object sender, System.EventArgs e)
+		{
+			//Tell user we are processing
+            this.Cursor = Cursors.WaitCursor;
+            this.lblMessage.Text = String.Empty;
+
+            //Get the control data into local vars
+			UpdateDialogData(false);
+			//Resource array, Begin date, Access type array, MTWTF , AM PM
+
+            //Get Availabilities and Appointments from the DB
+            //NB: m_sAmpm and m_sWeekDays don't have an effect on the M side side right now
+            m_dStart = m_dStart.Date; // move to 1200
+            m_dEnd = m_dEnd.Date.AddHours(23).AddMinutes(59).AddSeconds(59); //move to 235959
+            string sSearchInfo = "1|" + m_sAmpm + "|" + m_sWeekDays;
+			DataTable m_availTable = CGSchedLib.CreateAvailabilitySchedule(m_DocManager, m_alResources, m_dStart, m_dEnd, m_alAccessTypes, ScheduleType.Resource, sSearchInfo);
+            DataTable m_apptTable = CGSchedLib.CreateAppointmentSchedule(m_DocManager, m_alResources, m_dStart, m_dEnd);
+
+#if DEBUG            
+            System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
+            stopwatch.Start();
+#endif
+            lstResultantAvailabilities = (from rowAV in m_availTable.AsEnumerable()
+                         
+                         // Calculate the number of slots consumed in this availability by appointments
+                         let slotsConsumed = (from appt in m_apptTable.AsEnumerable()
+                                              //If the resource is the same and the user selection overlaps, then...
+                                              where (rowAV.Field<string>("RESOURCE") == appt.Field<string>("RESOURCENAME")
+                                                && CalendarGrid.TimesOverlap(rowAV.Field<DateTime>("START_TIME"), rowAV.Field<DateTime>("END_TIME"), appt.Field<DateTime>("START_TIME"), appt.Field<DateTime>("END_TIME")))
+                                              // if appt starttime is before avail start time, only count against the avail starting from the availability start time
+                                              let startTimeToCountAgainstBlock = appt.Field<DateTime>("START_TIME") < rowAV.Field<DateTime>("START_TIME") ? rowAV.Field<DateTime>("START_TIME") : appt.Field<DateTime>("START_TIME")
+                                              // if appt endtime is after the avail ends, only count against the avail up to where the avail ends
+                                              let endTimeToCountAgainstBlock = appt.Field<DateTime>("END_TIME") > rowAV.Field<DateTime>("END_TIME") ? rowAV.Field<DateTime>("END_TIME") : appt.Field<DateTime>("END_TIME")
+                                              // theoretical minutes per slot for the availability
+                                              let minPerSlot = (rowAV.Field<DateTime>("END_TIME") - rowAV.Field<DateTime>("START_TIME")).TotalMinutes / rowAV.Field<int>("SLOTS")
+                                              // how many minutes does this appointment take away from the slot
+                                              let minPerAppt = (endTimeToCountAgainstBlock - startTimeToCountAgainstBlock).TotalMinutes
+                                              // how many slots the appointment takes up using this availability's scale
+                                              let slotsConsumed = minPerAppt / minPerSlot
+                                              select slotsConsumed).Sum()
+                         
+                         // Subtract the number consumed from the original ones
+                         let slotsLeft = (float)rowAV.Field<int>("SLOTS") - slotsConsumed
+                         // filter by that value if it is at least one slot
+                         where slotsLeft >= 1
+                         // Sort by Start Time, then by Resource Name
+                         orderby rowAV.Field<DateTime>("START_TIME"), rowAV.Field<string>("RESOURCE")
+                          //return as a CGAvailability
+                          select new CGAvailability
+                         {
+                             ResourceList = rowAV.Field<string>("RESOURCE"),
+                             StartTime = rowAV.Field<DateTime>("START_TIME"),
+                             EndTime = rowAV.Field<DateTime>("END_TIME"),
+                             Slots = (int)slotsLeft,
+                             // AccessTypeName is grabbed from the Access Type Table using a psuedojoin syntax.
+                             // "ACCESS_TYPE" is the IEN of the AcceesType.
+                             // Single or default is b/c we are expecting one result.
+                             AccessTypeName = (from at in m_dsGlobal.Tables["AccessTypes"].AsEnumerable() 
+                                              where at.Field<int>("BMXIEN")==Int32.Parse(rowAV.Field<string>("ACCESS_TYPE"))
+                                              select at.Field<string>("ACCESS_TYPE_NAME")).SingleOrDefault<string>(),
+                             AvailabilityType = rowAV.Field<int>("AVAILABILITYID")
+                         })
+                         // convert to Generic List
+                         .ToList<CGAvailability>();
+
+            // if specific access types are chosen, filter the results based on a join against them.
+            if (m_alAccessTypes.Count > 0)
+                lstResultantAvailabilities = (from av in lstResultantAvailabilities
+                                              join at in m_alAccessTypes.Cast<string>() on av.AccessTypeName equals at
+                                              select av).ToList<CGAvailability>();
+
+            // if user chose AM radio button, get morning appointments
+            // TimeSpan.FromHours(12) gets the number of ticks since Midnight
+            if (rdoAM.Checked) // less than 12 pm
+            {
+                lstResultantAvailabilities = (from av in lstResultantAvailabilities
+                                              where av.StartTime.TimeOfDay < TimeSpan.FromHours(12)
+                                              select av).ToList<CGAvailability>();
+            }
+            // if user chose PM radio button, get morning appointments
+            if (rdoPM.Checked) // after or equal to 12 pm
+            {
+                lstResultantAvailabilities = (from av in lstResultantAvailabilities
+                                              where av.StartTime.TimeOfDay >= TimeSpan.FromHours(12)
+                                              select av).ToList<CGAvailability>();
+            }
+
+            // if any of the days of week are checked, create a new list based on them
+            // and clear the original list, and join the new lists together
+            if (chkMon.Checked || chkTue.Checked || chkWed.Checked || chkThu.Checked || chkFri.Checked || chkSat.Checked || chkSun.Checked)
+            {
+
+                var lstMonday = new List<CGAvailability>();
+                var lstTuesday = new List<CGAvailability>();
+                var lstWednesday = new List<CGAvailability>();
+                var lstThursday = new List<CGAvailability>();
+                var lstFriday = new List<CGAvailability>();
+                var lstSaturday = new List<CGAvailability>();
+                var lstSunday = new List<CGAvailability>();
+
+                if (chkMon.Checked == true)
+                {
+                    lstMonday = (from av in lstResultantAvailabilities
+                                 where av.StartTime.DayOfWeek == DayOfWeek.Monday
+                                 select av).ToList<CGAvailability>();
+                }
+
+                if (chkTue.Checked == true)
+                {
+                    lstTuesday = (from av in lstResultantAvailabilities
+                                  where av.StartTime.DayOfWeek == DayOfWeek.Tuesday
+                                  select av).ToList<CGAvailability>();
+                }
+
+                if (chkWed.Checked == true)
+                {
+                    lstWednesday = (from av in lstResultantAvailabilities
+                                    where av.StartTime.DayOfWeek == DayOfWeek.Wednesday
+                                    select av).ToList<CGAvailability>();
+
+                }
+
+                if (chkThu.Checked == true)
+                {
+                    lstThursday = (from av in lstResultantAvailabilities
+                                   where av.StartTime.DayOfWeek == DayOfWeek.Thursday
+                                   select av).ToList<CGAvailability>();
+
+                }
+
+                if (chkFri.Checked == true)
+                {
+                    lstFriday = (from av in lstResultantAvailabilities
+                                 where av.StartTime.DayOfWeek == DayOfWeek.Friday
+                                 select av).ToList<CGAvailability>();
+                }
+
+                if (chkSat.Checked == true)
+                {
+                    lstSaturday = (from av in lstResultantAvailabilities
+                                   where av.StartTime.DayOfWeek == DayOfWeek.Saturday
+                                   select av).ToList<CGAvailability>();
+
+                }
+
+                if (chkSun.Checked == true)
+                {
+                    lstSunday = (from av in lstResultantAvailabilities
+                                 where av.StartTime.DayOfWeek == DayOfWeek.Sunday
+                                 select av).ToList<CGAvailability>();
+
+                }
+
+
+                lstResultantAvailabilities.Clear();
+                lstResultantAvailabilities.AddRange(lstMonday);
+                lstResultantAvailabilities.AddRange(lstTuesday);
+                lstResultantAvailabilities.AddRange(lstWednesday);
+                lstResultantAvailabilities.AddRange(lstThursday);
+                lstResultantAvailabilities.AddRange(lstFriday);
+                lstResultantAvailabilities.AddRange(lstSaturday);
+                lstResultantAvailabilities.AddRange(lstSunday);
+
+                lstResultantAvailabilities.OrderBy(av => av.StartTime).ThenBy(av => av.ResourceList);
+            }
+
+            
+
+#if DEBUG
+            System.Diagnostics.Debug.Write("LINQ took this long: " + stopwatch.ElapsedMilliseconds + "\n");
+            stopwatch = null;
+#endif
+            
+            //Then, convert the availabilities to ListViewItems
+            var items = (from item in lstResultantAvailabilities
+                        let s = new string[] {item.AvailabilityType.ToString(), item.StartTime.ToShortDateString(), item.StartTime.DayOfWeek.ToString(),item.StartTime.ToShortTimeString() ,item.EndTime.ToShortTimeString() ,item.ResourceList,item.Slots.ToString(),item.AccessTypeName}
+                        let lvItem = new ListViewItem(s)
+                        select lvItem).ToArray<ListViewItem>();
+
+            //--Updating Listview
+            lstResults.BeginUpdate(); //tell listview to suspend drawing for now
+            lstResults.Items.Clear(); //empty it from old data
+
+            if (items.Length > 0) lstResults.Items.AddRange(items); // add new data
+            else this.lblMessage.Text = "No available Appointment Slots Found!";
+
+            lstResults.EndUpdate(); // ok done adding items, draw now.
+            //--End Update Listview
+
+            //We are done
+            this.Cursor = Cursors.Default;
+		}
+
+		private void cboAccessTypeFilter_SelectionChangeCommitted(object sender, System.EventArgs e)
+		{
+			//Load Access Types listbox & filter
+			string sGroup = cboAccessTypeFilter.Text;
+			if (sGroup == "<Show All Access Types>")
+			{
+				LoadListBox("ALL");
+			}
+			else 
+			{
+				LoadListBox("SELECTED");
+			}			
+				
+		}
+
+
+        private void lstResults_DoubleClick(object sender, EventArgs e)
+        {
+            ProcessChoice(sender, e);
+        }
+
+        private void btnAccept_Click(object sender, EventArgs e)
+        {
+            ProcessChoice(sender, e);
+        }
+
+        /// <summary>
+        /// Shared method to process a user's choice
+        /// </summary>
+        /// <param name="s">sender</param>
+        /// <param name="e">EventArgs</param>
+        private void ProcessChoice(object s, EventArgs e)
+        {
+            if (lstResults.SelectedIndices.Count == 0)
+            {
+                this.DialogResult = DialogResult.None;
+                lblMessage.Text = "No Appointment Slot selected!";
+                return;
+            }
+
+            long availabilityKey = long.Parse(lstResults.SelectedItems[0].SubItems[0].Text);
+            _selectedAvailability = (from av in lstResultantAvailabilities
+                                     where av.AvailabilityType == availabilityKey
+                                     select av).Single<CGAvailability>();
+            this.DialogResult = DialogResult.OK;
+        }
+
+        /// <summary>
+        /// Adjust start date based on end date.
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void dtStart_ValueChanged(object sender, EventArgs e)
+        {
+            if (dtEnd.Value < dtStart.Value) dtEnd.Value = dtStart.Value;
+        }
+
+        /// <summary>
+        /// Adjust end date based on start date.
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void dtEnd_ValueChanged(object sender, EventArgs e)
+        {
+            if (dtStart.Value > dtEnd.Value) dtStart.Value = dtEnd.Value;
+        }
+
+        #endregion  Event Handlers
+
+        #region Properties
+        
+        /// <summary>
+        /// Gets the Availability Selected by the User in which to put an appointment
+        /// </summary>
+        public CGAvailability SelectedAvailability
+        {
+            get { return this._selectedAvailability; }
+        }
+
+		#endregion Properties
+
+
+    }
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DApptSearch.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DApptSearch.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DApptSearch.resx	(revision 1134)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DApptSearchcs.bak
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DApptSearchcs.bak	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DApptSearchcs.bak	(revision 1134)
@@ -0,0 +1,531 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+using System.Data.OleDb;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DApptSearch.
+	/// </summary>
+	public class DApptSearch : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Panel panel1;
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.Button cmdOK;
+		private System.Windows.Forms.Panel pnlDescription;
+		private System.Windows.Forms.GroupBox grpDescription;
+		private System.Windows.Forms.Label lblDescription;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.CheckBox chkMon;
+		private System.Windows.Forms.CheckBox chkTue;
+		private System.Windows.Forms.CheckBox chkWed;
+		private System.Windows.Forms.CheckBox chkThu;
+		private System.Windows.Forms.CheckBox chkFri;
+		private System.Windows.Forms.GroupBox grpTimeOfDay;
+		private System.Windows.Forms.GroupBox grpDayOfWeek;
+		private System.Windows.Forms.CheckBox chkSat;
+		private System.Windows.Forms.CheckBox chkSun;
+		private System.Windows.Forms.RadioButton rdoAM;
+		private System.Windows.Forms.RadioButton rdoPM;
+		private System.Windows.Forms.RadioButton rdoBoth;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.Label label3;
+		private System.Windows.Forms.CheckedListBox lstAccessTypes;
+		private System.Windows.Forms.ComboBox cboAccessTypeFilter;
+		private System.Windows.Forms.MonthCalendar calStartDate;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public DApptSearch()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+		}
+
+		#region Fields
+
+		private OleDbConnection		m_RPMSConnection;
+		private CGDocumentManager	m_DocManager;
+		
+		private DataSet	m_dsGlobal;
+		DataTable		m_dtTypes;
+		DataView		m_dvTypes;
+
+		DateTime		m_dStart;
+		DateTime		m_dEnd;
+		ArrayList		m_alResources;
+		ArrayList		m_alAccessTypes;
+		string			m_sWeekDays;
+		string			m_sAmpm;
+
+		#endregion Fields
+
+		public void LoadListBox(string sGroup)
+		{
+			if (sGroup == "ALL")
+			{
+				//Load the Access Type list box with ALL access types
+				m_dtTypes = m_dsGlobal.Tables["AccessTypes"];
+				m_dvTypes = new DataView(m_dtTypes);
+				lstAccessTypes.DataSource = m_dvTypes;
+				lstAccessTypes.DisplayMember = "ACCESS_TYPE_NAME";
+				lstAccessTypes.ValueMember = "BMXIEN";
+			}
+			else 
+			{
+				//Load the Access Type list box with active access types belonging
+				//to group sGroup
+
+				//Build AccessGroup table containing *active* AccessTypes and their Groups
+				m_dtTypes = m_dsGlobal.Tables["AccessGroupType"];
+
+				//Create a view that is filterable on Access Group
+				m_dvTypes = new DataView(m_dtTypes);
+				m_dvTypes.RowFilter = "ACCESS_GROUP = '" + this.cboAccessTypeFilter.Text + "'";
+				lstAccessTypes.DataSource = m_dvTypes;
+				lstAccessTypes.DisplayMember = "ACCESS_TYPE";
+				lstAccessTypes.ValueMember = "ACCESS_TYPE_ID";
+			}
+		}
+
+		public void InitializePage(ArrayList alResources, CGDocumentManager docManager)
+		{
+
+			this.m_DocManager = docManager;
+			this.m_dsGlobal = m_DocManager.GlobalDataSet;
+			this.m_RPMSConnection = m_DocManager.ADOConnection;			
+			
+			LoadListBox("ALL");
+
+			m_dStart = DateTime.Today;
+			m_dEnd = new DateTime(9999);
+			this.m_alResources = alResources;
+			this.m_alAccessTypes = new ArrayList();
+			this.m_sAmpm="both";
+			this.m_sWeekDays = "";
+
+
+			//Load filter combo with list of access type groups
+			DataTable dtGroup = m_dsGlobal.Tables["AccessGroup"];
+			DataSet dsTemp = new DataSet("dsTemp");
+			dsTemp.Tables.Add(dtGroup.Copy());
+			DataTable dtTemp = dsTemp.Tables["AccessGroup"];
+			DataView dvGroup = new DataView(dtTemp);
+			DataRowView drv = dvGroup.AddNew();
+			drv["ACCESS_GROUP"]="<Show All Access Types>";
+			dvGroup.Sort = "ACCESS_GROUP ASC";
+			cboAccessTypeFilter.DataSource = dvGroup;
+			cboAccessTypeFilter.DisplayMember = "ACCESS_GROUP";
+			cboAccessTypeFilter.SelectedIndex = cboAccessTypeFilter.Items.Count - 1;
+
+			//TODO: Initialize member vars
+
+			this.UpdateDialogData(true);
+		
+		}
+
+		/// <summary>
+		/// If b is true, moves member vars into control data
+		/// otherwise, moves control data into member vars
+		/// </summary>
+		/// <param name="b"></param>
+		private void UpdateDialogData(bool b)
+		{
+			if (b == true) //move member vars into controls
+			{
+
+//				lblClinic.Text = m_pAppt.Resource;
+//				lblEndTime.Text = m_pAppt.EndTime.ToShortDateString() + " " + m_pAppt.EndTime.ToShortTimeString();
+//				lblStartTime.Text = m_pAppt.StartTime.ToShortDateString() + " " + m_pAppt.StartTime.ToShortTimeString();
+//				txtNote.Text = m_pAppt.Note;
+//				nudSlots.Value = m_pAppt.Slots;
+//				if (m_pAppt.AccessTypeID  != 0)
+//				{
+//					lstAccessTypes.SelectedValue = m_pAppt.AccessTypeID;
+//				}
+			}
+			else //move control data into member vars
+			{
+
+				//Build AccessType list
+
+				this.m_alAccessTypes.Clear();
+				for (int j = 0; j < this.lstAccessTypes.CheckedItems.Count; j++)
+				{
+					m_alAccessTypes.Add(this.lstAccessTypes.Items[j].ToString()); 
+				}
+
+				//TODO: AM/PM
+				this.m_sAmpm = "both";
+				
+				//TODO: Weekday
+				this.m_sWeekDays = "any";
+
+//				m_pAppt.Note = txtNote.Text;
+//				int nIndex = this.lstAccessTypes.SelectedIndex;
+//				string sTemp = (string) this.lstAccessTypes.SelectedValue;
+//				sTemp = (sTemp == "")?"-1":sTemp;
+//				m_pAppt.AccessTypeID = Convert.ToInt16(sTemp);
+//				m_pAppt.Slots  = Convert.ToInt16(nudSlots.Value);
+			}		
+		}
+
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.panel1 = new System.Windows.Forms.Panel();
+			this.cmdCancel = new System.Windows.Forms.Button();
+			this.cmdOK = new System.Windows.Forms.Button();
+			this.pnlDescription = new System.Windows.Forms.Panel();
+			this.grpDescription = new System.Windows.Forms.GroupBox();
+			this.lblDescription = new System.Windows.Forms.Label();
+			this.calStartDate = new System.Windows.Forms.MonthCalendar();
+			this.label1 = new System.Windows.Forms.Label();
+			this.grpTimeOfDay = new System.Windows.Forms.GroupBox();
+			this.rdoBoth = new System.Windows.Forms.RadioButton();
+			this.rdoPM = new System.Windows.Forms.RadioButton();
+			this.rdoAM = new System.Windows.Forms.RadioButton();
+			this.grpDayOfWeek = new System.Windows.Forms.GroupBox();
+			this.chkSun = new System.Windows.Forms.CheckBox();
+			this.chkSat = new System.Windows.Forms.CheckBox();
+			this.chkFri = new System.Windows.Forms.CheckBox();
+			this.chkThu = new System.Windows.Forms.CheckBox();
+			this.chkWed = new System.Windows.Forms.CheckBox();
+			this.chkTue = new System.Windows.Forms.CheckBox();
+			this.chkMon = new System.Windows.Forms.CheckBox();
+			this.cboAccessTypeFilter = new System.Windows.Forms.ComboBox();
+			this.lstAccessTypes = new System.Windows.Forms.CheckedListBox();
+			this.label2 = new System.Windows.Forms.Label();
+			this.label3 = new System.Windows.Forms.Label();
+			this.panel1.SuspendLayout();
+			this.pnlDescription.SuspendLayout();
+			this.grpDescription.SuspendLayout();
+			this.grpTimeOfDay.SuspendLayout();
+			this.grpDayOfWeek.SuspendLayout();
+			this.SuspendLayout();
+			// 
+			// panel1
+			// 
+			this.panel1.Controls.AddRange(new System.Windows.Forms.Control[] {
+																				 this.cmdCancel,
+																				 this.cmdOK});
+			this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.panel1.Location = new System.Drawing.Point(0, 440);
+			this.panel1.Name = "panel1";
+			this.panel1.Size = new System.Drawing.Size(488, 40);
+			this.panel1.TabIndex = 4;
+			// 
+			// cmdCancel
+			// 
+			this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.cmdCancel.Location = new System.Drawing.Point(416, 8);
+			this.cmdCancel.Name = "cmdCancel";
+			this.cmdCancel.Size = new System.Drawing.Size(64, 24);
+			this.cmdCancel.TabIndex = 1;
+			this.cmdCancel.Text = "Cancel";
+			// 
+			// cmdOK
+			// 
+			this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+			this.cmdOK.Location = new System.Drawing.Point(336, 8);
+			this.cmdOK.Name = "cmdOK";
+			this.cmdOK.Size = new System.Drawing.Size(64, 24);
+			this.cmdOK.TabIndex = 0;
+			this.cmdOK.Text = "Search";
+			this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
+			// 
+			// pnlDescription
+			// 
+			this.pnlDescription.Controls.AddRange(new System.Windows.Forms.Control[] {
+																						 this.grpDescription});
+			this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.pnlDescription.Location = new System.Drawing.Point(0, 376);
+			this.pnlDescription.Name = "pnlDescription";
+			this.pnlDescription.Size = new System.Drawing.Size(488, 64);
+			this.pnlDescription.TabIndex = 47;
+			// 
+			// grpDescription
+			// 
+			this.grpDescription.Controls.AddRange(new System.Windows.Forms.Control[] {
+																						 this.lblDescription});
+			this.grpDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.grpDescription.Name = "grpDescription";
+			this.grpDescription.Size = new System.Drawing.Size(488, 64);
+			this.grpDescription.TabIndex = 0;
+			this.grpDescription.TabStop = false;
+			this.grpDescription.Text = "Description";
+			// 
+			// lblDescription
+			// 
+			this.lblDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.lblDescription.Location = new System.Drawing.Point(3, 16);
+			this.lblDescription.Name = "lblDescription";
+			this.lblDescription.Size = new System.Drawing.Size(482, 45);
+			this.lblDescription.TabIndex = 1;
+			this.lblDescription.Text = "Search for available appointment times using this panel.  You may narrow your sea" +
+				"rch by selecting an access type or by selecting specific days of the week or tim" +
+				"es of day.";
+			// 
+			// calStartDate
+			// 
+			this.calStartDate.Location = new System.Drawing.Point(24, 32);
+			this.calStartDate.Name = "calStartDate";
+			this.calStartDate.TabIndex = 48;
+			// 
+			// label1
+			// 
+			this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+			this.label1.Location = new System.Drawing.Point(16, 8);
+			this.label1.Name = "label1";
+			this.label1.Size = new System.Drawing.Size(208, 16);
+			this.label1.TabIndex = 49;
+			this.label1.Text = "Search for first availabiltiy after this date:";
+			// 
+			// grpTimeOfDay
+			// 
+			this.grpTimeOfDay.Controls.AddRange(new System.Windows.Forms.Control[] {
+																					   this.rdoBoth,
+																					   this.rdoPM,
+																					   this.rdoAM});
+			this.grpTimeOfDay.Location = new System.Drawing.Point(240, 16);
+			this.grpTimeOfDay.Name = "grpTimeOfDay";
+			this.grpTimeOfDay.Size = new System.Drawing.Size(240, 48);
+			this.grpTimeOfDay.TabIndex = 50;
+			this.grpTimeOfDay.TabStop = false;
+			this.grpTimeOfDay.Text = "Time of Day";
+			// 
+			// rdoBoth
+			// 
+			this.rdoBoth.Checked = true;
+			this.rdoBoth.Location = new System.Drawing.Point(176, 24);
+			this.rdoBoth.Name = "rdoBoth";
+			this.rdoBoth.Size = new System.Drawing.Size(48, 16);
+			this.rdoBoth.TabIndex = 2;
+			this.rdoBoth.TabStop = true;
+			this.rdoBoth.Text = "Both";
+			// 
+			// rdoPM
+			// 
+			this.rdoPM.Location = new System.Drawing.Point(96, 24);
+			this.rdoPM.Name = "rdoPM";
+			this.rdoPM.Size = new System.Drawing.Size(72, 16);
+			this.rdoPM.TabIndex = 1;
+			this.rdoPM.Text = "PM Only";
+			// 
+			// rdoAM
+			// 
+			this.rdoAM.Location = new System.Drawing.Point(16, 24);
+			this.rdoAM.Name = "rdoAM";
+			this.rdoAM.Size = new System.Drawing.Size(72, 16);
+			this.rdoAM.TabIndex = 0;
+			this.rdoAM.Text = "AM Only";
+			// 
+			// grpDayOfWeek
+			// 
+			this.grpDayOfWeek.Controls.AddRange(new System.Windows.Forms.Control[] {
+																					   this.chkSun,
+																					   this.chkSat,
+																					   this.chkFri,
+																					   this.chkThu,
+																					   this.chkWed,
+																					   this.chkTue,
+																					   this.chkMon});
+			this.grpDayOfWeek.Location = new System.Drawing.Point(240, 80);
+			this.grpDayOfWeek.Name = "grpDayOfWeek";
+			this.grpDayOfWeek.Size = new System.Drawing.Size(240, 104);
+			this.grpDayOfWeek.TabIndex = 51;
+			this.grpDayOfWeek.TabStop = false;
+			this.grpDayOfWeek.Text = "Day of the Week";
+			// 
+			// chkSun
+			// 
+			this.chkSun.Location = new System.Drawing.Point(176, 64);
+			this.chkSun.Name = "chkSun";
+			this.chkSun.Size = new System.Drawing.Size(48, 16);
+			this.chkSun.TabIndex = 6;
+			this.chkSun.Text = "Sun";
+			// 
+			// chkSat
+			// 
+			this.chkSat.Location = new System.Drawing.Point(128, 64);
+			this.chkSat.Name = "chkSat";
+			this.chkSat.Size = new System.Drawing.Size(48, 16);
+			this.chkSat.TabIndex = 5;
+			this.chkSat.Text = "Sat";
+			// 
+			// chkFri
+			// 
+			this.chkFri.Location = new System.Drawing.Point(72, 64);
+			this.chkFri.Name = "chkFri";
+			this.chkFri.Size = new System.Drawing.Size(48, 16);
+			this.chkFri.TabIndex = 4;
+			this.chkFri.Text = "Fri";
+			// 
+			// chkThu
+			// 
+			this.chkThu.Location = new System.Drawing.Point(16, 64);
+			this.chkThu.Name = "chkThu";
+			this.chkThu.Size = new System.Drawing.Size(48, 16);
+			this.chkThu.TabIndex = 3;
+			this.chkThu.Text = "Thu";
+			// 
+			// chkWed
+			// 
+			this.chkWed.Location = new System.Drawing.Point(128, 32);
+			this.chkWed.Name = "chkWed";
+			this.chkWed.Size = new System.Drawing.Size(48, 16);
+			this.chkWed.TabIndex = 2;
+			this.chkWed.Text = "Wed";
+			// 
+			// chkTue
+			// 
+			this.chkTue.Location = new System.Drawing.Point(72, 32);
+			this.chkTue.Name = "chkTue";
+			this.chkTue.Size = new System.Drawing.Size(48, 16);
+			this.chkTue.TabIndex = 1;
+			this.chkTue.Text = "Tue";
+			// 
+			// chkMon
+			// 
+			this.chkMon.Location = new System.Drawing.Point(16, 32);
+			this.chkMon.Name = "chkMon";
+			this.chkMon.Size = new System.Drawing.Size(48, 16);
+			this.chkMon.TabIndex = 0;
+			this.chkMon.Text = "Mon";
+			// 
+			// cboAccessTypeFilter
+			// 
+			this.cboAccessTypeFilter.Location = new System.Drawing.Point(72, 208);
+			this.cboAccessTypeFilter.Name = "cboAccessTypeFilter";
+			this.cboAccessTypeFilter.Size = new System.Drawing.Size(224, 21);
+			this.cboAccessTypeFilter.TabIndex = 52;
+			this.cboAccessTypeFilter.Text = "cboAccessTypeFilter";
+			this.cboAccessTypeFilter.SelectionChangeCommitted += new System.EventHandler(this.cboAccessTypeFilter_SelectionChangeCommitted);
+			// 
+			// lstAccessTypes
+			// 
+			this.lstAccessTypes.CheckOnClick = true;
+			this.lstAccessTypes.HorizontalScrollbar = true;
+			this.lstAccessTypes.Location = new System.Drawing.Point(72, 240);
+			this.lstAccessTypes.MultiColumn = true;
+			this.lstAccessTypes.Name = "lstAccessTypes";
+			this.lstAccessTypes.Size = new System.Drawing.Size(408, 124);
+			this.lstAccessTypes.TabIndex = 53;
+			// 
+			// label2
+			// 
+			this.label2.Location = new System.Drawing.Point(16, 208);
+			this.label2.Name = "label2";
+			this.label2.Size = new System.Drawing.Size(48, 32);
+			this.label2.TabIndex = 54;
+			this.label2.Text = "Access Group";
+			// 
+			// label3
+			// 
+			this.label3.Location = new System.Drawing.Point(16, 240);
+			this.label3.Name = "label3";
+			this.label3.Size = new System.Drawing.Size(56, 32);
+			this.label3.TabIndex = 55;
+			this.label3.Text = "Access Type";
+			// 
+			// DApptSearch
+			// 
+			this.AcceptButton = this.cmdOK;
+			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+			this.CancelButton = this.cmdCancel;
+			this.ClientSize = new System.Drawing.Size(488, 480);
+			this.Controls.AddRange(new System.Windows.Forms.Control[] {
+																		  this.label3,
+																		  this.label2,
+																		  this.lstAccessTypes,
+																		  this.cboAccessTypeFilter,
+																		  this.grpDayOfWeek,
+																		  this.grpTimeOfDay,
+																		  this.label1,
+																		  this.calStartDate,
+																		  this.pnlDescription,
+																		  this.panel1});
+			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+			this.Name = "DApptSearch";
+			this.Text = "DApptSearch";
+			this.panel1.ResumeLayout(false);
+			this.pnlDescription.ResumeLayout(false);
+			this.grpDescription.ResumeLayout(false);
+			this.grpTimeOfDay.ResumeLayout(false);
+			this.grpDayOfWeek.ResumeLayout(false);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		private void cboAccessTypeFilter_SelectionChangeCommitted(object sender, System.EventArgs e)
+		{
+			//Load Access Types listbox & filter
+			string sGroup = cboAccessTypeFilter.Text;
+			if (sGroup == "<Show All Access Types>")
+			{
+				LoadListBox("ALL");
+			}
+			else 
+			{
+				LoadListBox("SELECTED");
+			}			
+		}
+
+		private void cmdOK_Click(object sender, System.EventArgs e)
+		{
+			//Get the control data into local vars
+			UpdateDialogData(false);
+			
+			//Do the search
+			DataSet rsOut = new DataSet("AvailabilitySearch");
+			OleDbCommand cmd = m_RPMSConnection.CreateCommand();
+			System.Data.OleDb.OleDbDataAdapter da = new OleDbDataAdapter();
+			//Resource array, Begin date, Access type array, MTWTF , AM PM
+//			string sSql = "BSDX SEARCH AVAILABILITY^" + m_nAccessGroupID.ToString() + "^" + nAccessTypeID.ToString();
+//			cmd.CommandText = sSql;
+			da.SelectCommand = cmd;
+			da.Fill(rsOut, "AvailabilitySearch");
+
+			// if the result set count > 0 open the result dialog
+			// else display a "no availability found" messagebox and return
+
+			//if the return from the result dialog is cancel then return to the search dialog
+			//else close the search dialog with dialogresult.oi
+
+		}
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCancelAppt.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCancelAppt.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCancelAppt.cs	(revision 1134)
@@ -0,0 +1,580 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DCancelAppt.
+	/// </summary>
+	public class DCancelAppt : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Panel pnlPageBottom;
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.Button cmdOK;
+		private System.Windows.Forms.Panel pnlDescription;
+		private System.Windows.Forms.GroupBox grpDescriptionResourceGroup;
+		private System.Windows.Forms.Label lblDescriptionResourceGroup;
+		private System.Windows.Forms.GroupBox grpCancelledby;
+		private System.Windows.Forms.RadioButton rdoClinic;
+		private System.Windows.Forms.RadioButton rdoPatient;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.ListBox lstReason;
+		private System.Windows.Forms.TextBox txtNote;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.GroupBox grpAutoRebook;
+		private System.Windows.Forms.CheckBox chkAutoRebook;
+		private System.Windows.Forms.NumericUpDown udStart;
+		private System.Windows.Forms.NumericUpDown udMax;
+		private System.Windows.Forms.Label label3;
+		private System.Windows.Forms.Label label4;
+		private System.Windows.Forms.RadioButton rdoRebookSameType;
+		private System.Windows.Forms.RadioButton rdoRebookAnyType;
+		private System.Windows.Forms.RadioButton rdoRebookSelectedType;
+		private System.Windows.Forms.Label lblRebookSelectedType;
+		private System.Windows.Forms.Label label6;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public DCancelAppt()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+		}
+		#region Fields
+
+		private bool		m_bClinicCancelled = true;
+		private int			m_nReason = 0;
+		private string		m_sNote = "";
+		private DataTable	m_dtCR;
+		private DataView	m_dvCR;
+		private bool		m_bAutoRebook = false;
+		private int			m_nStart = 7;
+		private int			m_nMax = 30;
+
+		// -1: use current, -2: use any non-zero type, >0 use this access type id
+		private int			m_nRebookAccessType = -1;
+
+
+		#endregion Fields
+
+		#region Methods
+
+		public void InitializePage(CGDocumentManager DocManager)
+		{
+			m_bClinicCancelled = true;
+			m_nReason = 0;
+			m_sNote = "";
+
+			//Load Reasons listbox
+
+			m_dtCR = DocManager.RPMSDataTable(@"SELECT BMXIEN, NAME FROM CANCELLATION_REASONS WHERE INACTIVE=''", "CR");
+			m_dvCR = new DataView(m_dtCR);
+			m_dvCR.Sort = "NAME ASC";
+			lstReason.DataSource = m_dvCR;
+			lstReason.DisplayMember = "NAME";
+			lstReason.ValueMember = "BMXIEN";
+
+			UpdateDialogData(true);
+		}
+
+		/// <summary>
+		/// If b is true, moves member vars into control data
+		/// otherwise, moves control data into member vars
+		/// </summary>
+		/// <param name="b"></param>
+		private void UpdateDialogData(bool b)
+		{
+			if (b == true)
+			{
+				rdoClinic.Checked = m_bClinicCancelled;
+				if (m_nReason != 0)
+				{
+					lstReason.SelectedValue = m_nReason;
+				}
+				txtNote.Text = m_sNote;
+				chkAutoRebook.Checked = m_bAutoRebook;
+				udStart.Value = m_nStart;
+				udMax.Value = m_nMax;
+
+				this.rdoRebookSameType.Checked = true;
+				this.rdoRebookAnyType.Checked = false;
+				this.rdoRebookSelectedType.Checked = false;
+			}
+			else
+			{
+				m_bClinicCancelled = rdoClinic.Checked;
+				m_nReason = (int) lstReason.SelectedValue;
+				m_sNote = txtNote.Text;
+				m_bAutoRebook = chkAutoRebook.Checked;
+				m_nStart = (int) udStart.Value;
+				m_nMax = (int) udMax.Value;
+				if (this.rdoRebookSameType.Checked == true)
+				{
+					m_nRebookAccessType = -1;
+				}
+				else
+				{
+					m_nRebookAccessType = -2;
+				}
+
+			}
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		private void cmdOK_Click(object sender, System.EventArgs e)
+		{
+			this.UpdateDialogData(false);
+		}
+		#endregion Methods
+
+		#region Properties
+
+		/// <summary>
+		/// Sets or returns the rebook access type:  -1 = use current type, -2 = use any type, 0 = prompt for a type
+		/// </summary>
+		public int RebookAccessType
+		{
+			get
+			{
+				return m_nRebookAccessType;
+			}
+			set
+			{
+				m_nRebookAccessType = value;
+				if (m_nRebookAccessType == -1)
+				{
+					this.rdoRebookSameType.Checked = true;
+				}
+				else
+				{
+					this.rdoRebookAnyType.Checked = true;
+				}
+
+			}
+		}
+		/// <summary>
+		/// Returns true if appt cancelled by Clinic, otherwise false
+		/// </summary>
+		public bool ClinicCancelled
+		{
+			get
+			{
+				return m_bClinicCancelled;
+			}
+		}
+
+		/// <summary>
+		/// Returns value of AutoRebook check box
+		/// </summary>
+		public bool AutoRebook
+		{
+			get
+			{
+				return m_bAutoRebook;
+			}
+			set
+			{
+				m_bAutoRebook = value;
+			}
+		}
+
+		/// <summary>
+		/// Returns internal entry in the CANCELLATION REASON file (409.2)
+		/// </summary>
+		public int CancelReason
+		{
+			get
+			{
+				return m_nReason;
+			}
+		}
+
+		/// <summary>
+		/// Returns cancellation remarks.
+		/// </summary>
+		public string CancelRemarks
+		{
+			get
+			{
+				return m_sNote;
+			}
+		}
+
+		/// <summary>
+		/// Sets or returns the number of days in the future to start searching for availability
+		/// </summary>
+		public int RebookStartDays
+		{
+			get
+			{
+				return m_nStart;
+			}
+			set
+			{
+				m_nStart = value;
+			}
+		}
+
+		/// <summary>
+		/// Sets and returns the maximum number of days in the future to look for rebook availability
+		/// </summary>
+		public int RebookMaxDays
+		{
+			get
+			{
+				return m_nMax;
+			}
+			set
+			{
+				m_nMax = value;
+			}
+		}
+
+		#endregion Properties
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.pnlPageBottom = new System.Windows.Forms.Panel();
+			this.cmdCancel = new System.Windows.Forms.Button();
+			this.cmdOK = new System.Windows.Forms.Button();
+			this.pnlDescription = new System.Windows.Forms.Panel();
+			this.grpDescriptionResourceGroup = new System.Windows.Forms.GroupBox();
+			this.lblDescriptionResourceGroup = new System.Windows.Forms.Label();
+			this.grpCancelledby = new System.Windows.Forms.GroupBox();
+			this.rdoPatient = new System.Windows.Forms.RadioButton();
+			this.rdoClinic = new System.Windows.Forms.RadioButton();
+			this.lstReason = new System.Windows.Forms.ListBox();
+			this.label1 = new System.Windows.Forms.Label();
+			this.txtNote = new System.Windows.Forms.TextBox();
+			this.label2 = new System.Windows.Forms.Label();
+			this.grpAutoRebook = new System.Windows.Forms.GroupBox();
+			this.label6 = new System.Windows.Forms.Label();
+			this.lblRebookSelectedType = new System.Windows.Forms.Label();
+			this.rdoRebookSameType = new System.Windows.Forms.RadioButton();
+			this.label3 = new System.Windows.Forms.Label();
+			this.udMax = new System.Windows.Forms.NumericUpDown();
+			this.udStart = new System.Windows.Forms.NumericUpDown();
+			this.chkAutoRebook = new System.Windows.Forms.CheckBox();
+			this.label4 = new System.Windows.Forms.Label();
+			this.rdoRebookAnyType = new System.Windows.Forms.RadioButton();
+			this.rdoRebookSelectedType = new System.Windows.Forms.RadioButton();
+			this.pnlPageBottom.SuspendLayout();
+			this.pnlDescription.SuspendLayout();
+			this.grpDescriptionResourceGroup.SuspendLayout();
+			this.grpCancelledby.SuspendLayout();
+			this.grpAutoRebook.SuspendLayout();
+			((System.ComponentModel.ISupportInitialize)(this.udMax)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.udStart)).BeginInit();
+			this.SuspendLayout();
+			// 
+			// pnlPageBottom
+			// 
+			this.pnlPageBottom.Controls.Add(this.cmdCancel);
+			this.pnlPageBottom.Controls.Add(this.cmdOK);
+			this.pnlPageBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.pnlPageBottom.Location = new System.Drawing.Point(0, 488);
+			this.pnlPageBottom.Name = "pnlPageBottom";
+			this.pnlPageBottom.Size = new System.Drawing.Size(594, 40);
+			this.pnlPageBottom.TabIndex = 6;
+			// 
+			// cmdCancel
+			// 
+			this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.cmdCancel.Location = new System.Drawing.Point(512, 8);
+			this.cmdCancel.Name = "cmdCancel";
+			this.cmdCancel.Size = new System.Drawing.Size(56, 24);
+			this.cmdCancel.TabIndex = 2;
+			this.cmdCancel.Text = "Cancel";
+			// 
+			// cmdOK
+			// 
+			this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+			this.cmdOK.Location = new System.Drawing.Point(432, 8);
+			this.cmdOK.Name = "cmdOK";
+			this.cmdOK.Size = new System.Drawing.Size(64, 24);
+			this.cmdOK.TabIndex = 1;
+			this.cmdOK.Text = "OK";
+			this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
+			// 
+			// pnlDescription
+			// 
+			this.pnlDescription.Controls.Add(this.grpDescriptionResourceGroup);
+			this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.pnlDescription.Location = new System.Drawing.Point(0, 416);
+			this.pnlDescription.Name = "pnlDescription";
+			this.pnlDescription.Size = new System.Drawing.Size(594, 72);
+			this.pnlDescription.TabIndex = 7;
+			// 
+			// grpDescriptionResourceGroup
+			// 
+			this.grpDescriptionResourceGroup.Controls.Add(this.lblDescriptionResourceGroup);
+			this.grpDescriptionResourceGroup.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.grpDescriptionResourceGroup.Location = new System.Drawing.Point(0, 0);
+			this.grpDescriptionResourceGroup.Name = "grpDescriptionResourceGroup";
+			this.grpDescriptionResourceGroup.Size = new System.Drawing.Size(594, 72);
+			this.grpDescriptionResourceGroup.TabIndex = 1;
+			this.grpDescriptionResourceGroup.TabStop = false;
+			this.grpDescriptionResourceGroup.Text = "Description";
+			// 
+			// lblDescriptionResourceGroup
+			// 
+			this.lblDescriptionResourceGroup.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.lblDescriptionResourceGroup.Location = new System.Drawing.Point(3, 16);
+			this.lblDescriptionResourceGroup.Name = "lblDescriptionResourceGroup";
+			this.lblDescriptionResourceGroup.Size = new System.Drawing.Size(588, 53);
+			this.lblDescriptionResourceGroup.TabIndex = 0;
+			this.lblDescriptionResourceGroup.Text = @"Use this panel to cancel an appointment. Indicate whether the appointment was cancelled by the clinic or by the patient.  Select a reason for the cancellation.  Enter remarks in the text box.  To automatically rebook cancelled appointments, check the Auto Rebook box.  The Start Time in Days and Maximum Days values control the time window for rebooked appointments.";
+			// 
+			// grpCancelledby
+			// 
+			this.grpCancelledby.Controls.Add(this.rdoPatient);
+			this.grpCancelledby.Controls.Add(this.rdoClinic);
+			this.grpCancelledby.Location = new System.Drawing.Point(24, 24);
+			this.grpCancelledby.Name = "grpCancelledby";
+			this.grpCancelledby.Size = new System.Drawing.Size(256, 80);
+			this.grpCancelledby.TabIndex = 8;
+			this.grpCancelledby.TabStop = false;
+			this.grpCancelledby.Text = "Appointment Cancelled By";
+			// 
+			// rdoPatient
+			// 
+			this.rdoPatient.Location = new System.Drawing.Point(24, 48);
+			this.rdoPatient.Name = "rdoPatient";
+			this.rdoPatient.Size = new System.Drawing.Size(160, 16);
+			this.rdoPatient.TabIndex = 1;
+			this.rdoPatient.Text = "Cancelled by Patient";
+			// 
+			// rdoClinic
+			// 
+			this.rdoClinic.Location = new System.Drawing.Point(24, 24);
+			this.rdoClinic.Name = "rdoClinic";
+			this.rdoClinic.Size = new System.Drawing.Size(160, 16);
+			this.rdoClinic.TabIndex = 0;
+			this.rdoClinic.Text = "Cancelled by Clinic";
+			// 
+			// lstReason
+			// 
+			this.lstReason.ColumnWidth = 250;
+			this.lstReason.Location = new System.Drawing.Point(24, 136);
+			this.lstReason.Name = "lstReason";
+			this.lstReason.Size = new System.Drawing.Size(256, 264);
+			this.lstReason.TabIndex = 9;
+			// 
+			// label1
+			// 
+			this.label1.Location = new System.Drawing.Point(24, 112);
+			this.label1.Name = "label1";
+			this.label1.Size = new System.Drawing.Size(248, 16);
+			this.label1.TabIndex = 10;
+			this.label1.Text = "Reason for Cancellation (Select one)";
+			// 
+			// txtNote
+			// 
+			this.txtNote.Location = new System.Drawing.Point(312, 304);
+			this.txtNote.Multiline = true;
+			this.txtNote.Name = "txtNote";
+			this.txtNote.Size = new System.Drawing.Size(272, 96);
+			this.txtNote.TabIndex = 11;
+			this.txtNote.Text = "";
+			// 
+			// label2
+			// 
+			this.label2.Location = new System.Drawing.Point(312, 280);
+			this.label2.Name = "label2";
+			this.label2.Size = new System.Drawing.Size(280, 64);
+			this.label2.TabIndex = 10;
+			this.label2.Text = "Remarks (Optional)";
+			// 
+			// grpAutoRebook
+			// 
+			this.grpAutoRebook.Controls.Add(this.label6);
+			this.grpAutoRebook.Controls.Add(this.lblRebookSelectedType);
+			this.grpAutoRebook.Controls.Add(this.rdoRebookSameType);
+			this.grpAutoRebook.Controls.Add(this.label3);
+			this.grpAutoRebook.Controls.Add(this.udMax);
+			this.grpAutoRebook.Controls.Add(this.udStart);
+			this.grpAutoRebook.Controls.Add(this.chkAutoRebook);
+			this.grpAutoRebook.Controls.Add(this.label4);
+			this.grpAutoRebook.Controls.Add(this.rdoRebookAnyType);
+			this.grpAutoRebook.Controls.Add(this.rdoRebookSelectedType);
+			this.grpAutoRebook.Location = new System.Drawing.Point(312, 24);
+			this.grpAutoRebook.Name = "grpAutoRebook";
+			this.grpAutoRebook.Size = new System.Drawing.Size(272, 248);
+			this.grpAutoRebook.TabIndex = 13;
+			this.grpAutoRebook.TabStop = false;
+			this.grpAutoRebook.Text = "Auto Rebook";
+			// 
+			// label6
+			// 
+			this.label6.Location = new System.Drawing.Point(16, 128);
+			this.label6.Name = "label6";
+			this.label6.Size = new System.Drawing.Size(232, 16);
+			this.label6.TabIndex = 19;
+			this.label6.Text = "Access Type for Rebooked Appointment:";
+			// 
+			// lblRebookSelectedType
+			// 
+			this.lblRebookSelectedType.Enabled = false;
+			this.lblRebookSelectedType.Location = new System.Drawing.Point(64, 224);
+			this.lblRebookSelectedType.Name = "lblRebookSelectedType";
+			this.lblRebookSelectedType.Size = new System.Drawing.Size(168, 16);
+			this.lblRebookSelectedType.TabIndex = 18;
+			// 
+			// rdoRebookSameType
+			// 
+			this.rdoRebookSameType.Location = new System.Drawing.Point(24, 152);
+			this.rdoRebookSameType.Name = "rdoRebookSameType";
+			this.rdoRebookSameType.Size = new System.Drawing.Size(160, 16);
+			this.rdoRebookSameType.TabIndex = 17;
+			this.rdoRebookSameType.Text = "Same as Current";
+			// 
+			// label3
+			// 
+			this.label3.Location = new System.Drawing.Point(88, 56);
+			this.label3.Name = "label3";
+			this.label3.Size = new System.Drawing.Size(104, 16);
+			this.label3.TabIndex = 16;
+			this.label3.Text = "Start time in Days";
+			// 
+			// udMax
+			// 
+			this.udMax.Increment = new System.Decimal(new int[] {
+																	7,
+																	0,
+																	0,
+																	0});
+			this.udMax.Location = new System.Drawing.Point(16, 88);
+			this.udMax.Maximum = new System.Decimal(new int[] {
+																  730,
+																  0,
+																  0,
+																  0});
+			this.udMax.Minimum = new System.Decimal(new int[] {
+																  1,
+																  0,
+																  0,
+																  0});
+			this.udMax.Name = "udMax";
+			this.udMax.Size = new System.Drawing.Size(56, 20);
+			this.udMax.TabIndex = 15;
+			this.udMax.Value = new System.Decimal(new int[] {
+																30,
+																0,
+																0,
+																0});
+			// 
+			// udStart
+			// 
+			this.udStart.Location = new System.Drawing.Point(16, 54);
+			this.udStart.Maximum = new System.Decimal(new int[] {
+																	730,
+																	0,
+																	0,
+																	0});
+			this.udStart.Name = "udStart";
+			this.udStart.Size = new System.Drawing.Size(56, 20);
+			this.udStart.TabIndex = 14;
+			this.udStart.Value = new System.Decimal(new int[] {
+																  14,
+																  0,
+																  0,
+																  0});
+			// 
+			// chkAutoRebook
+			// 
+			this.chkAutoRebook.Location = new System.Drawing.Point(16, 24);
+			this.chkAutoRebook.Name = "chkAutoRebook";
+			this.chkAutoRebook.Size = new System.Drawing.Size(120, 16);
+			this.chkAutoRebook.TabIndex = 13;
+			this.chkAutoRebook.Text = "Auto Rebook";
+			// 
+			// label4
+			// 
+			this.label4.Location = new System.Drawing.Point(88, 88);
+			this.label4.Name = "label4";
+			this.label4.Size = new System.Drawing.Size(104, 16);
+			this.label4.TabIndex = 16;
+			this.label4.Text = "Maximum Days";
+			// 
+			// rdoRebookAnyType
+			// 
+			this.rdoRebookAnyType.Location = new System.Drawing.Point(24, 176);
+			this.rdoRebookAnyType.Name = "rdoRebookAnyType";
+			this.rdoRebookAnyType.Size = new System.Drawing.Size(160, 16);
+			this.rdoRebookAnyType.TabIndex = 17;
+			this.rdoRebookAnyType.Text = "Any Access Type";
+			// 
+			// rdoRebookSelectedType
+			// 
+			this.rdoRebookSelectedType.Enabled = false;
+			this.rdoRebookSelectedType.Location = new System.Drawing.Point(24, 200);
+			this.rdoRebookSelectedType.Name = "rdoRebookSelectedType";
+			this.rdoRebookSelectedType.Size = new System.Drawing.Size(136, 16);
+			this.rdoRebookSelectedType.TabIndex = 17;
+			this.rdoRebookSelectedType.Text = "Selected Access Type:";
+			// 
+			// DCancelAppt
+			// 
+			this.AcceptButton = this.cmdOK;
+			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+			this.CancelButton = this.cmdCancel;
+			this.ClientSize = new System.Drawing.Size(594, 528);
+			this.ControlBox = false;
+			this.Controls.Add(this.grpAutoRebook);
+			this.Controls.Add(this.txtNote);
+			this.Controls.Add(this.label1);
+			this.Controls.Add(this.lstReason);
+			this.Controls.Add(this.grpCancelledby);
+			this.Controls.Add(this.pnlDescription);
+			this.Controls.Add(this.pnlPageBottom);
+			this.Controls.Add(this.label2);
+			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+			this.Name = "DCancelAppt";
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "Cancel Appointment";
+			this.pnlPageBottom.ResumeLayout(false);
+			this.pnlDescription.ResumeLayout(false);
+			this.grpDescriptionResourceGroup.ResumeLayout(false);
+			this.grpCancelledby.ResumeLayout(false);
+			this.grpAutoRebook.ResumeLayout(false);
+			((System.ComponentModel.ISupportInitialize)(this.udMax)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.udStart)).EndInit();
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+
+
+
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCancelAppt.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCancelAppt.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCancelAppt.resx	(revision 1134)
@@ -0,0 +1,391 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="pnlPageBottom.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="pnlPageBottom.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="pnlPageBottom.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="pnlPageBottom.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="pnlPageBottom.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="pnlPageBottom.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdCancel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdCancel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdCancel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdOK.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="pnlDescription.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="pnlDescription.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="pnlDescription.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="pnlDescription.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="pnlDescription.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="pnlDescription.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="grpDescriptionResourceGroup.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="grpDescriptionResourceGroup.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="grpDescriptionResourceGroup.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="grpDescriptionResourceGroup.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="grpDescriptionResourceGroup.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="grpDescriptionResourceGroup.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="lblDescriptionResourceGroup.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="lblDescriptionResourceGroup.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lblDescriptionResourceGroup.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="grpCancelledby.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="grpCancelledby.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="grpCancelledby.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="grpCancelledby.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="grpCancelledby.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="grpCancelledby.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoPatient.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="rdoPatient.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoPatient.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoClinic.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="rdoClinic.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoClinic.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lstReason.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lstReason.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="lstReason.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtNote.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtNote.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtNote.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="grpAutoRebook.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="grpAutoRebook.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="grpAutoRebook.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="grpAutoRebook.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="grpAutoRebook.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="grpAutoRebook.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label6.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label6.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label6.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lblRebookSelectedType.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="lblRebookSelectedType.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lblRebookSelectedType.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoRebookSameType.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="rdoRebookSameType.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoRebookSameType.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="udMax.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="udMax.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="udMax.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="udStart.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="udStart.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="udStart.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="chkAutoRebook.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="chkAutoRebook.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="chkAutoRebook.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label4.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label4.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label4.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoRebookAnyType.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="rdoRebookAnyType.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoRebookAnyType.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoRebookSelectedType.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="rdoRebookSelectedType.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoRebookSelectedType.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Name">
+    <value>DCancelAppt</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCheckIn.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCheckIn.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCheckIn.cs	(revision 1134)
@@ -0,0 +1,482 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+using System.Diagnostics;
+using IndianHealthService.BMXNet;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+    /// <summary>
+    /// Summary description for DCheckIn.
+    /// </summary>
+    public class DCheckIn : System.Windows.Forms.Form
+    {
+        private IContainer components;
+
+        public DCheckIn()
+        {
+            //
+            // Required for Windows Form Designer support
+            //
+            InitializeComponent();
+
+            
+        }
+
+
+        #region Fields
+        private System.Windows.Forms.Panel pnlPageBottom;
+        private System.Windows.Forms.Button cmdCancel;
+        private System.Windows.Forms.Button cmdOK;
+        private System.Windows.Forms.Panel pnlDescription;
+        private System.Windows.Forms.GroupBox grpDescriptionResourceGroup;
+        private System.Windows.Forms.Label lblDescriptionResourceGroup;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.DateTimePicker dtpCheckIn;
+        private System.Windows.Forms.Label lblAlready;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label lblPatientName;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.ComboBox cboProvider;
+        private System.Windows.Forms.CheckBox chkRoutingSlip;
+
+        private string m_sPatientName;
+        private DateTime m_dCheckIn;
+        private string m_sProviderIEN;
+        private CGDocumentManager m_DocManager;
+        private DataSet m_dsGlobal;
+        private DataTable m_dtProvider;
+        public bool m_bPrintRouteSlip;
+        private List<Provider> _providers;
+        private ToolTip toolTip1;
+        private bool _myCodeIsFiringIstheCheckBoxChangedEvent; // To prevent the event from firing when I set the control from code
+        
+        #endregion Fields
+
+        #region Properties
+
+        /// <summary>
+        /// Returns Provider chosen for Check-In
+        /// </summary>
+        public Provider Provider
+        {
+            get
+            {
+                if (cboProvider.SelectedIndex < 1) return null; // because first item is empty placeholder
+                else return this._providers[cboProvider.SelectedIndex];
+            }
+        }
+
+        /// <summary>
+        /// Returns 'true' if routing slip to be printed; otherwise 'false'
+        /// </summary>
+        public bool PrintRouteSlip
+        {
+            get
+            {
+                return m_bPrintRouteSlip;
+            }
+        }
+
+        /// <summary>
+        /// Appointment checkin time
+        /// </summary>
+        public DateTime CheckInTime
+        {
+            get
+            {
+                return m_dCheckIn;
+            }
+            set
+            {
+                m_dCheckIn = value;
+            }
+        }
+
+        #endregion Properties
+
+        #region Methods
+
+        /// <summary>
+        /// Fill memeber variables before showing dialog
+        /// </summary>
+        /// <param name="a">Appointment</param>
+        /// <param name="docManager">Document Manager</param>
+        public void InitializePage(CGAppointment a)
+        {
+            m_DocManager = CGDocumentManager.Current;
+            m_dsGlobal = m_DocManager.GlobalDataSet;
+
+            Int32? nHospLoc = (from resource in m_dsGlobal.Tables["Resources"].AsEnumerable()
+                           where resource.Field<string>("RESOURCE_NAME") == a.Resource
+                           select resource.Field<Int32?>("HOSPITAL_LOCATION_ID"))
+                           .SingleOrDefault();
+
+            //smh - following logic replaced with above...
+            /*
+            DataView rv = new DataView(this.m_DocManager.GlobalDataSet.Tables["Resources"]);
+            rv.Sort = "RESOURCE_NAME ASC";
+            int nFind = rv.Find((string)a.Resource);
+            DataRowView drv = rv[nFind];
+
+            string sHospLoc = drv["HOSPITAL_LOCATION_ID"].ToString();
+            sHospLoc = (sHospLoc == "") ? "0" : sHospLoc;
+            int nHospLoc = 0;
+            try
+            {
+                nHospLoc = Convert.ToInt32(sHospLoc);
+            }
+            catch (Exception ex)
+            {
+                Debug.Write("CGView.AppointmentCheckIn Error: " + ex.Message);
+            }
+            */
+
+            //smh new code
+            //if the resource is linked to a valid hospital location, grab this locations providers
+            //from the provider multiple and put them in the combo box.
+            if (nHospLoc != null)
+            {
+                //RPC BSDX HOSP LOC PROVIDERS returns Table w/ Columns: 
+                //HOSPITAL_LOCATION_ID^BMXIEN (ie Prov IEN)^NAME^DEFALUT
+                string sCommandText = "BSDX HOSP LOC PROVIDERS^" + nHospLoc;
+                m_dtProvider = m_DocManager.RPMSDataTable(sCommandText, "ClinicProviders");
+                
+                _providers = (from providerRow in m_dtProvider.AsEnumerable()
+                              orderby providerRow.Field<string>("NAME")
+                             select new Provider
+                             {
+                                 IEN = providerRow.Field<int>("BMXIEN"),
+                                 Name = providerRow.Field<string>("NAME"),
+                                 Default = providerRow.Field<string>("DEFAULT") == "YES" ? true : false
+                             }).ToList();
+
+
+
+                //cboProvider.DisplayMember = "NAME";
+                //cboProvider.ValueMember = "BMXIEN";
+                _providers.Insert(0, new Provider { Name = "<None>", IEN = -1 });
+                cboProvider.DataSource = _providers;
+                cboProvider.SelectedIndex = _providers.FindIndex(prov => prov.Default);
+                // if no provider is default, set default to be <none> item.
+                if (cboProvider.SelectedIndex == -1) cboProvider.SelectedIndex = 0;
+                ////Add None to the top of the list
+                //DataRow drProv = m_dtProvider.NewRow();
+                //drProv.BeginEdit();
+                //drProv["HOSPITAL_LOCATION_ID"] = 0;
+                //drProv["NAME"] = "<None>";
+                //drProv["BMXIEN"] = 0;
+                //drProv.EndEdit();
+                //m_dtProvider.Rows.InsertAt(drProv, 0);
+                ////cboProvider.SelectedIndex = 0;
+
+                //Find default provider--search for Yes in Field DEFAULT            
+                //DataRow[] nRow = m_dtProvider.Select("DEFAULT='YES'", "NAME ASC");
+                //if (nRow.Length > 0) nFind = m_dtProvider.Rows.IndexOf(nRow[0]);
+                
+
+            }
+            //otherwise, just use the default provider table
+            else
+            {
+
+                _providers = (from providerRow in m_dsGlobal.Tables["Provider"].AsEnumerable()
+                              orderby providerRow.Field<string>("NAME")
+                              select new Provider
+                              {
+                                  IEN = providerRow.Field<int>("BMXIEN"),
+                                  Name = providerRow.Field<string>("NAME"),
+                                  Default = false
+                              }).ToList();
+
+                
+                /*m_dtProvider = m_dsGlobal.Tables["Provider"];
+                m_dtProvider.DefaultView.Sort = "NAME ASC";*/
+                _providers.Insert(0, new Provider { Name = "<None>", IEN = -1 });
+                cboProvider.DataSource = _providers;
+                cboProvider.SelectedIndex = 0;
+                //cboProvider.DisplayMember = "NAME";
+                //cboProvider.ValueMember = "BMXIEN";
+
+                //Add None to the top of the list
+                //DataRow drProv = m_dtProvider.NewRow();
+                //drProv.BeginEdit();
+                //drProv["NAME"] = "<None>";
+                //drProv["BMXIEN"] = 0;
+                //drProv.EndEdit();
+                //m_dtProvider.Rows.InsertAt(drProv, 0);
+                //cboProvider.SelectedIndex = 0;
+            }
+
+                            
+
+            m_sPatientName = a.PatientName;
+            if (a.CheckInTime.Ticks != 0)
+            {
+                m_dCheckIn = a.CheckInTime;
+                dtpCheckIn.Enabled = false;
+                this.cboProvider.Enabled = false;
+                lblAlready.Visible = true;
+            }
+            else
+            {
+                m_dCheckIn = DateTime.Now;
+            }
+
+            _myCodeIsFiringIstheCheckBoxChangedEvent = true;
+            chkRoutingSlip.Checked = CGDocumentManager.Current.UserPreferences.PrintRoutingSlipAutomatically;
+            _myCodeIsFiringIstheCheckBoxChangedEvent = false;
+
+            UpdateDialogData(true);
+        }
+
+
+        /// <summary>
+        /// If b is true, moves member vars into control data
+        /// otherwise, moves control data into member vars
+        /// </summary>
+        /// <param name="b"></param>
+        private void UpdateDialogData(bool b)
+        {
+            if (b == true) //Move data to dialog controls from member variables
+            {
+                this.lblPatientName.Text = m_sPatientName;
+                this.dtpCheckIn.Value = m_dCheckIn;
+            }
+            else //Move data to member variables from dialog controls
+            {
+                m_dCheckIn = this.dtpCheckIn.Value;
+                m_sProviderIEN = this.cboProvider.SelectedValue.ToString();
+                m_bPrintRouteSlip = chkRoutingSlip.Checked;
+            }
+        }
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing)
+            {
+                if (components != null)
+                {
+                    components.Dispose();
+                }
+            }
+            base.Dispose(disposing);
+        }
+        #endregion Methods
+
+        #region Windows Form Designer generated code
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            this.pnlPageBottom = new System.Windows.Forms.Panel();
+            this.cmdCancel = new System.Windows.Forms.Button();
+            this.cmdOK = new System.Windows.Forms.Button();
+            this.pnlDescription = new System.Windows.Forms.Panel();
+            this.grpDescriptionResourceGroup = new System.Windows.Forms.GroupBox();
+            this.lblDescriptionResourceGroup = new System.Windows.Forms.Label();
+            this.label1 = new System.Windows.Forms.Label();
+            this.dtpCheckIn = new System.Windows.Forms.DateTimePicker();
+            this.lblAlready = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.lblPatientName = new System.Windows.Forms.Label();
+            this.cboProvider = new System.Windows.Forms.ComboBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.chkRoutingSlip = new System.Windows.Forms.CheckBox();
+            this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
+            this.pnlPageBottom.SuspendLayout();
+            this.pnlDescription.SuspendLayout();
+            this.grpDescriptionResourceGroup.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // pnlPageBottom
+            // 
+            this.pnlPageBottom.Controls.Add(this.cmdCancel);
+            this.pnlPageBottom.Controls.Add(this.cmdOK);
+            this.pnlPageBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlPageBottom.Location = new System.Drawing.Point(0, 203);
+            this.pnlPageBottom.Name = "pnlPageBottom";
+            this.pnlPageBottom.Size = new System.Drawing.Size(520, 40);
+            this.pnlPageBottom.TabIndex = 5;
+            // 
+            // cmdCancel
+            // 
+            this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.cmdCancel.Location = new System.Drawing.Point(440, 8);
+            this.cmdCancel.Name = "cmdCancel";
+            this.cmdCancel.Size = new System.Drawing.Size(56, 24);
+            this.cmdCancel.TabIndex = 2;
+            this.cmdCancel.Text = "Cancel";
+            // 
+            // cmdOK
+            // 
+            this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.cmdOK.Location = new System.Drawing.Point(360, 8);
+            this.cmdOK.Name = "cmdOK";
+            this.cmdOK.Size = new System.Drawing.Size(64, 24);
+            this.cmdOK.TabIndex = 1;
+            this.cmdOK.Text = "OK";
+            this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
+            // 
+            // pnlDescription
+            // 
+            this.pnlDescription.Controls.Add(this.grpDescriptionResourceGroup);
+            this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlDescription.Location = new System.Drawing.Point(0, 131);
+            this.pnlDescription.Name = "pnlDescription";
+            this.pnlDescription.Size = new System.Drawing.Size(520, 72);
+            this.pnlDescription.TabIndex = 6;
+            // 
+            // grpDescriptionResourceGroup
+            // 
+            this.grpDescriptionResourceGroup.Controls.Add(this.lblDescriptionResourceGroup);
+            this.grpDescriptionResourceGroup.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grpDescriptionResourceGroup.Location = new System.Drawing.Point(0, 0);
+            this.grpDescriptionResourceGroup.Name = "grpDescriptionResourceGroup";
+            this.grpDescriptionResourceGroup.Size = new System.Drawing.Size(520, 72);
+            this.grpDescriptionResourceGroup.TabIndex = 1;
+            this.grpDescriptionResourceGroup.TabStop = false;
+            this.grpDescriptionResourceGroup.Text = "Description";
+            // 
+            // lblDescriptionResourceGroup
+            // 
+            this.lblDescriptionResourceGroup.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lblDescriptionResourceGroup.Location = new System.Drawing.Point(3, 16);
+            this.lblDescriptionResourceGroup.Name = "lblDescriptionResourceGroup";
+            this.lblDescriptionResourceGroup.Size = new System.Drawing.Size(514, 53);
+            this.lblDescriptionResourceGroup.TabIndex = 0;
+            this.lblDescriptionResourceGroup.Text = "Use this panel to check in an appointment. A patient may only be checked-in once." +
+                "";
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(16, 16);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(80, 16);
+            this.label1.TabIndex = 7;
+            this.label1.Text = "Patient Name:";
+            // 
+            // dtpCheckIn
+            // 
+            this.dtpCheckIn.AllowDrop = true;
+            this.dtpCheckIn.CustomFormat = "MMMM dd yyyy H:mm";
+            this.dtpCheckIn.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+            this.dtpCheckIn.Location = new System.Drawing.Point(96, 48);
+            this.dtpCheckIn.Name = "dtpCheckIn";
+            this.dtpCheckIn.ShowUpDown = true;
+            this.dtpCheckIn.Size = new System.Drawing.Size(176, 20);
+            this.dtpCheckIn.TabIndex = 9;
+            // 
+            // lblAlready
+            // 
+            this.lblAlready.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.lblAlready.ForeColor = System.Drawing.Color.Green;
+            this.lblAlready.Location = new System.Drawing.Point(288, 40);
+            this.lblAlready.Name = "lblAlready";
+            this.lblAlready.Size = new System.Drawing.Size(192, 32);
+            this.lblAlready.TabIndex = 10;
+            this.lblAlready.Text = "This Patient is already checked in.";
+            this.lblAlready.Visible = false;
+            // 
+            // label3
+            // 
+            this.label3.Location = new System.Drawing.Point(16, 48);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(80, 16);
+            this.label3.TabIndex = 7;
+            this.label3.Text = "Check-in Time:";
+            // 
+            // lblPatientName
+            // 
+            this.lblPatientName.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.lblPatientName.Location = new System.Drawing.Point(96, 16);
+            this.lblPatientName.Name = "lblPatientName";
+            this.lblPatientName.Size = new System.Drawing.Size(256, 16);
+            this.lblPatientName.TabIndex = 11;
+            // 
+            // cboProvider
+            // 
+            this.cboProvider.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cboProvider.Location = new System.Drawing.Point(96, 88);
+            this.cboProvider.Name = "cboProvider";
+            this.cboProvider.Size = new System.Drawing.Size(240, 21);
+            this.cboProvider.TabIndex = 12;
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(16, 88);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(80, 16);
+            this.label2.TabIndex = 7;
+            this.label2.Text = "Visit Provider:";
+            // 
+            // chkRoutingSlip
+            // 
+            this.chkRoutingSlip.Location = new System.Drawing.Point(380, 93);
+            this.chkRoutingSlip.Name = "chkRoutingSlip";
+            this.chkRoutingSlip.Size = new System.Drawing.Size(128, 16);
+            this.chkRoutingSlip.TabIndex = 14;
+            this.chkRoutingSlip.Text = "Print Routing Slip";
+            this.toolTip1.SetToolTip(this.chkRoutingSlip, "Prints routing slip to the Windows Default Printer");
+            this.chkRoutingSlip.CheckedChanged += new System.EventHandler(this.chkRoutingSlip_CheckedChanged);
+            // 
+            // DCheckIn
+            // 
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.ClientSize = new System.Drawing.Size(520, 243);
+            this.Controls.Add(this.chkRoutingSlip);
+            this.Controls.Add(this.cboProvider);
+            this.Controls.Add(this.lblPatientName);
+            this.Controls.Add(this.lblAlready);
+            this.Controls.Add(this.dtpCheckIn);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.pnlDescription);
+            this.Controls.Add(this.pnlPageBottom);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.label2);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.Name = "DCheckIn";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Appointment Check In";
+            this.pnlPageBottom.ResumeLayout(false);
+            this.pnlDescription.ResumeLayout(false);
+            this.grpDescriptionResourceGroup.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+        #endregion
+
+        #region Events
+
+        private void cmdOK_Click(object sender, System.EventArgs e)
+        {
+            this.UpdateDialogData(false);
+        }
+
+        /// <summary>
+        /// Save this in User Preferences Object.
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void chkRoutingSlip_CheckedChanged(object sender, EventArgs e)
+        {
+            if (_myCodeIsFiringIstheCheckBoxChangedEvent) return;
+
+            CGDocumentManager.Current.UserPreferences.PrintRoutingSlipAutomatically = chkRoutingSlip.Checked;
+        }
+
+        #endregion Events
+
+    }
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCheckIn.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCheckIn.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCheckIn.resx	(revision 1134)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCopyAppts.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCopyAppts.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCopyAppts.cs	(revision 1134)
@@ -0,0 +1,297 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+using IndianHealthService.BMXNet;
+using System.Threading;
+using System.Net;
+using System.Net.Sockets;
+using System.Diagnostics;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DCopyAppts.
+	/// </summary>
+	public class DCopyAppts : System.Windows.Forms.Form
+    {
+		private System.Windows.Forms.Button cmdOK;
+        private System.Windows.Forms.Panel pnlOKCancel;
+		private System.Windows.Forms.Label lblSummary;
+		private System.Windows.Forms.Label lblProgress;
+		private System.ComponentModel.IContainer components;
+
+
+        #region Fields
+        private DateTime			m_dtBegin;
+		private DateTime			m_dtEnd;
+		private string				m_HospLocationID;
+		private string				m_HospLocationName;
+		private string				m_ResourceID;
+		private string				m_ResourceName;
+		private string				m_sTask;
+		private CGDocumentManager	m_DocManager;
+
+		private System.Windows.Forms.Timer timerPoll;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.Label label2;
+
+		//protected delegate void UpdateDisplayDelegate(string sText);
+		//protected delegate void RegisterEventDelegate(string sPort, string sEvent);
+
+        #endregion Fields
+
+        public DCopyAppts()
+		{
+			InitializeComponent();
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.components = new System.ComponentModel.Container();
+            this.pnlOKCancel = new System.Windows.Forms.Panel();
+            this.cmdOK = new System.Windows.Forms.Button();
+            this.lblSummary = new System.Windows.Forms.Label();
+            this.lblProgress = new System.Windows.Forms.Label();
+            this.timerPoll = new System.Windows.Forms.Timer(this.components);
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.pnlOKCancel.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // pnlOKCancel
+            // 
+            this.pnlOKCancel.Controls.Add(this.cmdOK);
+            this.pnlOKCancel.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlOKCancel.Location = new System.Drawing.Point(0, 211);
+            this.pnlOKCancel.Name = "pnlOKCancel";
+            this.pnlOKCancel.Size = new System.Drawing.Size(376, 40);
+            this.pnlOKCancel.TabIndex = 4;
+            // 
+            // cmdOK
+            // 
+            this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.cmdOK.Location = new System.Drawing.Point(208, 8);
+            this.cmdOK.Name = "cmdOK";
+            this.cmdOK.Size = new System.Drawing.Size(136, 24);
+            this.cmdOK.TabIndex = 0;
+            this.cmdOK.Text = "OK";
+            // 
+            // lblSummary
+            // 
+            this.lblSummary.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.lblSummary.Location = new System.Drawing.Point(32, 32);
+            this.lblSummary.Name = "lblSummary";
+            this.lblSummary.Size = new System.Drawing.Size(312, 64);
+            this.lblSummary.TabIndex = 48;
+            this.lblSummary.Text = "lblSummary";
+            // 
+            // lblProgress
+            // 
+            this.lblProgress.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.lblProgress.Location = new System.Drawing.Point(32, 128);
+            this.lblProgress.Name = "lblProgress";
+            this.lblProgress.Size = new System.Drawing.Size(312, 72);
+            this.lblProgress.TabIndex = 49;
+            this.lblProgress.Text = "lblProgress";
+            // 
+            // timerPoll
+            // 
+            this.timerPoll.Tick += new System.EventHandler(this.timerPoll_Tick);
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(32, 112);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(144, 16);
+            this.label1.TabIndex = 50;
+            this.label1.Text = "Status:";
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(32, 16);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(144, 16);
+            this.label2.TabIndex = 51;
+            this.label2.Text = "Job Summary:";
+            // 
+            // DCopyAppts
+            // 
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.ClientSize = new System.Drawing.Size(376, 251);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.lblProgress);
+            this.Controls.Add(this.lblSummary);
+            this.Controls.Add(this.pnlOKCancel);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.MaximizeBox = false;
+            this.Name = "DCopyAppts";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "Copy Appointments";
+            this.Load += new System.EventHandler(this.DCopyAppts_Load);
+            this.Closing += new System.ComponentModel.CancelEventHandler(this.DCopyAppts_Closing);
+            this.pnlOKCancel.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+		}
+		#endregion
+
+        #region Methods and Handlers
+
+		public void InitializePage(DateTime StartDate, DateTime EndDate, 
+			string HospLocationID, string HospLocationName, 
+			string ResourceID, string ResourceName, 
+			CGDocumentManager DocManager)
+		{
+			string sMsg = "Copying appointments from " + HospLocationName + " to " + ResourceName + ", ";
+			sMsg += "beginning with apppointments on " + StartDate.ToLongDateString();
+			sMsg += " and going through " + EndDate.ToLongDateString() + ".";
+			lblSummary.Text = sMsg;
+			m_dtBegin = StartDate;
+			m_dtEnd = EndDate;
+			m_HospLocationID = HospLocationID;
+			m_HospLocationName = HospLocationName;
+			m_ResourceID = ResourceID;
+			m_ResourceName = ResourceName;
+			m_DocManager = DocManager;
+		}
+
+		private void DCopyAppts_Load(object sender, System.EventArgs e)
+		{
+			try
+			{
+				//Start M copy job and get the ZTSK number
+				//this.timerPoll.Stop();
+				lblProgress.Text = "Starting Process... \r\n";
+
+                string sFMBeginDate = FMDateTime.Create(m_dtBegin).DateOnly.FMDateString;
+                string sFMEndDate = FMDateTime.Create(m_dtEnd).DateOnly.FMDateString;
+
+                //smh - i18n
+                //string sSql = "BSDX COPY APPOINTMENTS^" + m_ResourceID + "^" + m_HospLocationID + "^" + m_dtBegin.ToShortDateString() + "^" + m_dtEnd.ToShortDateString();
+                string sSql = "BSDX COPY APPOINTMENTS^" + m_ResourceID + "^" + m_HospLocationID + "^" + sFMBeginDate + "^" + sFMEndDate;
+
+				DataTable dt = m_DocManager.RPMSDataTable(sSql, "ApptCopy");
+				Debug.Assert(dt.Rows.Count == 1);
+
+                // TODO (later): delegate is supposed to support cross thread communication -- but this doesn't work.
+                //m_DocManager d = new RPMSDataTableDelegate(m_DocManager.RPMSDataTable);
+                //DataTable dt = d.Invoke(sSql, "ApptCopy");
+                //Debug.Assert(dt.Rows.Count == 1);
+
+				DataRow dr = dt.Rows[0];
+				m_sTask = "0";
+				Object oTask = dr["TASK_NUMBER"];
+				m_sTask = oTask.ToString();
+
+				Object oError = dr["ERRORID"];
+				string sError = oError.ToString();
+				if (sError != "OK")
+				{
+					//timerPoll.Stop();
+					lblProgress.Text = sError;
+					cmdOK.Enabled = true;
+				}
+				else
+				{
+					lblProgress.Text += "VistA Job queued as Task #" + m_sTask;
+					//this.timerPoll.Start();
+					cmdOK.Enabled = true;	
+				}
+
+			}
+			catch (Exception Ex)
+			{
+				MessageBox.Show(Ex.Message);
+			}
+			
+		}
+
+		private void cmdCancel_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				//Check status and update progress control
+				string sSql = "BSDX COPY APPOINTMENT CANCEL^" + m_sTask;
+				DataTable dt = m_DocManager.RPMSDataTable(sSql, "ApptCopyCancel");
+				Debug.Assert(dt.Rows.Count == 1);
+				DataRow dr = dt.Rows[0];
+				Object oCount = dr["RECORD_COUNT"];
+				string sCount = oCount.ToString();
+
+				lblProgress.Text = "Cancelling job...";
+			}
+			catch (Exception Ex)
+			{
+				MessageBox.Show(Ex.Message);
+			}		
+		}
+
+		private void DCopyAppts_Closing(object sender, System.ComponentModel.CancelEventArgs e)
+		{
+
+        }
+
+		private void timerPoll_Tick(object sender, System.EventArgs e)
+		{
+			try
+			{
+                return;
+				//Check status and update progress control
+                //string sSql = "BSDX COPY APPOINTMENT STATUS^" + m_sTask;
+                //DataTable dt = m_DocManager.RPMSDataTable(sSql, "ApptCopyStatus");
+                //Debug.Assert(dt.Rows.Count == 1);
+                //DataRow dr = dt.Rows[0];
+                //Object oCount = dr["RECORD_COUNT"];
+                //string sCount = oCount.ToString();
+                //Object oError = dr["ERRORID"];
+                //string sError = oError.ToString();
+                //if (sError != "OK")
+                //{
+                //    timerPoll.Stop();
+                //    lblProgress.Text = sError;
+                //}
+                //else if ((sCount.StartsWith("Finished"))||(sCount.StartsWith("Cancelled")))
+                //{
+                //    timerPoll.Stop();
+                //    lblProgress.Text = sCount;
+                //    cmdOK.Enabled = true;
+                //    cmdCancel.Enabled = false;
+                //}
+                //else
+                //{
+                //    lblProgress.Text = "RPMS Job queued as Task #" + m_sTask + ".  " + sCount; // + " records copied so far.";
+                //}
+			}
+			catch (Exception Ex)
+			{
+				MessageBox.Show(Ex.Message);
+			}
+        }
+
+        #endregion Methods and Handlers
+    }
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCopyAppts.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCopyAppts.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DCopyAppts.resx	(revision 1134)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="timerPoll.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DManagement.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DManagement.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DManagement.cs	(revision 1134)
@@ -0,0 +1,2405 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+using IndianHealthService.BMXNet;
+using System.Diagnostics;
+using System.Threading;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DManagement.
+	/// </summary>
+	public class DManagement : System.Windows.Forms.Form
+	{
+
+		private System.ComponentModel.Container components = null;
+		private System.Windows.Forms.TabPage tpResources;
+		private System.Windows.Forms.TabPage tpAccessTypes;
+		private System.Windows.Forms.GroupBox grpDescription;
+		private System.Windows.Forms.Label lblDescription;
+		private System.Windows.Forms.Panel pnlPageBottom;
+		private System.Windows.Forms.TabControl tabMain;
+		private System.Windows.Forms.Panel pnlAddEdit;
+		private System.Windows.Forms.Button cmdAddResource;
+		private System.Windows.Forms.Button cmdChangeResource;
+		private System.Windows.Forms.Panel pnlDescription;
+		private System.Windows.Forms.Panel pnlResources;
+		private System.Windows.Forms.DataGrid grdResources;
+		private System.Windows.Forms.Panel pnlAddEditAT;
+		private System.Windows.Forms.Button cmdChangeAT;
+		private System.Windows.Forms.Button cmdAddAT;
+		private System.Windows.Forms.Panel pnlDescriptionAT;
+		private System.Windows.Forms.GroupBox grpDescriptionAT;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.TabPage tpAccessGroups;
+		private System.Windows.Forms.Button cmdClose;
+		private System.Windows.Forms.TabPage tpResourceGroups;
+		private System.Windows.Forms.Panel pnlAddEditResourceGroups;
+		private System.Windows.Forms.Panel pnlDescriptionResourceGroup;
+		private System.Windows.Forms.GroupBox grpDescriptionResourceGroup;
+		private System.Windows.Forms.Label lblDescriptionResourceGroup;
+		private System.Windows.Forms.Panel pnlAddEditAccessGroup;
+		private System.Windows.Forms.Button cmdRemoveAccessGroup;
+		private System.Windows.Forms.Button cmdAddAccessGroup;
+		private System.Windows.Forms.Panel pnlDescriptionAccessGroups;
+		private System.Windows.Forms.GroupBox grpDescriptionAccessGroups;
+		private System.Windows.Forms.Label lblDescriptionAccessGroups;
+		private System.Windows.Forms.DataGrid grdAccessGroups;
+		private System.Windows.Forms.Button cmdRemoveUser;
+		private System.Windows.Forms.DataGrid grdResourceGroup;
+		private System.Windows.Forms.Button cmdRemoveResourceGroup;
+		private System.Windows.Forms.Button cmdAddResourceGroup;
+		private System.Windows.Forms.Button cmdChangeResourceGroup;
+		private System.Windows.Forms.Button cmdChangeAccessGroup;
+		private System.Windows.Forms.TabPage tpTransferAppts;
+		private System.Windows.Forms.Panel pnlCmdXfer;
+		private System.Windows.Forms.Panel pnlDescriptionXfer;
+		private System.Windows.Forms.Label lblDescriptionXfer;
+		private System.Windows.Forms.GroupBox grpDescriptionXfer;
+		private System.Windows.Forms.DataGrid grdAccessTypes;
+
+		#region Fields
+		private DataTable			m_dtResources;
+		private DataView			m_dvResources;
+		private DataTable			m_dtHospLoc;
+		private DataView			m_dvHospLoc;
+		private DataTable			m_dtResourceGroup;
+		private DataView			m_dvResourceGroup;
+		private DataTable			m_dtAccessTypes;
+		private DataView			m_dvAccessTypes;
+		private DataTable			m_dtAccessGroup;
+		private DataView			m_dvAccessGroup;
+		private DataTable			m_dtAccessGroupType;
+		private DataView			m_dvAccessGroupType;
+		private int					m_nATRow;
+		private int					m_nResourceRow;
+		private int					m_nResourceGroupRow;
+		private int					m_nAccessGroupRow;
+		private int					m_nResourceID;
+		private int					m_nResourceGroupID;
+		private int					m_nAccessGroupID;
+		private DataSet				m_dsGlobal;
+		private CGDocumentManager	m_DocManager;
+		private bool				m_bEditUsers;
+		private string				m_sMember;
+		private string				m_sGroupMember;
+		private string				m_sAccessGroupMember;
+		private bool				m_bEditGroupItems;
+		private bool				m_bEditAccessGroupItems;
+		private string				m_sResourceGroupName;
+        private string              m_sAccessGroupName;
+        private DataTable           m_dtWSGrid;
+        private System.Windows.Forms.Button cmdCopyAppts;
+		private System.Windows.Forms.ComboBox cboRPMSClinic;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.Label label3;
+		private System.Windows.Forms.DateTimePicker dtpBegin;
+		private System.Windows.Forms.Label label4;
+		private System.Windows.Forms.Label label5;
+		private System.Windows.Forms.DateTimePicker dtpEnd;
+		private System.Windows.Forms.ComboBox cboBSDXClinic;
+		private System.Windows.Forms.TabPage tpWorkStations;
+		private System.Windows.Forms.Panel panel1;
+		private System.Windows.Forms.Button cmdWorkStationsMessage;
+		private System.Windows.Forms.Button cmdWorkStationsShutdown;
+		private System.Windows.Forms.Button cmdWorkStationsRefresh;
+		private System.Windows.Forms.Panel pnlWorkstations;
+		private System.Windows.Forms.GroupBox groupBox1;
+		private System.Windows.Forms.Label lblWorkstations;
+		private System.Windows.Forms.DataGrid grdWorkStations;
+		private System.Windows.Forms.TextBox txtSendMessage;
+
+		#endregion Fields
+
+		#region Initialization
+
+		public DManagement()
+		{
+			InitializeComponent();
+
+			m_nATRow = -1;
+			m_nResourceRow = -1;
+			m_nResourceGroupRow = -1;
+			m_nAccessGroupRow = -1;
+			m_nResourceID = 0;
+			m_sMember = "Resource";
+			m_sGroupMember = "Group";
+			m_sAccessGroupMember = "Group";
+
+		}
+
+		public void InitializeDialog(CGDocumentManager docManager)
+		{
+			//System.IntPtr pHandle = this.Handle;
+            //this.m_sMgrHandle = pHandle.ToString()
+			this.m_DocManager = docManager;
+			this.m_dsGlobal = m_DocManager.GlobalDataSet;
+
+			MgrEventDelegate = new BMXNetConnectInfo.BMXNetEventDelegate(MgrEventHandler);
+			m_DocManager.ConnectInfo.BMXNetEvent += MgrEventDelegate;
+			m_DocManager.ConnectInfo.SubscribeEvent("BSDX WORKSTATION REPORT");
+			m_dtWSGrid = new DataTable("WSGrid");
+			m_dtWSGrid.Columns.Add("UserName", typeof(System.String));
+			m_dtWSGrid.Columns.Add("Handle", typeof(System.String));
+			m_dtWSGrid.Columns.Add("Version", typeof(System.String));
+			m_dtWSGrid.Columns.Add("Views", typeof(System.String));
+
+			this.grdWorkStations.DataSource = m_dtWSGrid;
+
+			//Resources
+			m_dtResources = m_dsGlobal.Tables["Resources"];
+			m_dvResources = new DataView(m_dtResources);
+			m_dvResources.Sort = "RESOURCE_NAME ASC";
+			this.grdResources.DataSource = m_dvResources;
+
+			//Reload ResourceUser table with all users
+			m_dsGlobal.Tables["ResourceUser"].Clear();
+			m_DocManager.LoadResourceUserTable(true);
+
+			//Create DataGridTableStyle for ResourceUser table
+			DataGridTableStyle tsRU = new DataGridTableStyle();
+			tsRU.MappingName = "ResourceUser";
+			tsRU.ReadOnly = true;
+			// Add RESOURCEID column style.
+			DataGridColumnStyle colRUID = new DataGridTextBoxColumn();
+			colRUID.MappingName = "RESOURCEID";
+			colRUID.HeaderText = "Resource ID";
+			colRUID.Width = 0;
+			tsRU.GridColumnStyles.Add(colRUID);
+			// Add RESOURCEUSER_ID column style.
+			DataGridColumnStyle colRUserID = new DataGridTextBoxColumn();
+			colRUserID.MappingName = "RESOURCEUSER_ID";
+			colRUserID.HeaderText = "ResourceUser ID";
+			colRUserID.Width = 15;
+			tsRU.GridColumnStyles.Add(colRUserID);
+			// Add USERNAME column style.
+			DataGridColumnStyle colRUName = new DataGridTextBoxColumn();
+			colRUName.MappingName = "USERNAME";
+			colRUName.HeaderText = "Resource User Name";
+			colRUName.Width = 250;
+			tsRU.GridColumnStyles.Add(colRUName);
+
+			grdResources.TableStyles.Add(tsRU);
+
+			//Create DataGridTableStyle for Resources table
+			DataGridTableStyle tsResource = new DataGridTableStyle();
+			tsResource.MappingName = "Resources";
+			tsResource.ReadOnly = true;
+
+			// Add RESOURCEID column style.
+			DataGridColumnStyle colResID = new DataGridTextBoxColumn();
+			colResID.MappingName = "RESOURCEID";
+			colResID.HeaderText = "Resource ID";
+			colResID.Width = 0;
+			tsResource.GridColumnStyles.Add(colResID);
+
+			// Add RESOURCE_NAME column style.
+			DataGridColumnStyle colResName = new DataGridTextBoxColumn();
+			colResName.MappingName = "RESOURCE_NAME";
+			colResName.HeaderText = "Resource Name";
+			colResName.Width = 250;
+			tsResource.GridColumnStyles.Add(colResName);
+			grdResources.TableStyles.Add(tsResource);
+
+			//ResourceGroup
+			m_dtResourceGroup = m_dsGlobal.Tables["ResourceGroup"];
+			m_dvResourceGroup = new DataView(m_dtResourceGroup);
+            m_dvResourceGroup.Sort = "RESOURCE_GROUP ASC";
+			this.grdResourceGroup.DataSource = m_dvResourceGroup;
+
+			//Create DataGridTableStyle for ResourceGroup table
+			DataGridTableStyle tsResourceGroup = new DataGridTableStyle();
+			tsResourceGroup.MappingName = "ResourceGroup";
+			tsResourceGroup.ReadOnly = true;
+			// Add RESOURCE_GROUPID column style.
+			DataGridColumnStyle colResGroupID = new DataGridTextBoxColumn();
+			colResGroupID.MappingName = "RESOURCE_GROUPID";
+			colResGroupID.HeaderText = "GroupID";
+			colResGroupID.Width = 50;
+			tsResourceGroup.GridColumnStyles.Add(colResGroupID);
+			// Add RESOURCE_GROUP column style.
+			DataGridColumnStyle colResGroup = new DataGridTextBoxColumn();
+			colResGroup.MappingName = "RESOURCE_GROUP";
+			colResGroup.HeaderText = "Group";
+			colResGroup.Width = 250;
+			tsResourceGroup.GridColumnStyles.Add(colResGroup);
+			grdResourceGroup.TableStyles.Add(tsResourceGroup);
+
+			//Create DataGridTableStyle for GroupResources table
+			DataGridTableStyle tsGroupResources = new DataGridTableStyle();
+			tsGroupResources.MappingName = "GroupResources";
+			tsGroupResources.ReadOnly = true;
+			// Add RESOURCE_GROUPID column style.
+			DataGridColumnStyle colResGroupID2 = new DataGridTextBoxColumn();
+			colResGroupID2.MappingName = "RESOURCE_GROUPID";
+			colResGroupID2.HeaderText = "Resource GroupID";
+			colResGroupID2.Width = 50;
+			tsGroupResources.GridColumnStyles.Add(colResGroupID2);
+			// Add RESOURCE_NAME column style.
+			DataGridColumnStyle colGroupRes = new DataGridTextBoxColumn();
+			colGroupRes.MappingName = "RESOURCE_NAME";
+			colGroupRes.HeaderText = "Resource Name";
+			colGroupRes.Width = 250;
+			tsGroupResources.GridColumnStyles.Add(colGroupRes);
+
+
+			// Add RESOURCE_GROUP_ITEMID column style.
+			DataGridColumnStyle colResGroupItemID = new DataGridTextBoxColumn();
+			colResGroupItemID.MappingName = "RESOURCE_GROUP_ITEMID";
+			colResGroupItemID.HeaderText = "Resource ItemID";
+			colResGroupItemID.Width = 50;
+			tsGroupResources.GridColumnStyles.Add(colResGroupItemID);
+			grdResourceGroup.TableStyles.Add(tsGroupResources);
+
+
+			//Access Types
+			m_dtAccessTypes = m_dsGlobal.Tables["AccessTypes"];
+			m_dvAccessTypes = new DataView(m_dtAccessTypes);
+            m_dvAccessTypes.Sort = "ACCESS_TYPE_NAME ASC";
+			this.grdAccessTypes.DataSource = m_dvAccessTypes;
+
+			// Create DataGridTableStyle for AccessTypes table  
+			DataGridTableStyle tsAT = new DataGridTableStyle();
+			tsAT.MappingName = "AccessTypes";
+			tsAT.ReadOnly = true;
+
+			// Add ACCESS_TYPE_NAME column style.
+			DataGridColumnStyle colATName = new DataGridTextBoxColumn();
+			colATName.MappingName = "ACCESS_TYPE_NAME";
+			colATName.HeaderText = "Access Type";
+			colATName.Width = 250;
+			tsAT.GridColumnStyles.Add(colATName);
+      
+			// Add INACTIVE column style.
+			DataGridColumnStyle colATInactive = new DataGridTextBoxColumn();
+			colATInactive.MappingName = "INACTIVE";
+			colATInactive.HeaderText = "Inactive?";
+			colATInactive.Width = 100;
+			tsAT.GridColumnStyles.Add(colATInactive);
+
+			grdAccessTypes.TableStyles.Add(tsAT);
+
+
+			//Access Groups
+			m_dtAccessGroup = m_dsGlobal.Tables["AccessGroup"];
+			m_dvAccessGroup = new DataView(m_dtAccessGroup);
+            m_dvAccessGroup.Sort = "ACCESS_GROUP ASC";
+			this.grdAccessGroups.DataSource = m_dvAccessGroup;
+
+			// Create DataGridTableStyle for AccessGroup table  
+			DataGridTableStyle tsAG = new DataGridTableStyle();
+			tsAG.MappingName = "AccessGroup";
+			tsAG.ReadOnly = true;
+
+			// Add BMXIEN column style.
+			DataGridColumnStyle colAGID = new DataGridTextBoxColumn();
+			colAGID.MappingName = "BMXIEN";
+			colAGID.HeaderText = "Access Group ID";
+			colAGID.Width = 50;
+			tsAG.GridColumnStyles.Add(colAGID);
+      
+			// Add ACCESS_GROUP column style.
+			DataGridColumnStyle colAGNAME = new DataGridTextBoxColumn();
+			colAGNAME.MappingName = "ACCESS_GROUP";
+			colAGNAME.HeaderText = "Access Group";
+			colAGNAME.Width = 150;
+			tsAG.GridColumnStyles.Add(colAGNAME);
+
+			grdAccessGroups.TableStyles.Add(tsAG);
+
+			//Access Group Types
+			m_dtAccessGroupType = m_dsGlobal.Tables["AccessGroupType"];
+			m_dvAccessGroupType = new DataView(m_dtAccessGroupType);
+
+			// Create DataGridTableStyle for AccessGroupType table  
+			DataGridTableStyle tsAGTP = new DataGridTableStyle();
+			tsAGTP.MappingName = "AccessGroupType";
+			tsAGTP.ReadOnly = true;
+
+			// 0 Add ACCESS_GROUP_TYPEID column style.
+			DataGridColumnStyle colAGTPID = new DataGridTextBoxColumn();
+			colAGTPID.MappingName = "ACCESS_GROUP_TYPEID";
+			colAGTPID.HeaderText = "Access Group Type ID";
+			colAGTPID.Width = 0;
+			tsAGTP.GridColumnStyles.Add(colAGTPID);
+      
+			// 1 Add ACCESS_GROUP_ID column style.
+			DataGridColumnStyle colAGTPGroupID = new DataGridTextBoxColumn();
+			colAGTPGroupID.MappingName = "ACCESS_GROUP_ID";
+			colAGTPGroupID.HeaderText = "Access Group ID";
+			colAGTPGroupID.Width = 0;
+			tsAGTP.GridColumnStyles.Add(colAGTPGroupID);
+
+			// 2 Add ACCESS_GROUP column style.
+			DataGridColumnStyle colAGTPGroup = new DataGridTextBoxColumn();
+			colAGTPGroup.MappingName = "ACCESS_GROUP";
+			colAGTPGroup.HeaderText = "Access Group";
+			colAGTPGroup.Width = 0;
+			tsAGTP.GridColumnStyles.Add(colAGTPGroup);
+
+			// 3 Add ACCESS_TYPE_ID column style.
+			DataGridColumnStyle colAGTPTypeID = new DataGridTextBoxColumn();
+			colAGTPTypeID.MappingName = "ACCESS_TYPE_ID";
+			colAGTPTypeID.HeaderText = "Access TypeID";
+			colAGTPTypeID.Width = 0;
+			tsAGTP.GridColumnStyles.Add(colAGTPTypeID);
+
+			// 4 Add ACCESS_TYPE column style.
+			DataGridColumnStyle colAGTPType = new DataGridTextBoxColumn();
+			colAGTPType.MappingName = "ACCESS_TYPE";
+			colAGTPType.HeaderText = "Access Type";
+			colAGTPType.Width = 150;
+			tsAGTP.GridColumnStyles.Add(colAGTPType);
+
+			grdAccessGroups.TableStyles.Add(tsAGTP);
+
+
+			//Find out if there are any grdResources rows and
+			//enable command buttons accordingly
+			int nRows = this.grdResources.VisibleRowCount;
+			if (nRows == 0)
+			{
+				this.cmdChangeResource.Enabled = false;
+				this.cmdRemoveUser.Enabled = false;
+			}
+			else
+			{
+				grdResources.CurrentCell = new DataGridCell(0, 0);
+				this.cmdChangeResource.Enabled = true;
+				this.cmdRemoveUser.Enabled = true;
+
+			}
+
+			//Copy Appointments TabPage
+			m_dtHospLoc = m_dsGlobal.Tables["HospitalLocation"];
+			m_dvHospLoc = new DataView(m_dtHospLoc);
+			m_dvHospLoc.Sort = "HOSPITAL_LOCATION ASC";
+			cboRPMSClinic.DataSource = m_dvHospLoc;
+			cboRPMSClinic.DisplayMember = "HOSPITAL_LOCATION";
+			cboRPMSClinic.ValueMember = "HOSPITAL_LOCATION_ID";
+			cboBSDXClinic.DataSource = m_dvResources;
+			cboBSDXClinic.DisplayMember = "RESOURCE_NAME";
+			cboBSDXClinic.ValueMember = "RESOURCEID";
+
+		}
+
+		private void DManagement_Load(object sender, System.EventArgs e)
+		{
+			this.cmdChangeResource.Enabled = false;
+			this.cmdRemoveUser.Enabled = false;
+			//Select the grid's zeroeth row
+			if (m_dvResources.Count > 0)
+			{
+				this.grdResources.CurrentCell = new DataGridCell(0,0);
+				this.grdResources.Select(0);
+				this.m_nResourceRow=0;
+				Object dgItem = grdResources[0,0];
+				this.m_nResourceID = Convert.ToInt16(dgItem);
+				this.cmdChangeResource.Enabled = true;
+				this.cmdRemoveUser.Enabled = true;
+			}
+
+			this.cmdChangeResourceGroup.Enabled = false;
+			this.cmdRemoveResourceGroup.Enabled = false;
+			if (this.m_dvResourceGroup.Count > 0)
+			{
+				this.m_nResourceGroupRow = 0;
+				this.cmdChangeResourceGroup.Enabled = true;
+				this.cmdRemoveResourceGroup.Enabled = true;
+			}
+			
+			this.cmdChangeAccessGroup.Enabled = false;
+			this.cmdRemoveAccessGroup.Enabled = false;
+			if (this.m_dvAccessGroup.Count > 0)
+			{
+				this.m_nAccessGroupRow = 0;
+				this.cmdChangeAccessGroup.Enabled = true;
+				this.cmdRemoveAccessGroup.Enabled = true;
+			}
+
+			this.cmdChangeAT.Enabled = false;
+			if (this.m_dvAccessTypes.Count > 0)
+			{
+				this.m_nATRow = 0;
+				this.cmdChangeAT.Enabled = true;
+			}
+		}
+
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#endregion Initialization
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DManagement));
+            this.pnlPageBottom = new System.Windows.Forms.Panel();
+            this.cmdClose = new System.Windows.Forms.Button();
+            this.tabMain = new System.Windows.Forms.TabControl();
+            this.tpResources = new System.Windows.Forms.TabPage();
+            this.pnlResources = new System.Windows.Forms.Panel();
+            this.grdResources = new System.Windows.Forms.DataGrid();
+            this.pnlDescription = new System.Windows.Forms.Panel();
+            this.grpDescription = new System.Windows.Forms.GroupBox();
+            this.lblDescription = new System.Windows.Forms.Label();
+            this.pnlAddEdit = new System.Windows.Forms.Panel();
+            this.cmdRemoveUser = new System.Windows.Forms.Button();
+            this.cmdChangeResource = new System.Windows.Forms.Button();
+            this.cmdAddResource = new System.Windows.Forms.Button();
+            this.tpResourceGroups = new System.Windows.Forms.TabPage();
+            this.grdResourceGroup = new System.Windows.Forms.DataGrid();
+            this.pnlDescriptionResourceGroup = new System.Windows.Forms.Panel();
+            this.grpDescriptionResourceGroup = new System.Windows.Forms.GroupBox();
+            this.lblDescriptionResourceGroup = new System.Windows.Forms.Label();
+            this.pnlAddEditResourceGroups = new System.Windows.Forms.Panel();
+            this.cmdChangeResourceGroup = new System.Windows.Forms.Button();
+            this.cmdRemoveResourceGroup = new System.Windows.Forms.Button();
+            this.cmdAddResourceGroup = new System.Windows.Forms.Button();
+            this.tpAccessTypes = new System.Windows.Forms.TabPage();
+            this.grdAccessTypes = new System.Windows.Forms.DataGrid();
+            this.pnlDescriptionAT = new System.Windows.Forms.Panel();
+            this.grpDescriptionAT = new System.Windows.Forms.GroupBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.pnlAddEditAT = new System.Windows.Forms.Panel();
+            this.cmdChangeAT = new System.Windows.Forms.Button();
+            this.cmdAddAT = new System.Windows.Forms.Button();
+            this.tpAccessGroups = new System.Windows.Forms.TabPage();
+            this.grdAccessGroups = new System.Windows.Forms.DataGrid();
+            this.pnlDescriptionAccessGroups = new System.Windows.Forms.Panel();
+            this.grpDescriptionAccessGroups = new System.Windows.Forms.GroupBox();
+            this.lblDescriptionAccessGroups = new System.Windows.Forms.Label();
+            this.pnlAddEditAccessGroup = new System.Windows.Forms.Panel();
+            this.cmdChangeAccessGroup = new System.Windows.Forms.Button();
+            this.cmdRemoveAccessGroup = new System.Windows.Forms.Button();
+            this.cmdAddAccessGroup = new System.Windows.Forms.Button();
+            this.tpTransferAppts = new System.Windows.Forms.TabPage();
+            this.label5 = new System.Windows.Forms.Label();
+            this.dtpEnd = new System.Windows.Forms.DateTimePicker();
+            this.label4 = new System.Windows.Forms.Label();
+            this.dtpBegin = new System.Windows.Forms.DateTimePicker();
+            this.label3 = new System.Windows.Forms.Label();
+            this.cboBSDXClinic = new System.Windows.Forms.ComboBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.cboRPMSClinic = new System.Windows.Forms.ComboBox();
+            this.pnlDescriptionXfer = new System.Windows.Forms.Panel();
+            this.grpDescriptionXfer = new System.Windows.Forms.GroupBox();
+            this.lblDescriptionXfer = new System.Windows.Forms.Label();
+            this.pnlCmdXfer = new System.Windows.Forms.Panel();
+            this.cmdCopyAppts = new System.Windows.Forms.Button();
+            this.tpWorkStations = new System.Windows.Forms.TabPage();
+            this.grdWorkStations = new System.Windows.Forms.DataGrid();
+            this.pnlWorkstations = new System.Windows.Forms.Panel();
+            this.groupBox1 = new System.Windows.Forms.GroupBox();
+            this.lblWorkstations = new System.Windows.Forms.Label();
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.txtSendMessage = new System.Windows.Forms.TextBox();
+            this.cmdWorkStationsMessage = new System.Windows.Forms.Button();
+            this.cmdWorkStationsShutdown = new System.Windows.Forms.Button();
+            this.cmdWorkStationsRefresh = new System.Windows.Forms.Button();
+            this.pnlPageBottom.SuspendLayout();
+            this.tabMain.SuspendLayout();
+            this.tpResources.SuspendLayout();
+            this.pnlResources.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.grdResources)).BeginInit();
+            this.pnlDescription.SuspendLayout();
+            this.grpDescription.SuspendLayout();
+            this.pnlAddEdit.SuspendLayout();
+            this.tpResourceGroups.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.grdResourceGroup)).BeginInit();
+            this.pnlDescriptionResourceGroup.SuspendLayout();
+            this.grpDescriptionResourceGroup.SuspendLayout();
+            this.pnlAddEditResourceGroups.SuspendLayout();
+            this.tpAccessTypes.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.grdAccessTypes)).BeginInit();
+            this.pnlDescriptionAT.SuspendLayout();
+            this.grpDescriptionAT.SuspendLayout();
+            this.pnlAddEditAT.SuspendLayout();
+            this.tpAccessGroups.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.grdAccessGroups)).BeginInit();
+            this.pnlDescriptionAccessGroups.SuspendLayout();
+            this.grpDescriptionAccessGroups.SuspendLayout();
+            this.pnlAddEditAccessGroup.SuspendLayout();
+            this.tpTransferAppts.SuspendLayout();
+            this.pnlDescriptionXfer.SuspendLayout();
+            this.grpDescriptionXfer.SuspendLayout();
+            this.pnlCmdXfer.SuspendLayout();
+            this.tpWorkStations.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.grdWorkStations)).BeginInit();
+            this.pnlWorkstations.SuspendLayout();
+            this.groupBox1.SuspendLayout();
+            this.panel1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // pnlPageBottom
+            // 
+            this.pnlPageBottom.Controls.Add(this.cmdClose);
+            this.pnlPageBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlPageBottom.Location = new System.Drawing.Point(0, 454);
+            this.pnlPageBottom.Name = "pnlPageBottom";
+            this.pnlPageBottom.Size = new System.Drawing.Size(704, 40);
+            this.pnlPageBottom.TabIndex = 3;
+            // 
+            // cmdClose
+            // 
+            this.cmdClose.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.cmdClose.Location = new System.Drawing.Point(600, 8);
+            this.cmdClose.Name = "cmdClose";
+            this.cmdClose.Size = new System.Drawing.Size(96, 24);
+            this.cmdClose.TabIndex = 0;
+            this.cmdClose.Text = "Close";
+            // 
+            // tabMain
+            // 
+            this.tabMain.Controls.Add(this.tpResources);
+            this.tabMain.Controls.Add(this.tpResourceGroups);
+            this.tabMain.Controls.Add(this.tpAccessTypes);
+            this.tabMain.Controls.Add(this.tpAccessGroups);
+            this.tabMain.Controls.Add(this.tpTransferAppts);
+            this.tabMain.Controls.Add(this.tpWorkStations);
+            this.tabMain.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.tabMain.Location = new System.Drawing.Point(0, 0);
+            this.tabMain.Name = "tabMain";
+            this.tabMain.SelectedIndex = 0;
+            this.tabMain.Size = new System.Drawing.Size(704, 454);
+            this.tabMain.TabIndex = 4;
+            this.tabMain.Click += new System.EventHandler(this.tabMain_Click);
+            // 
+            // tpResources
+            // 
+            this.tpResources.Controls.Add(this.pnlResources);
+            this.tpResources.Controls.Add(this.pnlDescription);
+            this.tpResources.Controls.Add(this.pnlAddEdit);
+            this.tpResources.Location = new System.Drawing.Point(4, 22);
+            this.tpResources.Name = "tpResources";
+            this.tpResources.Size = new System.Drawing.Size(696, 428);
+            this.tpResources.TabIndex = 0;
+            this.tpResources.Text = "Resources and Users";
+            // 
+            // pnlResources
+            // 
+            this.pnlResources.Controls.Add(this.grdResources);
+            this.pnlResources.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.pnlResources.Location = new System.Drawing.Point(0, 0);
+            this.pnlResources.Name = "pnlResources";
+            this.pnlResources.Size = new System.Drawing.Size(696, 316);
+            this.pnlResources.TabIndex = 2;
+            // 
+            // grdResources
+            // 
+            this.grdResources.DataMember = "";
+            this.grdResources.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grdResources.HeaderForeColor = System.Drawing.SystemColors.ControlText;
+            this.grdResources.Location = new System.Drawing.Point(0, 0);
+            this.grdResources.Name = "grdResources";
+            this.grdResources.ReadOnly = true;
+            this.grdResources.Size = new System.Drawing.Size(696, 316);
+            this.grdResources.TabIndex = 0;
+            this.grdResources.CurrentCellChanged += new System.EventHandler(this.grdResources_CurrentCellChanged);
+            this.grdResources.Navigate += new System.Windows.Forms.NavigateEventHandler(this.grdResources_Navigate);
+            // 
+            // pnlDescription
+            // 
+            this.pnlDescription.Controls.Add(this.grpDescription);
+            this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlDescription.Location = new System.Drawing.Point(0, 316);
+            this.pnlDescription.Name = "pnlDescription";
+            this.pnlDescription.Size = new System.Drawing.Size(696, 72);
+            this.pnlDescription.TabIndex = 1;
+            // 
+            // grpDescription
+            // 
+            this.grpDescription.Controls.Add(this.lblDescription);
+            this.grpDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grpDescription.Location = new System.Drawing.Point(0, 0);
+            this.grpDescription.Name = "grpDescription";
+            this.grpDescription.Size = new System.Drawing.Size(696, 72);
+            this.grpDescription.TabIndex = 0;
+            this.grpDescription.TabStop = false;
+            this.grpDescription.Text = "Description";
+            // 
+            // lblDescription
+            // 
+            this.lblDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lblDescription.Location = new System.Drawing.Point(3, 16);
+            this.lblDescription.Name = "lblDescription";
+            this.lblDescription.Size = new System.Drawing.Size(690, 53);
+            this.lblDescription.TabIndex = 0;
+            this.lblDescription.Text = resources.GetString("lblDescription.Text");
+            // 
+            // pnlAddEdit
+            // 
+            this.pnlAddEdit.Controls.Add(this.cmdRemoveUser);
+            this.pnlAddEdit.Controls.Add(this.cmdChangeResource);
+            this.pnlAddEdit.Controls.Add(this.cmdAddResource);
+            this.pnlAddEdit.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlAddEdit.Location = new System.Drawing.Point(0, 388);
+            this.pnlAddEdit.Name = "pnlAddEdit";
+            this.pnlAddEdit.Size = new System.Drawing.Size(696, 40);
+            this.pnlAddEdit.TabIndex = 0;
+            // 
+            // cmdRemoveUser
+            // 
+            this.cmdRemoveUser.Location = new System.Drawing.Point(304, 8);
+            this.cmdRemoveUser.Name = "cmdRemoveUser";
+            this.cmdRemoveUser.Size = new System.Drawing.Size(128, 24);
+            this.cmdRemoveUser.TabIndex = 3;
+            this.cmdRemoveUser.Text = "&Remove User";
+            this.cmdRemoveUser.Visible = false;
+            this.cmdRemoveUser.Click += new System.EventHandler(this.cmdRemoveUser_Click);
+            // 
+            // cmdChangeResource
+            // 
+            this.cmdChangeResource.Enabled = false;
+            this.cmdChangeResource.Location = new System.Drawing.Point(160, 8);
+            this.cmdChangeResource.Name = "cmdChangeResource";
+            this.cmdChangeResource.Size = new System.Drawing.Size(128, 24);
+            this.cmdChangeResource.TabIndex = 1;
+            this.cmdChangeResource.Text = "&Change...";
+            this.cmdChangeResource.Click += new System.EventHandler(this.cmdChangeResource_Click);
+            // 
+            // cmdAddResource
+            // 
+            this.cmdAddResource.Location = new System.Drawing.Point(16, 8);
+            this.cmdAddResource.Name = "cmdAddResource";
+            this.cmdAddResource.Size = new System.Drawing.Size(128, 24);
+            this.cmdAddResource.TabIndex = 0;
+            this.cmdAddResource.Text = "&Add...";
+            this.cmdAddResource.Click += new System.EventHandler(this.cmdAddResource_Click);
+            // 
+            // tpResourceGroups
+            // 
+            this.tpResourceGroups.Controls.Add(this.grdResourceGroup);
+            this.tpResourceGroups.Controls.Add(this.pnlDescriptionResourceGroup);
+            this.tpResourceGroups.Controls.Add(this.pnlAddEditResourceGroups);
+            this.tpResourceGroups.Location = new System.Drawing.Point(4, 22);
+            this.tpResourceGroups.Name = "tpResourceGroups";
+            this.tpResourceGroups.Size = new System.Drawing.Size(696, 428);
+            this.tpResourceGroups.TabIndex = 4;
+            this.tpResourceGroups.Text = "Resource Groups";
+            // 
+            // grdResourceGroup
+            // 
+            this.grdResourceGroup.AccessibleName = "DataGrid";
+            this.grdResourceGroup.AccessibleRole = System.Windows.Forms.AccessibleRole.Table;
+            this.grdResourceGroup.DataMember = "";
+            this.grdResourceGroup.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grdResourceGroup.HeaderForeColor = System.Drawing.SystemColors.ControlText;
+            this.grdResourceGroup.Location = new System.Drawing.Point(0, 0);
+            this.grdResourceGroup.Name = "grdResourceGroup";
+            this.grdResourceGroup.ReadOnly = true;
+            this.grdResourceGroup.Size = new System.Drawing.Size(696, 316);
+            this.grdResourceGroup.TabIndex = 4;
+            this.grdResourceGroup.CurrentCellChanged += new System.EventHandler(this.grdResourceGroup_CurrentCellChanged);
+            this.grdResourceGroup.Navigate += new System.Windows.Forms.NavigateEventHandler(this.grdResourceGroup_Navigate);
+            // 
+            // pnlDescriptionResourceGroup
+            // 
+            this.pnlDescriptionResourceGroup.Controls.Add(this.grpDescriptionResourceGroup);
+            this.pnlDescriptionResourceGroup.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlDescriptionResourceGroup.Location = new System.Drawing.Point(0, 316);
+            this.pnlDescriptionResourceGroup.Name = "pnlDescriptionResourceGroup";
+            this.pnlDescriptionResourceGroup.Size = new System.Drawing.Size(696, 72);
+            this.pnlDescriptionResourceGroup.TabIndex = 3;
+            // 
+            // grpDescriptionResourceGroup
+            // 
+            this.grpDescriptionResourceGroup.Controls.Add(this.lblDescriptionResourceGroup);
+            this.grpDescriptionResourceGroup.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grpDescriptionResourceGroup.Location = new System.Drawing.Point(0, 0);
+            this.grpDescriptionResourceGroup.Name = "grpDescriptionResourceGroup";
+            this.grpDescriptionResourceGroup.Size = new System.Drawing.Size(696, 72);
+            this.grpDescriptionResourceGroup.TabIndex = 0;
+            this.grpDescriptionResourceGroup.TabStop = false;
+            this.grpDescriptionResourceGroup.Text = "Description";
+            // 
+            // lblDescriptionResourceGroup
+            // 
+            this.lblDescriptionResourceGroup.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lblDescriptionResourceGroup.Location = new System.Drawing.Point(3, 16);
+            this.lblDescriptionResourceGroup.Name = "lblDescriptionResourceGroup";
+            this.lblDescriptionResourceGroup.Size = new System.Drawing.Size(690, 53);
+            this.lblDescriptionResourceGroup.TabIndex = 0;
+            this.lblDescriptionResourceGroup.Text = resources.GetString("lblDescriptionResourceGroup.Text");
+            // 
+            // pnlAddEditResourceGroups
+            // 
+            this.pnlAddEditResourceGroups.Controls.Add(this.cmdChangeResourceGroup);
+            this.pnlAddEditResourceGroups.Controls.Add(this.cmdRemoveResourceGroup);
+            this.pnlAddEditResourceGroups.Controls.Add(this.cmdAddResourceGroup);
+            this.pnlAddEditResourceGroups.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlAddEditResourceGroups.Location = new System.Drawing.Point(0, 388);
+            this.pnlAddEditResourceGroups.Name = "pnlAddEditResourceGroups";
+            this.pnlAddEditResourceGroups.Size = new System.Drawing.Size(696, 40);
+            this.pnlAddEditResourceGroups.TabIndex = 2;
+            // 
+            // cmdChangeResourceGroup
+            // 
+            this.cmdChangeResourceGroup.Enabled = false;
+            this.cmdChangeResourceGroup.Location = new System.Drawing.Point(160, 8);
+            this.cmdChangeResourceGroup.Name = "cmdChangeResourceGroup";
+            this.cmdChangeResourceGroup.Size = new System.Drawing.Size(128, 24);
+            this.cmdChangeResourceGroup.TabIndex = 2;
+            this.cmdChangeResourceGroup.Text = "&Change Group";
+            this.cmdChangeResourceGroup.Click += new System.EventHandler(this.cmdChangeResourceGroup_Click);
+            // 
+            // cmdRemoveResourceGroup
+            // 
+            this.cmdRemoveResourceGroup.Enabled = false;
+            this.cmdRemoveResourceGroup.Location = new System.Drawing.Point(304, 8);
+            this.cmdRemoveResourceGroup.Name = "cmdRemoveResourceGroup";
+            this.cmdRemoveResourceGroup.Size = new System.Drawing.Size(128, 24);
+            this.cmdRemoveResourceGroup.TabIndex = 1;
+            this.cmdRemoveResourceGroup.Text = "&Remove Group";
+            this.cmdRemoveResourceGroup.Click += new System.EventHandler(this.cmdRemoveResourceGroup_Click);
+            // 
+            // cmdAddResourceGroup
+            // 
+            this.cmdAddResourceGroup.Location = new System.Drawing.Point(16, 8);
+            this.cmdAddResourceGroup.Name = "cmdAddResourceGroup";
+            this.cmdAddResourceGroup.Size = new System.Drawing.Size(128, 24);
+            this.cmdAddResourceGroup.TabIndex = 0;
+            this.cmdAddResourceGroup.Text = "&Add Group";
+            this.cmdAddResourceGroup.Click += new System.EventHandler(this.cmdAddResourceGroup_Click);
+            // 
+            // tpAccessTypes
+            // 
+            this.tpAccessTypes.Controls.Add(this.grdAccessTypes);
+            this.tpAccessTypes.Controls.Add(this.pnlDescriptionAT);
+            this.tpAccessTypes.Controls.Add(this.pnlAddEditAT);
+            this.tpAccessTypes.Location = new System.Drawing.Point(4, 22);
+            this.tpAccessTypes.Name = "tpAccessTypes";
+            this.tpAccessTypes.Size = new System.Drawing.Size(696, 428);
+            this.tpAccessTypes.TabIndex = 2;
+            this.tpAccessTypes.Text = "Access Types";
+            // 
+            // grdAccessTypes
+            // 
+            this.grdAccessTypes.DataMember = "";
+            this.grdAccessTypes.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grdAccessTypes.HeaderForeColor = System.Drawing.SystemColors.ControlText;
+            this.grdAccessTypes.Location = new System.Drawing.Point(0, 0);
+            this.grdAccessTypes.Name = "grdAccessTypes";
+            this.grdAccessTypes.ReadOnly = true;
+            this.grdAccessTypes.RowHeadersVisible = false;
+            this.grdAccessTypes.Size = new System.Drawing.Size(696, 316);
+            this.grdAccessTypes.TabIndex = 3;
+            this.grdAccessTypes.CurrentCellChanged += new System.EventHandler(this.grdAccessTypes_CurrentCellChanged);
+            // 
+            // pnlDescriptionAT
+            // 
+            this.pnlDescriptionAT.Controls.Add(this.grpDescriptionAT);
+            this.pnlDescriptionAT.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlDescriptionAT.Location = new System.Drawing.Point(0, 316);
+            this.pnlDescriptionAT.Name = "pnlDescriptionAT";
+            this.pnlDescriptionAT.Size = new System.Drawing.Size(696, 72);
+            this.pnlDescriptionAT.TabIndex = 2;
+            // 
+            // grpDescriptionAT
+            // 
+            this.grpDescriptionAT.Controls.Add(this.label1);
+            this.grpDescriptionAT.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grpDescriptionAT.Location = new System.Drawing.Point(0, 0);
+            this.grpDescriptionAT.Name = "grpDescriptionAT";
+            this.grpDescriptionAT.Size = new System.Drawing.Size(696, 72);
+            this.grpDescriptionAT.TabIndex = 0;
+            this.grpDescriptionAT.TabStop = false;
+            this.grpDescriptionAT.Text = "Description";
+            // 
+            // label1
+            // 
+            this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.label1.Location = new System.Drawing.Point(3, 16);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(690, 53);
+            this.label1.TabIndex = 1;
+            this.label1.Text = " Use the Access Types panel to define the kinds of access available for schedulin" +
+                "g at this facility.  Common types of access include Walkin, Scheduled, Same Day," +
+                " and Dental Expanded Functions.";
+            // 
+            // pnlAddEditAT
+            // 
+            this.pnlAddEditAT.Controls.Add(this.cmdChangeAT);
+            this.pnlAddEditAT.Controls.Add(this.cmdAddAT);
+            this.pnlAddEditAT.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlAddEditAT.Location = new System.Drawing.Point(0, 388);
+            this.pnlAddEditAT.Name = "pnlAddEditAT";
+            this.pnlAddEditAT.Size = new System.Drawing.Size(696, 40);
+            this.pnlAddEditAT.TabIndex = 1;
+            // 
+            // cmdChangeAT
+            // 
+            this.cmdChangeAT.Location = new System.Drawing.Point(160, 8);
+            this.cmdChangeAT.Name = "cmdChangeAT";
+            this.cmdChangeAT.Size = new System.Drawing.Size(128, 24);
+            this.cmdChangeAT.TabIndex = 1;
+            this.cmdChangeAT.Text = "&Change Access Type";
+            this.cmdChangeAT.Click += new System.EventHandler(this.cmdChangeAT_Click);
+            // 
+            // cmdAddAT
+            // 
+            this.cmdAddAT.Location = new System.Drawing.Point(16, 8);
+            this.cmdAddAT.Name = "cmdAddAT";
+            this.cmdAddAT.Size = new System.Drawing.Size(128, 24);
+            this.cmdAddAT.TabIndex = 0;
+            this.cmdAddAT.Text = "&Add Access Type";
+            this.cmdAddAT.Click += new System.EventHandler(this.cmdAddAT_Click);
+            // 
+            // tpAccessGroups
+            // 
+            this.tpAccessGroups.Controls.Add(this.grdAccessGroups);
+            this.tpAccessGroups.Controls.Add(this.pnlDescriptionAccessGroups);
+            this.tpAccessGroups.Controls.Add(this.pnlAddEditAccessGroup);
+            this.tpAccessGroups.Location = new System.Drawing.Point(4, 22);
+            this.tpAccessGroups.Name = "tpAccessGroups";
+            this.tpAccessGroups.Size = new System.Drawing.Size(696, 428);
+            this.tpAccessGroups.TabIndex = 1;
+            this.tpAccessGroups.Text = "Access Groups";
+            // 
+            // grdAccessGroups
+            // 
+            this.grdAccessGroups.AccessibleName = "DataGrid";
+            this.grdAccessGroups.AccessibleRole = System.Windows.Forms.AccessibleRole.Table;
+            this.grdAccessGroups.DataMember = "";
+            this.grdAccessGroups.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grdAccessGroups.HeaderForeColor = System.Drawing.SystemColors.ControlText;
+            this.grdAccessGroups.Location = new System.Drawing.Point(0, 0);
+            this.grdAccessGroups.Name = "grdAccessGroups";
+            this.grdAccessGroups.ReadOnly = true;
+            this.grdAccessGroups.Size = new System.Drawing.Size(696, 316);
+            this.grdAccessGroups.TabIndex = 5;
+            this.grdAccessGroups.CurrentCellChanged += new System.EventHandler(this.grdAccessGroups_CurrentCellChanged);
+            this.grdAccessGroups.Navigate += new System.Windows.Forms.NavigateEventHandler(this.grdAccessGroups_Navigate);
+            // 
+            // pnlDescriptionAccessGroups
+            // 
+            this.pnlDescriptionAccessGroups.Controls.Add(this.grpDescriptionAccessGroups);
+            this.pnlDescriptionAccessGroups.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlDescriptionAccessGroups.Location = new System.Drawing.Point(0, 316);
+            this.pnlDescriptionAccessGroups.Name = "pnlDescriptionAccessGroups";
+            this.pnlDescriptionAccessGroups.Size = new System.Drawing.Size(696, 72);
+            this.pnlDescriptionAccessGroups.TabIndex = 4;
+            // 
+            // grpDescriptionAccessGroups
+            // 
+            this.grpDescriptionAccessGroups.Controls.Add(this.lblDescriptionAccessGroups);
+            this.grpDescriptionAccessGroups.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grpDescriptionAccessGroups.Location = new System.Drawing.Point(0, 0);
+            this.grpDescriptionAccessGroups.Name = "grpDescriptionAccessGroups";
+            this.grpDescriptionAccessGroups.Size = new System.Drawing.Size(696, 72);
+            this.grpDescriptionAccessGroups.TabIndex = 0;
+            this.grpDescriptionAccessGroups.TabStop = false;
+            this.grpDescriptionAccessGroups.Text = "Description";
+            // 
+            // lblDescriptionAccessGroups
+            // 
+            this.lblDescriptionAccessGroups.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lblDescriptionAccessGroups.Location = new System.Drawing.Point(3, 16);
+            this.lblDescriptionAccessGroups.Name = "lblDescriptionAccessGroups";
+            this.lblDescriptionAccessGroups.Size = new System.Drawing.Size(690, 53);
+            this.lblDescriptionAccessGroups.TabIndex = 0;
+            this.lblDescriptionAccessGroups.Text = resources.GetString("lblDescriptionAccessGroups.Text");
+            // 
+            // pnlAddEditAccessGroup
+            // 
+            this.pnlAddEditAccessGroup.Controls.Add(this.cmdChangeAccessGroup);
+            this.pnlAddEditAccessGroup.Controls.Add(this.cmdRemoveAccessGroup);
+            this.pnlAddEditAccessGroup.Controls.Add(this.cmdAddAccessGroup);
+            this.pnlAddEditAccessGroup.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlAddEditAccessGroup.Location = new System.Drawing.Point(0, 388);
+            this.pnlAddEditAccessGroup.Name = "pnlAddEditAccessGroup";
+            this.pnlAddEditAccessGroup.Size = new System.Drawing.Size(696, 40);
+            this.pnlAddEditAccessGroup.TabIndex = 3;
+            // 
+            // cmdChangeAccessGroup
+            // 
+            this.cmdChangeAccessGroup.Enabled = false;
+            this.cmdChangeAccessGroup.Location = new System.Drawing.Point(160, 8);
+            this.cmdChangeAccessGroup.Name = "cmdChangeAccessGroup";
+            this.cmdChangeAccessGroup.Size = new System.Drawing.Size(128, 24);
+            this.cmdChangeAccessGroup.TabIndex = 3;
+            this.cmdChangeAccessGroup.Text = "&Change Group";
+            this.cmdChangeAccessGroup.Click += new System.EventHandler(this.cmdChangeAccessGroup_Click);
+            // 
+            // cmdRemoveAccessGroup
+            // 
+            this.cmdRemoveAccessGroup.Enabled = false;
+            this.cmdRemoveAccessGroup.Location = new System.Drawing.Point(304, 8);
+            this.cmdRemoveAccessGroup.Name = "cmdRemoveAccessGroup";
+            this.cmdRemoveAccessGroup.Size = new System.Drawing.Size(128, 24);
+            this.cmdRemoveAccessGroup.TabIndex = 1;
+            this.cmdRemoveAccessGroup.Text = "&Remove Group";
+            this.cmdRemoveAccessGroup.Click += new System.EventHandler(this.cmdRemoveAccessGroup_Click);
+            // 
+            // cmdAddAccessGroup
+            // 
+            this.cmdAddAccessGroup.Location = new System.Drawing.Point(16, 8);
+            this.cmdAddAccessGroup.Name = "cmdAddAccessGroup";
+            this.cmdAddAccessGroup.Size = new System.Drawing.Size(128, 24);
+            this.cmdAddAccessGroup.TabIndex = 0;
+            this.cmdAddAccessGroup.Text = "&Add Group";
+            this.cmdAddAccessGroup.Click += new System.EventHandler(this.cmdAddAccessGroup_Click);
+            // 
+            // tpTransferAppts
+            // 
+            this.tpTransferAppts.Controls.Add(this.label5);
+            this.tpTransferAppts.Controls.Add(this.dtpEnd);
+            this.tpTransferAppts.Controls.Add(this.label4);
+            this.tpTransferAppts.Controls.Add(this.dtpBegin);
+            this.tpTransferAppts.Controls.Add(this.label3);
+            this.tpTransferAppts.Controls.Add(this.cboBSDXClinic);
+            this.tpTransferAppts.Controls.Add(this.label2);
+            this.tpTransferAppts.Controls.Add(this.cboRPMSClinic);
+            this.tpTransferAppts.Controls.Add(this.pnlDescriptionXfer);
+            this.tpTransferAppts.Controls.Add(this.pnlCmdXfer);
+            this.tpTransferAppts.Location = new System.Drawing.Point(4, 22);
+            this.tpTransferAppts.Name = "tpTransferAppts";
+            this.tpTransferAppts.Size = new System.Drawing.Size(696, 428);
+            this.tpTransferAppts.TabIndex = 5;
+            this.tpTransferAppts.Text = "Copy Appointments";
+            // 
+            // label5
+            // 
+            this.label5.Location = new System.Drawing.Point(8, 128);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(144, 18);
+            this.label5.TabIndex = 10;
+            this.label5.Text = "End with appointments on:";
+            // 
+            // dtpEnd
+            // 
+            this.dtpEnd.Location = new System.Drawing.Point(152, 128);
+            this.dtpEnd.Name = "dtpEnd";
+            this.dtpEnd.Size = new System.Drawing.Size(232, 20);
+            this.dtpEnd.TabIndex = 9;
+            // 
+            // label4
+            // 
+            this.label4.Location = new System.Drawing.Point(8, 94);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(144, 18);
+            this.label4.TabIndex = 8;
+            this.label4.Text = "Start with appointments on:";
+            // 
+            // dtpBegin
+            // 
+            this.dtpBegin.Location = new System.Drawing.Point(152, 93);
+            this.dtpBegin.Name = "dtpBegin";
+            this.dtpBegin.Size = new System.Drawing.Size(232, 20);
+            this.dtpBegin.TabIndex = 7;
+            // 
+            // label3
+            // 
+            this.label3.Location = new System.Drawing.Point(8, 46);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(136, 24);
+            this.label3.TabIndex = 6;
+            this.label3.Text = "Copy To Windows Scheduling Resource:";
+            // 
+            // cboBSDXClinic
+            // 
+            this.cboBSDXClinic.Location = new System.Drawing.Point(152, 48);
+            this.cboBSDXClinic.Name = "cboBSDXClinic";
+            this.cboBSDXClinic.Size = new System.Drawing.Size(232, 21);
+            this.cboBSDXClinic.TabIndex = 5;
+            this.cboBSDXClinic.Text = "cboBSDXClinic";
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(8, 18);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(136, 16);
+            this.label2.TabIndex = 4;
+            this.label2.Text = "Copy From VistA Clinic:";
+            // 
+            // cboRPMSClinic
+            // 
+            this.cboRPMSClinic.Location = new System.Drawing.Point(152, 16);
+            this.cboRPMSClinic.Name = "cboRPMSClinic";
+            this.cboRPMSClinic.Size = new System.Drawing.Size(232, 21);
+            this.cboRPMSClinic.TabIndex = 3;
+            this.cboRPMSClinic.Text = "cboRPMSClinic";
+            // 
+            // pnlDescriptionXfer
+            // 
+            this.pnlDescriptionXfer.Controls.Add(this.grpDescriptionXfer);
+            this.pnlDescriptionXfer.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlDescriptionXfer.Location = new System.Drawing.Point(0, 316);
+            this.pnlDescriptionXfer.Name = "pnlDescriptionXfer";
+            this.pnlDescriptionXfer.Size = new System.Drawing.Size(696, 72);
+            this.pnlDescriptionXfer.TabIndex = 2;
+            // 
+            // grpDescriptionXfer
+            // 
+            this.grpDescriptionXfer.Controls.Add(this.lblDescriptionXfer);
+            this.grpDescriptionXfer.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grpDescriptionXfer.Location = new System.Drawing.Point(0, 0);
+            this.grpDescriptionXfer.Name = "grpDescriptionXfer";
+            this.grpDescriptionXfer.Size = new System.Drawing.Size(696, 72);
+            this.grpDescriptionXfer.TabIndex = 0;
+            this.grpDescriptionXfer.TabStop = false;
+            this.grpDescriptionXfer.Text = "Description";
+            // 
+            // lblDescriptionXfer
+            // 
+            this.lblDescriptionXfer.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lblDescriptionXfer.Location = new System.Drawing.Point(3, 16);
+            this.lblDescriptionXfer.Name = "lblDescriptionXfer";
+            this.lblDescriptionXfer.Size = new System.Drawing.Size(690, 53);
+            this.lblDescriptionXfer.TabIndex = 0;
+            this.lblDescriptionXfer.Text = resources.GetString("lblDescriptionXfer.Text");
+            // 
+            // pnlCmdXfer
+            // 
+            this.pnlCmdXfer.Controls.Add(this.cmdCopyAppts);
+            this.pnlCmdXfer.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlCmdXfer.Location = new System.Drawing.Point(0, 388);
+            this.pnlCmdXfer.Name = "pnlCmdXfer";
+            this.pnlCmdXfer.Size = new System.Drawing.Size(696, 40);
+            this.pnlCmdXfer.TabIndex = 1;
+            // 
+            // cmdCopyAppts
+            // 
+            this.cmdCopyAppts.Location = new System.Drawing.Point(16, 8);
+            this.cmdCopyAppts.Name = "cmdCopyAppts";
+            this.cmdCopyAppts.Size = new System.Drawing.Size(128, 24);
+            this.cmdCopyAppts.TabIndex = 0;
+            this.cmdCopyAppts.Text = "&Copy Appointments";
+            this.cmdCopyAppts.Click += new System.EventHandler(this.cmdCopyAppts_Click);
+            // 
+            // tpWorkStations
+            // 
+            this.tpWorkStations.Controls.Add(this.grdWorkStations);
+            this.tpWorkStations.Controls.Add(this.pnlWorkstations);
+            this.tpWorkStations.Controls.Add(this.panel1);
+            this.tpWorkStations.Location = new System.Drawing.Point(4, 22);
+            this.tpWorkStations.Name = "tpWorkStations";
+            this.tpWorkStations.Size = new System.Drawing.Size(696, 428);
+            this.tpWorkStations.TabIndex = 6;
+            this.tpWorkStations.Text = "WorkStations";
+            // 
+            // grdWorkStations
+            // 
+            this.grdWorkStations.AccessibleName = "DataGrid";
+            this.grdWorkStations.AccessibleRole = System.Windows.Forms.AccessibleRole.Table;
+            this.grdWorkStations.DataMember = "";
+            this.grdWorkStations.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grdWorkStations.HeaderForeColor = System.Drawing.SystemColors.ControlText;
+            this.grdWorkStations.Location = new System.Drawing.Point(0, 0);
+            this.grdWorkStations.Name = "grdWorkStations";
+            this.grdWorkStations.ReadOnly = true;
+            this.grdWorkStations.Size = new System.Drawing.Size(696, 316);
+            this.grdWorkStations.TabIndex = 6;
+            // 
+            // pnlWorkstations
+            // 
+            this.pnlWorkstations.Controls.Add(this.groupBox1);
+            this.pnlWorkstations.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlWorkstations.Location = new System.Drawing.Point(0, 316);
+            this.pnlWorkstations.Name = "pnlWorkstations";
+            this.pnlWorkstations.Size = new System.Drawing.Size(696, 72);
+            this.pnlWorkstations.TabIndex = 5;
+            // 
+            // groupBox1
+            // 
+            this.groupBox1.Controls.Add(this.lblWorkstations);
+            this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.groupBox1.Location = new System.Drawing.Point(0, 0);
+            this.groupBox1.Name = "groupBox1";
+            this.groupBox1.Size = new System.Drawing.Size(696, 72);
+            this.groupBox1.TabIndex = 0;
+            this.groupBox1.TabStop = false;
+            this.groupBox1.Text = "Description";
+            // 
+            // lblWorkstations
+            // 
+            this.lblWorkstations.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lblWorkstations.Location = new System.Drawing.Point(3, 16);
+            this.lblWorkstations.Name = "lblWorkstations";
+            this.lblWorkstations.Size = new System.Drawing.Size(690, 53);
+            this.lblWorkstations.TabIndex = 0;
+            this.lblWorkstations.Text = resources.GetString("lblWorkstations.Text");
+            // 
+            // panel1
+            // 
+            this.panel1.Controls.Add(this.txtSendMessage);
+            this.panel1.Controls.Add(this.cmdWorkStationsMessage);
+            this.panel1.Controls.Add(this.cmdWorkStationsShutdown);
+            this.panel1.Controls.Add(this.cmdWorkStationsRefresh);
+            this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.panel1.Location = new System.Drawing.Point(0, 388);
+            this.panel1.Name = "panel1";
+            this.panel1.Size = new System.Drawing.Size(696, 40);
+            this.panel1.TabIndex = 4;
+            // 
+            // txtSendMessage
+            // 
+            this.txtSendMessage.Location = new System.Drawing.Point(440, 8);
+            this.txtSendMessage.Name = "txtSendMessage";
+            this.txtSendMessage.Size = new System.Drawing.Size(248, 20);
+            this.txtSendMessage.TabIndex = 4;
+            // 
+            // cmdWorkStationsMessage
+            // 
+            this.cmdWorkStationsMessage.Location = new System.Drawing.Point(160, 8);
+            this.cmdWorkStationsMessage.Name = "cmdWorkStationsMessage";
+            this.cmdWorkStationsMessage.Size = new System.Drawing.Size(128, 24);
+            this.cmdWorkStationsMessage.TabIndex = 3;
+            this.cmdWorkStationsMessage.Text = "Send &Message";
+            this.cmdWorkStationsMessage.Click += new System.EventHandler(this.cmdWorkStationsMessage_Click);
+            // 
+            // cmdWorkStationsShutdown
+            // 
+            this.cmdWorkStationsShutdown.Location = new System.Drawing.Point(304, 8);
+            this.cmdWorkStationsShutdown.Name = "cmdWorkStationsShutdown";
+            this.cmdWorkStationsShutdown.Size = new System.Drawing.Size(128, 24);
+            this.cmdWorkStationsShutdown.TabIndex = 1;
+            this.cmdWorkStationsShutdown.Text = "&Stop Workstations";
+            this.cmdWorkStationsShutdown.Click += new System.EventHandler(this.cmdWorkStationsShutdown_Click);
+            // 
+            // cmdWorkStationsRefresh
+            // 
+            this.cmdWorkStationsRefresh.Location = new System.Drawing.Point(16, 8);
+            this.cmdWorkStationsRefresh.Name = "cmdWorkStationsRefresh";
+            this.cmdWorkStationsRefresh.Size = new System.Drawing.Size(128, 24);
+            this.cmdWorkStationsRefresh.TabIndex = 0;
+            this.cmdWorkStationsRefresh.Text = "&Refresh";
+            this.cmdWorkStationsRefresh.Click += new System.EventHandler(this.cmdWorkStationsRefresh_Click);
+            // 
+            // DManagement
+            // 
+            this.AcceptButton = this.cmdClose;
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.ClientSize = new System.Drawing.Size(704, 494);
+            this.Controls.Add(this.tabMain);
+            this.Controls.Add(this.pnlPageBottom);
+            this.Name = "DManagement";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Scheduling Management";
+            this.Closing += new System.ComponentModel.CancelEventHandler(this.DManagement_Closing);
+            this.Load += new System.EventHandler(this.DManagement_Load);
+            this.pnlPageBottom.ResumeLayout(false);
+            this.tabMain.ResumeLayout(false);
+            this.tpResources.ResumeLayout(false);
+            this.pnlResources.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.grdResources)).EndInit();
+            this.pnlDescription.ResumeLayout(false);
+            this.grpDescription.ResumeLayout(false);
+            this.pnlAddEdit.ResumeLayout(false);
+            this.tpResourceGroups.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.grdResourceGroup)).EndInit();
+            this.pnlDescriptionResourceGroup.ResumeLayout(false);
+            this.grpDescriptionResourceGroup.ResumeLayout(false);
+            this.pnlAddEditResourceGroups.ResumeLayout(false);
+            this.tpAccessTypes.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.grdAccessTypes)).EndInit();
+            this.pnlDescriptionAT.ResumeLayout(false);
+            this.grpDescriptionAT.ResumeLayout(false);
+            this.pnlAddEditAT.ResumeLayout(false);
+            this.tpAccessGroups.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.grdAccessGroups)).EndInit();
+            this.pnlDescriptionAccessGroups.ResumeLayout(false);
+            this.grpDescriptionAccessGroups.ResumeLayout(false);
+            this.pnlAddEditAccessGroup.ResumeLayout(false);
+            this.tpTransferAppts.ResumeLayout(false);
+            this.pnlDescriptionXfer.ResumeLayout(false);
+            this.grpDescriptionXfer.ResumeLayout(false);
+            this.pnlCmdXfer.ResumeLayout(false);
+            this.tpWorkStations.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.grdWorkStations)).EndInit();
+            this.pnlWorkstations.ResumeLayout(false);
+            this.groupBox1.ResumeLayout(false);
+            this.panel1.ResumeLayout(false);
+            this.panel1.PerformLayout();
+            this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		#region TabMain
+		private void tabMain_Click(object sender, System.EventArgs e)
+		{
+			TabPage tp = tabMain.SelectedTab;
+			if (tp.Text == "Resource Groups")
+			{
+				//20041109 Added below
+				InitResourceGroupsPage();
+			}
+			//20041109 Added below
+			if (tp.Text == "Access Groups")
+			{
+				InitAccessGroupsPage();
+			}
+		
+		}
+		#endregion TabMain
+
+		#region Resources
+
+		private void cmdAddResource_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				if (m_bEditUsers == true)
+				{
+					AddResourceUser();
+					return;
+				}
+
+				DResource dRes = new DResource();
+				dRes.InitializePage(-1, this.m_dsGlobal);
+				if (dRes.ShowDialog(this) == DialogResult.Cancel)
+				{
+					return;
+				}
+
+				//Call RPMS to add new resource
+				bool bInactive = dRes.Inactive;
+				string sInactive = (bInactive == true)?"YES":"NO";
+				string sResourceName = dRes.ResourceName;
+				int nHospLocID = dRes.HospitalLocationID;
+				string sHospLocID = nHospLocID.ToString();
+				int nResourceID = dRes.ResourceID;
+				string sResourceID = nResourceID.ToString();
+
+				int nTimeScale = dRes.TimeScale;
+				string sTimeScale = nTimeScale.ToString();
+				string sLetterText = dRes.LetterText;
+
+				string sNoShowLetter = dRes.NoShowLetterText;
+				string sCancellationLetter = dRes.CancellationLetterText;
+
+				string sSql = "BSDX ADD/EDIT RESOURCE^" + sResourceID + "|" + sResourceName + "|" + sInactive + "|" + sHospLocID + "|" + sTimeScale + "|" + sLetterText + "|" + sNoShowLetter + "|" + sCancellationLetter;
+				DataTable dtRes = m_DocManager.RPMSDataTable(sSql, "Resource");
+
+				Debug.Assert(dtRes.Rows.Count == 1);
+				if (dtRes.Rows.Count != 1)
+				{
+					throw new Exception("DManagement:cmdAddResource_Click: Unable to add new Resource.");
+				}
+				DataRow dr = dtRes.Rows[0];
+				int nErrorID = (int) dr["RESOURCEID"];
+				if (nErrorID == 0)
+				{
+					throw new Exception((string) dr["ERRORTEXT"]);
+				}
+				m_dsGlobal.Tables["GroupResources"].Clear();
+				m_dsGlobal.Tables["ResourceUser"].Clear();
+				m_dsGlobal.Tables["Resources"].Clear();
+				m_DocManager.LoadBSDXResourcesTable();
+
+				m_DocManager.LoadGroupResourcesTable();
+			
+				m_DocManager.LoadResourceUserTable();
+
+				m_DocManager.UpdateViews();
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show(ex.Message);
+			}
+		}
+
+		private void cmdChangeResource_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				if (m_bEditUsers == true)
+				{
+					ChangeResourceUser();
+					return;
+				}
+			
+				Object oSelectedResourceID = grdResources[grdResources.CurrentRowIndex, 0];
+				int nSelectedResourceID = Convert.ToInt16(oSelectedResourceID);
+
+				DResource dRes = new DResource();
+				dRes.InitializePage(nSelectedResourceID, this.m_dsGlobal);
+
+				if (dRes.ShowDialog(this) == DialogResult.Cancel)
+				{
+					return;
+				}
+
+				//Call RPMS to change data for resource
+				bool bInactive = dRes.Inactive;
+				string sInactive = (bInactive == true)?"YES":"NO";
+				string sResourceName = dRes.ResourceName;
+				int nHospLocID = dRes.HospitalLocationID;
+				string sHospLocID = nHospLocID.ToString();
+				int nResourceID = dRes.ResourceID;
+				string sResourceID = nResourceID.ToString();
+
+				int nTimeScale = dRes.TimeScale;
+				string sTimeScale = nTimeScale.ToString();
+				string sLetterText = dRes.LetterText;
+
+				string sNoShowLetter = dRes.NoShowLetterText;
+				string sCancellationLetter = dRes.CancellationLetterText;
+
+				//Replace all crlfs with "@~" character combination
+				//sLetterText = sLetterText.Replace("\r\n","@~");
+
+				string sSql = "BSDX ADD/EDIT RESOURCE^" + sResourceID + "|" + sResourceName + "|" + sInactive + "|" + sHospLocID + "|" + sTimeScale + "|" + sLetterText + "|" + sNoShowLetter + "|" + sCancellationLetter;
+				DataTable dtRes = m_DocManager.RPMSDataTable(sSql, "Resource");
+
+				if (dtRes.Rows.Count != 1)
+				{
+					Exception ex = new Exception("Unable to update Resource file");
+					throw ex;
+				}
+				DataRow rw = dtRes.Rows[0];
+				string sError = rw["ERRORTEXT"].ToString();
+				if (sError != "")
+				{
+					Exception ex = new Exception(sError);
+					throw ex;
+				}
+
+				m_dsGlobal.Tables["ResourceUser"].Clear();
+
+				m_dsGlobal.Tables["Resources"].Clear();
+				m_DocManager.LoadBSDXResourcesTable();
+				m_DocManager.LoadResourceUserTable();
+
+				m_dsGlobal.Tables["GroupResources"].Clear();
+				m_DocManager.LoadGroupResourcesTable();
+			
+				m_DocManager.UpdateViews();
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show(ex.Message);
+			}
+		}
+
+		private void grdResources_CurrentCellChanged(object sender, System.EventArgs e)
+		{
+			DataGridCell dgCell;
+			dgCell = this.grdResources.CurrentCell;
+			m_nResourceRow = dgCell.RowNumber;
+			this.grdResources.Select(m_nResourceRow);
+			if (m_sMember == "Resource")
+			{
+				Object dgItem = grdResources[dgCell.RowNumber, 0];
+				this.m_nResourceID = Convert.ToInt16(dgItem);
+				Debug.Write("m_nResourceID changed to " + m_nResourceID.ToString() + "\n");
+			}
+			this.cmdChangeResource.Enabled = true;
+		}
+		private void grdResources_Navigate(object sender, System.Windows.Forms.NavigateEventArgs ne)
+		{
+			m_sMember = grdResources.DataMember.ToString();
+			if (m_sMember == "")
+				m_sMember = "Resource";
+
+			if (m_sMember == "ResourceUser")
+			{
+				m_bEditUsers = true;
+				this.cmdAddResource.Text = "Add User...";
+				this.cmdChangeResource.Text = "Change User...";
+				this.cmdRemoveUser.Visible = true;
+				this.lblDescription.Text = "Define the users who can create appointments and establish availability for a particular resource.  Users must first be given basic access to the VistA Scheduling package using standard VistA menu and key management before they can be selected here and assigned to a resource.  Click the left-pointing arrow near the upper right of the window to go back to the list of resources.";
+				int nRows = this.grdResources.VisibleRowCount;
+				if (nRows == 0)
+				{
+					this.cmdChangeResource.Enabled = false;
+					this.cmdRemoveUser.Enabled = false;
+				}
+				else
+				{
+					grdResources.CurrentCell = new DataGridCell(0, 0);
+					this.cmdChangeResource.Enabled = true;
+					this.cmdRemoveUser.Enabled = true;
+				}
+			}
+			else
+			{
+				m_bEditUsers = false;
+				this.cmdAddResource.Text = "Add ...";
+				this.cmdChangeResource.Text = "Change...";
+				this.cmdRemoveUser.Visible = false;
+				this.lblDescription.Text="Use the resources panel to define the set of clinical entities available for scheduling at this facility.  Resources may include care providers (for example, dentists and physicians) or other kinds of scheduled services, facilities or equipment.  Click the small + sign next to the resource name to manage the users who can schedule this resource.";
+				this.cmdChangeResource.Enabled = true;
+			}
+		}
+
+		#endregion Resources
+
+		#region ResourceUser
+
+		private void AddResourceUser()
+		{
+			DResourceUser dRes = new DResourceUser();
+
+			//Find out if there are any rows here
+			int nRows = this.grdResources.VisibleRowCount;
+			if (nRows == 0)
+			{
+				this.cmdChangeResource.Enabled = false;
+				this.cmdRemoveUser.Enabled = false;
+			}
+
+			dRes.InitializePage(-1, this.m_dsGlobal);
+			if (dRes.ShowDialog(this) == DialogResult.Cancel)
+			{
+				return;
+			}
+			//Call RPMS to add new Resource User
+			int nUserID = dRes.UserID;
+			string sUserID = nUserID.ToString();
+			bool bOverbook = dRes.Overbook;
+			string sOverbook = (bOverbook == true)?"YES":"NO";
+			bool bModifySchedule = dRes.ModifySchedule;
+			string sModifySchedule = (bModifySchedule == true)?"YES":"NO";
+			bool bAppointments = dRes.Appoinmtments;
+			string sAppointments = (bAppointments == true)?"YES":"NO";
+
+			string sSql = "BSDX ADD/EDIT RESOURCEUSER^" + "0" + "|" + sOverbook + "|" + sModifySchedule + "|" + m_nResourceID + "|" + sUserID + "|" + sAppointments;
+			DataTable dtRes = m_DocManager.RPMSDataTable(sSql, "TempResourceUser");
+
+			m_dsGlobal.Tables["ResourceUser"].Clear();
+			m_DocManager.LoadResourceUserTable(true);
+			
+			m_DocManager.UpdateViews();
+		}
+
+
+		private void ChangeResourceUser()
+		{
+			Object oSelectedResourceUserID = grdResources[grdResources.CurrentCell.RowNumber, 1];
+			int nSelectedResourceUserID = Convert.ToInt16(oSelectedResourceUserID);
+			DResourceUser dRes = new DResourceUser();
+			dRes.InitializePage(nSelectedResourceUserID, this.m_dsGlobal);
+			if (dRes.ShowDialog(this) != DialogResult.OK)
+			{
+				return;
+			}
+			//Call RPMS to change Resource User
+			int nUserID = dRes.UserID;
+			string sUserID = nUserID.ToString();
+			bool bOverbook = dRes.Overbook;
+			string sOverbook = (bOverbook == true)?"YES":"NO";
+			bool bModifySchedule = dRes.ModifySchedule;
+			string sModifySchedule = (bModifySchedule == true)?"YES":"NO";
+			bool bAppointments = dRes.Appoinmtments;
+			string sAppointments = (bAppointments == true)?"YES":"NO";
+
+			string sSql = "BSDX ADD/EDIT RESOURCEUSER^" + nSelectedResourceUserID.ToString() + "|" + sOverbook + "|" + sModifySchedule + "|" + m_nResourceID + "|" + sUserID + "|" + sAppointments ;
+			DataTable dtRes = m_DocManager.RPMSDataTable(sSql, "TempResourceUser");
+
+			m_dsGlobal.Tables["ResourceUser"].Clear();
+			m_DocManager.LoadResourceUserTable(true);
+			
+			m_DocManager.UpdateViews();
+		}
+
+
+		private void cmdRemoveUser_Click(object sender, System.EventArgs e)
+		{
+			Object oSelectedResourceUserID = grdResources[grdResources.CurrentCell.RowNumber, 1];
+			int nSelectedResourceUserID = Convert.ToInt16(oSelectedResourceUserID);
+
+			string sSql = "BSDX DELETE RESOURCEUSER^" + nSelectedResourceUserID.ToString();
+			DataTable dtRes = m_DocManager.RPMSDataTable(sSql, "TempResUsr");
+
+			m_dsGlobal.Tables["ResourceUser"].Clear();
+			m_DocManager.LoadResourceUserTable(true);
+			
+			m_DocManager.UpdateViews();
+			int nRows = this.grdResources.VisibleRowCount;
+			if (nRows == 0)
+			{
+				this.cmdChangeResource.Enabled = false;
+				this.cmdRemoveUser.Enabled = false;
+			}
+			else
+			{
+				grdResources.Select(0);
+				this.cmdChangeResource.Enabled = true;
+				this.cmdRemoveUser.Enabled = true;
+			}
+		}
+
+		#endregion ResourceUser
+
+		#region ResourceGroups
+
+		//20041109 Added below
+		private void InitResourceGroupsPage()
+		{
+			this.cmdChangeResourceGroup.Enabled = false;
+			this.cmdRemoveResourceGroup.Enabled = false;
+			if (this.m_dvResourceGroup.Count > 0)
+			{
+				this.m_nResourceGroupRow = 0;
+
+				this.grdResourceGroup.CurrentCell = new DataGridCell(0,0);
+				this.grdResourceGroup.Select(0);
+				this.m_nResourceGroupRow = 0;
+				object dgItem = this.grdResourceGroup[0,0];
+				this.m_nResourceGroupID = Convert.ToInt16(dgItem);
+				dgItem = grdResourceGroup[0,1];
+				this.m_sResourceGroupName = dgItem.ToString();
+
+				this.cmdChangeResourceGroup.Enabled = true;
+				this.cmdRemoveResourceGroup.Enabled = true;
+			}		
+		}
+
+		private void cmdAddResourceGroup_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				if (m_bEditGroupItems == true)
+				{
+					AddResourceGroupItem();
+					return;
+				}
+
+				DResourceGroup dRes = new DResourceGroup();
+				dRes.InitializePage(-1, this.m_dsGlobal);
+				if (dRes.ShowDialog(this) == DialogResult.Cancel)
+				{
+					return;
+				}
+
+				//Call RPMS to add new resource
+
+				string sResGroupName = dRes.ResourceGroupName;
+
+				string sSql = "BSDX ADD/EDIT RESOURCE GROUP^0|" + sResGroupName;
+				DataTable dtRes = m_DocManager.RPMSDataTable(sSql, "ResourceGroup");
+				
+				Debug.Assert(dtRes.Rows.Count == 1);
+				if (dtRes.Rows.Count != 1)
+				{
+					throw new Exception("DManagement:cmdAddResource_Click: Unable to add new Resource Group.");
+				}
+				DataRow dr = dtRes.Rows[0];
+				int nErrorID = (int) dr["RESOURCEGROUPID"];
+				if (nErrorID == 0)
+				{
+					throw new Exception((string) dr["ERRORTEXT"]);
+				}
+
+				m_dsGlobal.Tables["GroupResources"].Clear();
+				m_DocManager.LoadGroupResourcesTable();
+				m_DocManager.LoadResourceGroupTable();
+			
+				m_DocManager.UpdateViews();
+
+				//20041109 Added below
+				InitResourceGroupsPage();
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show(ex.Message);
+			}
+		}
+
+		private void grdResourceGroup_CurrentCellChanged(object sender, System.EventArgs e)
+		{
+			DataGridCell dgCell;
+			dgCell = grdResourceGroup.CurrentCell;
+			m_nResourceGroupRow = dgCell.RowNumber;
+			grdResourceGroup.Select(m_nResourceGroupRow);
+			if (m_sGroupMember == "Group")
+			{
+				Object dgItem = grdResourceGroup[dgCell.RowNumber, 1];
+				m_sResourceGroupName = dgItem.ToString();
+				dgItem = grdResourceGroup[dgCell.RowNumber, 0];
+				m_nResourceGroupID = Convert.ToInt16(dgItem);
+				Debug.Write("m_nResourceGroupID changed to " + m_nResourceGroupID.ToString() + "\n");
+			}
+			this.cmdRemoveResourceGroup.Enabled = true;
+			this.cmdChangeResourceGroup.Enabled = true;
+		}
+		
+
+		private void grdResourceGroup_Navigate(object sender, System.Windows.Forms.NavigateEventArgs ne)
+		{
+			m_sGroupMember = grdResourceGroup.DataMember.ToString();
+			if (m_sGroupMember == "")
+				m_sGroupMember = "Group";
+
+			if (m_sGroupMember == "GroupResource")
+			{
+				m_bEditGroupItems = true;
+				cmdAddResourceGroup.Text = "Add Resource";
+				this.cmdRemoveResourceGroup.Text = "Remove Resource";
+				this.cmdChangeResourceGroup.Visible = false;
+				this.cmdRemoveResourceGroup.Visible = true;
+				this.lblDescriptionResourceGroup.Text = "Define the Resource which will be a part of this group.  Click the left-pointing arrow near the upper right of the window to go back to the list of Resource Groups.";
+				int nRows = this.grdResourceGroup.VisibleRowCount;
+				if (nRows == 0)
+				{
+					this.cmdRemoveResourceGroup.Enabled = false;
+					this.cmdChangeResourceGroup.Visible = false;
+				}
+				else
+				{
+					grdResourceGroup.CurrentCell = new DataGridCell(0, 0);
+					this.cmdChangeResourceGroup.Visible = false;
+					this.cmdRemoveResourceGroup.Enabled = true;
+				}
+			}
+			else
+			{
+				m_bEditGroupItems = false;
+				this.cmdAddResourceGroup.Text = "&Add Group";
+				this.cmdRemoveResourceGroup.Text = "&Remove Group";
+				this.cmdChangeResourceGroup.Visible = true;
+				this.lblDescriptionResourceGroup.Text="Use this panel to organize Resources into useful groups.  Resource Groups may include departments, clinics or any other collection of resources.  Resource groups will be visible to all scheduling users.";
+			}		
+		}
+
+		private void cmdRemoveResourceGroup_Click(object sender, System.EventArgs e)
+		{
+			if (m_bEditGroupItems == true)
+			{
+				RemoveResourceGroupItem();
+				return;
+			}
+		
+			string sSql = "BSDX DELETE RESOURCE GROUP^" + m_sResourceGroupName;
+			DataTable dtRes = m_DocManager.RPMSDataTable(sSql, "TempResGrp");
+
+			m_dsGlobal.Tables["GroupResources"].Clear();
+			m_DocManager.LoadGroupResourcesTable();
+			m_DocManager.LoadResourceGroupTable();
+
+			DataTable dt = m_dsGlobal.Tables["ResourceGroup"];
+			DataRow dr = dt.Rows.Find(m_sResourceGroupName);
+			dr.Delete();
+			dr.AcceptChanges();
+			
+			m_DocManager.UpdateViews();
+
+			//20041109 Added below
+			InitResourceGroupsPage();
+
+			//20041109 Removed below
+//			int nRows = this.grdResourceGroup.VisibleRowCount;
+//			if (nRows == 0)
+//			{
+//				this.cmdRemoveResourceGroup.Enabled = false;
+//			}
+//			else
+//			{
+//				grdResourceGroup.Select(0);
+//				this.cmdRemoveResourceGroup.Enabled = true;
+//			}
+
+		}
+
+		private void AddResourceGroupItem()
+		{
+			DResourceGroupItem dRes = new DResourceGroupItem();
+			dRes.InitializePage(-1, this.m_dsGlobal);
+			if (dRes.ShowDialog(this) == DialogResult.Cancel)
+			{
+				return;
+			}
+
+			//Call RPMS to add new resource
+
+			int nResID = dRes.ResourceID;
+
+			string sSql = "BSDX ADD RES GROUP ITEM^" + m_nResourceGroupID.ToString() + "^" + nResID.ToString();
+			DataTable dtRes = m_DocManager.RPMSDataTable(sSql, "ResourceGroupItem");
+
+			this.cmdRemoveResourceGroup.Enabled = true;
+
+			m_dsGlobal.Tables["GroupResources"].Clear();
+			m_DocManager.LoadGroupResourcesTable();
+			
+			m_DocManager.UpdateViews();
+
+		}
+
+		private void RemoveResourceGroupItem()
+		{
+			Object oSelectedResourceName = this.grdResourceGroup[grdResourceGroup.CurrentCell.RowNumber, 1];
+			string sSelectedResourceName = oSelectedResourceName.ToString();
+
+			Object oSelectedResourceGroupID = this.grdResourceGroup[grdResourceGroup.CurrentCell.RowNumber, 0];
+			int nSelectedResourceGroupID = Convert.ToInt16(oSelectedResourceGroupID);
+
+			Object oSelectedResourceItemID = this.grdResourceGroup[grdResourceGroup.CurrentCell.RowNumber, 2];
+			int nSelectedResourceItemID = Convert.ToInt16(oSelectedResourceItemID);
+			
+			string sSql = "BSDX DELETE RES GROUP ITEM^" + nSelectedResourceGroupID.ToString() + "^" + nSelectedResourceItemID.ToString();
+			DataTable dtRes = m_DocManager.RPMSDataTable(sSql, "TempResGrpItem");
+
+			m_dsGlobal.Tables["GroupResources"].Clear();
+			m_DocManager.LoadGroupResourcesTable();
+			
+			m_DocManager.UpdateViews();
+			int nRows = this.grdResourceGroup.VisibleRowCount;
+			if (nRows == 0)
+			{
+				this.cmdRemoveResourceGroup.Enabled = false;
+			}
+			else
+			{
+				grdResourceGroup.Select(0);
+				this.cmdRemoveResourceGroup.Enabled = true;
+			}
+		}
+
+		private void cmdChangeResourceGroup_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				int nRows = this.grdResourceGroup.VisibleRowCount;
+				if (nRows == 0)
+				{
+					Debug.Assert(false, "This code shouldn't execute.");
+					m_sResourceGroupName = "";
+					this.cmdChangeResource.Enabled = false;
+					this.cmdRemoveResourceGroup.Enabled = false;
+					return;
+				}
+				else
+				{
+					DataGridCell dgCell;
+					dgCell = grdResourceGroup.CurrentCell;
+					Object dgItem = grdResourceGroup[dgCell.RowNumber, 1];
+					m_sResourceGroupName = dgItem.ToString();
+					this.cmdChangeResource.Enabled = true;
+					this.cmdRemoveResourceGroup.Enabled = true;
+				}
+
+				DataTable dt = m_dsGlobal.Tables["ResourceGroup"];
+				DataRow dr = dt.Rows.Find(m_sResourceGroupName);
+				int nRGID = Convert.ToInt16(dr["RESOURCE_GROUPID"]);
+
+				DResourceGroup dRes = new DResourceGroup();
+				dRes.ResourceGroupName = m_sResourceGroupName;
+				dRes.InitializePage(nRGID, this.m_dsGlobal);
+				if (dRes.ShowDialog(this) == DialogResult.Cancel)
+				{
+					return;
+				}
+
+				//Call RPMS to change resource group
+
+				string sResGroupName = dRes.ResourceGroupName;
+			
+				string sSql = "BSDX ADD/EDIT RESOURCE GROUP^" + nRGID.ToString() + "|" + sResGroupName;
+				DataTable dtRes = m_DocManager.RPMSDataTable(sSql, "TempResGrp");
+
+				Debug.Assert(dtRes.Rows.Count == 1);
+				if (dtRes.Rows.Count != 1)
+				{
+					throw new Exception("DManagement:cmdAddResource_Click: Unable to edit Resource Group.");
+				}
+				dr = dtRes.Rows[0];
+				int nErrorID = (int) dr["RESOURCEGROUPID"];
+				if (nErrorID == 0)
+				{
+					throw new Exception((string) dr["ERRORTEXT"]);
+				}
+
+				m_sResourceGroupName = sResGroupName;
+				m_DocManager.LoadResourceGroupTable();
+				m_dsGlobal.Tables["GroupResources"].Clear();
+				m_DocManager.LoadGroupResourcesTable();
+
+
+				dr.Delete();
+				dr.AcceptChanges();
+			
+				m_DocManager.UpdateViews();
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show(ex.Message);
+			}
+		}
+
+		#endregion ResourceGroups
+
+		#region AccessTypes
+
+		private void grdAccessTypes_CurrentCellChanged(object sender, System.EventArgs e)
+		{
+			DataGridCell myCell;
+			myCell = this.grdAccessTypes.CurrentCell;
+			m_nATRow = myCell.RowNumber;
+			grdAccessTypes.Select(m_nATRow);
+			this.cmdChangeAT.Enabled = true;
+		}
+
+		private void cmdChangeAT_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				DAccessType dAT = new DAccessType();
+				dAT.InitializePage(m_nATRow, this.m_dsGlobal);
+
+				if (dAT.ShowDialog(this) == DialogResult.Cancel)
+				{
+					return;
+				}
+				//Call RPMS to change data for access type
+				bool bInactive = dAT.Inactive;
+				string sInactive = (bInactive == true)?"YES":"NO";
+				string sAccessTypeName = dAT.AccessTypeName;
+				string sColor = dAT.DisplayColor;
+				string sRed = dAT.Red.ToString();
+				string sBlue = dAT.Blue.ToString();
+				string sGreen = dAT.Green.ToString();
+				string sIEN = dAT.AccessIEN;
+			
+			
+				string sSql = "BSDX ADD/EDIT ACCESS TYPE^" + sIEN + "|" + sAccessTypeName + "|" + sInactive + "|" + sColor + "|" + sRed + "|" + sGreen + "|" + sBlue;
+				DataTable dtAppt = m_DocManager.RPMSDataTable(sSql, "AccessType");
+
+				Debug.Assert(dtAppt.Rows.Count == 1);
+				if (dtAppt.Rows.Count != 1)
+				{
+					throw new Exception("DManagement:cmdChangeAT_Click: Unable to add new Access Type.");
+				}
+				DataRow dr = dtAppt.Rows[0];
+				int nErrorID = (int) dr["ACCESSTYPEID"];
+				if (nErrorID == 0)
+				{
+					throw new Exception((string) dr["ERRORTEXT"]);
+				}
+
+                RefreshAccessTypesTables();
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show(ex.Message);
+			}
+		}
+
+        private void RefreshAccessTypesTables()
+        {
+            m_dsGlobal.Tables["AccessTypes"].Clear();
+            m_dsGlobal.Tables["AccessGroupType"].Clear();
+            DataTable dt1 = m_DocManager.DAL.GetAccessTypes();
+            m_dsGlobal.Tables["AccessTypes"].Merge(dt1);
+            m_dsGlobal.Tables.Add(dt1);
+            //Fix Groups
+            //m_DocManager.LoadAccessTypesTable();
+            m_DocManager.LoadAccessGroupTypesTable();
+            m_DocManager.UpdateViews();
+        }
+
+		private void cmdAddAT_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				DAccessType dAT = new DAccessType();
+				dAT.InitializePage(-1, this.m_dsGlobal);
+				if (dAT.ShowDialog(this) == DialogResult.Cancel)
+				{
+					return;
+				}
+
+				//Call RPMS to add new access type
+				bool bInactive = dAT.Inactive;
+				string sInactive = (bInactive == true)?"YES":"NO";
+				string sAccessTypeName = dAT.AccessTypeName;
+				string sColor = dAT.DisplayColor;
+				string sRed = dAT.Red.ToString();
+				string sBlue = dAT.Blue.ToString();
+				string sGreen = dAT.Green.ToString();
+
+				string sSql = "BSDX ADD/EDIT ACCESS TYPE^0|" + sAccessTypeName + "|" + sInactive + "|" + sColor + "|" + sRed + "|" + sGreen + "|" + sBlue;
+				DataTable dtAppt = m_DocManager.RPMSDataTable(sSql, "AccessType");
+
+				Debug.Assert(dtAppt.Rows.Count == 1);
+				if (dtAppt.Rows.Count != 1)
+				{
+					throw new Exception("DManagement:cmdAddAT_Click: Unable to add new Resource.");
+				}
+				DataRow dr = dtAppt.Rows[0];
+				int nErrorID = (int) dr["ACCESSTYPEID"];
+				if (nErrorID == 0)
+				{
+					throw new Exception((string) dr["ERRORTEXT"]);
+				}
+
+                RefreshAccessTypesTables();
+
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show(ex.Message);
+			}
+		}
+
+		#endregion AccessTypes
+
+		#region AccessGroups
+
+		private void InitAccessGroupsPage()
+		{
+			this.cmdChangeAccessGroup.Enabled = false;
+			this.cmdRemoveAccessGroup.Enabled = false;
+			if (this.m_dvAccessGroup.Count > 0)
+			{
+				this.m_nAccessGroupRow = 0;
+
+				this.grdAccessGroups.CurrentCell = new DataGridCell(0,0);
+				this.grdAccessGroups.Select(0);
+				this.m_nAccessGroupRow = 0;
+				object dgItem = this.grdAccessGroups[0,0];
+				this.m_nAccessGroupID = Convert.ToInt16(dgItem);
+				dgItem = grdAccessGroups[0,1];
+				this.m_sAccessGroupName = dgItem.ToString();
+				this.cmdChangeAccessGroup.Enabled = true;
+				this.cmdRemoveAccessGroup.Enabled = true;
+			}
+		}
+
+		private void grdAccessGroups_CurrentCellChanged(object sender, System.EventArgs e)
+		{
+			DataGridCell dgCell;
+			dgCell = grdAccessGroups.CurrentCell;
+			m_nAccessGroupRow = dgCell.RowNumber;
+			grdAccessGroups.Select(m_nAccessGroupRow);
+			if (m_sAccessGroupMember == "Group")
+			{
+				Object dgItem = grdAccessGroups[dgCell.RowNumber, 0];
+				m_sAccessGroupName = dgItem.ToString();
+				dgItem = grdAccessGroups[dgCell.RowNumber, 0];
+				m_nAccessGroupID = Convert.ToInt16(dgItem);
+				Debug.Write("m_nAccessGroupID changed to " + m_nAccessGroupID.ToString() + "\n");
+				dgItem = grdAccessGroups[dgCell.RowNumber, 1];
+				m_sAccessGroupName = dgItem.ToString();
+				Debug.Write("m_sAccessGroupName changed to " + m_sAccessGroupName + "\n");
+			}
+			cmdRemoveAccessGroup.Enabled = true;
+			cmdChangeAccessGroup.Enabled = true;
+		}
+
+		private void grdAccessGroups_Navigate(object sender, System.Windows.Forms.NavigateEventArgs ne)
+		{
+			m_sAccessGroupMember = grdAccessGroups.DataMember.ToString();
+			if (m_sAccessGroupMember == "")
+			{
+				m_sAccessGroupMember = "Group";
+			}
+
+			if (m_sAccessGroupMember == "AccessGroupType")
+			{
+				m_bEditAccessGroupItems = true;
+				this.cmdAddAccessGroup.Text = "&Add Type";
+				this.cmdRemoveAccessGroup.Text = "&Remove Type";
+				cmdChangeAccessGroup.Visible = false;
+				this.lblDescriptionAccessGroups.Text = "Define the Access Type which will be a part of this group.  Click the left-pointing arrow near the upper right of the window to go back to the list of Access Groups.";
+				int nRows = this.grdAccessGroups.VisibleRowCount;
+				if (nRows == 0)
+				{
+					this.cmdRemoveAccessGroup.Enabled = false;
+					cmdChangeAccessGroup.Visible = false;
+				}
+				else
+				{
+					grdAccessGroups.CurrentCell = new DataGridCell(0, 0);
+					cmdChangeAccessGroup.Visible = false;
+					this.cmdRemoveAccessGroup.Enabled = true;
+				}
+			}
+			else
+			{
+				m_bEditAccessGroupItems = false;
+				this.cmdAddAccessGroup.Text = "&Add Group";
+				this.cmdRemoveAccessGroup.Text = "&Remove Group";
+				cmdChangeAccessGroup.Visible = true;
+				this.lblDescriptionAccessGroups.Text="Use this panel to organize Access Types into convenient groups.  Access Groups are useful when selecting the Access Type (Walk-in, Same-Day, etc) to use when setting up the schedule for a resource.  Access Type Groups will be visible to all scheduling users.";
+			}			
+		}
+
+		private void cmdAddAccessGroup_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				if (m_bEditAccessGroupItems == true)
+				{
+					AddAccessGroupItem();
+					return;
+				}
+
+				DAccessGroup dRes = new DAccessGroup();
+				dRes.InitializePage(-1, this.m_dsGlobal);
+				if (dRes.ShowDialog(this) == DialogResult.Cancel)
+				{
+					return;
+				}
+
+				//Call RPMS to add new Acccess Group
+				string sAccessGroupName = dRes.AccessGroupName;
+				string sSql = "BSDX ADD/EDIT ACCESS GROUP^0|" + sAccessGroupName;
+				DataTable dtAppt = m_DocManager.RPMSDataTable(sSql, "AccessGroup");
+
+				Debug.Assert(dtAppt.Rows.Count == 1);
+				if (dtAppt.Rows.Count != 1)
+				{
+					throw new Exception("DManagement:cmdAddAccessGroup_Click: Unable to add new Resource.");
+				}
+				DataRow dr = dtAppt.Rows[0];
+				int nErrorID = (int) dr["ACCESSGROUPID"];
+				if (nErrorID == 0)
+				{
+					throw new Exception((string) dr["ERRORTEXT"]);
+				}
+
+				m_dsGlobal.Tables["AccessGroupType"].Clear();
+				m_dsGlobal.Tables["AccessGroup"].Clear();
+				m_DocManager.LoadAccessGroupsTable();
+				m_DocManager.LoadAccessGroupTypesTable();
+			
+				m_DocManager.UpdateViews();
+				
+				//20041109 Added
+				InitAccessGroupsPage();
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show(ex.Message);
+			}
+
+		}
+
+		private void cmdRemoveAccessGroup_Click(object sender, System.EventArgs e)
+		{
+			if (m_bEditAccessGroupItems == true)
+			{
+				RemoveAccessGroupItem();
+				return;
+			}
+		
+			string sSql = "BSDX DELETE ACCESS GROUP^" + this.m_nAccessGroupID;
+			DataTable dtAppt = m_DocManager.RPMSDataTable(sSql, "AccessGroup");
+
+			m_dsGlobal.Tables["AccessGroupType"].Clear();
+			m_dsGlobal.Tables["AccessGroup"].Clear();
+			m_DocManager.LoadAccessGroupsTable();
+			m_DocManager.LoadAccessGroupTypesTable();
+			m_DocManager.UpdateViews();
+
+			//20041109 Added
+			InitAccessGroupsPage();	
+		}
+
+		private void cmdChangeAccessGroup_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				int nRows = this.grdAccessGroups.VisibleRowCount;
+				int nAccessGroupID;
+				if (nRows == 0)
+				{
+					Debug.Assert(false, "This code shouldn't execute.");
+					return;
+				}
+				else
+				{
+					DataGridCell dgCell;
+					dgCell = grdAccessGroups.CurrentCell;
+					Object dgItem = grdAccessGroups[dgCell.RowNumber, 1];
+					m_sAccessGroupName = dgItem.ToString();
+					dgItem = grdAccessGroups[dgCell.RowNumber, 0];
+					nAccessGroupID = Convert.ToInt16(dgItem);
+				}
+
+				DAccessGroup dRes = new DAccessGroup();
+				dRes.AccessGroupName = m_sAccessGroupName;
+				dRes.InitializePage(nAccessGroupID, this.m_dsGlobal);
+				if (dRes.ShowDialog(this) == DialogResult.Cancel)
+				{
+					return;
+				}
+
+				//Call RPMS to change resource group
+
+				string sAccessGroupName = dRes.AccessGroupName;
+			
+				string sSql = "BSDX ADD/EDIT ACCESS GROUP^" + nAccessGroupID.ToString() + "|" + sAccessGroupName;
+				DataTable dtAppt = m_DocManager.RPMSDataTable(sSql, "TempAccGrp");
+
+				Debug.Assert(dtAppt.Rows.Count == 1);
+				if (dtAppt.Rows.Count != 1)
+				{
+					throw new Exception("DManagement:cmdChangeAccessGroup_Click: Unable to add new Resource.");
+				}
+				DataRow dr = dtAppt.Rows[0];
+				int nErrorID = (int) dr["ACCESSGROUPID"];
+				if (nErrorID == 0)
+				{
+					throw new Exception((string) dr["ERRORTEXT"]);
+				}
+
+				m_sAccessGroupName = sAccessGroupName;
+				m_dsGlobal.Tables["AccessGroupType"].Clear();
+				m_dsGlobal.Tables["AccessGroup"].Clear();
+				m_DocManager.LoadAccessGroupsTable();
+				m_DocManager.LoadAccessGroupTypesTable();
+			
+				m_DocManager.UpdateViews();	
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show(ex.Message);
+			}
+		}
+
+		private void AddAccessGroupItem()
+		{
+			try
+			{
+				DAccessGroupItem dRes = new DAccessGroupItem();
+				dRes.InitializePage(-1, this.m_dsGlobal);
+				if (dRes.ShowDialog(this) == DialogResult.Cancel)
+				{
+					return;
+				}
+
+				//Call RPMS to add new AccessGroupItem
+
+				int nAccessTypeID = dRes.AccessTypeID;
+
+				string sSql = "BSDX ADD ACCESS GROUP ITEM^" + m_nAccessGroupID.ToString() + "^" + nAccessTypeID.ToString();
+				DataTable dtAppt = m_DocManager.RPMSDataTable(sSql, "AccessGroupItem");
+
+				Debug.Assert(dtAppt.Rows.Count == 1);
+				if (dtAppt.Rows.Count != 1)
+				{
+					throw new Exception("DManagement:AddAccessGroupItem: Unable to add new Access Group Item.");
+				}
+				DataRow dr = dtAppt.Rows[0];
+				int nErrorID = (int) dr["ACCESSGROUPTYPEID"];
+				if (nErrorID == 0)
+				{
+					throw new Exception((string) dr["ERRORTEXT"]);
+				}
+
+
+				this.cmdRemoveAccessGroup.Enabled = true;
+
+                RefreshAccessTypesTables();
+
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show(ex.Message);
+			}
+		}
+
+		private void RemoveAccessGroupItem()
+		{
+			try
+			{
+				Object oSelectedAccessGroupID = this.grdAccessGroups[grdAccessGroups.CurrentCell.RowNumber, 1];
+				int nSelectedAccessGroupID = Convert.ToInt16(oSelectedAccessGroupID);
+
+				Object oSelectedAccessGroupItemID = this.grdAccessGroups[grdAccessGroups.CurrentCell.RowNumber, 3];
+				int nSelectedAccessGroupItemID = Convert.ToInt16(oSelectedAccessGroupItemID);
+			
+				string sSql = "BSDX DELETE ACCESS GROUP ITEM^" + nSelectedAccessGroupID.ToString() + "^" + nSelectedAccessGroupItemID.ToString();
+				DataTable dtAppt = m_DocManager.RPMSDataTable(sSql, "TempAccGrpItem");
+
+				Debug.Assert(dtAppt.Rows.Count == 1);
+				if (dtAppt.Rows.Count != 1)
+				{
+					throw new Exception("DManagement:RemoveAccessGroupItem: Unable to add new Access Group Item.");
+				}
+				DataRow dr = dtAppt.Rows[0];
+				int nErrorID = (int) dr["ACCESSGROUPTYPEID"];
+				if (nErrorID == 0)
+				{
+					throw new Exception((string) dr["ERRORTEXT"]);
+				}
+
+				m_dsGlobal.Tables["AccessGroupType"].Clear();
+				m_DocManager.LoadAccessGroupTypesTable();
+			
+				m_DocManager.UpdateViews();
+				int nRows = this.grdAccessGroups.VisibleRowCount;
+				if (nRows == 0)
+				{
+					this.cmdRemoveAccessGroup.Enabled = false;
+				}
+				else
+				{
+					grdResourceGroup.Select(0);
+					this.cmdRemoveAccessGroup.Enabled = true;
+				}
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show(ex.Message);
+			}
+		}
+
+		#endregion AccessGroups
+
+		#region TransferAppts
+
+		private void cmdCopyAppts_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				//Show a modeless progress dialog
+				int nHospLocationID = Convert.ToInt32(this.cboRPMSClinic.SelectedValue);
+				int nResourceID = Convert.ToInt32(this.cboBSDXClinic.SelectedValue);
+				
+				ThreadApptCopy tac = new ThreadApptCopy(this.dtpBegin.Value, this.dtpEnd.Value, 
+					nHospLocationID.ToString(), cboRPMSClinic.Text, 
+					nResourceID.ToString(), cboBSDXClinic.Text, 
+					this.m_DocManager);
+
+				Thread threadApptCopy = new Thread(new System.Threading.ThreadStart(tac.ThreadApptCopyProc));
+				//threadApptCopy.ApartmentState = ApartmentState.STA;
+                threadApptCopy.SetApartmentState(ApartmentState.STA);
+				threadApptCopy.Start();
+
+			}
+			catch(Exception ex)
+			{
+				MessageBox.Show(this,ex.Message,"Clinical Scheduling");
+			}
+		
+		}
+
+
+		public class ThreadApptCopy
+		{
+			private						DateTime m_dtBegin;
+			private						DateTime m_dtEnd;
+			private	string				m_HospLocationID;
+			private string				m_HospLocationName;
+			private string				m_ResourceID;
+			private string				m_ResourceName;
+			private CGDocumentManager	m_DocManager;
+
+			public ThreadApptCopy(DateTime dtBegin, DateTime EndDate, 
+				string HospLocationID, string HospLocationName, 
+				string ResourceID, string ResourceName, 
+				CGDocumentManager DocManager)
+			{
+				m_dtBegin = dtBegin;
+				m_dtEnd = EndDate;
+				m_HospLocationID = HospLocationID;
+				m_HospLocationName = HospLocationName;
+				m_ResourceID = ResourceID;
+				m_ResourceName = ResourceName;
+				m_DocManager = DocManager;
+			}
+
+			public void ThreadApptCopyProc()
+			{
+				DCopyAppts dCopy = new DCopyAppts();
+				dCopy.InitializePage(m_dtBegin, m_dtEnd, 
+					m_HospLocationID, m_HospLocationName, 
+					m_ResourceID, m_ResourceName, 
+					m_DocManager);
+				dCopy.ShowDialog();
+			}
+		}
+
+		#endregion TransferAppts
+
+        #region Workstations
+        private void cmdWorkStationsRefresh_Click(object sender, System.EventArgs e)
+		{
+			this.m_dtWSGrid.Clear();
+			this.m_DocManager.ConnectInfo.RaiseEvent("BSDX CALL WORKSTATIONS", "A", true);
+		}
+
+		private BMXNetConnectInfo.BMXNetEventDelegate	MgrEventDelegate;
+		delegate void UpdateWorkstationGridDelegate(string sParam);
+
+		private void MgrEventHandler(Object obj, BMXNet.BMXNetEventArgs e)
+		{
+			try
+			{
+				if (e.BMXEvent == "BSDX WORKSTATION REPORT")
+				{
+					Debug.Write("DManagement Got Workstation Report\n");
+					UpdateWorkstationGridDelegate uWSGd = new UpdateWorkstationGridDelegate(UpdateWorkstationGrid);
+                    if (this.InvokeRequired == true) //ensures that handle is created
+                    {
+                        this.Invoke(uWSGd, new object[] { e.BMXParam });
+                    }
+                    else
+                    {
+                        UpdateWorkstationGrid(e.BMXParam);
+                    }
+				}
+			}
+			catch (Exception ex)
+			{
+				Debug.Write("MgrEventHandler exception: " + ex.Message + "\n");
+			}
+		}
+
+		private void UpdateWorkstationGrid(string sParam)
+		{
+			string sDelim = "~";
+			DataRow dr = this.m_dtWSGrid.NewRow();
+			dr["UserName"] = BMXNetLib.Piece(sParam,sDelim,1);
+			dr["Handle"] = BMXNetLib.Piece(sParam,sDelim,2);
+			dr["Version"] = BMXNetLib.Piece(sParam,sDelim,3);		
+			dr["Views"] = BMXNetLib.Piece(sParam,sDelim,4);
+			m_dtWSGrid.Rows.Add(dr);
+		}
+
+		private void DManagement_Closing(object sender, System.ComponentModel.CancelEventArgs e)
+		{
+			m_DocManager.ConnectInfo.UnSubscribeEvent("BSDX WORKSTATION REPORT");
+		}
+
+		private void cmdWorkStationsMessage_Click(object sender, System.EventArgs e)
+		{
+			string sMessage;
+			dInputText dlg = new dInputText();
+			dlg.DialogTitle = "Clinical Scheduling - Send Message to Scheduling Clients.";
+
+			if (dlg.ShowDialog(this) != DialogResult.OK)
+				return;
+
+			sMessage = dlg.TextValue;
+
+			if (sMessage == "")
+				return;
+
+			this.m_DocManager.ConnectInfo.RaiseEvent("BSDX ADMIN MESSAGE", sMessage, false);
+		}
+
+		private void cmdWorkStationsShutdown_Click(object sender, System.EventArgs e)
+		{
+			if (MessageBox.Show("Are you sure you want to shut down all Clincal Scheduling clients?" ,"Clinical Scheduling Client Shutdown", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
+			{
+				return;
+			}
+			this.m_DocManager.ConnectInfo.RaiseEvent("BSDX ADMIN SHUTDOWN", txtSendMessage.Text, false);
+        }
+        #endregion Workstations
+
+    }
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DManagement.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DManagement.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DManagement.resx	(revision 1134)
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="lblDescription.Text" xml:space="preserve">
+    <value>Use the resources panel to define the set of clinical entities available for scheduling at this facility.  Resources may include care providers (for example, dentists and physicians) or other kinds of scheduled services, facilities or equipment.  Click the small + sign next to the resource name to manage the users who can schedule this resource.</value>
+  </data>
+  <data name="lblDescriptionResourceGroup.Text" xml:space="preserve">
+    <value>Use this panel to organize Resources into useful groups.  Resource Groups may include departments, clinics or any other collection of resources.  Resource groups will be visible to all scheduling users.</value>
+  </data>
+  <data name="lblDescriptionAccessGroups.Text" xml:space="preserve">
+    <value>Use this panel to organize Access Types into convenient groups.  Access Groups are useful when selecting the Access Type (Walk-in, Same-Day, etc) to use when setting up the schedule for a resource.  Access Type Groups will be visible to all scheduling users.</value>
+  </data>
+  <data name="lblDescriptionXfer.Text" xml:space="preserve">
+    <value>Use this panel to copy appointments from an VistA clinic into a Windows Scheduling clinic.  Select the Beginning and Ending dates for the transfer.  All appointments (except cancelled appointments) during the time between these dates will be copied from VistA to the selected Windows Scheduling resource.</value>
+  </data>
+  <data name="lblWorkstations.Text" xml:space="preserve">
+    <value>From this panel you can view, communicate with and shut down workstations running clinical scheduling software.  Press the Refresh button to show a current list of running workstations.  To stop all scheduling clients, enter a shutdown message in the textbox below and press the Stop Workstations button.</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DMassSlotDelete.Designer.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DMassSlotDelete.Designer.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DMassSlotDelete.Designer.cs	(revision 1134)
@@ -0,0 +1,151 @@
+﻿namespace IndianHealthService.ClinicalScheduling
+{
+    partial class DMassSlotDelete
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            this.dtStart = new System.Windows.Forms.DateTimePicker();
+            this.dtEnd = new System.Windows.Forms.DateTimePicker();
+            this.lblStart = new System.Windows.Forms.Label();
+            this.lblEnd = new System.Windows.Forms.Label();
+            this.btnOK = new System.Windows.Forms.Button();
+            this.btnCancel = new System.Windows.Forms.Button();
+            this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
+            this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+            this.tableLayoutPanel1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // dtStart
+            // 
+            this.dtStart.Location = new System.Drawing.Point(163, 68);
+            this.dtStart.Name = "dtStart";
+            this.dtStart.Size = new System.Drawing.Size(200, 20);
+            this.dtStart.TabIndex = 0;
+            // 
+            // dtEnd
+            // 
+            this.dtEnd.Location = new System.Drawing.Point(163, 135);
+            this.dtEnd.Name = "dtEnd";
+            this.dtEnd.Size = new System.Drawing.Size(200, 20);
+            this.dtEnd.TabIndex = 1;
+            // 
+            // lblStart
+            // 
+            this.lblStart.AutoSize = true;
+            this.lblStart.Location = new System.Drawing.Point(24, 68);
+            this.lblStart.Name = "lblStart";
+            this.lblStart.Size = new System.Drawing.Size(57, 13);
+            this.lblStart.TabIndex = 2;
+            this.lblStart.Text = "Start Date";
+            // 
+            // lblEnd
+            // 
+            this.lblEnd.AutoSize = true;
+            this.lblEnd.Location = new System.Drawing.Point(24, 135);
+            this.lblEnd.Name = "lblEnd";
+            this.lblEnd.Size = new System.Drawing.Size(51, 13);
+            this.lblEnd.TabIndex = 3;
+            this.lblEnd.Text = "End Date";
+            // 
+            // btnOK
+            // 
+            this.btnOK.Location = new System.Drawing.Point(3, 3);
+            this.btnOK.Name = "btnOK";
+            this.btnOK.Size = new System.Drawing.Size(75, 23);
+            this.btnOK.TabIndex = 4;
+            this.btnOK.Text = "OK";
+            this.btnOK.UseVisualStyleBackColor = true;
+            this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
+            // 
+            // btnCancel
+            // 
+            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.btnCancel.Location = new System.Drawing.Point(94, 3);
+            this.btnCancel.Name = "btnCancel";
+            this.btnCancel.Size = new System.Drawing.Size(75, 23);
+            this.btnCancel.TabIndex = 5;
+            this.btnCancel.Text = "Cancel";
+            this.btnCancel.UseVisualStyleBackColor = true;
+            // 
+            // tableLayoutPanel1
+            // 
+            this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.tableLayoutPanel1.ColumnCount = 2;
+            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 49.62406F));
+            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.37594F));
+            this.tableLayoutPanel1.Controls.Add(this.btnOK, 0, 0);
+            this.tableLayoutPanel1.Controls.Add(this.btnCancel, 1, 0);
+            this.tableLayoutPanel1.Location = new System.Drawing.Point(307, 226);
+            this.tableLayoutPanel1.Name = "tableLayoutPanel1";
+            this.tableLayoutPanel1.RowCount = 1;
+            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+            this.tableLayoutPanel1.Size = new System.Drawing.Size(185, 29);
+            this.tableLayoutPanel1.TabIndex = 6;
+            // 
+            // errorProvider
+            // 
+            this.errorProvider.ContainerControl = this;
+            // 
+            // DMassSlotDelete
+            // 
+            this.AcceptButton = this.btnOK;
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.CancelButton = this.btnCancel;
+            this.ClientSize = new System.Drawing.Size(504, 267);
+            this.ControlBox = false;
+            this.Controls.Add(this.tableLayoutPanel1);
+            this.Controls.Add(this.lblEnd);
+            this.Controls.Add(this.lblStart);
+            this.Controls.Add(this.dtEnd);
+            this.Controls.Add(this.dtStart);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.Name = "DMassSlotDelete";
+            this.ShowIcon = false;
+            this.ShowInTaskbar = false;
+            this.Text = "Mass Slot Delete";
+            this.tableLayoutPanel1.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.DateTimePicker dtStart;
+        private System.Windows.Forms.DateTimePicker dtEnd;
+        private System.Windows.Forms.Label lblStart;
+        private System.Windows.Forms.Label lblEnd;
+        private System.Windows.Forms.Button btnOK;
+        private System.Windows.Forms.Button btnCancel;
+        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
+        private System.Windows.Forms.ErrorProvider errorProvider;
+    }
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DMassSlotDelete.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DMassSlotDelete.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DMassSlotDelete.cs	(revision 1134)
@@ -0,0 +1,35 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+    public partial class DMassSlotDelete : Form
+    {
+        public DMassSlotDelete()
+        {
+            InitializeComponent();
+        }
+        
+        public DateTime StartDate { get { return this.dtStart.Value; } }
+        public DateTime EndDate   { get { return this.dtEnd.Value;   } }
+
+        private void btnOK_Click(object sender, EventArgs e)
+        {
+            if (EndDate < StartDate)
+            {
+                errorProvider.SetError(dtEnd, "End Date cannot be before Start Date");
+                this.DialogResult = DialogResult.None;
+                return;
+            }
+
+            this.DialogResult = DialogResult.OK;
+        }
+        
+    }
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DMassSlotDelete.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DMassSlotDelete.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DMassSlotDelete.resx	(revision 1134)
@@ -0,0 +1,123 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DNoShow.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DNoShow.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DNoShow.cs	(revision 1134)
@@ -0,0 +1,446 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DAutoRebook.
+	/// </summary>
+	public class DNoShow : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Panel pnlPageBottom;
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.Button cmdOK;
+		private System.Windows.Forms.Panel pnlDescription;
+		private System.Windows.Forms.GroupBox grpDescriptionResourceGroup;
+		private System.Windows.Forms.Label lblDescriptionResourceGroup;
+		private System.Windows.Forms.GroupBox grpAutoRebook;
+		private System.Windows.Forms.Label label6;
+		private System.Windows.Forms.Label lblRebookSelectedType;
+		private System.Windows.Forms.RadioButton rdoRebookSameType;
+		private System.Windows.Forms.Label label3;
+		private System.Windows.Forms.NumericUpDown udMax;
+		private System.Windows.Forms.NumericUpDown udStart;
+		private System.Windows.Forms.CheckBox chkAutoRebook;
+		private System.Windows.Forms.Label label4;
+		private System.Windows.Forms.RadioButton rdoRebookAnyType;
+		private System.Windows.Forms.RadioButton rdoRebookSelectedType;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+
+		#region Fields
+
+
+		private bool		m_bAutoRebook = false;
+		private int			m_nStart = 7;
+		private int			m_nMax = 30;
+
+		// -1: use current, -2: use any non-zero type, >0 use this access type id
+		private int			m_nRebookAccessType = -1;
+
+
+		#endregion Fields
+
+		#region Methods
+
+		public void InitializePage()
+		{
+			UpdateDialogData(true);
+		}
+
+		/// <summary>
+		/// If b is true, moves member vars into control data
+		/// otherwise, moves control data into member vars
+		/// </summary>
+		/// <param name="b"></param>
+		private void UpdateDialogData(bool b)
+		{
+			if (b == true)
+			{
+				chkAutoRebook.Checked = m_bAutoRebook;
+				udStart.Value = m_nStart;
+				udMax.Value = m_nMax;
+
+				this.rdoRebookSameType.Checked = true;
+				this.rdoRebookAnyType.Checked = false;
+				this.rdoRebookSelectedType.Checked = false;
+			}
+			else
+			{
+				m_bAutoRebook = chkAutoRebook.Checked;
+				m_nStart = (int) udStart.Value;
+				m_nMax = (int) udMax.Value;
+				if (this.rdoRebookSameType.Checked == true)
+				{
+					m_nRebookAccessType = -1;
+				}
+				else
+				{
+					m_nRebookAccessType = -2;
+				}
+
+			}
+		}
+
+
+		public DNoShow()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		private void cmdOK_Click(object sender, System.EventArgs e)
+		{
+			this.UpdateDialogData(false);
+		}
+		
+		#endregion Methods
+
+		#region Properties
+
+		/// <summary>
+		/// Sets or returns the rebook access type:  -1 = use current type, -2 = use any type, 0 = prompt for a type
+		/// </summary>
+		public int RebookAccessType
+		{
+			get
+			{
+				return m_nRebookAccessType;
+			}
+			set
+			{
+				m_nRebookAccessType = value;
+				if (m_nRebookAccessType == -1)
+				{
+					this.rdoRebookSameType.Checked = true;
+				}
+				else
+				{
+					this.rdoRebookAnyType.Checked = true;
+				}
+
+			}
+		}
+
+		/// <summary>
+		/// Returns value of AutoRebook check box
+		/// </summary>
+		public bool AutoRebook
+		{
+			get
+			{
+				return m_bAutoRebook;
+			}
+			set
+			{
+				m_bAutoRebook = value;
+			}
+		}
+
+		/// <summary>
+		/// Sets or returns the number of days in the future to start searching for availability
+		/// </summary>
+		public int RebookStartDays
+		{
+			get
+			{
+				return m_nStart;
+			}
+			set
+			{
+				m_nStart = value;
+			}
+		}
+
+		/// <summary>
+		/// Sets and returns the maximum number of days in the future to look for rebook availability
+		/// </summary>
+		public int RebookMaxDays
+		{
+			get
+			{
+				return m_nMax;
+			}
+			set
+			{
+				m_nMax = value;
+			}
+		}
+
+
+		#endregion Properties
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.pnlPageBottom = new System.Windows.Forms.Panel();
+			this.cmdCancel = new System.Windows.Forms.Button();
+			this.cmdOK = new System.Windows.Forms.Button();
+			this.pnlDescription = new System.Windows.Forms.Panel();
+			this.grpDescriptionResourceGroup = new System.Windows.Forms.GroupBox();
+			this.lblDescriptionResourceGroup = new System.Windows.Forms.Label();
+			this.grpAutoRebook = new System.Windows.Forms.GroupBox();
+			this.label6 = new System.Windows.Forms.Label();
+			this.lblRebookSelectedType = new System.Windows.Forms.Label();
+			this.rdoRebookSameType = new System.Windows.Forms.RadioButton();
+			this.label3 = new System.Windows.Forms.Label();
+			this.udMax = new System.Windows.Forms.NumericUpDown();
+			this.udStart = new System.Windows.Forms.NumericUpDown();
+			this.chkAutoRebook = new System.Windows.Forms.CheckBox();
+			this.label4 = new System.Windows.Forms.Label();
+			this.rdoRebookAnyType = new System.Windows.Forms.RadioButton();
+			this.rdoRebookSelectedType = new System.Windows.Forms.RadioButton();
+			this.pnlPageBottom.SuspendLayout();
+			this.pnlDescription.SuspendLayout();
+			this.grpDescriptionResourceGroup.SuspendLayout();
+			this.grpAutoRebook.SuspendLayout();
+			((System.ComponentModel.ISupportInitialize)(this.udMax)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.udStart)).BeginInit();
+			this.SuspendLayout();
+			// 
+			// pnlPageBottom
+			// 
+			this.pnlPageBottom.Controls.Add(this.cmdCancel);
+			this.pnlPageBottom.Controls.Add(this.cmdOK);
+			this.pnlPageBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.pnlPageBottom.Location = new System.Drawing.Point(0, 366);
+			this.pnlPageBottom.Name = "pnlPageBottom";
+			this.pnlPageBottom.Size = new System.Drawing.Size(344, 40);
+			this.pnlPageBottom.TabIndex = 7;
+			// 
+			// cmdCancel
+			// 
+			this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.cmdCancel.Location = new System.Drawing.Point(256, 8);
+			this.cmdCancel.Name = "cmdCancel";
+			this.cmdCancel.Size = new System.Drawing.Size(56, 24);
+			this.cmdCancel.TabIndex = 2;
+			this.cmdCancel.Text = "Cancel";
+			// 
+			// cmdOK
+			// 
+			this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+			this.cmdOK.Location = new System.Drawing.Point(176, 8);
+			this.cmdOK.Name = "cmdOK";
+			this.cmdOK.Size = new System.Drawing.Size(64, 24);
+			this.cmdOK.TabIndex = 1;
+			this.cmdOK.Text = "OK";
+			this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
+			// 
+			// pnlDescription
+			// 
+			this.pnlDescription.Controls.Add(this.grpDescriptionResourceGroup);
+			this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.pnlDescription.Location = new System.Drawing.Point(0, 294);
+			this.pnlDescription.Name = "pnlDescription";
+			this.pnlDescription.Size = new System.Drawing.Size(344, 72);
+			this.pnlDescription.TabIndex = 8;
+			// 
+			// grpDescriptionResourceGroup
+			// 
+			this.grpDescriptionResourceGroup.Controls.Add(this.lblDescriptionResourceGroup);
+			this.grpDescriptionResourceGroup.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.grpDescriptionResourceGroup.Location = new System.Drawing.Point(0, 0);
+			this.grpDescriptionResourceGroup.Name = "grpDescriptionResourceGroup";
+			this.grpDescriptionResourceGroup.Size = new System.Drawing.Size(344, 72);
+			this.grpDescriptionResourceGroup.TabIndex = 1;
+			this.grpDescriptionResourceGroup.TabStop = false;
+			this.grpDescriptionResourceGroup.Text = "Description";
+			// 
+			// lblDescriptionResourceGroup
+			// 
+			this.lblDescriptionResourceGroup.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.lblDescriptionResourceGroup.Location = new System.Drawing.Point(3, 16);
+			this.lblDescriptionResourceGroup.Name = "lblDescriptionResourceGroup";
+			this.lblDescriptionResourceGroup.Size = new System.Drawing.Size(338, 53);
+			this.lblDescriptionResourceGroup.TabIndex = 0;
+			this.lblDescriptionResourceGroup.Text = "Use this panel mark an appointment as a no-show. To automatically rebook no-show " +
+				"appointments, check the Auto Rebook box.  The Start Time in Days and Maximum Day" +
+				"s values control the time window for rebooked appointments.";
+			// 
+			// grpAutoRebook
+			// 
+			this.grpAutoRebook.Controls.Add(this.label6);
+			this.grpAutoRebook.Controls.Add(this.lblRebookSelectedType);
+			this.grpAutoRebook.Controls.Add(this.rdoRebookSameType);
+			this.grpAutoRebook.Controls.Add(this.label3);
+			this.grpAutoRebook.Controls.Add(this.udMax);
+			this.grpAutoRebook.Controls.Add(this.udStart);
+			this.grpAutoRebook.Controls.Add(this.chkAutoRebook);
+			this.grpAutoRebook.Controls.Add(this.label4);
+			this.grpAutoRebook.Controls.Add(this.rdoRebookAnyType);
+			this.grpAutoRebook.Controls.Add(this.rdoRebookSelectedType);
+			this.grpAutoRebook.Location = new System.Drawing.Point(32, 24);
+			this.grpAutoRebook.Name = "grpAutoRebook";
+			this.grpAutoRebook.Size = new System.Drawing.Size(272, 248);
+			this.grpAutoRebook.TabIndex = 14;
+			this.grpAutoRebook.TabStop = false;
+			this.grpAutoRebook.Text = "Auto Rebook";
+			// 
+			// label6
+			// 
+			this.label6.Location = new System.Drawing.Point(16, 128);
+			this.label6.Name = "label6";
+			this.label6.Size = new System.Drawing.Size(232, 16);
+			this.label6.TabIndex = 19;
+			this.label6.Text = "Access Type for Rebooked Appointment:";
+			// 
+			// lblRebookSelectedType
+			// 
+			this.lblRebookSelectedType.Enabled = false;
+			this.lblRebookSelectedType.Location = new System.Drawing.Point(64, 224);
+			this.lblRebookSelectedType.Name = "lblRebookSelectedType";
+			this.lblRebookSelectedType.Size = new System.Drawing.Size(168, 16);
+			this.lblRebookSelectedType.TabIndex = 18;
+			// 
+			// rdoRebookSameType
+			// 
+			this.rdoRebookSameType.Checked = true;
+			this.rdoRebookSameType.Location = new System.Drawing.Point(24, 152);
+			this.rdoRebookSameType.Name = "rdoRebookSameType";
+			this.rdoRebookSameType.Size = new System.Drawing.Size(160, 16);
+			this.rdoRebookSameType.TabIndex = 17;
+			this.rdoRebookSameType.TabStop = true;
+			this.rdoRebookSameType.Text = "Same as Current";
+			// 
+			// label3
+			// 
+			this.label3.Location = new System.Drawing.Point(88, 56);
+			this.label3.Name = "label3";
+			this.label3.Size = new System.Drawing.Size(104, 16);
+			this.label3.TabIndex = 16;
+			this.label3.Text = "Start time in Days";
+			// 
+			// udMax
+			// 
+			this.udMax.Increment = new System.Decimal(new int[] {
+																	7,
+																	0,
+																	0,
+																	0});
+			this.udMax.Location = new System.Drawing.Point(16, 88);
+			this.udMax.Maximum = new System.Decimal(new int[] {
+																  730,
+																  0,
+																  0,
+																  0});
+			this.udMax.Minimum = new System.Decimal(new int[] {
+																  1,
+																  0,
+																  0,
+																  0});
+			this.udMax.Name = "udMax";
+			this.udMax.Size = new System.Drawing.Size(56, 20);
+			this.udMax.TabIndex = 15;
+			this.udMax.Value = new System.Decimal(new int[] {
+																30,
+																0,
+																0,
+																0});
+			// 
+			// udStart
+			// 
+			this.udStart.Location = new System.Drawing.Point(16, 54);
+			this.udStart.Maximum = new System.Decimal(new int[] {
+																	730,
+																	0,
+																	0,
+																	0});
+			this.udStart.Name = "udStart";
+			this.udStart.Size = new System.Drawing.Size(56, 20);
+			this.udStart.TabIndex = 14;
+			this.udStart.Value = new System.Decimal(new int[] {
+																  14,
+																  0,
+																  0,
+																  0});
+			// 
+			// chkAutoRebook
+			// 
+			this.chkAutoRebook.Location = new System.Drawing.Point(16, 24);
+			this.chkAutoRebook.Name = "chkAutoRebook";
+			this.chkAutoRebook.Size = new System.Drawing.Size(120, 16);
+			this.chkAutoRebook.TabIndex = 13;
+			this.chkAutoRebook.Text = "Auto Rebook";
+			// 
+			// label4
+			// 
+			this.label4.Location = new System.Drawing.Point(88, 88);
+			this.label4.Name = "label4";
+			this.label4.Size = new System.Drawing.Size(104, 16);
+			this.label4.TabIndex = 16;
+			this.label4.Text = "Maximum Days";
+			// 
+			// rdoRebookAnyType
+			// 
+			this.rdoRebookAnyType.Location = new System.Drawing.Point(24, 176);
+			this.rdoRebookAnyType.Name = "rdoRebookAnyType";
+			this.rdoRebookAnyType.Size = new System.Drawing.Size(160, 16);
+			this.rdoRebookAnyType.TabIndex = 17;
+			this.rdoRebookAnyType.Text = "Any Access Type";
+			// 
+			// rdoRebookSelectedType
+			// 
+			this.rdoRebookSelectedType.Enabled = false;
+			this.rdoRebookSelectedType.Location = new System.Drawing.Point(24, 200);
+			this.rdoRebookSelectedType.Name = "rdoRebookSelectedType";
+			this.rdoRebookSelectedType.Size = new System.Drawing.Size(136, 16);
+			this.rdoRebookSelectedType.TabIndex = 17;
+			this.rdoRebookSelectedType.Text = "Selected Access Type:";
+			// 
+			// DNoShow
+			// 
+			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+			this.ClientSize = new System.Drawing.Size(344, 406);
+			this.Controls.Add(this.grpAutoRebook);
+			this.Controls.Add(this.pnlDescription);
+			this.Controls.Add(this.pnlPageBottom);
+			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+			this.Name = "DNoShow";
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "No Show Appointment";
+			this.pnlPageBottom.ResumeLayout(false);
+			this.pnlDescription.ResumeLayout(false);
+			this.grpDescriptionResourceGroup.ResumeLayout(false);
+			this.grpAutoRebook.ResumeLayout(false);
+			((System.ComponentModel.ISupportInitialize)(this.udMax)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.udStart)).EndInit();
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DNoShow.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DNoShow.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DNoShow.resx	(revision 1134)
@@ -0,0 +1,319 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="pnlPageBottom.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="pnlPageBottom.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="pnlPageBottom.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="pnlPageBottom.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="pnlPageBottom.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="pnlPageBottom.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdCancel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdCancel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdCancel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdOK.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="pnlDescription.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="pnlDescription.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="pnlDescription.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="pnlDescription.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="pnlDescription.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="pnlDescription.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="grpDescriptionResourceGroup.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="grpDescriptionResourceGroup.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="grpDescriptionResourceGroup.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="grpDescriptionResourceGroup.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="grpDescriptionResourceGroup.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="grpDescriptionResourceGroup.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lblDescriptionResourceGroup.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="lblDescriptionResourceGroup.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lblDescriptionResourceGroup.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="grpAutoRebook.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="grpAutoRebook.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="grpAutoRebook.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="grpAutoRebook.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="grpAutoRebook.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="grpAutoRebook.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label6.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label6.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label6.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lblRebookSelectedType.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="lblRebookSelectedType.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lblRebookSelectedType.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoRebookSameType.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="rdoRebookSameType.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoRebookSameType.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="udMax.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="udMax.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="udMax.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="udStart.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="udStart.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="udStart.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="chkAutoRebook.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="chkAutoRebook.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="chkAutoRebook.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label4.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label4.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label4.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoRebookAnyType.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="rdoRebookAnyType.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoRebookAnyType.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoRebookSelectedType.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="rdoRebookSelectedType.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="rdoRebookSelectedType.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Name">
+    <value>DNoShow</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DPatientApptDisplay.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DPatientApptDisplay.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DPatientApptDisplay.cs	(revision 1134)
@@ -0,0 +1,68 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using IndianHealthService.BMXNet;
+using System.Data;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DPatientApptDisplay.
+	/// </summary>
+	public class DPatientApptDisplay : System.Windows.Forms.Form
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public void InitializeForm(CGDocumentManager docManager, int nPatientID)
+		{
+            Control UC = new UCPatientAppts(docManager, nPatientID);
+            UC.Dock = DockStyle.Fill;
+            this.Controls.Add(UC);
+        }
+
+		public DPatientApptDisplay()
+		{
+			InitializeComponent();
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+
+		private void InitializeComponent()
+		{
+            // DPatientApptDisplay
+            // 
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.ClientSize = new System.Drawing.Size(664, 478);
+            this.Name = "DPatientApptDisplay";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Patient Appointments";
+            this.ResumeLayout(false);
+
+		}
+		#endregion
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DPatientLetter.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DPatientLetter.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DPatientLetter.cs	(revision 1134)
@@ -0,0 +1,408 @@
+using System;
+using System.Windows.Forms;
+using System.Data;
+using System.Drawing.Printing;
+using System.Drawing;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Handles Printing of letters (Reminder, Rebook, Cancellation) and a Report. Contains a Print Preview dialog.
+	/// </summary>
+	public class DPatientLetter : System.Windows.Forms.PrintPreviewDialog
+    {
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+        private System.ComponentModel.Container components = null;
+        private System.Drawing.Printing.PrintDocument printAppts;
+        private System.Drawing.Printing.PrintDocument printReminderLetters;
+        private System.Drawing.Printing.PrintDocument printCancelLetters;
+        private System.Drawing.Printing.PrintDocument printRebookLetters;
+
+		#region Fields
+        DateTime _dtBegin, _dtEnd; //global fields to use in passing to printing method
+        
+        //stuff to track what got printed and where we are -- very ugly, I know
+        //but I don't know if there is a better way to do it.
+        int _currentResourcePrinting = 0;
+        int _currentApptPrinting = 0;
+        int _pageNumber = 0;
+        
+        //typed datasets to load the results of queries into and set to print routines
+        dsPatientApptDisplay2 _dsApptDisplay;
+        dsRebookAppts _dsRebookAppts;
+
+		#endregion Fields
+
+        #region Windows Form Designer generated code
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.printAppts = new System.Drawing.Printing.PrintDocument();
+            this.printReminderLetters = new System.Drawing.Printing.PrintDocument();
+            this.printCancelLetters = new System.Drawing.Printing.PrintDocument();
+            this.printRebookLetters = new System.Drawing.Printing.PrintDocument();
+            this.SuspendLayout();
+            // 
+            // printAppts
+            // 
+            this.printAppts.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printAppts_PrintPage);
+            // 
+            // printReminderLetters
+            // 
+            this.printReminderLetters.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printReminderLetters_PrintPage);
+            // 
+            // printCancelLetters
+            // 
+            this.printCancelLetters.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printCancelLetters_PrintPage);
+            // 
+            // printRebookLetters
+            // 
+            this.printRebookLetters.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printRebookLetters_PrintPage);
+            // 
+            // DPatientLetter
+            // 
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.ClientSize = new System.Drawing.Size(748, 443);
+            this.Name = "DPatientLetter";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "Patient Letter";
+            this.ResumeLayout(false);
+
+        }
+        #endregion
+
+
+		/// <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>
+        public void InitializeFormClinicSchedule(CGDocumentManager docManager,
+			string sClinicList,
+			DateTime dtBegin,
+			DateTime dtEnd)
+		{
+			try
+			{
+				if (sClinicList == "")
+				{
+					throw new Exception("At least one clinic must be selected.");
+				}
+
+                _dtBegin = dtBegin; // Global variable to use in Printing method below
+                _dtEnd = dtEnd; // ditto
+
+                this.Text="Clinic Schedules";
+
+                // Get Data
+                DataTable PatientAppts = docManager.DAL.GetClinicSchedules(sClinicList, dtBegin, dtEnd);
+                DataTable Resources = docManager.DAL.GetResourceLetters(sClinicList);
+
+                // Merge tables into typed dataset
+                _dsApptDisplay = new dsPatientApptDisplay2();
+                _dsApptDisplay.PatientAppts.Merge(PatientAppts);
+                _dsApptDisplay.BSDXResource.Merge(Resources);
+
+                this.PrintPreviewControl.Document = printAppts;
+            }
+			catch (Exception ex)
+			{
+				throw ex;
+			}
+		}
+
+        /// <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,
+            DateTime dtEnd)
+		{
+			try
+			{	
+				if (sClinicList == "")
+				{
+					throw new Exception("At least one clinic must be selected.");
+				}
+
+                //Call RPC to get list of appt ids that have been rebooked for these clinics on these dates
+                DataTable PatientAppts = docManager.DAL.GetRebookedAppointments(sClinicList, dtBegin, dtEnd);
+                DataTable Resources = docManager.DAL.GetResourceLetters(sClinicList);
+
+                _dsRebookAppts = new dsRebookAppts();
+                _dsRebookAppts.PatientAppts.Merge(PatientAppts);
+                _dsRebookAppts.BSDXResource.Merge(Resources);
+
+            }
+			catch (Exception ex)
+			{
+				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,
+            string sApptIDList)
+        {
+            try
+            {
+                if (sClinicList == "")
+                {
+                    throw new Exception("At least one clinic must be selected.");
+                }
+
+                DataTable PatientAppts = docManager.DAL.GetRebookedAppointments(sApptIDList);
+                DataTable Resources = docManager.DAL.GetResourceLetters(sClinicList);
+
+                _dsRebookAppts = new dsRebookAppts();
+                _dsRebookAppts.PatientAppts.Merge(PatientAppts);
+                _dsRebookAppts.BSDXResource.Merge(Resources);
+            }
+            catch (Exception ex)
+            {
+                throw ex;
+            }
+
+            PrintPreviewControl.Document = printRebookLetters;
+        }
+
+        /// <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>
+		public void InitializeFormCancellationLetters(CGDocumentManager docManager,
+			string sClinicList,
+            DateTime dtBegin,
+            DateTime dtEnd)
+        {
+			try
+			{	
+				if (sClinicList == "")
+				{
+					throw new Exception("At least one clinic must be selected.");
+				}
+                
+                DataTable PatientAppts = docManager.DAL.GetCancelledAppointments(sClinicList, dtBegin, dtEnd);
+                DataTable Resources = docManager.DAL.GetResourceLetters(sClinicList);
+                
+                _dsRebookAppts = new dsRebookAppts();
+                _dsRebookAppts.PatientAppts.Merge(PatientAppts);
+                _dsRebookAppts.BSDXResource.Merge(Resources);
+                
+                PrintPreviewControl.Document = printCancelLetters;
+
+			}
+			catch (Exception ex)
+			{
+				throw ex;
+			}
+		}
+        /// <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>
+        public void InitializeFormPatientReminderLetters(CGDocumentManager docManager,
+			string sClinicList,
+			DateTime dtBegin,
+			DateTime dtEnd)
+		{
+			try
+			{	
+				if (sClinicList == "")
+				{
+					throw new Exception("At least one clinic must be selected.");
+				}
+
+                // Global variables to use in printing routine down below
+                _dtBegin = dtBegin;
+                _dtEnd = dtEnd;
+
+                this.Text = "Reminder Letters";
+
+                // Get Data
+                DataTable PatientAppts = docManager.DAL.GetClinicSchedules(sClinicList, dtBegin, dtEnd);
+                DataTable Resources = docManager.DAL.GetResourceLetters(sClinicList);
+
+                // Merge tables into typed dataset
+                _dsApptDisplay = new dsPatientApptDisplay2();
+                _dsApptDisplay.PatientAppts.Merge(PatientAppts);
+                _dsApptDisplay.BSDXResource.Merge(Resources);
+
+                this.PrintPreviewControl.Document = printReminderLetters;
+				
+			}
+			catch (Exception ex)
+			{
+				throw ex;
+			}
+		}
+
+        /// <summary>
+        /// Ctor
+        /// </summary>
+		public DPatientLetter() : base()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+
+        private void printAppts_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
+        {
+            //Each time we enter here, we start off with a new page number - we start off with zero
+            _pageNumber++; //becomes one first time through
+            
+            // _currentResourcePrinting starts with zero. There will be at least this one.
+            CGDocumentManager.Current.PrintingObject.PrintAppointments(_dsApptDisplay, e, _dtBegin, _dtEnd,
+                    _currentResourcePrinting, ref _currentApptPrinting, _pageNumber);
+
+            //If the printing routine says it needs more pages to print the appointments,
+            //return here and have it print again.
+            if (e.HasMorePages == true) return;
+
+            // if there are more resouces to print, increment. Setting HasMorePages to true
+            // calls this routine again, so printing will happen with the incremented _currentResourcePrinting
+            if (_currentResourcePrinting < _dsApptDisplay.BSDXResource.Rows.Count - 1)
+            {
+                _currentResourcePrinting++;
+                //reset _currentApptPrinting
+                _currentApptPrinting = 0;
+                e.HasMorePages = true;
+                return;
+            }
+
+            // if neither of these conditions is true, then we are done with printing.
+            // So reset counters for next one. Fixes ticket #15 on https://trac.opensourcevista.net/ticket/15
+            _currentResourcePrinting = 0;
+            _currentApptPrinting = 0;
+            _pageNumber = 0;
+        }
+
+        private void printReminderLetters_PrintPage(object sender, PrintPageEventArgs e)
+        {
+            // no patients
+            if (_dsApptDisplay.PatientAppts.Count == 0)
+            {
+                CGDocumentManager.Current.PrintingObject.PrintMessage("No Appointments found", e);
+                return;
+            }
+            // if there are patients
+            else if (_currentApptPrinting < _dsApptDisplay.PatientAppts.Count)
+            {
+                dsPatientApptDisplay2.BSDXResourceRow c = (dsPatientApptDisplay2.BSDXResourceRow)
+                   _dsApptDisplay.PatientAppts[_currentApptPrinting].GetParentRow(_dsApptDisplay.Relations[0]);
+                CGDocumentManager.Current.PrintingObject.PrintReminderLetter(_dsApptDisplay.PatientAppts[_currentApptPrinting], e, c.LETTER_TEXT, "Reminder Letter");
+                _currentApptPrinting++;
+                if (_currentApptPrinting < _dsApptDisplay.PatientAppts.Count)
+                {
+                    e.HasMorePages = true;
+                    return;
+                }
+            }
+
+            // If we reach this point, we need to reset the counter (ticket #15 on https://trac.opensourcevista.net/ticket/15) 
+ 	        _currentApptPrinting = 0; 
+            
+        }
+
+        private void printCancelLetters_PrintPage(object sender, PrintPageEventArgs e)
+        {
+            // no patients
+            if (_dsRebookAppts.PatientAppts.Count == 0)
+            {
+                CGDocumentManager.Current.PrintingObject.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]);
+                CGDocumentManager.Current.PrintingObject.PrintCancelLetter(_dsRebookAppts.PatientAppts[_currentApptPrinting], e, c.CLINIC_CANCELLATION_LETTER, "Cancellation Letter");
+                _currentApptPrinting++;
+                if (_currentApptPrinting < _dsRebookAppts.PatientAppts.Count)
+                {
+                    e.HasMorePages = true;
+                    return;
+                }
+            }
+            // If we reach this point, we need to reset the counter (ticket #15 on https://trac.opensourcevista.net/ticket/15) 
+            _currentApptPrinting = 0; 
+        }
+
+        private void printRebookLetters_PrintPage(object sender, PrintPageEventArgs e)
+        {
+            // no patients
+            if (_dsRebookAppts.PatientAppts.Count == 0)
+            {
+                CGDocumentManager.Current.PrintingObject.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???
+                CGDocumentManager.Current.PrintingObject.PrintRebookLetter(_dsRebookAppts.PatientAppts[_currentApptPrinting], e, c.NO_SHOW_LETTER, "Rebook Letter");
+                _currentApptPrinting++;
+                if (_currentApptPrinting < _dsRebookAppts.PatientAppts.Count)
+                {
+                    e.HasMorePages = true;
+                    return;
+                }
+            }
+            // If we reach this point, we need to reset the counter (ticket #15 on https://trac.opensourcevista.net/ticket/15) 
+            _currentApptPrinting = 0; 
+        }
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DPatientLetter.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DPatientLetter.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DPatientLetter.resx	(revision 1134)
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="printAppts.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>122, 17</value>
+  </metadata>
+  <metadata name="printReminderLetters.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>231, 17</value>
+  </metadata>
+  <metadata name="printCancelLetters.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>397, 17</value>
+  </metadata>
+  <metadata name="printRebookLetters.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>547, 17</value>
+  </metadata>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DPatientLookup.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DPatientLookup.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DPatientLookup.cs	(revision 1134)
@@ -0,0 +1,393 @@
+using System;
+using System.Windows.Forms;
+using System.Data;
+
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DPatientLookup.
+	/// </summary>
+	public class DPatientLookup : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Panel panel1;
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.Button cmdOK;
+		private System.Windows.Forms.Panel panel2;
+		private System.Windows.Forms.Button cmdSearch;
+		private System.Windows.Forms.TextBox txtSearch;
+		private System.Windows.Forms.Panel panel3;
+		private System.Windows.Forms.ListView lvwPatients;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public DPatientLookup()
+		{
+			this.m_sPatientName = "";
+			this.m_sPatientIEN = "";
+			m_nMax = 20;
+			InitializeComponent();
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.panel1 = new System.Windows.Forms.Panel();
+			this.cmdCancel = new System.Windows.Forms.Button();
+			this.cmdOK = new System.Windows.Forms.Button();
+			this.panel2 = new System.Windows.Forms.Panel();
+			this.cmdSearch = new System.Windows.Forms.Button();
+			this.txtSearch = new System.Windows.Forms.TextBox();
+			this.panel3 = new System.Windows.Forms.Panel();
+			this.lvwPatients = new System.Windows.Forms.ListView();
+			this.panel1.SuspendLayout();
+			this.panel2.SuspendLayout();
+			this.panel3.SuspendLayout();
+			this.SuspendLayout();
+			// 
+			// panel1
+			// 
+			this.panel1.Controls.Add(this.cmdCancel);
+			this.panel1.Controls.Add(this.cmdOK);
+			this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.panel1.Location = new System.Drawing.Point(0, 238);
+			this.panel1.Name = "panel1";
+			this.panel1.Size = new System.Drawing.Size(384, 40);
+			this.panel1.TabIndex = 2;
+			// 
+			// cmdCancel
+			// 
+			this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.cmdCancel.Location = new System.Drawing.Point(304, 8);
+			this.cmdCancel.Name = "cmdCancel";
+			this.cmdCancel.Size = new System.Drawing.Size(64, 24);
+			this.cmdCancel.TabIndex = 1;
+			this.cmdCancel.Text = "Cancel";
+			// 
+			// cmdOK
+			// 
+			this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+			this.cmdOK.Location = new System.Drawing.Point(224, 8);
+			this.cmdOK.Name = "cmdOK";
+			this.cmdOK.Size = new System.Drawing.Size(64, 24);
+			this.cmdOK.TabIndex = 0;
+			this.cmdOK.Text = "OK";
+			this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
+			// 
+			// panel2
+			// 
+			this.panel2.Controls.Add(this.cmdSearch);
+			this.panel2.Controls.Add(this.txtSearch);
+			this.panel2.Dock = System.Windows.Forms.DockStyle.Top;
+			this.panel2.Location = new System.Drawing.Point(0, 0);
+			this.panel2.Name = "panel2";
+			this.panel2.Size = new System.Drawing.Size(384, 40);
+			this.panel2.TabIndex = 5;
+			// 
+			// cmdSearch
+			// 
+			this.cmdSearch.Location = new System.Drawing.Point(288, 8);
+			this.cmdSearch.Name = "cmdSearch";
+			this.cmdSearch.Size = new System.Drawing.Size(80, 24);
+			this.cmdSearch.TabIndex = 5;
+			this.cmdSearch.Text = "Search";
+			this.cmdSearch.Click += new System.EventHandler(this.cmdSearch_Click);
+			// 
+			// txtSearch
+			// 
+			this.txtSearch.Location = new System.Drawing.Point(16, 8);
+			this.txtSearch.Name = "txtSearch";
+			this.txtSearch.Size = new System.Drawing.Size(216, 20);
+			this.txtSearch.TabIndex = 4;
+			this.txtSearch.Text = "";
+			this.txtSearch.TextChanged += new System.EventHandler(this.txtSearch_TextChanged);
+			// 
+			// panel3
+			// 
+			this.panel3.Controls.Add(this.lvwPatients);
+			this.panel3.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.panel3.Location = new System.Drawing.Point(0, 40);
+			this.panel3.Name = "panel3";
+			this.panel3.Size = new System.Drawing.Size(384, 198);
+			this.panel3.TabIndex = 6;
+			// 
+			// lvwPatients
+			// 
+			this.lvwPatients.AllowColumnReorder = true;
+			this.lvwPatients.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.lvwPatients.FullRowSelect = true;
+			this.lvwPatients.GridLines = true;
+			this.lvwPatients.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+			this.lvwPatients.Location = new System.Drawing.Point(0, 0);
+			this.lvwPatients.MultiSelect = false;
+			this.lvwPatients.Name = "lvwPatients";
+			this.lvwPatients.Size = new System.Drawing.Size(384, 198);
+			this.lvwPatients.Sorting = System.Windows.Forms.SortOrder.Ascending;
+			this.lvwPatients.TabIndex = 5;
+			this.lvwPatients.View = System.Windows.Forms.View.Details;
+			this.lvwPatients.ItemActivate += new System.EventHandler(this.lvwPatients_ItemActivate);
+			// 
+			// DPatientLookup
+			// 
+			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+			this.CancelButton = this.cmdCancel;
+			this.ClientSize = new System.Drawing.Size(384, 278);
+			this.Controls.Add(this.panel3);
+			this.Controls.Add(this.panel2);
+			this.Controls.Add(this.panel1);
+			this.Name = "DPatientLookup";
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "Select Patient";
+			this.Load += new System.EventHandler(this.DPatientLookup_Load);
+			this.Activated += new System.EventHandler(this.DPatientLookup_Activated);
+			this.panel1.ResumeLayout(false);
+			this.panel2.ResumeLayout(false);
+			this.panel3.ResumeLayout(false);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		#region Fields
+
+		private string				m_sPatientName;
+		private	DataTable			m_rsPatients;
+		private CGDocumentManager	m_DocManager;
+		private int					m_nMax;
+		private string				m_sPatientHRN = "";
+		private string				m_sPatientIEN;
+		private string				m_sPatientDOB;
+		private string				m_sPatientPID;
+
+		#endregion //Fields
+
+		#region Methods
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		private void cmdOK_Click(object sender, System.EventArgs e)
+		{
+			if (this.txtSearch.Text == "")
+			{
+				this.DialogResult = DialogResult.Cancel;
+				return;
+			}
+			m_sPatientName = this.txtSearch.Text;
+
+			//Update spacebar lookup value
+			string sSql;
+			sSql = "BSDX SPACEBAR SET^AUPNPAT(^" + m_sPatientIEN;
+			DataTable dtAppt = m_DocManager.RPMSDataTable(sSql, "SpaceBarValue");
+			return;
+		}
+
+		private void cmdSearch_Click(object sender, System.EventArgs e)
+		{
+			try
+			{
+				string sSearch = txtSearch.Text;
+				if (sSearch == "")
+					return;
+				this.lvwPatients.Clear();
+				m_rsPatients = this.GetPatientLookupRS(sSearch, m_nMax);
+
+				if (m_rsPatients.Rows.Count == 0)
+				{
+					MessageBox.Show("No matching Patients Found.");
+					this.txtSearch.Focus();
+					return;
+				}
+			
+				if (m_rsPatients.Rows.Count == 1)
+				{
+					DataRow r = m_rsPatients.Rows[0];
+					this.m_sPatientName = r["NAME"].ToString();
+					txtSearch.Text = this.m_sPatientName;
+					this.m_sPatientHRN = r["HRN"].ToString();
+					this.m_sPatientIEN = r["IEN"].ToString();
+					this.m_sPatientPID = r["PID"].ToString();
+                    DateTime d = Convert.ToDateTime(r["DOB"]);
+                    string sFormat = System.Globalization.DateTimeFormatInfo.CurrentInfo.ShortDatePattern;
+                    this.m_sPatientDOB = d.ToString(sFormat);
+					this.cmdOK.Enabled = true;
+					this.AcceptButton = cmdOK;
+					this.cmdOK.Focus();
+				}
+				lvwPatients.View = View.Details;
+
+				foreach (DataRow r in m_rsPatients.Rows)
+				{
+					string sPat = r["NAME"].ToString();
+					ListViewItem lv = new ListViewItem(sPat);
+					lv.SubItems.Add(r["HRN"].ToString());
+					lv.SubItems.Add(r["PID"].ToString());
+					DateTime d = Convert.ToDateTime(r["DOB"]);
+					string sFormat = System.Globalization.DateTimeFormatInfo.CurrentInfo.ShortDatePattern;
+                    string sDob = d.ToString(sFormat);
+					lv.SubItems.Add(sDob);
+					lv.SubItems.Add((r["IEN"].ToString()));
+					lvwPatients.Items.Add(lv);
+				}
+
+				lvwPatients.View = View.Details;
+				int w =-1;
+				lvwPatients.Columns.Add("Name", w, HorizontalAlignment.Left);
+				lvwPatients.Columns.Add("HRN", w, HorizontalAlignment.Left);
+				lvwPatients.Columns.Add("PID", w, HorizontalAlignment.Left);
+				lvwPatients.Columns.Add("DOB",w, HorizontalAlignment.Left);
+
+				lvwPatients.Columns[0].Width = -1;
+				lvwPatients.Columns[1].Width = -1;
+				lvwPatients.Columns[2].Width = -1;
+				lvwPatients.Columns[3].Width = -1;
+				lvwPatients.Select();
+				lvwPatients.Items[0].Selected = true;
+				lvwPatients.Focus();			
+			}
+			catch (Exception ex)
+			{
+				MessageBox.Show(this, ex.Message, "Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+			}
+		}
+
+		private DataTable GetPatientLookupRS(string sLookup, int nMax)
+		{
+			string sSql;
+			sSql = "BSDXPatientLookupRS^" + sLookup + "^" + nMax.ToString();
+			System.Data.DataTable tb = m_DocManager.RPMSDataTable(sSql, "PatientTable");
+			return tb;
+
+		}
+
+		private void lvwPatients_Click(object sender, System.EventArgs e)
+		{
+		
+		}
+
+		private void lvwPatients_ItemActivate(object sender, System.EventArgs e)
+		{
+			ListViewItem v = lvwPatients.SelectedItems[0]; //only one can be selected
+			m_sPatientName = v.SubItems[0].Text;
+			m_sPatientIEN = v.SubItems[4].Text;
+			m_sPatientHRN = v.SubItems[1].Text;
+			m_sPatientDOB = v.SubItems[3].Text;
+			m_sPatientPID = v.SubItems[2].Text;
+			this.txtSearch.Text = m_sPatientName;
+			this.cmdOK.Enabled = true;
+			this.cmdOK.Focus();
+		}
+
+		private void txtSearch_TextChanged(object sender, System.EventArgs e)
+		{
+			this.cmdOK.Enabled = false;
+			this.AcceptButton = cmdSearch;
+		}
+
+		private void DPatientLookup_Load(object sender, System.EventArgs e)
+		{
+		}
+
+		private void DPatientLookup_Activated(object sender, System.EventArgs e)
+		{
+			System.IntPtr pHandle = this.Handle;
+			this.cmdOK.Enabled = false;
+			this.txtSearch.Focus();			
+		
+		}
+
+		#endregion //Methods
+
+		#region Properties
+
+		/// <summary>
+		/// Gets or sets the name of the selected patient
+		/// </summary>
+		public string PatientName
+		{
+			get
+			{
+				return m_sPatientName;
+			}
+			set
+			{
+				m_sPatientName = value;
+			}
+		}
+
+		public CGDocumentManager DocManager
+		{
+			get
+			{
+				return m_DocManager;
+			}
+			set
+			{
+				m_DocManager = value;
+			}
+		}
+
+		/// <summary>
+		/// RPMS Internal Entry Number in PATIENT file (DFN)
+		/// </summary>
+		public string PatientIEN
+		{
+			get
+			{
+				return this.m_sPatientIEN;
+			}
+		}
+
+		/// <summary>
+		/// The string representation of the Health Record Number
+		/// </summary>
+		public string HealthRecordNumber
+		{
+			get
+			{
+				return m_sPatientHRN;
+			}
+			set
+			{
+				m_sPatientHRN = value;
+			}
+		}
+
+        public DateTime PatientDOB
+        {
+            get
+            {
+                return DateTime.Parse(m_sPatientDOB);
+            }
+        }
+
+        public string PatientPID
+        {
+            get
+            {
+                return m_sPatientPID;
+            }
+        }
+
+		#endregion //Properties
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DPatientLookup.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DPatientLookup.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DPatientLookup.resx	(revision 1134)
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="panel1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panel1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="panel1.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panel1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panel1.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="panel1.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdCancel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdCancel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdCancel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdOK.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panel2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="panel2.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panel2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panel2.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="panel2.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panel2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdSearch.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdSearch.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdSearch.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtSearch.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtSearch.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="txtSearch.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panel3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="panel3.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panel3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="panel3.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="panel3.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="panel3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lvwPatients.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="lvwPatients.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lvwPatients.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Name">
+    <value>DPatientLookup</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResource.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResource.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResource.cs	(revision 1134)
@@ -0,0 +1,817 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+//using System.Data.OleDb;
+using IndianHealthService.BMXNet;
+using System.Diagnostics;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DResource.
+	/// </summary>
+	public class DResource : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.Button cmdOK;
+		private System.Windows.Forms.Panel pnlDescription;
+		private System.Windows.Forms.GroupBox grpDescription;
+		private System.Windows.Forms.Label lblDescription;
+		private System.Windows.Forms.CheckBox chkInactivate;
+		private System.Windows.Forms.GroupBox grpRPMSClinicLink;
+		private System.Windows.Forms.Label lblReactivateDate;
+		private System.Windows.Forms.Label label10;
+		private System.Windows.Forms.Label lblInactivateDate;
+		private System.Windows.Forms.Label label8;
+		private System.Windows.Forms.Label lblClinicCode;
+		private System.Windows.Forms.Label label6;
+		private System.Windows.Forms.Label lblProvider;
+		private System.Windows.Forms.Label label7;
+		private System.Windows.Forms.Label lblVisitServiceCategory;
+		private System.Windows.Forms.Label label3;
+		private System.Windows.Forms.Label lblCreateVisit;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.Label label4;
+		private System.Windows.Forms.ComboBox cboRPMSClinic;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.TextBox txtResourceName;
+		private System.Windows.Forms.TabControl tabResources;
+		private System.Windows.Forms.TabPage tpRPMSLink;
+		private System.Windows.Forms.ComboBox cboTimeInterval;
+		private System.Windows.Forms.Label label5;
+		private System.Windows.Forms.TabPage tpLetter;
+		private System.Windows.Forms.TextBox txtLetter;
+		private System.Windows.Forms.Label label9;
+		private System.Windows.Forms.Label label11;
+		private System.Windows.Forms.Panel pnlOkCancel;
+		private System.Windows.Forms.TabPage tpRebookLetter;
+		private System.Windows.Forms.TabPage tpCancellationLetter;
+		private System.Windows.Forms.Label label12;
+		private System.Windows.Forms.Label label13;
+		private System.Windows.Forms.TextBox txtRebookLetter;
+		private System.Windows.Forms.TextBox txtCancellationLetter;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public DResource()
+		{
+			InitializeComponent();
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DResource));
+            this.pnlOkCancel = new System.Windows.Forms.Panel();
+            this.cmdCancel = new System.Windows.Forms.Button();
+            this.cmdOK = new System.Windows.Forms.Button();
+            this.pnlDescription = new System.Windows.Forms.Panel();
+            this.grpDescription = new System.Windows.Forms.GroupBox();
+            this.lblDescription = new System.Windows.Forms.Label();
+            this.tabResources = new System.Windows.Forms.TabControl();
+            this.tpRPMSLink = new System.Windows.Forms.TabPage();
+            this.label11 = new System.Windows.Forms.Label();
+            this.label5 = new System.Windows.Forms.Label();
+            this.cboTimeInterval = new System.Windows.Forms.ComboBox();
+            this.chkInactivate = new System.Windows.Forms.CheckBox();
+            this.grpRPMSClinicLink = new System.Windows.Forms.GroupBox();
+            this.lblReactivateDate = new System.Windows.Forms.Label();
+            this.label10 = new System.Windows.Forms.Label();
+            this.lblInactivateDate = new System.Windows.Forms.Label();
+            this.label8 = new System.Windows.Forms.Label();
+            this.lblClinicCode = new System.Windows.Forms.Label();
+            this.label6 = new System.Windows.Forms.Label();
+            this.lblProvider = new System.Windows.Forms.Label();
+            this.label7 = new System.Windows.Forms.Label();
+            this.lblVisitServiceCategory = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.lblCreateVisit = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.cboRPMSClinic = new System.Windows.Forms.ComboBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtResourceName = new System.Windows.Forms.TextBox();
+            this.tpLetter = new System.Windows.Forms.TabPage();
+            this.label9 = new System.Windows.Forms.Label();
+            this.txtLetter = new System.Windows.Forms.TextBox();
+            this.tpRebookLetter = new System.Windows.Forms.TabPage();
+            this.label12 = new System.Windows.Forms.Label();
+            this.txtRebookLetter = new System.Windows.Forms.TextBox();
+            this.tpCancellationLetter = new System.Windows.Forms.TabPage();
+            this.label13 = new System.Windows.Forms.Label();
+            this.txtCancellationLetter = new System.Windows.Forms.TextBox();
+            this.pnlOkCancel.SuspendLayout();
+            this.pnlDescription.SuspendLayout();
+            this.grpDescription.SuspendLayout();
+            this.tabResources.SuspendLayout();
+            this.tpRPMSLink.SuspendLayout();
+            this.grpRPMSClinicLink.SuspendLayout();
+            this.tpLetter.SuspendLayout();
+            this.tpRebookLetter.SuspendLayout();
+            this.tpCancellationLetter.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // pnlOkCancel
+            // 
+            this.pnlOkCancel.Controls.Add(this.cmdCancel);
+            this.pnlOkCancel.Controls.Add(this.cmdOK);
+            this.pnlOkCancel.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlOkCancel.Location = new System.Drawing.Point(0, 424);
+            this.pnlOkCancel.Name = "pnlOkCancel";
+            this.pnlOkCancel.Size = new System.Drawing.Size(498, 40);
+            this.pnlOkCancel.TabIndex = 3;
+            // 
+            // cmdCancel
+            // 
+            this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.cmdCancel.Location = new System.Drawing.Point(416, 8);
+            this.cmdCancel.Name = "cmdCancel";
+            this.cmdCancel.Size = new System.Drawing.Size(64, 24);
+            this.cmdCancel.TabIndex = 5;
+            this.cmdCancel.Text = "Cancel";
+            // 
+            // cmdOK
+            // 
+            this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.cmdOK.Location = new System.Drawing.Point(336, 8);
+            this.cmdOK.Name = "cmdOK";
+            this.cmdOK.Size = new System.Drawing.Size(64, 24);
+            this.cmdOK.TabIndex = 4;
+            this.cmdOK.Text = "OK";
+            this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
+            // 
+            // pnlDescription
+            // 
+            this.pnlDescription.Controls.Add(this.grpDescription);
+            this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlDescription.Location = new System.Drawing.Point(0, 344);
+            this.pnlDescription.Name = "pnlDescription";
+            this.pnlDescription.Size = new System.Drawing.Size(498, 80);
+            this.pnlDescription.TabIndex = 46;
+            // 
+            // grpDescription
+            // 
+            this.grpDescription.Controls.Add(this.lblDescription);
+            this.grpDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grpDescription.Location = new System.Drawing.Point(0, 0);
+            this.grpDescription.Name = "grpDescription";
+            this.grpDescription.Size = new System.Drawing.Size(498, 80);
+            this.grpDescription.TabIndex = 0;
+            this.grpDescription.TabStop = false;
+            this.grpDescription.Text = "Description";
+            // 
+            // lblDescription
+            // 
+            this.lblDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lblDescription.Location = new System.Drawing.Point(3, 16);
+            this.lblDescription.Name = "lblDescription";
+            this.lblDescription.Size = new System.Drawing.Size(492, 61);
+            this.lblDescription.TabIndex = 1;
+            this.lblDescription.Text = resources.GetString("lblDescription.Text");
+            // 
+            // tabResources
+            // 
+            this.tabResources.Controls.Add(this.tpRPMSLink);
+            this.tabResources.Controls.Add(this.tpLetter);
+            this.tabResources.Controls.Add(this.tpRebookLetter);
+            this.tabResources.Controls.Add(this.tpCancellationLetter);
+            this.tabResources.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.tabResources.Location = new System.Drawing.Point(0, 0);
+            this.tabResources.Name = "tabResources";
+            this.tabResources.SelectedIndex = 0;
+            this.tabResources.Size = new System.Drawing.Size(498, 344);
+            this.tabResources.TabIndex = 10;
+            this.tabResources.SelectedIndexChanged += new System.EventHandler(this.tabResources_SelectedIndexChanged);
+            // 
+            // tpRPMSLink
+            // 
+            this.tpRPMSLink.Controls.Add(this.label11);
+            this.tpRPMSLink.Controls.Add(this.label5);
+            this.tpRPMSLink.Controls.Add(this.cboTimeInterval);
+            this.tpRPMSLink.Controls.Add(this.chkInactivate);
+            this.tpRPMSLink.Controls.Add(this.grpRPMSClinicLink);
+            this.tpRPMSLink.Controls.Add(this.label1);
+            this.tpRPMSLink.Controls.Add(this.txtResourceName);
+            this.tpRPMSLink.Location = new System.Drawing.Point(4, 22);
+            this.tpRPMSLink.Name = "tpRPMSLink";
+            this.tpRPMSLink.Size = new System.Drawing.Size(490, 318);
+            this.tpRPMSLink.TabIndex = 0;
+            this.tpRPMSLink.Text = "Resource Link";
+            // 
+            // label11
+            // 
+            this.label11.Location = new System.Drawing.Point(328, 40);
+            this.label11.Name = "label11";
+            this.label11.Size = new System.Drawing.Size(80, 16);
+            this.label11.TabIndex = 52;
+            this.label11.Text = "minutes.";
+            // 
+            // label5
+            // 
+            this.label5.Location = new System.Drawing.Point(192, 40);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(64, 16);
+            this.label5.TabIndex = 51;
+            this.label5.Text = "Time Scale:";
+            // 
+            // cboTimeInterval
+            // 
+            this.cboTimeInterval.Items.AddRange(new object[] {
+            "5",
+            "10",
+            "15",
+            "20",
+            "30",
+            "60"});
+            this.cboTimeInterval.Location = new System.Drawing.Point(256, 38);
+            this.cboTimeInterval.MaxDropDownItems = 6;
+            this.cboTimeInterval.Name = "cboTimeInterval";
+            this.cboTimeInterval.Size = new System.Drawing.Size(64, 21);
+            this.cboTimeInterval.TabIndex = 2;
+            // 
+            // chkInactivate
+            // 
+            this.chkInactivate.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+            this.chkInactivate.Location = new System.Drawing.Point(80, 40);
+            this.chkInactivate.Name = "chkInactivate";
+            this.chkInactivate.Size = new System.Drawing.Size(72, 16);
+            this.chkInactivate.TabIndex = 1;
+            this.chkInactivate.Text = "Inactive:";
+            // 
+            // grpRPMSClinicLink
+            // 
+            this.grpRPMSClinicLink.Controls.Add(this.lblReactivateDate);
+            this.grpRPMSClinicLink.Controls.Add(this.label10);
+            this.grpRPMSClinicLink.Controls.Add(this.lblInactivateDate);
+            this.grpRPMSClinicLink.Controls.Add(this.label8);
+            this.grpRPMSClinicLink.Controls.Add(this.lblClinicCode);
+            this.grpRPMSClinicLink.Controls.Add(this.label6);
+            this.grpRPMSClinicLink.Controls.Add(this.lblProvider);
+            this.grpRPMSClinicLink.Controls.Add(this.label7);
+            this.grpRPMSClinicLink.Controls.Add(this.lblVisitServiceCategory);
+            this.grpRPMSClinicLink.Controls.Add(this.label3);
+            this.grpRPMSClinicLink.Controls.Add(this.lblCreateVisit);
+            this.grpRPMSClinicLink.Controls.Add(this.label2);
+            this.grpRPMSClinicLink.Controls.Add(this.label4);
+            this.grpRPMSClinicLink.Controls.Add(this.cboRPMSClinic);
+            this.grpRPMSClinicLink.Location = new System.Drawing.Point(32, 88);
+            this.grpRPMSClinicLink.Name = "grpRPMSClinicLink";
+            this.grpRPMSClinicLink.Size = new System.Drawing.Size(384, 208);
+            this.grpRPMSClinicLink.TabIndex = 48;
+            this.grpRPMSClinicLink.TabStop = false;
+            this.grpRPMSClinicLink.Text = "VistA Clinic Link";
+            // 
+            // lblReactivateDate
+            // 
+            this.lblReactivateDate.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.lblReactivateDate.Location = new System.Drawing.Point(176, 168);
+            this.lblReactivateDate.Name = "lblReactivateDate";
+            this.lblReactivateDate.Size = new System.Drawing.Size(176, 16);
+            this.lblReactivateDate.TabIndex = 57;
+            // 
+            // label10
+            // 
+            this.label10.Location = new System.Drawing.Point(56, 168);
+            this.label10.Name = "label10";
+            this.label10.Size = new System.Drawing.Size(112, 16);
+            this.label10.TabIndex = 56;
+            this.label10.Text = "Reactivate Date:";
+            this.label10.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // lblInactivateDate
+            // 
+            this.lblInactivateDate.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.lblInactivateDate.Location = new System.Drawing.Point(176, 144);
+            this.lblInactivateDate.Name = "lblInactivateDate";
+            this.lblInactivateDate.Size = new System.Drawing.Size(176, 16);
+            this.lblInactivateDate.TabIndex = 55;
+            // 
+            // label8
+            // 
+            this.label8.Location = new System.Drawing.Point(48, 144);
+            this.label8.Name = "label8";
+            this.label8.Size = new System.Drawing.Size(120, 16);
+            this.label8.TabIndex = 54;
+            this.label8.Text = "Inactivate Date:";
+            this.label8.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // lblClinicCode
+            // 
+            this.lblClinicCode.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.lblClinicCode.Location = new System.Drawing.Point(176, 120);
+            this.lblClinicCode.Name = "lblClinicCode";
+            this.lblClinicCode.Size = new System.Drawing.Size(176, 16);
+            this.lblClinicCode.TabIndex = 53;
+            // 
+            // label6
+            // 
+            this.label6.Location = new System.Drawing.Point(96, 120);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(72, 16);
+            this.label6.TabIndex = 52;
+            this.label6.Text = "Clinic Code:";
+            this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // lblProvider
+            // 
+            this.lblProvider.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.lblProvider.Location = new System.Drawing.Point(176, 96);
+            this.lblProvider.Name = "lblProvider";
+            this.lblProvider.Size = new System.Drawing.Size(176, 16);
+            this.lblProvider.TabIndex = 51;
+            // 
+            // label7
+            // 
+            this.label7.Location = new System.Drawing.Point(104, 96);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(64, 16);
+            this.label7.TabIndex = 50;
+            this.label7.Text = "Provider:";
+            this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // lblVisitServiceCategory
+            // 
+            this.lblVisitServiceCategory.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.lblVisitServiceCategory.Location = new System.Drawing.Point(176, 72);
+            this.lblVisitServiceCategory.Name = "lblVisitServiceCategory";
+            this.lblVisitServiceCategory.Size = new System.Drawing.Size(176, 16);
+            this.lblVisitServiceCategory.TabIndex = 49;
+            // 
+            // label3
+            // 
+            this.label3.Location = new System.Drawing.Point(48, 72);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(120, 16);
+            this.label3.TabIndex = 48;
+            this.label3.Text = "Visit Sevice Category:";
+            this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // lblCreateVisit
+            // 
+            this.lblCreateVisit.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.lblCreateVisit.Location = new System.Drawing.Point(176, 48);
+            this.lblCreateVisit.Name = "lblCreateVisit";
+            this.lblCreateVisit.Size = new System.Drawing.Size(40, 16);
+            this.lblCreateVisit.TabIndex = 47;
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(32, 48);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(136, 16);
+            this.label2.TabIndex = 46;
+            this.label2.Text = "Create Visit at Check-In?";
+            this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // label4
+            // 
+            this.label4.Location = new System.Drawing.Point(32, 18);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(72, 16);
+            this.label4.TabIndex = 45;
+            this.label4.Text = "VistA Clinic:";
+            this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // cboRPMSClinic
+            // 
+            this.cboRPMSClinic.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+            this.cboRPMSClinic.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+            this.cboRPMSClinic.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cboRPMSClinic.Location = new System.Drawing.Point(112, 16);
+            this.cboRPMSClinic.Name = "cboRPMSClinic";
+            this.cboRPMSClinic.Size = new System.Drawing.Size(256, 21);
+            this.cboRPMSClinic.TabIndex = 3;
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(36, 11);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(96, 16);
+            this.label1.TabIndex = 47;
+            this.label1.Text = "Resource Name:";
+            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // txtResourceName
+            // 
+            this.txtResourceName.Location = new System.Drawing.Point(140, 11);
+            this.txtResourceName.MaxLength = 30;
+            this.txtResourceName.Name = "txtResourceName";
+            this.txtResourceName.Size = new System.Drawing.Size(256, 20);
+            this.txtResourceName.TabIndex = 0;
+            // 
+            // tpLetter
+            // 
+            this.tpLetter.Controls.Add(this.label9);
+            this.tpLetter.Controls.Add(this.txtLetter);
+            this.tpLetter.Location = new System.Drawing.Point(4, 22);
+            this.tpLetter.Name = "tpLetter";
+            this.tpLetter.Size = new System.Drawing.Size(490, 318);
+            this.tpLetter.TabIndex = 1;
+            this.tpLetter.Text = "Reminder Letter";
+            // 
+            // label9
+            // 
+            this.label9.Location = new System.Drawing.Point(32, 24);
+            this.label9.Name = "label9";
+            this.label9.Size = new System.Drawing.Size(416, 32);
+            this.label9.TabIndex = 1;
+            this.label9.Text = "Enter the text which will appear on reminder letters sent to patients with appoin" +
+                "tments in this clinic.  Use CTRL+Enter to start a new line.";
+            // 
+            // txtLetter
+            // 
+            this.txtLetter.Location = new System.Drawing.Point(32, 72);
+            this.txtLetter.Multiline = true;
+            this.txtLetter.Name = "txtLetter";
+            this.txtLetter.Size = new System.Drawing.Size(416, 216);
+            this.txtLetter.TabIndex = 20;
+            this.txtLetter.Text = "Dear Patient,\r\n\r\nThis letter is to remind you that you have the appointments list" +
+                "ed below.\r\n\r\nPlease contact us at 555-1234 if you are unable to keep this appoin" +
+                "tment.\r\n\r\nThank you,\r\n\r\nThe Clinic";
+            // 
+            // tpRebookLetter
+            // 
+            this.tpRebookLetter.Controls.Add(this.label12);
+            this.tpRebookLetter.Controls.Add(this.txtRebookLetter);
+            this.tpRebookLetter.Location = new System.Drawing.Point(4, 22);
+            this.tpRebookLetter.Name = "tpRebookLetter";
+            this.tpRebookLetter.Size = new System.Drawing.Size(490, 318);
+            this.tpRebookLetter.TabIndex = 2;
+            this.tpRebookLetter.Text = "Rebook Letter";
+            // 
+            // label12
+            // 
+            this.label12.Location = new System.Drawing.Point(37, 27);
+            this.label12.Name = "label12";
+            this.label12.Size = new System.Drawing.Size(416, 32);
+            this.label12.TabIndex = 21;
+            this.label12.Text = "Enter the text which will appear on rebook letters sent to patients with appointm" +
+                "ents in this clinic.  Use CTRL+Enter to start a new line.";
+            // 
+            // txtRebookLetter
+            // 
+            this.txtRebookLetter.Location = new System.Drawing.Point(37, 75);
+            this.txtRebookLetter.Multiline = true;
+            this.txtRebookLetter.Name = "txtRebookLetter";
+            this.txtRebookLetter.Size = new System.Drawing.Size(416, 216);
+            this.txtRebookLetter.TabIndex = 22;
+            this.txtRebookLetter.Text = resources.GetString("txtRebookLetter.Text");
+            // 
+            // tpCancellationLetter
+            // 
+            this.tpCancellationLetter.Controls.Add(this.label13);
+            this.tpCancellationLetter.Controls.Add(this.txtCancellationLetter);
+            this.tpCancellationLetter.Location = new System.Drawing.Point(4, 22);
+            this.tpCancellationLetter.Name = "tpCancellationLetter";
+            this.tpCancellationLetter.Size = new System.Drawing.Size(490, 318);
+            this.tpCancellationLetter.TabIndex = 3;
+            this.tpCancellationLetter.Text = "Cancellation Letter";
+            // 
+            // label13
+            // 
+            this.label13.Location = new System.Drawing.Point(37, 27);
+            this.label13.Name = "label13";
+            this.label13.Size = new System.Drawing.Size(416, 32);
+            this.label13.TabIndex = 21;
+            this.label13.Text = "Enter the text which will appear on cancellation letters sent to patients with ap" +
+                "pointments in this clinic.  Use CTRL+Enter to start a new line.";
+            // 
+            // txtCancellationLetter
+            // 
+            this.txtCancellationLetter.Location = new System.Drawing.Point(37, 75);
+            this.txtCancellationLetter.Multiline = true;
+            this.txtCancellationLetter.Name = "txtCancellationLetter";
+            this.txtCancellationLetter.Size = new System.Drawing.Size(416, 216);
+            this.txtCancellationLetter.TabIndex = 22;
+            this.txtCancellationLetter.Text = resources.GetString("txtCancellationLetter.Text");
+            // 
+            // DResource
+            // 
+            this.AcceptButton = this.cmdOK;
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.CancelButton = this.cmdCancel;
+            this.ClientSize = new System.Drawing.Size(498, 464);
+            this.Controls.Add(this.tabResources);
+            this.Controls.Add(this.pnlDescription);
+            this.Controls.Add(this.pnlOkCancel);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.Name = "DResource";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Manage Resource";
+            this.Activated += new System.EventHandler(this.DResource_Activated);
+            this.pnlOkCancel.ResumeLayout(false);
+            this.pnlDescription.ResumeLayout(false);
+            this.grpDescription.ResumeLayout(false);
+            this.tabResources.ResumeLayout(false);
+            this.tpRPMSLink.ResumeLayout(false);
+            this.tpRPMSLink.PerformLayout();
+            this.grpRPMSClinicLink.ResumeLayout(false);
+            this.tpLetter.ResumeLayout(false);
+            this.tpLetter.PerformLayout();
+            this.tpRebookLetter.ResumeLayout(false);
+            this.tpRebookLetter.PerformLayout();
+            this.tpCancellationLetter.ResumeLayout(false);
+            this.tpCancellationLetter.PerformLayout();
+            this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		#region Fields
+
+		private DataTable			m_dtResources;
+		private CGResource			m_pResource;
+		private DataView			m_dvHospLoc;
+		
+		#endregion Fields
+
+		#region Methods
+
+		public void InitializePage(int nSelectedResourceID, DataSet dsGlobal)
+		{
+			m_dtResources = dsGlobal.Tables["Resources"];
+
+			//Datasource the HOSPITAL LOCATION combo box
+			DataTable dtHospLoc = dsGlobal.Tables["HospitalLocation"];
+			m_dvHospLoc = new DataView(dtHospLoc);
+            m_dvHospLoc.Sort = "HOSPITAL_LOCATION_ID ASC";
+			int nFind = m_dvHospLoc.Find((int) 0);
+			if (nFind < 0)
+			{
+				DataRowView drv = m_dvHospLoc.AddNew();
+				drv.BeginEdit();
+				drv["HOSPITAL_LOCATION"]="<None>";
+				drv["HOSPITAL_LOCATION_ID"]=0;
+				drv.EndEdit();
+			}
+            m_dvHospLoc.Sort = "HOSPITAL_LOCATION ASC";
+
+//			DataTable dtClinicParams = dsGlobal.Tables["ClinicSetupParameters"];
+//			m_dvClinicParams = new DataView(dtClinicParams);
+//			m_dvClinicParams.Sort = "HOSPITAL_LOCATION_ID ASC";
+//			m_dvClinicParams.Sort = "HOSPITAL_LOCATION ASC";
+//			string sFind = "<None>";
+//			nFind = m_dvClinicParams.Find((int) 0);
+/*			nFind = m_dvClinicParams.Find((string) sFind);
+
+			if (nFind < 0)
+			{
+				DataRowView drv = m_dvClinicParams.AddNew();
+				drv.BeginEdit();
+				drv["HOSPITAL_LOCATION"]="<None>";
+				drv["HOSPITAL_LOCATION_ID"]="0";
+				drv["CREATE_VISIT"]="";
+				drv["VISIT_SERVICE_CATEGORY"]="";
+				drv.EndEdit();
+			}
+*/
+//smh       cboRPMSClinic.DataSource = m_dvClinicParams;
+            cboRPMSClinic.DataSource = m_dvHospLoc;
+			cboRPMSClinic.DisplayMember = "HOSPITAL_LOCATION";
+			cboRPMSClinic.ValueMember = "HOSPITAL_LOCATION_ID";
+//			cboRPMSClinic.SelectedItem = nFind;
+			cboRPMSClinic.SelectedIndex = nFind;
+
+			//Set databindings of the label boxes
+
+//smh		lblCreateVisit.DataBindings.Add("Text", m_dvClinicParams, "CREATE_VISIT");
+//smh   	lblClinicCode.DataBindings.Add("Text", m_dvClinicParams, "CLINIC_STOP");
+            lblClinicCode.DataBindings.Add("Text", m_dvHospLoc, "STOP_CODE_NUMBER"); //smh
+//smh		lblProvider.DataBindings.Add("Text", m_dvClinicParams, "PROVIDER");
+            lblProvider.DataBindings.Add("Text", m_dvHospLoc, "DEFAULT_PROVIDER"); //smh
+//smh		lblInactivateDate.DataBindings.Add("Text", m_dvClinicParams, "INACTIVATE_DATE");
+            lblInactivateDate.DataBindings.Add("Text", m_dvHospLoc, "INACTIVATE_DATE"); //smh
+//smh		lblReactivateDate.DataBindings.Add("Text", m_dvClinicParams, "REACTIVATE_DATE");
+            lblReactivateDate.DataBindings.Add("Text", m_dvHospLoc, "REACTIVATE_DATE"); //smh
+			//create new instance of Resource class
+			m_pResource = new CGResource();
+
+			if (nSelectedResourceID < 0) //then we're in ADD mode
+			{
+				this.Text = "Add New Scheduling Resource";
+				m_pResource.ResourceID = 0;
+				m_pResource.ResourceName = "";
+				m_pResource.Inactive = false;
+				m_pResource.HospitalLocationID = 0;
+				m_pResource.HospitalLocation = "";
+				m_pResource.TimeScale = 15;
+			}
+			else //we're in EDIT mode
+			{
+				this.Text = "Edit Scheduling Resource";
+//				DataRow dr = m_dtResources.Rows[nSelectedResourceID];
+
+				DataRow dr = m_dtResources.Rows.Find(nSelectedResourceID);
+				//TODO: test dr for validity
+
+				string sID = dr["RESOURCEID"].ToString();
+				sID = (sID == "")?"0":sID;
+				m_pResource.ResourceID = Convert.ToInt16(sID);
+				m_pResource.ResourceName = dr["RESOURCE_NAME"].ToString();
+
+				string sInactive = dr["INACTIVE"].ToString();
+				m_pResource.Inactive = (sInactive == "1")?true:false;
+
+				sID = dr["HOSPITAL_LOCATION_ID"].ToString();
+				sID = (sID == "")?"0":sID;
+				m_pResource.HospitalLocationID = Convert.ToInt16(sID);
+
+				if (dr["TIMESCALE"].ToString() != "")
+				{
+					m_pResource.TimeScale = (int) dr["TIMESCALE"];
+				}
+				m_pResource.LetterText = dr["LETTER_TEXT"].ToString();
+				m_pResource.NoShowLetterText = dr["NO_SHOW_LETTER"].ToString();
+				m_pResource.CancellationLetterText = dr["CLINIC_CANCELLATION_LETTER"].ToString();
+
+				dr = dsGlobal.Tables["HospitalLocation"].Rows.Find(m_pResource.HospitalLocationID);
+				//TODO: test dr validity
+				m_pResource.HospitalLocation = dr["HOSPITAL_LOCATION"].ToString();
+
+
+			}
+			UpdateDialogData(true);
+		}
+
+		/// <summary>
+		/// If b is true, moves member vars into control data
+		/// otherwise, moves control data into member vars
+		/// </summary>
+		/// <param name="b"></param>
+		private void UpdateDialogData(bool b)
+		{
+			if (b == true)
+			{
+				txtResourceName.Text = m_pResource.ResourceName;
+				chkInactivate.Checked = m_pResource.Inactive;
+				cboRPMSClinic.SelectedValue = m_pResource.HospitalLocationID;
+				txtLetter.Text = m_pResource.LetterText;
+				txtRebookLetter.Text = m_pResource.NoShowLetterText;
+				txtCancellationLetter.Text = m_pResource.CancellationLetterText;
+				cboTimeInterval.Text = m_pResource.TimeScale.ToString();
+
+			}
+			else
+			{
+				m_pResource.ResourceName = this.txtResourceName.Text;
+				m_pResource.Inactive = this.chkInactivate.Checked;
+				m_pResource.HospitalLocationID  = Convert.ToInt16(this.cboRPMSClinic.SelectedValue);
+				m_pResource.LetterText = txtLetter.Text;
+				m_pResource.CancellationLetterText = txtCancellationLetter.Text;
+				m_pResource.NoShowLetterText = txtRebookLetter.Text;
+				if (cboTimeInterval.Text != "")
+					m_pResource.TimeScale = Convert.ToInt16(cboTimeInterval.Text);
+
+			}
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		private void cmdOK_Click(object sender, System.EventArgs e)
+		{
+			this.UpdateDialogData(false);
+		}
+
+		private void tabResources_SelectedIndexChanged(object sender, System.EventArgs e)
+		{
+			if (tabResources.SelectedIndex == 0)
+			{
+				txtResourceName.Focus();
+			}
+			else
+			{
+				txtLetter.Focus();
+			}
+		}
+
+		private void DResource_Activated(object sender, System.EventArgs e)
+		{
+			txtResourceName.Focus();	
+		}
+		
+		#endregion Methods
+
+		#region Properties
+		public bool Inactive
+		{
+			get
+			{
+				return m_pResource.Inactive;
+			}
+			set
+			{
+				m_pResource.Inactive = value;
+			}
+		}
+
+		public int HospitalLocationID
+		{
+			get
+			{
+				return m_pResource.HospitalLocationID;
+			}
+			set
+			{
+				m_pResource.HospitalLocationID = value;
+			}
+		}
+
+		public string ResourceName
+		{
+			get
+			{
+				return m_pResource.ResourceName;
+			}
+			set
+			{
+				m_pResource.ResourceName = value;
+			}
+		}
+
+		public string LetterText
+		{
+			get
+			{
+				return m_pResource.LetterText;
+			}
+			set
+			{
+				m_pResource.LetterText = value;
+			}
+		}
+
+		public string NoShowLetterText
+		{
+			get
+			{
+				return m_pResource.NoShowLetterText;
+			}
+			set
+			{
+				m_pResource.NoShowLetterText = value;
+			}
+		}
+
+		public string CancellationLetterText
+		{
+			get
+			{
+				return m_pResource.CancellationLetterText;
+			}
+			set
+			{
+				m_pResource.CancellationLetterText = value;
+			}
+		}
+
+		public int ResourceID
+		{
+			get
+			{
+				return m_pResource.ResourceID;
+			}
+			set
+			{
+				m_pResource.ResourceID = value;
+			}
+		}
+
+		public int TimeScale
+		{
+			get
+			{
+				return m_pResource.TimeScale;
+			}
+			set
+			{
+				m_pResource.TimeScale = value;
+			}
+		}
+
+		#endregion Properties
+
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResource.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResource.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResource.resx	(revision 1134)
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="lblDescription.Text" xml:space="preserve">
+    <value>Resources may optionally be linked to a VistA Clinic.  To define the parameters for an VistA clinic, you must log into VistA and use the VistA Scheduling Supervisor's menus.  The Time Interval field controls the increment of time used on the Calendar display.  The Letter Text tab contains the body text of reminder letters for this clinic.</value>
+  </data>
+  <data name="txtRebookLetter.Text" xml:space="preserve">
+    <value>Dear Patient,
+
+This letter is to inform you that we have changed the appointments listed below.
+
+Please contact us at 555-1234 if you are unable to keep your appointment.
+
+Thank you,
+
+The Clinic</value>
+  </data>
+  <data name="txtCancellationLetter.Text" xml:space="preserve">
+    <value>Dear Patient,
+
+This letter is to inform you that the appointments listed below have been cancelled.
+
+Please contact us at 555-1234 if you have questions about your appointments.
+
+Thank you,
+
+The Clinic</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceGroup.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceGroup.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceGroup.cs	(revision 1134)
@@ -0,0 +1,206 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+//using System.Data.OleDb;
+using IndianHealthService.BMXNet;
+using System.Diagnostics;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DResourceGroup.
+	/// </summary>
+	public class DResourceGroup : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Panel pnlPageBottom;
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.Button cmdOK;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.TextBox txtResourceGroupName;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public DResourceGroup()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+			m_sResourceGroupName = "";
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.pnlPageBottom = new System.Windows.Forms.Panel();
+			this.cmdCancel = new System.Windows.Forms.Button();
+			this.cmdOK = new System.Windows.Forms.Button();
+			this.label1 = new System.Windows.Forms.Label();
+			this.txtResourceGroupName = new System.Windows.Forms.TextBox();
+			this.pnlPageBottom.SuspendLayout();
+			this.SuspendLayout();
+			// 
+			// pnlPageBottom
+			// 
+			this.pnlPageBottom.Controls.Add(this.cmdCancel);
+			this.pnlPageBottom.Controls.Add(this.cmdOK);
+			this.pnlPageBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.pnlPageBottom.Location = new System.Drawing.Point(0, 120);
+			this.pnlPageBottom.Name = "pnlPageBottom";
+			this.pnlPageBottom.Size = new System.Drawing.Size(472, 40);
+			this.pnlPageBottom.TabIndex = 6;
+			// 
+			// cmdCancel
+			// 
+			this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.cmdCancel.Location = new System.Drawing.Point(376, 8);
+			this.cmdCancel.Name = "cmdCancel";
+			this.cmdCancel.Size = new System.Drawing.Size(56, 24);
+			this.cmdCancel.TabIndex = 2;
+			this.cmdCancel.Text = "Cancel";
+			// 
+			// cmdOK
+			// 
+			this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+			this.cmdOK.Enabled = false;
+			this.cmdOK.Location = new System.Drawing.Point(296, 8);
+			this.cmdOK.Name = "cmdOK";
+			this.cmdOK.Size = new System.Drawing.Size(64, 24);
+			this.cmdOK.TabIndex = 1;
+			this.cmdOK.Text = "OK";
+			this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
+			// 
+			// label1
+			// 
+			this.label1.Location = new System.Drawing.Point(40, 48);
+			this.label1.Name = "label1";
+			this.label1.Size = new System.Drawing.Size(136, 16);
+			this.label1.TabIndex = 7;
+			this.label1.Text = "Resource Group Name:";
+			// 
+			// txtResourceGroupName
+			// 
+			this.txtResourceGroupName.Location = new System.Drawing.Point(176, 48);
+			this.txtResourceGroupName.Name = "txtResourceGroupName";
+			this.txtResourceGroupName.Size = new System.Drawing.Size(256, 20);
+			this.txtResourceGroupName.TabIndex = 0;
+			this.txtResourceGroupName.Text = "";
+			this.txtResourceGroupName.TextChanged += new System.EventHandler(this.txtResourceGroupName_TextChanged);
+			// 
+			// DResourceGroup
+			// 
+			this.AcceptButton = this.cmdOK;
+			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+			this.CancelButton = this.cmdCancel;
+			this.ClientSize = new System.Drawing.Size(472, 160);
+			this.Controls.Add(this.txtResourceGroupName);
+			this.Controls.Add(this.label1);
+			this.Controls.Add(this.pnlPageBottom);
+			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+			this.Name = "DResourceGroup";
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "Add Resource Group";
+			this.pnlPageBottom.ResumeLayout(false);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		private string	m_sResourceGroupName;
+
+		public void InitializePage(int nSelectedRGID, DataSet dsGlobal)
+		{
+
+			if (nSelectedRGID < 0) //then we're in ADD mode
+			{
+				this.Text = "Add New Resource Group";
+				this.cmdOK.Enabled = false;
+			}
+			else //we're in EDIT mode
+			{
+				this.Text = "Edit Resource Group";
+			}
+			UpdateDialogData(true);
+		}
+
+
+		/// <summary>
+		/// If b is true, moves member vars into control data
+		/// otherwise, moves control data into member vars
+		/// </summary>
+		/// <param name="b"></param>
+		private void UpdateDialogData(bool b)
+		{
+			if (b == true)
+			{
+				txtResourceGroupName.Text = m_sResourceGroupName;
+			}
+			else
+			{
+				m_sResourceGroupName = txtResourceGroupName.Text;
+			}
+		}
+
+		private void txtResourceGroupName_TextChanged(object sender, System.EventArgs e)
+		{
+			string sText = txtResourceGroupName.Text;
+			if ((sText.Length > 2) && (sText.Length < 30))
+			{
+				cmdOK.Enabled = true;
+			}
+			else
+			{
+				cmdOK.Enabled = false;
+			}
+		}
+
+		private void cmdOK_Click(object sender, System.EventArgs e)
+		{
+			UpdateDialogData(false);
+		}
+
+		/// <summary>
+		/// Gets the name of the resource group
+		/// </summary>
+		public String ResourceGroupName
+		{
+			get
+			{
+				return m_sResourceGroupName;
+			}
+			set
+			{
+				m_sResourceGroupName = value;
+			}
+		}
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceGroup.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceGroup.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceGroup.resx	(revision 1134)
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="pnlPageBottom.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="pnlPageBottom.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="pnlPageBottom.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="pnlPageBottom.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="pnlPageBottom.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="pnlPageBottom.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdCancel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdCancel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdCancel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdOK.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtResourceGroupName.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtResourceGroupName.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="txtResourceGroupName.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.Name">
+    <value>DResourceGroup</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceGroupItem.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceGroupItem.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceGroupItem.cs	(revision 1134)
@@ -0,0 +1,219 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+//using System.Data.OleDb;
+using IndianHealthService.BMXNet;
+using System.Diagnostics;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DResourceGroup.
+	/// </summary>
+	public class DResourceGroupItem : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Panel pnlPageBottom;
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.Button cmdOK;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.ComboBox cboResource;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public DResourceGroupItem()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.pnlPageBottom = new System.Windows.Forms.Panel();
+            this.cmdCancel = new System.Windows.Forms.Button();
+            this.cmdOK = new System.Windows.Forms.Button();
+            this.label1 = new System.Windows.Forms.Label();
+            this.cboResource = new System.Windows.Forms.ComboBox();
+            this.pnlPageBottom.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // pnlPageBottom
+            // 
+            this.pnlPageBottom.Controls.Add(this.cmdCancel);
+            this.pnlPageBottom.Controls.Add(this.cmdOK);
+            this.pnlPageBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlPageBottom.Location = new System.Drawing.Point(0, 112);
+            this.pnlPageBottom.Name = "pnlPageBottom";
+            this.pnlPageBottom.Size = new System.Drawing.Size(456, 40);
+            this.pnlPageBottom.TabIndex = 5;
+            // 
+            // cmdCancel
+            // 
+            this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.cmdCancel.Location = new System.Drawing.Point(376, 8);
+            this.cmdCancel.Name = "cmdCancel";
+            this.cmdCancel.Size = new System.Drawing.Size(56, 24);
+            this.cmdCancel.TabIndex = 2;
+            this.cmdCancel.Text = "Cancel";
+            // 
+            // cmdOK
+            // 
+            this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.cmdOK.Location = new System.Drawing.Point(296, 8);
+            this.cmdOK.Name = "cmdOK";
+            this.cmdOK.Size = new System.Drawing.Size(64, 24);
+            this.cmdOK.TabIndex = 1;
+            this.cmdOK.Text = "OK";
+            this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(40, 40);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(96, 16);
+            this.label1.TabIndex = 8;
+            this.label1.Text = "Select Resource:";
+            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // cboResource
+            // 
+            this.cboResource.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+            this.cboResource.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+            this.cboResource.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cboResource.Location = new System.Drawing.Point(144, 40);
+            this.cboResource.Name = "cboResource";
+            this.cboResource.Size = new System.Drawing.Size(248, 21);
+            this.cboResource.TabIndex = 7;
+            // 
+            // DResourceGroupItem
+            // 
+            this.AcceptButton = this.cmdOK;
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.CancelButton = this.cmdCancel;
+            this.ClientSize = new System.Drawing.Size(456, 152);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.cboResource);
+            this.Controls.Add(this.pnlPageBottom);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.Name = "DResourceGroupItem";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "DResourceGroupItem";
+            this.pnlPageBottom.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		#region Fields
+		int		m_nResourceID;
+		string	m_sResourceName;
+//		DataSet	m_dtResource;
+
+		#endregion Fields
+
+
+		public void InitializePage(int nSelectedRID, DataSet dsGlobal)
+		{
+
+//			m_dtResource = dsGlobal.Tables["Resources"];
+
+			//Datasource the RESOURCE combo box
+			DataTable dtResource = dsGlobal.Tables["Resources"];
+			DataView dvResource = new DataView(dtResource);
+            dvResource.Sort = "RESOURCE_NAME ASC";
+
+			cboResource.DataSource = dvResource;
+			cboResource.DisplayMember = "RESOURCE_NAME";
+			cboResource.ValueMember = "RESOURCEID";
+
+			if (nSelectedRID < 0) //then we're in ADD mode
+			{
+				this.Text = "Add New Resource to Group";
+				m_nResourceID = 0;
+				m_sResourceName = "";
+//				this.cmdOK.Enabled = false;
+			}
+			UpdateDialogData(true);
+		}
+
+		/// <summary>
+		/// If b is true, moves member vars into control data
+		/// otherwise, moves control data into member vars
+		/// </summary>
+		/// <param name="b"></param>
+		private void UpdateDialogData(bool b)
+		{
+			if (b == true)
+			{
+				cboResource.SelectedValue = m_nResourceID;
+			}
+			else
+			{
+				m_nResourceID = Convert.ToInt16(cboResource.SelectedValue);
+			}
+		}
+
+		private void cmdOK_Click(object sender, System.EventArgs e)
+		{
+			UpdateDialogData(false);
+		}
+
+
+		#region Properties
+
+
+		/// <summary>
+		/// Contains the IEN of the Resource in the BSDX_RESOURCE file
+		/// </summary>
+		public int ResourceID
+		{
+			get
+			{
+				return m_nResourceID;
+			}
+		}
+
+		/// <summary>
+		/// Contains the name of the Resource
+		/// </summary>
+		public string ResourceName
+		{
+			get
+			{
+				return m_sResourceName;
+			}
+		}
+		#endregion Properties
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceGroupItem.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceGroupItem.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceGroupItem.resx	(revision 1134)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceUser.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceUser.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceUser.cs	(revision 1134)
@@ -0,0 +1,379 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+using IndianHealthService.BMXNet;
+using System.Diagnostics;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DResourceUser.
+	/// </summary>
+	public class DResourceUser : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.Panel pnlPageBottom;
+		private System.Windows.Forms.Panel pnlDescription;
+		private System.Windows.Forms.GroupBox grpDescriptionResourceGroup;
+		private System.Windows.Forms.Label lblDescriptionResourceGroup;
+		private System.Windows.Forms.Button cmdOK;
+		private System.Windows.Forms.ComboBox cboScheduleUser;
+		private System.Windows.Forms.CheckBox chkModifySchedule;
+		private System.Windows.Forms.CheckBox chkOverbook;
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.CheckBox chkAppointments;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public DResourceUser()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DResourceUser));
+            this.cboScheduleUser = new System.Windows.Forms.ComboBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.pnlPageBottom = new System.Windows.Forms.Panel();
+            this.cmdCancel = new System.Windows.Forms.Button();
+            this.cmdOK = new System.Windows.Forms.Button();
+            this.pnlDescription = new System.Windows.Forms.Panel();
+            this.grpDescriptionResourceGroup = new System.Windows.Forms.GroupBox();
+            this.lblDescriptionResourceGroup = new System.Windows.Forms.Label();
+            this.chkModifySchedule = new System.Windows.Forms.CheckBox();
+            this.chkOverbook = new System.Windows.Forms.CheckBox();
+            this.chkAppointments = new System.Windows.Forms.CheckBox();
+            this.pnlPageBottom.SuspendLayout();
+            this.pnlDescription.SuspendLayout();
+            this.grpDescriptionResourceGroup.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // cboScheduleUser
+            // 
+            this.cboScheduleUser.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+            this.cboScheduleUser.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
+            this.cboScheduleUser.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cboScheduleUser.Location = new System.Drawing.Point(144, 32);
+            this.cboScheduleUser.Name = "cboScheduleUser";
+            this.cboScheduleUser.Size = new System.Drawing.Size(248, 21);
+            this.cboScheduleUser.TabIndex = 0;
+            this.cboScheduleUser.SelectedIndexChanged += new System.EventHandler(this.cboScheduleUser_SelectedIndexChanged);
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(16, 32);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(120, 16);
+            this.label1.TabIndex = 1;
+            this.label1.Text = "Select Resource User:";
+            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+            // 
+            // pnlPageBottom
+            // 
+            this.pnlPageBottom.Controls.Add(this.cmdCancel);
+            this.pnlPageBottom.Controls.Add(this.cmdOK);
+            this.pnlPageBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlPageBottom.Location = new System.Drawing.Point(0, 254);
+            this.pnlPageBottom.Name = "pnlPageBottom";
+            this.pnlPageBottom.Size = new System.Drawing.Size(448, 40);
+            this.pnlPageBottom.TabIndex = 4;
+            // 
+            // cmdCancel
+            // 
+            this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.cmdCancel.Location = new System.Drawing.Point(376, 8);
+            this.cmdCancel.Name = "cmdCancel";
+            this.cmdCancel.Size = new System.Drawing.Size(56, 24);
+            this.cmdCancel.TabIndex = 6;
+            this.cmdCancel.Text = "Cancel";
+            // 
+            // cmdOK
+            // 
+            this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.cmdOK.Location = new System.Drawing.Point(296, 8);
+            this.cmdOK.Name = "cmdOK";
+            this.cmdOK.Size = new System.Drawing.Size(64, 24);
+            this.cmdOK.TabIndex = 5;
+            this.cmdOK.Text = "OK";
+            this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
+            // 
+            // pnlDescription
+            // 
+            this.pnlDescription.Controls.Add(this.grpDescriptionResourceGroup);
+            this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlDescription.Location = new System.Drawing.Point(0, 182);
+            this.pnlDescription.Name = "pnlDescription";
+            this.pnlDescription.Size = new System.Drawing.Size(448, 72);
+            this.pnlDescription.TabIndex = 5;
+            // 
+            // grpDescriptionResourceGroup
+            // 
+            this.grpDescriptionResourceGroup.Controls.Add(this.lblDescriptionResourceGroup);
+            this.grpDescriptionResourceGroup.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grpDescriptionResourceGroup.Location = new System.Drawing.Point(0, 0);
+            this.grpDescriptionResourceGroup.Name = "grpDescriptionResourceGroup";
+            this.grpDescriptionResourceGroup.Size = new System.Drawing.Size(448, 72);
+            this.grpDescriptionResourceGroup.TabIndex = 1;
+            this.grpDescriptionResourceGroup.TabStop = false;
+            this.grpDescriptionResourceGroup.Text = "Description";
+            // 
+            // lblDescriptionResourceGroup
+            // 
+            this.lblDescriptionResourceGroup.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lblDescriptionResourceGroup.Location = new System.Drawing.Point(3, 16);
+            this.lblDescriptionResourceGroup.Name = "lblDescriptionResourceGroup";
+            this.lblDescriptionResourceGroup.Size = new System.Drawing.Size(442, 53);
+            this.lblDescriptionResourceGroup.TabIndex = 0;
+            this.lblDescriptionResourceGroup.Text = resources.GetString("lblDescriptionResourceGroup.Text");
+            // 
+            // chkModifySchedule
+            // 
+            this.chkModifySchedule.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+            this.chkModifySchedule.Location = new System.Drawing.Point(96, 136);
+            this.chkModifySchedule.Name = "chkModifySchedule";
+            this.chkModifySchedule.Size = new System.Drawing.Size(152, 16);
+            this.chkModifySchedule.TabIndex = 4;
+            this.chkModifySchedule.Text = "Modify Clinic Availability:";
+            this.chkModifySchedule.CheckedChanged += new System.EventHandler(this.chkModifySchedule_CheckedChanged);
+            // 
+            // chkOverbook
+            // 
+            this.chkOverbook.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+            this.chkOverbook.Location = new System.Drawing.Point(160, 104);
+            this.chkOverbook.Name = "chkOverbook";
+            this.chkOverbook.Size = new System.Drawing.Size(88, 16);
+            this.chkOverbook.TabIndex = 3;
+            this.chkOverbook.Text = "Overbook:";
+            this.chkOverbook.CheckedChanged += new System.EventHandler(this.chkOverbook_CheckedChanged);
+            // 
+            // chkAppointments
+            // 
+            this.chkAppointments.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+            this.chkAppointments.Location = new System.Drawing.Point(40, 72);
+            this.chkAppointments.Name = "chkAppointments";
+            this.chkAppointments.Size = new System.Drawing.Size(208, 16);
+            this.chkAppointments.TabIndex = 2;
+            this.chkAppointments.Text = "Add, Edit and Delete appointments:";
+            this.chkAppointments.CheckedChanged += new System.EventHandler(this.chkAppointments_CheckedChanged);
+            // 
+            // DResourceUser
+            // 
+            this.AcceptButton = this.cmdOK;
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.CancelButton = this.cmdCancel;
+            this.ClientSize = new System.Drawing.Size(448, 294);
+            this.Controls.Add(this.chkAppointments);
+            this.Controls.Add(this.chkOverbook);
+            this.Controls.Add(this.chkModifySchedule);
+            this.Controls.Add(this.pnlDescription);
+            this.Controls.Add(this.pnlPageBottom);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.cboScheduleUser);
+            this.Name = "DResourceUser";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "DResourceUser";
+            this.pnlPageBottom.ResumeLayout(false);
+            this.pnlDescription.ResumeLayout(false);
+            this.grpDescriptionResourceGroup.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		#region Fields
+
+		private DataTable	m_dtResourceUser;
+		private int			m_nUserID;
+		private bool		m_bModifySchedule;
+		private bool		m_bOverbook;
+		private bool		m_bAppointments;
+
+		#endregion Fields
+
+		#region Properties
+
+		/// <summary>
+		/// The ID of the Resource User in the NEW PERSON file.
+		/// </summary>
+		public int UserID
+		{
+			get
+			{
+				return m_nUserID;
+			}
+		}
+
+		/// <summary>
+		/// True if the user is allowed to modify the resource's scheduled availability
+		/// </summary>
+		public bool ModifySchedule
+		{
+			get
+			{
+				return m_bModifySchedule;
+			}
+		}
+
+		/// <summary>
+		/// True if the user is allowed to overbook beyond the resource's scheduled availability
+		/// </summary>
+		public bool Overbook
+		{
+			get
+			{
+				return m_bOverbook;
+			}
+		}
+
+		/// <summary>
+		/// True if the user is allowed to create, edit and delete appointments
+		/// </summary>
+		public bool Appoinmtments
+		{
+			get
+			{
+				return m_bAppointments;
+			}
+		}		
+		#endregion Properties
+
+
+		public void InitializePage(int nSelectedRUID, DataSet dsGlobal)
+		{
+
+			m_dtResourceUser = dsGlobal.Tables["ResourceUser"];
+
+			//Datasource the SCHEDULE USER combo box
+			DataTable dtSchedUser = dsGlobal.Tables["ScheduleUser"];
+			DataView dvSchedUser = new DataView(dtSchedUser);
+			dvSchedUser.Sort = "USERNAME ASC";
+
+
+			cboScheduleUser.DataSource = dvSchedUser;
+			cboScheduleUser.DisplayMember = "USERNAME";
+			cboScheduleUser.ValueMember = "USERID";
+
+			if (nSelectedRUID < 0) //then we're in ADD mode
+			{
+				this.Text = "Add New Resource User";
+				m_nUserID = 0;
+				m_bModifySchedule = false;
+				m_bOverbook = false;
+				m_bAppointments = false;
+				this.cmdOK.Enabled = false;
+			}
+			else //we're in EDIT mode
+			{
+				this.Text = "Edit Scheduling Resource";
+				this.cboScheduleUser.Enabled = false;
+				DataRow dr = m_dtResourceUser.Rows.Find(nSelectedRUID);	
+				m_nUserID = Convert.ToInt16(dr["USERID"]);//CHANGED FROM USERID1
+				string sOverbook = dr["OVERBOOK"].ToString();
+				m_bOverbook = (sOverbook == "YES")?true:false;
+				string sModify = dr["MODIFY_SCHEDULE"].ToString();
+				m_bModifySchedule = (sModify == "YES")?true:false;
+				string sAppts = dr["MODIFY_APPOINTMENTS"].ToString();
+				m_bAppointments = (sAppts == "YES")?true:false;
+
+			}
+			UpdateDialogData(true);
+		}
+
+		/// <summary>
+		/// If b is true, moves member vars into control data
+		/// otherwise, moves control data into member vars
+		/// </summary>
+		/// <param name="b"></param>
+		private void UpdateDialogData(bool b)
+		{
+			if (b == true)
+			{
+				this.chkOverbook.Checked = m_bOverbook;
+				this.chkModifySchedule.Checked = m_bModifySchedule;
+				this.cboScheduleUser.SelectedValue = m_nUserID;
+				this.chkAppointments.Checked = m_bAppointments;
+			}
+			else
+			{
+				m_bOverbook = this.chkOverbook.Checked;
+				m_bModifySchedule = this.chkModifySchedule.Checked;
+				m_bAppointments = this.chkAppointments.Checked;
+				m_nUserID = Convert.ToInt16(this.cboScheduleUser.SelectedValue);
+			}
+		}
+
+		private void cmdOK_Click(object sender, System.EventArgs e)
+		{
+			this.UpdateDialogData(false);
+		}
+
+		private void cboScheduleUser_SelectedIndexChanged(object sender, System.EventArgs e)
+		{
+			this.cmdOK.Enabled = true;
+		}
+
+		private void chkModifySchedule_CheckedChanged(object sender, System.EventArgs e)
+		{
+			if (chkModifySchedule.Checked == true)
+			{
+				this.chkAppointments.Checked = true;
+				this.chkOverbook.Checked = true;
+			}
+		}
+
+		private void chkOverbook_CheckedChanged(object sender, System.EventArgs e)
+		{
+			if (chkOverbook.Checked == true)
+			{
+				chkAppointments.Checked = true;
+			}
+			if (chkOverbook.Checked == false)
+			{
+				chkModifySchedule.Checked = false;
+			}
+		}
+
+		private void chkAppointments_CheckedChanged(object sender, System.EventArgs e)
+		{
+			if (chkAppointments.Checked == false)
+			{
+				chkOverbook.Checked = false;
+				chkModifySchedule.Checked = false;
+			}
+		}
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceUser.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceUser.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DResourceUser.resx	(revision 1134)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="lblDescriptionResourceGroup.Text" xml:space="preserve">
+    <value>Use this panel to assign user access to Resources.  Only users who have the BSDXZMENU key in VistA will appear in the selection list.  If Modify Schedule is checked, then the user will be able to add and edit the resource's availability.</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSelectLetterClinics.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSelectLetterClinics.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSelectLetterClinics.cs	(revision 1134)
@@ -0,0 +1,366 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Use this dialog to select resources and dates (begin and end) for their examination.
+    /// <example>
+    /// DSelectLetterClinics ds = new DSelectLetterClinics();
+    /// ds.InitializePage(this.m_DocManager.GlobalDataSet, "Print Clinic Cancellation Letters");
+	///	ds.ShowDialog(this) 					
+    ///
+	/// //get the resource names and call the letter printer
+	///	string sClinics = ds.SelectedClinics;
+	///	DateTime dtBegin = ds.BeginDate;
+	///	DateTime dtEnd = ds.EndDate;
+    /// </example>
+	/// </summary>
+    /// 
+	public class DSelectLetterClinics : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.Button cmdOK;
+		private System.Windows.Forms.Panel pnlOkCancel;
+		private System.Windows.Forms.Panel pnlDescription;
+		private System.Windows.Forms.GroupBox grpDescription;
+		private System.Windows.Forms.Label lblDescription;
+		private System.Windows.Forms.CheckedListBox lstResource;
+		private System.Windows.Forms.ComboBox cboResourceGroup;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.Label label4;
+		private System.Windows.Forms.Label label5;
+		private System.Windows.Forms.DateTimePicker dtBegin;
+		private System.Windows.Forms.DateTimePicker dtEnd;
+		private System.Windows.Forms.Label lblRange;
+		private System.Windows.Forms.CheckBox chkSelectAll;
+		private System.ComponentModel.Container components = null;
+
+		/// <summary>
+		/// Ctor; also sets default enter and cancel buttons
+		/// </summary>
+        public DSelectLetterClinics()
+		{
+			InitializeComponent();
+            this.AcceptButton = cmdOK;
+            this.CancelButton = cmdCancel;
+            this.chkSelectAll.Focus();
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DSelectLetterClinics));
+            this.pnlOkCancel = new System.Windows.Forms.Panel();
+            this.cmdCancel = new System.Windows.Forms.Button();
+            this.cmdOK = new System.Windows.Forms.Button();
+            this.pnlDescription = new System.Windows.Forms.Panel();
+            this.grpDescription = new System.Windows.Forms.GroupBox();
+            this.lblDescription = new System.Windows.Forms.Label();
+            this.lstResource = new System.Windows.Forms.CheckedListBox();
+            this.cboResourceGroup = new System.Windows.Forms.ComboBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.dtBegin = new System.Windows.Forms.DateTimePicker();
+            this.dtEnd = new System.Windows.Forms.DateTimePicker();
+            this.lblRange = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.label5 = new System.Windows.Forms.Label();
+            this.chkSelectAll = new System.Windows.Forms.CheckBox();
+            this.pnlOkCancel.SuspendLayout();
+            this.pnlDescription.SuspendLayout();
+            this.grpDescription.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // pnlOkCancel
+            // 
+            this.pnlOkCancel.Controls.Add(this.cmdCancel);
+            this.pnlOkCancel.Controls.Add(this.cmdOK);
+            this.pnlOkCancel.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlOkCancel.Location = new System.Drawing.Point(0, 430);
+            this.pnlOkCancel.Name = "pnlOkCancel";
+            this.pnlOkCancel.Size = new System.Drawing.Size(512, 40);
+            this.pnlOkCancel.TabIndex = 4;
+            // 
+            // cmdCancel
+            // 
+            this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.cmdCancel.Location = new System.Drawing.Point(416, 8);
+            this.cmdCancel.Name = "cmdCancel";
+            this.cmdCancel.Size = new System.Drawing.Size(64, 24);
+            this.cmdCancel.TabIndex = 1;
+            this.cmdCancel.Text = "Cancel";
+            // 
+            // cmdOK
+            // 
+            this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+            this.cmdOK.Location = new System.Drawing.Point(336, 8);
+            this.cmdOK.Name = "cmdOK";
+            this.cmdOK.Size = new System.Drawing.Size(64, 24);
+            this.cmdOK.TabIndex = 0;
+            this.cmdOK.Text = "OK";
+            // 
+            // pnlDescription
+            // 
+            this.pnlDescription.Controls.Add(this.grpDescription);
+            this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.pnlDescription.Location = new System.Drawing.Point(0, 350);
+            this.pnlDescription.Name = "pnlDescription";
+            this.pnlDescription.Size = new System.Drawing.Size(512, 80);
+            this.pnlDescription.TabIndex = 47;
+            // 
+            // grpDescription
+            // 
+            this.grpDescription.Controls.Add(this.lblDescription);
+            this.grpDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grpDescription.Location = new System.Drawing.Point(0, 0);
+            this.grpDescription.Name = "grpDescription";
+            this.grpDescription.Size = new System.Drawing.Size(512, 80);
+            this.grpDescription.TabIndex = 0;
+            this.grpDescription.TabStop = false;
+            this.grpDescription.Text = "Description";
+            // 
+            // lblDescription
+            // 
+            this.lblDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.lblDescription.Location = new System.Drawing.Point(3, 16);
+            this.lblDescription.Name = "lblDescription";
+            this.lblDescription.Size = new System.Drawing.Size(506, 61);
+            this.lblDescription.TabIndex = 1;
+            this.lblDescription.Text = resources.GetString("lblDescription.Text");
+            // 
+            // lstResource
+            // 
+            this.lstResource.HorizontalScrollbar = true;
+            this.lstResource.Location = new System.Drawing.Point(24, 96);
+            this.lstResource.MultiColumn = true;
+            this.lstResource.Name = "lstResource";
+            this.lstResource.Size = new System.Drawing.Size(448, 124);
+            this.lstResource.TabIndex = 48;
+            // 
+            // cboResourceGroup
+            // 
+            this.cboResourceGroup.Location = new System.Drawing.Point(24, 40);
+            this.cboResourceGroup.Name = "cboResourceGroup";
+            this.cboResourceGroup.Size = new System.Drawing.Size(448, 21);
+            this.cboResourceGroup.TabIndex = 49;
+            this.cboResourceGroup.SelectedIndexChanged += new System.EventHandler(this.cboResourceGroup_SelectedIndexChanged);
+            // 
+            // label1
+            // 
+            this.label1.Location = new System.Drawing.Point(24, 16);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(208, 16);
+            this.label1.TabIndex = 50;
+            this.label1.Text = "Resource Group:";
+            // 
+            // label2
+            // 
+            this.label2.Location = new System.Drawing.Point(24, 72);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(72, 16);
+            this.label2.TabIndex = 51;
+            this.label2.Text = "Resource:";
+            // 
+            // dtBegin
+            // 
+            this.dtBegin.Location = new System.Drawing.Point(24, 312);
+            this.dtBegin.Name = "dtBegin";
+            this.dtBegin.Size = new System.Drawing.Size(200, 20);
+            this.dtBegin.TabIndex = 52;
+            // 
+            // dtEnd
+            // 
+            this.dtEnd.Location = new System.Drawing.Point(280, 312);
+            this.dtEnd.Name = "dtEnd";
+            this.dtEnd.Size = new System.Drawing.Size(192, 20);
+            this.dtEnd.TabIndex = 52;
+            // 
+            // lblRange
+            // 
+            this.lblRange.Location = new System.Drawing.Point(24, 272);
+            this.lblRange.Name = "lblRange";
+            this.lblRange.Size = new System.Drawing.Size(192, 16);
+            this.lblRange.TabIndex = 53;
+            this.lblRange.Text = "Date range for appointment letters:";
+            // 
+            // label4
+            // 
+            this.label4.Location = new System.Drawing.Point(24, 296);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(152, 16);
+            this.label4.TabIndex = 54;
+            this.label4.Text = "Beginning Date:";
+            // 
+            // label5
+            // 
+            this.label5.Location = new System.Drawing.Point(280, 296);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(152, 16);
+            this.label5.TabIndex = 54;
+            this.label5.Text = "Ending  Date:";
+            // 
+            // chkSelectAll
+            // 
+            this.chkSelectAll.Location = new System.Drawing.Point(32, 232);
+            this.chkSelectAll.Name = "chkSelectAll";
+            this.chkSelectAll.Size = new System.Drawing.Size(168, 24);
+            this.chkSelectAll.TabIndex = 55;
+            this.chkSelectAll.Text = "Select &All Resources";
+            this.chkSelectAll.CheckedChanged += new System.EventHandler(this.chkSelectAll_CheckedChanged);
+            // 
+            // DSelectLetterClinics
+            // 
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.ClientSize = new System.Drawing.Size(512, 470);
+            this.Controls.Add(this.chkSelectAll);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.lblRange);
+            this.Controls.Add(this.dtBegin);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.cboResourceGroup);
+            this.Controls.Add(this.lstResource);
+            this.Controls.Add(this.pnlDescription);
+            this.Controls.Add(this.pnlOkCancel);
+            this.Controls.Add(this.dtEnd);
+            this.Controls.Add(this.label5);
+            this.Name = "DSelectLetterClinics";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Print Apppointment Letters";
+            this.pnlOkCancel.ResumeLayout(false);
+            this.pnlDescription.ResumeLayout(false);
+            this.grpDescription.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		#region Methods
+
+		public void SetupForReports()
+		{
+			lblRange.Text = "Date Range for Appointment List:";
+			lblDescription.Text = "Use this panel to select resources and to specify the time period for appointment lists.  Check each resource (clinic) for which to print lists.  Lists will be printed for appointments between the beginning and ending dates, inclusive.";
+			this.Text = "Print Clinic Schedules";
+		}
+
+		public void InitializePage(DataSet dsGlobal, string sWindowText)
+		{
+			try
+			{
+				m_bInitialized = false;
+				this.Text = sWindowText;
+				m_dtResources = dsGlobal.Tables["GroupResources"];
+				m_dvResources = new DataView(m_dtResources);
+				m_dvResources.Sort = "RESOURCE_NAME ASC";
+				lstResource.DataSource = m_dvResources;
+				lstResource.DisplayMember = "RESOURCE_NAME";
+				lstResource.ValueMember = "RESOURCEID";	
+				
+				m_dtGroups = dsGlobal.Tables["ResourceGroup"];
+				m_dvGroups = new DataView(m_dtGroups);
+				m_dvGroups.Sort = "RESOURCE_GROUP ASC";
+				cboResourceGroup.DataSource = m_dvGroups;
+				cboResourceGroup.DisplayMember = "RESOURCE_GROUP";
+				cboResourceGroup.ValueMember = "RESOURCE_GROUPID";
+
+				m_dvResources.RowFilter = "RESOURCE_GROUPID = " + cboResourceGroup.SelectedValue;
+				m_bInitialized = true;
+				return;
+			}
+			catch(Exception ex)
+			{
+				throw ex;
+			}
+
+		}
+
+		private void cboResourceGroup_SelectedIndexChanged(object sender, System.EventArgs e)
+		{
+			if (m_bInitialized == true)
+				m_dvResources.RowFilter = "RESOURCE_GROUPID = " + cboResourceGroup.SelectedValue;
+			chkSelectAll.Checked = false;
+		}
+
+		private void chkSelectAll_CheckedChanged(object sender, System.EventArgs e)
+		{
+			for(int i=0; i < lstResource.Items.Count; i++)
+			{
+				lstResource.SetItemChecked(i, chkSelectAll.Checked);
+			}
+		}
+
+		#endregion Methods
+
+		#region Fields
+		private DataTable		m_dtGroups;
+		private DataView		m_dvGroups;
+		private DataTable		m_dtResources;
+		private DataView		m_dvResources;
+		private bool			m_bInitialized;
+
+		#endregion Fields
+
+		#region Properties
+
+		/// <summary>
+		/// Returns the |-delimited string of selected resource id's
+		/// </summary>
+		public string SelectedClinics
+		{
+			get
+			{
+				string sRet = "";
+				foreach(DataRowView s in this.lstResource.CheckedItems)
+				{
+					sRet = sRet + s["RESOURCEID"].ToString() + "|";
+				}
+				return sRet;
+			}
+		}
+
+		public DateTime BeginDate
+		{
+			get
+			{
+				return dtBegin.Value;
+			}
+		}
+
+		public DateTime EndDate
+		{
+			get
+			{
+				return dtEnd.Value;
+			}
+		}
+		#endregion Properties
+
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSelectLetterClinics.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSelectLetterClinics.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSelectLetterClinics.resx	(revision 1134)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="lblDescription.Text" xml:space="preserve">
+    <value>Use this panel to select resources and to specify the time period for patient reminder letters.  Check each resource (clinic) for which to print letters.  Letters will be printed for appointments between the beginning and ending dates, inclusive.</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSelectSchedules.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSelectSchedules.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSelectSchedules.cs	(revision 1134)
@@ -0,0 +1,352 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DSelectSchedules.
+	/// </summary>
+	public class DSelectSchedules : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Panel pnlOkCancel;
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.Button cmdOK;
+		private System.Windows.Forms.Panel pnlDescription;
+		private System.Windows.Forms.GroupBox grpDescription;
+		private System.Windows.Forms.Label lblDescription;
+		private System.Windows.Forms.Label label2;
+		private System.Windows.Forms.CheckedListBox lstResource;
+		private System.Windows.Forms.CheckBox chkOneWindow;
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.ComboBox cboResourceGroup;
+		private System.Windows.Forms.TextBox txtGroupWindow;
+		private System.Windows.Forms.Label label3;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public DSelectSchedules()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.pnlOkCancel = new System.Windows.Forms.Panel();
+			this.cmdCancel = new System.Windows.Forms.Button();
+			this.cmdOK = new System.Windows.Forms.Button();
+			this.pnlDescription = new System.Windows.Forms.Panel();
+			this.grpDescription = new System.Windows.Forms.GroupBox();
+			this.lblDescription = new System.Windows.Forms.Label();
+			this.label2 = new System.Windows.Forms.Label();
+			this.lstResource = new System.Windows.Forms.CheckedListBox();
+			this.chkOneWindow = new System.Windows.Forms.CheckBox();
+			this.label1 = new System.Windows.Forms.Label();
+			this.cboResourceGroup = new System.Windows.Forms.ComboBox();
+			this.txtGroupWindow = new System.Windows.Forms.TextBox();
+			this.label3 = new System.Windows.Forms.Label();
+			this.pnlOkCancel.SuspendLayout();
+			this.pnlDescription.SuspendLayout();
+			this.grpDescription.SuspendLayout();
+			this.SuspendLayout();
+			// 
+			// pnlOkCancel
+			// 
+			this.pnlOkCancel.Controls.Add(this.cmdCancel);
+			this.pnlOkCancel.Controls.Add(this.cmdOK);
+			this.pnlOkCancel.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.pnlOkCancel.Location = new System.Drawing.Point(0, 478);
+			this.pnlOkCancel.Name = "pnlOkCancel";
+			this.pnlOkCancel.Size = new System.Drawing.Size(512, 40);
+			this.pnlOkCancel.TabIndex = 5;
+			// 
+			// cmdCancel
+			// 
+			this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.cmdCancel.Location = new System.Drawing.Point(416, 8);
+			this.cmdCancel.Name = "cmdCancel";
+			this.cmdCancel.Size = new System.Drawing.Size(64, 24);
+			this.cmdCancel.TabIndex = 30;
+			this.cmdCancel.Text = "Cancel";
+			// 
+			// cmdOK
+			// 
+			this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+			this.cmdOK.Location = new System.Drawing.Point(336, 8);
+			this.cmdOK.Name = "cmdOK";
+			this.cmdOK.Size = new System.Drawing.Size(64, 24);
+			this.cmdOK.TabIndex = 25;
+			this.cmdOK.Text = "OK";
+			// 
+			// pnlDescription
+			// 
+			this.pnlDescription.Controls.Add(this.grpDescription);
+			this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.pnlDescription.Location = new System.Drawing.Point(0, 398);
+			this.pnlDescription.Name = "pnlDescription";
+			this.pnlDescription.Size = new System.Drawing.Size(512, 80);
+			this.pnlDescription.TabIndex = 48;
+			// 
+			// grpDescription
+			// 
+			this.grpDescription.Controls.Add(this.lblDescription);
+			this.grpDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.grpDescription.Location = new System.Drawing.Point(0, 0);
+			this.grpDescription.Name = "grpDescription";
+			this.grpDescription.Size = new System.Drawing.Size(512, 80);
+			this.grpDescription.TabIndex = 0;
+			this.grpDescription.TabStop = false;
+			this.grpDescription.Text = "Description";
+			// 
+			// lblDescription
+			// 
+			this.lblDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.lblDescription.Location = new System.Drawing.Point(3, 16);
+			this.lblDescription.Name = "lblDescription";
+			this.lblDescription.Size = new System.Drawing.Size(506, 61);
+			this.lblDescription.TabIndex = 1;
+			this.lblDescription.Text = "Use this panel to open a group of resource schedules.  You can open each schedule" +
+				" in a separate window or open all schedules in one single group window.  If you " +
+				"use a group window, you can assign a name to identify the window.";
+			// 
+			// label2
+			// 
+			this.label2.Location = new System.Drawing.Point(16, 80);
+			this.label2.Name = "label2";
+			this.label2.Size = new System.Drawing.Size(240, 16);
+			this.label2.TabIndex = 53;
+			this.label2.Text = "Resource:";
+			// 
+			// lstResource
+			// 
+			this.lstResource.HorizontalScrollbar = true;
+			this.lstResource.Location = new System.Drawing.Point(16, 104);
+			this.lstResource.MultiColumn = true;
+			this.lstResource.Name = "lstResource";
+			this.lstResource.Size = new System.Drawing.Size(448, 184);
+			this.lstResource.TabIndex = 10;
+			// 
+			// chkOneWindow
+			// 
+			this.chkOneWindow.Checked = true;
+			this.chkOneWindow.CheckState = System.Windows.Forms.CheckState.Checked;
+			this.chkOneWindow.Location = new System.Drawing.Point(24, 304);
+			this.chkOneWindow.Name = "chkOneWindow";
+			this.chkOneWindow.Size = new System.Drawing.Size(328, 24);
+			this.chkOneWindow.TabIndex = 15;
+			this.chkOneWindow.Text = "Open Schedules in a Single Group Window";
+			this.chkOneWindow.CheckedChanged += new System.EventHandler(this.chkOneWindow_CheckedChanged);
+			// 
+			// label1
+			// 
+			this.label1.Location = new System.Drawing.Point(16, 16);
+			this.label1.Name = "label1";
+			this.label1.Size = new System.Drawing.Size(208, 16);
+			this.label1.TabIndex = 58;
+			this.label1.Text = "Resource Group:";
+			// 
+			// cboResourceGroup
+			// 
+			this.cboResourceGroup.Location = new System.Drawing.Point(16, 40);
+			this.cboResourceGroup.Name = "cboResourceGroup";
+			this.cboResourceGroup.Size = new System.Drawing.Size(448, 21);
+			this.cboResourceGroup.TabIndex = 5;
+			this.cboResourceGroup.SelectionChangeCommitted += new System.EventHandler(this.cboResourceGroup_SelectionChangeCommitted);
+			// 
+			// txtGroupWindow
+			// 
+			this.txtGroupWindow.Location = new System.Drawing.Point(160, 344);
+			this.txtGroupWindow.Name = "txtGroupWindow";
+			this.txtGroupWindow.Size = new System.Drawing.Size(304, 20);
+			this.txtGroupWindow.TabIndex = 20;
+			this.txtGroupWindow.Text = "";
+			// 
+			// label3
+			// 
+			this.label3.Location = new System.Drawing.Point(32, 344);
+			this.label3.Name = "label3";
+			this.label3.Size = new System.Drawing.Size(120, 16);
+			this.label3.TabIndex = 58;
+			this.label3.Text = "Group Window Name:";
+			// 
+			// DSelectSchedules
+			// 
+			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+			this.ClientSize = new System.Drawing.Size(512, 518);
+			this.Controls.Add(this.txtGroupWindow);
+			this.Controls.Add(this.label1);
+			this.Controls.Add(this.cboResourceGroup);
+			this.Controls.Add(this.chkOneWindow);
+			this.Controls.Add(this.label2);
+			this.Controls.Add(this.lstResource);
+			this.Controls.Add(this.pnlDescription);
+			this.Controls.Add(this.pnlOkCancel);
+			this.Controls.Add(this.label3);
+			this.Name = "DSelectSchedules";
+			this.Text = "Open Selected Schedules";
+			this.pnlOkCancel.ResumeLayout(false);
+			this.pnlDescription.ResumeLayout(false);
+			this.grpDescription.ResumeLayout(false);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+
+		#region Fields
+		private DataTable		m_dtGroups;
+		private DataView		m_dvGroups;
+		private DataTable		m_dtResources;
+		private DataView		m_dvResources;
+		private DataSet			m_dsGlobal;
+
+		#endregion Fields
+
+		#region Properties
+
+		/// <summary>
+		/// Returns the an ArrayList of selected resource names
+		/// </summary>
+		public ArrayList SelectedClinics
+		{
+
+			get
+			{
+				System.Collections.ArrayList al = new System.Collections.ArrayList();
+				foreach(DataRowView s in this.lstResource.CheckedItems)
+				{
+					al.Add(s["RESOURCE_NAME"].ToString());
+				}
+				return al;
+			}
+		}
+
+		public bool SingleWindow
+		{
+			get
+			{
+				return this.chkOneWindow.Checked;
+			}
+		}
+
+		public string GroupWindowName
+		{
+			get
+			{
+				return this.txtGroupWindow.Text;
+			}
+		}
+		#endregion Properties
+
+
+		public void InitializePage(DataSet dsGlobal, string sWindowText)
+		{
+			try
+			{
+				m_dsGlobal = dsGlobal;
+				this.Text = sWindowText;
+				m_dtResources = dsGlobal.Tables["Resources"];
+				m_dvResources = new DataView(m_dtResources);
+				m_dvResources.Sort = "RESOURCE_NAME ASC";
+				m_dvResources.RowFilter = "INACTIVE <> 1 AND VIEW = 1";
+				lstResource.DataSource = m_dvResources;
+				lstResource.DisplayMember = "RESOURCE_NAME";
+				lstResource.ValueMember = "RESOURCE_NAME";	
+				
+				m_dtGroups = dsGlobal.Tables["ResourceGroup"].Copy();
+				m_dvGroups = new DataView(m_dtGroups);
+				m_dvGroups.Sort = "RESOURCE_GROUP ASC";
+				this.cboResourceGroup.Items.Add("<Show All Resources & Clinics>");
+				foreach (DataRowView drvG in m_dvGroups)
+				{
+					this.cboResourceGroup.Items.Add(drvG["RESOURCE_GROUP"]);
+				}
+				this.cboResourceGroup.Text = "<Show All Resources & Clinics>";
+				return;
+			}
+			catch(Exception ex)
+			{
+				throw ex;
+			}
+
+		}
+
+		private void cboResourceGroup_SelectionChangeCommitted(object sender, System.EventArgs e)
+		{
+			string sGroup = cboResourceGroup.SelectedItem.ToString();
+			if (sGroup == "<Show All Resources & Clinics>")
+			{
+				LoadListBox("ALL");
+			}
+			else 
+			{
+				LoadListBox("SELECTED");
+			}			
+				
+		}
+
+		private void LoadListBox(string sGroup)
+		{
+			if (sGroup == "ALL")
+			{
+				//Load the Resources list box with ALL resources
+				m_dtResources = m_dsGlobal.Tables["Resources"];
+				m_dvResources = new DataView(m_dtResources);
+				m_dvResources = new DataView(m_dtResources);
+				m_dvResources.Sort = "RESOURCE_NAME ASC";
+				m_dvResources.RowFilter = "INACTIVE <> 1 AND VIEW = 1";
+				lstResource.DataSource = m_dvResources;
+				lstResource.DisplayMember = "RESOURCE_NAME";
+				lstResource.ValueMember = "RESOURCE_NAME";	
+			}
+			else 
+			{
+				//Load the Resources list box with active resources belonging
+				//to group sGroup
+
+				//Build Resource Group table containing *active* Resources and their Groups
+				m_dtResources = m_dsGlobal.Tables["GroupResources"];
+				//Create a view that is filterable on ResourceGroup
+				m_dvResources = new DataView(m_dtResources);
+				m_dvResources.RowFilter = "RESOURCE_GROUP = '" + this.cboResourceGroup.SelectedItem.ToString() + "'";
+				lstResource.DataSource = m_dvResources;
+				lstResource.DisplayMember = "RESOURCE_NAME";
+				lstResource.ValueMember = "RESOURCE_NAME";
+			}
+		}
+
+		private void chkOneWindow_CheckedChanged(object sender, System.EventArgs e)
+		{
+			this.txtGroupWindow.Enabled = this.chkOneWindow.Checked;
+		}
+
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSelectSchedules.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSelectSchedules.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSelectSchedules.resx	(revision 1134)
@@ -0,0 +1,274 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="pnlOkCancel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="pnlOkCancel.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="pnlOkCancel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="pnlOkCancel.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="pnlOkCancel.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="pnlOkCancel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdCancel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdCancel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdCancel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdOK.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="pnlDescription.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="pnlDescription.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="pnlDescription.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="pnlDescription.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="pnlDescription.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="pnlDescription.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="grpDescription.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="grpDescription.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="grpDescription.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="grpDescription.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="grpDescription.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="grpDescription.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lblDescription.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="lblDescription.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lblDescription.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label2.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label2.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label2.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lstResource.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="lstResource.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="lstResource.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="chkOneWindow.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="chkOneWindow.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="chkOneWindow.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label1.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label1.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cboResourceGroup.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cboResourceGroup.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cboResourceGroup.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtGroupWindow.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtGroupWindow.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="txtGroupWindow.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label3.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="label3.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="label3.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Name">
+    <value>DSelectSchedules</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSplash.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSplash.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSplash.cs	(revision 1134)
@@ -0,0 +1,201 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for DSplash.
+	/// </summary>
+	public class DSplash : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Label label1;
+		private System.Windows.Forms.LinkLabel lnkMail;
+		private System.Windows.Forms.Label lblStatus;
+        private Label lblVersion;
+        private Label label2;
+        private ProgressBar progressBar1;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public DSplash()
+		{
+			//
+			// Required for Windows Form Designer support
+			//
+			InitializeComponent();
+
+			//
+			// TODO: Add any constructor code after InitializeComponent call
+			//
+		}
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DSplash));
+            this.label1 = new System.Windows.Forms.Label();
+            this.lnkMail = new System.Windows.Forms.LinkLabel();
+            this.lblStatus = new System.Windows.Forms.Label();
+            this.lblVersion = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.progressBar1 = new System.Windows.Forms.ProgressBar();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 21.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label1.Location = new System.Drawing.Point(12, 67);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(464, 40);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Clinical Scheduling";
+            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+            // 
+            // lnkMail
+            // 
+            this.lnkMail.Location = new System.Drawing.Point(0, 0);
+            this.lnkMail.Name = "lnkMail";
+            this.lnkMail.Size = new System.Drawing.Size(100, 23);
+            this.lnkMail.TabIndex = 4;
+            // 
+            // lblStatus
+            // 
+            this.lblStatus.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+            this.lblStatus.Location = new System.Drawing.Point(80, 159);
+            this.lblStatus.Name = "lblStatus";
+            this.lblStatus.Size = new System.Drawing.Size(328, 16);
+            this.lblStatus.TabIndex = 3;
+            this.lblStatus.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+            // 
+            // lblVersion
+            // 
+            this.lblVersion.AutoSize = true;
+            this.lblVersion.Location = new System.Drawing.Point(210, 117);
+            this.lblVersion.Name = "lblVersion";
+            this.lblVersion.Size = new System.Drawing.Size(52, 13);
+            this.lblVersion.TabIndex = 5;
+            this.lblVersion.Text = "lblVersion";
+            this.lblVersion.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Font = new System.Drawing.Font("Book Antiqua", 27.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.label2.Location = new System.Drawing.Point(180, 21);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(130, 46);
+            this.label2.TabIndex = 6;
+            this.label2.Text = "VISTA";
+            // 
+            // progressBar1
+            // 
+            this.progressBar1.Location = new System.Drawing.Point(18, 207);
+            this.progressBar1.Name = "progressBar1";
+            this.progressBar1.Size = new System.Drawing.Size(458, 14);
+            this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
+            this.progressBar1.TabIndex = 7;
+            // 
+            // DSplash
+            // 
+            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+            this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
+            this.ClientSize = new System.Drawing.Size(488, 252);
+            this.ControlBox = false;
+            this.Controls.Add(this.progressBar1);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.lblVersion);
+            this.Controls.Add(this.lblStatus);
+            this.Controls.Add(this.lnkMail);
+            this.Controls.Add(this.label1);
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.Name = "DSplash";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "Clinical Scheduling";
+            this.Load += new System.EventHandler(this.DSplash_Load);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+		}
+		#endregion
+
+        public delegate void dSetStatus(string sStatus);
+        public delegate void dAny();
+        public delegate void dProgressBarSet(int number);
+		
+        public void SetStatus(string sStatus)
+		{
+            if (this.InvokeRequired == true)
+            {
+                dSetStatus d = new dSetStatus(SetStatus);
+                this.Invoke(d, new object[] { sStatus });
+                return;
+            }
+            
+			this.lblStatus.Text = sStatus;
+		}
+
+		private void DSplash_Load(object sender, System.EventArgs e)
+		{
+			this.lblVersion.Text = "Version " + Application.ProductVersion;
+		}
+
+        public void RemoteClose()
+        {
+            dAny d = new dAny(this.Close);
+            this.Invoke(d);
+        }
+
+        public void RemoteProgressBarMaxSet(int max)
+        {
+            if (this.InvokeRequired == true)
+            {
+                dProgressBarSet d = new dProgressBarSet(RemoteProgressBarMaxSet);
+                this.Invoke(d, new object[] { max });
+                return;
+            }
+
+            this.progressBar1.Maximum = max;
+        }
+
+        public void RemoteProgressBarValueSet(int val)
+        {
+            if (this.InvokeRequired == true)
+            {
+                dProgressBarSet d = new dProgressBarSet(RemoteProgressBarValueSet);
+                this.Invoke(d, new object[] { val });
+                return;
+            }
+
+            this.progressBar1.Value = val;
+        }
+
+	}
+
+
+    
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSplash.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSplash.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DSplash.resx	(revision 1134)
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAIAC
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIh3iI
+        iId4iAAAAAAAAAAACId4iIiHeIAiIiIggAAAAAAAAAAAAAgCqqqqoggAAAAAAAAAAACAKqqqqiAIAAiH
+        eId4iIiIAqqqqqIAAIAIh3iHeIiIgCqqqqogAACAAAAAAAAACAKqqqqiAAAAgAAAAAAAAIAqqqqqIAAA
+        AIAAAAAAAAgCqqqqogAAAAgAAAAAAAAAIiIiIiAAAACAAAAA////8AAAAAAAAAAIAAAAAP////8Aqqqq
+        IAAAgAAAAAD/iIj/gCqqqqIACAAAAAAA/4iI/4gCqqqqIIAAAAAAAP//////8AAAAAgAAAAAAAD/////
+        //+IiIiPAAAAAAAA/4iI/4iI/4iI/wAAAAAAAP+IiP+IiP+IiP8AAAAAAAD/////////////AAAAAAAA
+        /////////////wAAAAAAAP+IiP+IiP+IiP8AAAAAAAD/iIj/iIj/iIj/AAAAAAAA/////////////wAA
+        AAAAAP////////////8AAAAAAERERERERERERERERAAAAABEREREREREREREREQAAAAARERERERERERE
+        REREAAAAAERERERERERERERERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////
+        ///4AAAP+AAAB///gAP//wADgAAAAYAAAAH/+AAB//AAAcAAAAPAAAAHwAAAD8AAAB/AAAA/wAAAP8AA
+        AD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/////////
+        //8oAAAAEAAAACAAAAABAAQAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA
+        AACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAHh4iHgA
+        CAAAAAAAACIiAAh4eIgCqqIIAAAAACqqIAAAAAACqqIAAAAP/wAAAAAAAA+IgKqiAAAAD//4AADwAAAP
+        iPiPiPAAAA//////8AAAD4j4j4jwAAAP//////AAAERERERERAAAREREREREAAAAAAAAAAAA//8AAMAD
+        AAD/gQAAgAAAAP4AAADAAQAAwAMAAMADAADAAwAAwAMAAMADAADAAwAAwAMAAMADAADAAwAA//8AAA==
+</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/FMDateTime.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/FMDateTime.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/FMDateTime.cs	(revision 1134)
@@ -0,0 +1,1180 @@
+/*
+ * Copyright (C) 2004-2009  Medsphere Systems Corporation
+ * All rights reserved.
+ *
+ * This source code contains the intellectual property
+ * of its copyright holder(s), and is made available
+ * under a license. If you do not know the terms of
+ * the license, please stop and do not read further.
+ *
+ * Please read LICENSES for detailed information about 
+ * the license this source code file is available under. 
+ * Questions should be directed to legal@medsphere.com
+ *
+ *
+ * Licensed under AGPL v3.
+ * 
+ * 
+
+ Mods by Sam Habiel to use in Scheduling GUI.
+ */
+
+
+using System;
+using System.Globalization;
+using System.Text.RegularExpressions;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	public delegate void FMDateTimeHandler (FMDateTime time);
+	public delegate string FMDateStringHandler (string s);
+	
+	[Serializable]
+	[System.Xml.Serialization.SoapType (Namespace="http://ws.medsphere.com")]
+	public class FMDateTime : IComparable, ICloneable
+	{
+		/* public properties */
+		[System.Xml.Serialization.SoapAttribute (Namespace="http://ws.medsphere.com")]
+		public DateTime DateTime {
+			get {
+				switch (Precision) {
+				case FMDateTimePrecision.YearOnly:
+					return new DateTime (Year, 1, 1);
+				case FMDateTimePrecision.YearMonthOnly:
+					return new DateTime (Year, Month, 1);
+				case FMDateTimePrecision.DateOnly:
+					return new DateTime (Year, Month, Day);
+				default:
+					return new DateTime (Year, Month, Day, Hour, Minute, Second);
+				}
+			}
+		}
+
+		public int Year {
+			get { return year; }
+			set { year = value; }
+		}
+
+		public int Month {
+			get { return month; }
+			set { month = value; }
+		}
+
+		public int Day {
+			get { return day; }
+			set { day = value; }
+		}
+
+		public int Hour {
+			get { return hour; }
+			set {
+				if (value > 24) {
+					throw new ArgumentException ("Hour cannot be greater than 24");
+				}
+
+				hour = value % 24;
+			}
+		}
+
+		public int Minute {
+			get { return minute; }
+			set {
+				if (value > 59) {
+					throw new ArgumentException ("Minute cannot be greater than 59");
+				}
+
+				minute = value;
+			}
+		}
+
+		public int Second {
+			get { return second; }
+			set {
+				if (value > 59) {
+					throw new ArgumentException ("Second cannot be greater than 59");
+				}
+
+				second = value;
+			}
+		}
+
+		public static FMDateTime ServerNow {
+			get { return FMDateTime.Create (DateTime.Now - server_offset); }
+		}
+
+		public string RelativeFMDateString {
+			get { return Raw; }
+		}
+
+		public string ShortHandString {
+			get {
+				if (Raw != null && date_format.IsMatch (Raw.Replace (" ", ""))) {
+					return Raw;
+				}
+				return ToString ();
+			}
+		}
+
+		public FMDateTime AtZero {
+			get {
+				FMDateTime d = (FMDateTime)this.Clone ();
+				d.Precision = FMDateTimePrecision.DateAndTime;
+				d.Hour = 0;
+				d.Minute = 0;
+				d.Second = 0;
+				return d;
+			}
+		}
+
+		public FMDateTime AtMidnight {
+			get {
+				FMDateTime d = (FMDateTime)this.Clone ();
+				d.Precision = FMDateTimePrecision.DateAndTime;
+				d.Hour = 23;
+				d.Minute = 59;
+				d.Second = 59;
+				return d;
+			}
+		}
+
+		public FMDateTime DateOnly {
+			get {
+				FMDateTime d = (FMDateTime)this.Clone ();
+				if (Precision != FMDateTimePrecision.DateAndTime) {
+					return d;
+				}
+				d.Precision = FMDateTimePrecision.DateOnly;
+				d.Hour = d.Minute = d.Second = 0;
+				return d;
+			}
+		}
+
+		public string FMDateString {
+			get {
+				switch (Precision) {
+				case FMDateTimePrecision.YearOnly:
+					return String.Format ("{0:000}", year - 1700);
+				case FMDateTimePrecision.YearMonthOnly:
+					return String.Format ("{0:000}{1:00}", year - 1700, month);
+				case FMDateTimePrecision.DateOnly:
+					return String.Format ("{0:000}{1:00}{2:00}", year - 1700, month, day);
+				case FMDateTimePrecision.DateAndTime:
+				default:
+					if (second > 0) {
+						return String.Format ("{0:000}{1:00}{2:00}.{3:00}{4:00}{5:00}",
+								      year - 1700, month, day, hour, minute, second);
+					} else {
+						return String.Format ("{0:000}{1:00}{2:00}.{3:00}{4:00}",
+								      year - 1700, month, day, hour, minute);
+					}
+				}
+			}
+		}
+
+		/* public fields */
+		public FMDateTimePrecision Precision;
+
+		[NonSerialized]
+		public static FMDateStringHandler ValidationMethod;
+
+		public static FMDateTime MinValue; // 1/1/1700
+		public static FMDateTime MaxValue; // 12/31/2699 12:59 PM
+
+		/* public methods */
+		static FMDateTime ()
+		{
+			// This is the equivalent of the FMDateTime string '0000101'
+			// We do this manually to avoid parsing overhead here.
+			MinValue = new FMDateTime (); // 1/1/1700
+			MinValue.Hour = MinValue.Minute = MinValue.Second = 0;
+			MinValue.Day = MinValue.Month = 1;
+			MinValue.Year = 1700;
+			MinValue.Precision = FMDateTimePrecision.DateOnly;
+
+			// This is the equivalent of the FMDateTime string '9991231.235959'
+			// We do this manually to avoid parsing overhead here.
+			MaxValue = new FMDateTime (); // 12/31/2699 12:59 PM
+			MaxValue.Hour = 23;
+			MaxValue.Minute = 59;
+			MaxValue.Second = 59;
+			MaxValue.Day = 31;
+			MaxValue.Month = 12;
+			MaxValue.Year = 2699;
+			MaxValue.Precision = FMDateTimePrecision.DateAndTime;
+		}
+
+		public FMDateTime ()
+		{
+		}
+
+        public FMDateTime(DateTime d)
+            : this(d, FMDateTimePrecision.DateAndTime)
+        {
+        }
+
+        public FMDateTime(DateTime d, FMDateTimePrecision precision)
+        {
+            if (d > MaxValue.DateTime || d < MinValue.DateTime)
+                return;
+
+            this.Precision = precision;
+            this.Year = d.Year;
+            this.Month = d.Month;
+            this.Day = d.Day;
+            this.Hour = d.Hour;
+            this.Minute = d.Minute;
+            this.Second = d.Second;
+        }
+		
+		public static FMDateTime Create (DateTime d, FMDateTimePrecision precision)
+		{
+			if (d > MaxValue.DateTime || d < MinValue.DateTime) {
+				return null;
+			}
+			
+			FMDateTime f = new FMDateTime ();
+			f.Precision = precision;
+			f.Year = d.Year;
+			f.Month = d.Month;
+			f.Day = d.Day;
+			f.Hour = d.Hour;
+			f.Minute = d.Minute;
+			f.Second = d.Second;
+
+			return f;
+		}
+
+		public static FMDateTime Create (DateTime d)
+		{
+			return Create (d, FMDateTimePrecision.DateAndTime);
+		}
+
+		public static FMDateTime Parse (string str)
+		{
+			return Parse (str, FMDateTime.ValidationMethod);
+		}
+
+		public static FMDateTime Parse (string str,
+						FMDateStringHandler validation_method)
+		{
+			if (validation_method == null) {
+				throw new ArgumentNullException ("You must pass in a valid validation_method");
+			}
+
+			if (str == null) {
+				return null;
+			}
+
+			FMDateTime date = null;
+
+			str = str.Trim ();
+			if (str == "0" || str == String.Empty) {
+				return null;
+			}
+
+			if (str.IndexOf ("@") != -1) {
+				date = new FMDateTime ();
+
+				// string has a date and time part
+				string[] tokens = str.Split (new char[] {'@'}, 2);
+				if (ParseDatePart (tokens[0], ref date)
+ 				    || ParseUsingDateTime (tokens[0], ref date)
+				    || (validation_method != null
+				        && ParseInternalFormat (validation_method (tokens[0]), ref date))) {
+					// Its been decided that if you have an
+					// invalid time part, that the entire
+					// string is invalid
+					if (!ParseTimePart (tokens[1], true, ref date)) {
+						return null;
+					}
+
+					date.Raw = str;
+					return date;
+				} else {
+					// Account for @0600
+					date = FMDateTime.ServerNow;
+					if (!ParseTimePart (tokens[1], true, ref date)) {
+						return null;
+					}
+					return date;
+				}
+			}
+			
+			if (ParseDatePart (str, ref date)) {
+				date.Raw = str;
+				return date;
+			}
+
+			if (ParseTimePart (str, false, ref date)) {
+				FMDateTime now = ServerNow;
+				date.Year = now.Year;
+				date.Month = now.Month;
+				date.Day = now.Day;
+				return date;
+			}
+
+			if (ParseUsingDateTime (str, ref date)) {
+				return date;
+			}
+
+			if (ParseInternalFormat (str, ref date)) {
+				return date;
+			}
+
+			if (validation_method != null) {
+				if (ParseInternalFormat (validation_method (str), ref date)) {
+					return date;
+				}
+				return null;
+			}
+
+			if (date == null) {
+				Console.WriteLine ("WARNING: FMDateTime failed parsing '{0}'", str);
+			}
+
+			return date;
+		}
+
+		public static FMDateTime Parse (string str, FMDateTimePrecision precision)
+		{
+			FMDateTime date = FMDateTime.Parse (str);
+			if (date != null) {
+				date.Precision = precision;
+			}
+
+			return date;
+		}
+
+		public void PopulateFrom12HrTime (int hour, int minute, int second, bool is_pm)
+		{
+			if (hour < 12 && is_pm) {
+				hour += 12;
+			} else if (hour == 12 && !is_pm) {
+				hour = 0;
+			}
+
+			Hour = hour;
+			Minute = minute;
+			Second = second;
+		}
+
+		public bool IsFutureDate
+		{
+			get {
+				return (CompareTo (Precision, FMDateTime.ServerNow, FMDateTime.ServerNow.Precision) > 0);
+			}
+		}
+
+		public bool IsPastDate
+		{
+			get {
+				return (CompareTo (Precision, FMDateTime.ServerNow, FMDateTime.ServerNow.Precision) < 0);
+			}
+		}
+
+		public static void UpdateServerNow (FMDateTime server_now)
+		{
+			if (server_now != null) {
+				server_offset = (DateTime.Now - server_now.DateTime);
+			}
+		}
+
+		public override string ToString ()
+		{
+			switch (Precision) {
+			case FMDateTimePrecision.YearOnly:
+				return DateTime.ToString ("yyyy");
+			case FMDateTimePrecision.YearMonthOnly:
+				return DateTime.ToString ("Y");
+			case FMDateTimePrecision.DateOnly:
+				return DateTime.ToString ("d");
+			default:
+				return DateTime.ToString ("G");
+			}
+		}
+
+		public static string ToString (FMDateTime date)
+		{
+			if (date != null) {
+				return date.ToString ();
+			}
+			return String.Empty;
+		}
+
+		public string ToString (string format)
+		{
+			return DateTime.ToString (format);
+		}
+
+		public static string ToString (FMDateTime date, string format)
+		{
+			if (date != null) {
+				return date.ToString (format);
+			}
+			return String.Empty;
+		}
+
+		public string ToDateString ()
+		{
+			return DateTime.ToString ("d");
+		}
+
+		public static string ToDateString (FMDateTime date)
+		{
+			if (date != null) {
+				return date.ToDateString ();
+			}
+			return String.Empty;
+		}
+
+		public string ToTimeString ()
+		{
+			return DateTime.ToString ("t");
+		}
+
+		public static string ToTimeString (FMDateTime date)
+		{
+			if (date != null) {
+				return date.ToTimeString ();
+			}
+			return String.Empty;
+		}
+
+		public static string ToFMDateString (FMDateTime date)
+		{
+			if (date != null) {
+				return date.FMDateString;
+			}
+			return String.Empty;
+		}
+				
+		/**
+		 * Compares this FMDateTime instance with given FMDateTimePrecision this_p to dt
+		 * using the given FMDateTimePrecision p.
+		 */ 
+		public int CompareTo (FMDateTimePrecision this_p, FMDateTime dt, FMDateTimePrecision dt_p)
+		{
+			int r;
+			FMDateTimePrecision save_this_p = Precision;
+			FMDateTimePrecision save_dt_p = dt.Precision;
+			Precision = this_p;
+			dt.Precision = dt_p;
+			r = DateTime.CompareTo (dt.DateTime);
+			Precision = save_this_p;
+			dt.Precision = save_dt_p;
+			return r;
+		}
+
+		/**
+		 * Implementation of IComparable interface.
+		 */
+		public int CompareTo (object o)
+		{
+			if (o == null) {
+				return 1;
+			} else if (o is FMDateTime) {
+				FMDateTime f = (FMDateTime)o;
+				int r = DateTime.CompareTo (f.DateTime);
+				if (r == 0) {
+					// special cases of DateTime comparison:
+					//     1900 and January,1900 and 01/01/1900 are all 
+					//         represented as 01/01/1900
+					//     TODAY@0 and TODAY are both represented as TODAY@0
+					// these are the cases where precision has the last word
+					if (Precision < f.Precision) {
+						r = -1;
+					} else if (Precision > f.Precision) {
+						r = 1;
+					}
+				}
+				return r;
+			} else if (o is DateTime) {
+				DateTime d = (DateTime)o;
+				return DateTime.CompareTo (d);
+			}
+			
+			throw new ArgumentException ("Value is not a DateTime or FMDateTime.");
+		}
+
+		public static int Compare (FMDateTime a, FMDateTime b)
+		{
+			if (a == null && b == null) {
+				return 0;
+			} else if (a != null && b != null) {
+				return a.CompareTo (b);
+			/* We sort the non-null item before the null one for the mixed case */
+			} else if (a == null) {
+				return -1;
+			} else if (b == null) {
+				return 1;
+			}
+
+			// This code path really has no way of being hit.
+			return 0;
+		}
+
+		public override bool Equals (object o)
+		{
+			if (o == null) {
+				return false;
+			} else if (o is FMDateTime) {
+				FMDateTime f = (FMDateTime)o;
+
+				if (f.Precision != Precision) {
+					return false;
+				}
+
+				switch (Precision) {
+				case FMDateTimePrecision.YearOnly:
+					return Year == f.Year;
+				case FMDateTimePrecision.YearMonthOnly:
+					return Year == f.Year && Month == f.Month;
+				case FMDateTimePrecision.DateOnly:
+					return Year == f.Year && Month == f.Month && Day == f.Day;
+				case FMDateTimePrecision.DateAndTime:
+				default:
+					return Year == f.Year && Month == f.Month && Day == f.Day
+					       && Hour == f.Hour && Minute == f.Minute && Second == f.Second;
+				}
+			}
+
+			throw new ArgumentException ("Value is not a FMDateTime.");
+		}
+
+		public override int GetHashCode ()
+		{
+			return (int)Precision + year + month + day + hour + minute + second;
+		}
+
+		/**
+		 * This gets a hash code based upon the FMDateTime precision, so that
+		 * an object can be stored based on DateOnly, for example, and if you
+		 * try to look it up later using a different FMDateTime object that
+		 * has the same date, but may have different time.  Seconds are
+		 * intentionally never factored into this hash code, even for DateAndTime
+		 * cases.  If you want to factor in seconds as  well, just use GetHashCode().
+		 *
+		 * @return   An integer hash code.
+		 */
+		public int GetPrecisionAwareHashCode ()
+		{
+			int hash_code = (int)Precision;
+
+			switch (Precision)
+			{
+			case FMDateTimePrecision.YearOnly:
+				hash_code += year;
+				break;
+			case FMDateTimePrecision.YearMonthOnly:
+				hash_code += year;
+				hash_code += month;
+				break;
+			case FMDateTimePrecision.DateOnly:
+				hash_code += year;
+				hash_code += month;
+				hash_code += day;
+				break;
+			case FMDateTimePrecision.DateAndTime:
+			default:
+				hash_code += year;
+				hash_code += month;
+				hash_code += day;
+				hash_code += hour;
+				hash_code += minute;
+				break;
+			}
+
+			return hash_code;
+		}
+
+		public object Clone ()
+		{
+			FMDateTime d = new FMDateTime ();
+			d.Precision = Precision;
+			d.Year = year;
+			d.Month = month;
+			d.Day = day;
+			d.Hour = hour;
+			d.Minute = minute;
+			d.Second = second;
+			return d;
+		}
+	
+		public static bool operator == (FMDateTime a, FMDateTime b)
+		{
+			object obj_a = (object)a;
+			object obj_b = (object)b;
+
+			if (obj_a == null && obj_b == null) {
+				return true;
+			} else if (obj_a != null && obj_b != null) {
+				return a.Equals (b);
+			} else {
+				return false;
+			}
+		}
+
+		public static bool operator != (FMDateTime a, FMDateTime b)
+		{
+			return !(a == b);
+		}
+
+		public static bool operator > (FMDateTime a, FMDateTime b)
+		{
+			if (a == null) {
+				throw new ArgumentException ("Left hand argument to comparison cannot be null.");
+			}
+
+			return (a.CompareTo (b) > 0);
+		}
+
+		public static bool operator >= (FMDateTime a, FMDateTime b)
+		{
+			if (a == null) {
+				throw new ArgumentException ("Left hand argument to comparison cannot be null.");
+			}
+
+			return (a.CompareTo (b) >= 0);
+		}
+
+		public static bool operator < (FMDateTime a, FMDateTime b)
+		{
+			if (a == null) {
+				throw new ArgumentException ("Left hand argument to comparison cannot be null.");
+			}
+
+			return (a.CompareTo (b) < 0);
+		}
+
+		public static bool operator <= (FMDateTime a, FMDateTime b)
+		{
+			if (a == null) {
+				throw new ArgumentException ("Left hand argument to comparison cannot be null.");
+			}
+
+			return (a.CompareTo (b) <= 0);
+		}
+
+		public static implicit operator FMDateTime (DateTime d)
+		{
+			return FMDateTime.Create (d);
+		}
+
+		/* protected properties */
+		protected string Raw;
+		
+		/* private properties */
+		private static Calendar CurrentCalendar {
+			get { return CultureInfo.CurrentCulture.Calendar; }
+		}
+
+		/* private fields */
+		private int year, month, day, hour, minute, second;
+
+		// We do this here so we can lazy load the compiled regexes.
+		private static Regex internal_format {
+			get {
+				if (priv_internal_format == null) {
+					priv_internal_format = new Regex (@"^(\d{3})(\d{2})?(\d{2})?(\.(\d{1,2})?(\d{1,2})?(\d{1,2})?)?$", RegexOptions.IgnoreCase | RegexOptions.Compiled);
+				}
+				
+				return priv_internal_format;
+			}
+		}
+		private static Regex priv_internal_format;
+
+		private static Regex date_format {
+			get {
+				if (priv_date_format == null) {
+					priv_date_format = new Regex (@"^(t(oday)?|n(ow)?)(([+-])(\d+)(w)?)?$", RegexOptions.IgnoreCase | RegexOptions.Compiled);
+				}
+				
+				return priv_date_format;
+			}
+		}
+		private static Regex priv_date_format;
+
+		private static Regex time_format {
+			get {
+				if (priv_time_format == null) {
+					priv_time_format = new Regex (@"^(\d{1,2})(:(\d{2}))?(:(\d{2}))?(\s*)(AM|PM)?$", RegexOptions.IgnoreCase | RegexOptions.Compiled);
+				}
+				
+				return priv_time_format;
+			}
+		}
+		private static Regex priv_time_format;
+
+		private static TimeSpan server_offset = new TimeSpan ();
+
+		/* private methods */
+		private static bool ParseDatePart (string str, ref FMDateTime date)
+		{
+			FMDateTime orig_date = date;
+		
+			string clean = str.Replace (" ", "");
+
+			// see if it matches (t|today|now) +/- some number
+			if (!date_format.IsMatch (clean)) {
+				return false;
+			}
+
+			Match m = date_format.Match (clean);
+			if (m != null) {
+				if (date == null) {
+					date = new FMDateTime ();
+				}
+
+				// be safe about dates like T-99999999
+				try {
+					int modifier = 0;
+					if (m.Groups[5].Value != String.Empty) {
+						int sign_bit = 1;
+						if (m.Groups[5].Value == "-") {
+							sign_bit = -1;
+						}
+						
+						// Convert will bomb if the modifier
+						// won't fit into an int (it's invalid
+						// anyway)
+						modifier = sign_bit * Convert.ToInt32 (m.Groups[6].Value);
+					}
+
+					DateTime dt = ServerNow.DateTime;
+					if (m.Groups[7].Value.ToLower () == "w") {
+						dt = CurrentCalendar.AddWeeks (dt, modifier);
+					} else {
+						dt = CurrentCalendar.AddDays (dt, modifier);
+					}
+
+					date.Day = dt.Day;
+					date.Month = dt.Month;
+					date.Year = dt.Year;
+
+					if (m.Groups[1].Value.ToLower ().StartsWith ("n")) {
+						date.Precision = FMDateTimePrecision.DateAndTime;
+						date.Hour = dt.Hour;
+						date.Minute = dt.Minute;
+						date.Second = dt.Second;
+					} else {
+						date.Precision = FMDateTimePrecision.DateOnly;
+						date.Hour = date.Minute = date.Second = 0;
+					}
+				} catch {
+					date = orig_date;
+					return false;
+				}
+
+				return true;
+			}
+
+			date = orig_date;
+			return false;
+		}
+
+		private static bool ParseTimePart (string str, bool try_int_parse, ref FMDateTime date)
+		{
+            int time;
+			str = str.ToUpper ();
+			if (str == "NOON") {
+				if (date == null) {
+					date = new FMDateTime ();
+				}
+			
+				date.Hour = 12;
+				date.Minute = date.Second = 0;
+				
+				date.Precision = FMDateTimePrecision.DateAndTime;
+
+				return true;
+			} else if (str == "MID" || str == "MIDNIGHT") {
+				if (date == null) {
+					date = new FMDateTime ();
+				}
+			
+				date.Hour = 23;
+				date.Minute = 59;
+				date.Second = 59;
+
+				date.Precision = FMDateTimePrecision.DateAndTime;
+
+				return true;
+			} else if (time_format.IsMatch (str)) {
+				Match m = time_format.Match (str);
+				if (m == null) {
+					return false;
+				}
+
+				int hour, minute, second;
+                int.TryParse(m.Groups[1].Value, out hour);
+				int.TryParse(m.Groups[3].Value, out minute);
+				int.TryParse(m.Groups[5].Value, out second);
+
+				if (m.Groups[7].Value == "PM") {
+					hour += 12;
+				}
+
+				if (hour == 24 && minute == 0 && second == 0) {
+					hour = 23;
+					minute = second = 59;
+				}
+
+				if (!ValidateTime (hour, minute, second)) {
+					return false;
+				}
+
+				if (date == null) {
+					date = new FMDateTime ();
+				}
+
+				date.Hour = hour;
+				date.Minute = minute;
+				date.Second = second;
+				date.Precision = FMDateTimePrecision.DateAndTime;
+
+				return true;
+			} else if (try_int_parse && int.TryParse(str, out time)) {
+
+				int hour, minute, second;
+				if (time <= 2359) {
+					hour = time / 100;
+					minute = time - (hour * 100);
+					second = 0;
+				} else if (time <= 235959) {
+					hour = time / 10000;
+					minute = (time - (hour * 10000)) / 100;
+					second = time - ((time / 100) * 100);
+				} else {
+					return false;
+				}
+				
+				if (hour == 24 && minute == 0 && second == 0) {
+					hour = 23;
+					minute = second = 59;
+				}
+
+				if (!ValidateTime (hour, minute, second)) {
+					return false;
+				}
+
+				if (date == null) {
+					date = new FMDateTime ();
+				}
+				
+				date.Hour = hour;
+				date.Minute = minute;
+				date.Second = second;
+				date.Precision = FMDateTimePrecision.DateAndTime;
+
+				return true;
+			}
+			
+			return false;
+		}
+
+		private static bool ParseUsingDateTime (string str, ref FMDateTime date)
+		{
+			// we need to use DateTime.Parse to allow
+			// roundtripping of our ToString () methods
+
+			// LAMESPEC: There isn't any way to find out whether a
+			// DateTime contains a time part, or just a date part
+			// after calling Parse, so we have to specifically call
+			// ParseExact on a few known formats
+			try {
+				string[] formats = new string[] {
+					"yyyy"
+				};
+				
+				DateTime d = DateTime.ParseExact (str, formats, null,
+				                                  DateTimeStyles.AllowWhiteSpaces);
+				if (date == null) {
+					date = new FMDateTime ();
+				}
+				                                  
+				date.Year = d.Year;
+				date.Precision = FMDateTimePrecision.YearOnly;
+				return true;
+			} catch (FormatException) {
+			}
+
+			try {
+				string[] formats = new string[] {
+					"Y"
+				};
+				
+				DateTime d = DateTime.ParseExact (str, formats, null,
+				                                  DateTimeStyles.AllowWhiteSpaces);
+				if (date == null) {
+					date = new FMDateTime ();
+				}
+				
+				date.Year = d.Year;
+				date.Month = d.Month;
+				date.Precision = FMDateTimePrecision.YearMonthOnly;
+				return true;
+			} catch (FormatException) {
+			}
+
+			try {
+				string[] formats = new string[] {
+					"d", "MM/dd/yy"
+				};
+				
+				DateTime d = DateTime.ParseExact (str, formats, null,
+				                                  DateTimeStyles.AllowWhiteSpaces);
+				if (date == null) {
+					date = new FMDateTime ();
+				}
+				
+				date.Year = d.Year;
+				date.Month = d.Month;
+				date.Day = d.Day;
+				date.Precision = FMDateTimePrecision.DateOnly;
+				return true;
+			} catch (FormatException) {
+			}
+
+			try {
+				string[] formats = new string[] {
+					"g", "G", "MM/dd/yy hh:mm tt",
+					"MM/dd/yy h:mm tt"
+				};
+				
+				DateTime d = DateTime.ParseExact (str, formats, null,
+				                                  DateTimeStyles.AllowWhiteSpaces);
+				if (date == null) {
+					date = new FMDateTime ();
+				}
+				
+				date.Year = d.Year;
+				date.Month = d.Month;
+				date.Day = d.Day;
+
+				date.Hour = d.Hour;
+				date.Minute = d.Minute;
+				date.Second = d.Second;
+
+				date.Precision = FMDateTimePrecision.DateAndTime;
+				return true;
+			} catch (FormatException) {
+			}
+		
+			/* XXX: Disabiling this for now, since it sucks incredibly
+			// first try parsing date & time
+			try {
+				string[] date_time_formats = new string[] {
+					"dddd*, MMMM* dd, yyyy HH*:mm* tt*", "f",
+					"dddd*, MMMM* dd, yyyy HH*:mm*:ss* tt*", "F",
+					"MM/dd/yyyy HH*:mm* tt*", "g",
+					"MM/dd/yyyy HH*:mm*:ss* tt*", "G",
+					"dddd*, MMMM* dd, yyyy HH*:mm*:ss* tt*", "U"
+				};
+
+				DateTime d = DateTime.ParseExact (str, date_time_formats, null,
+				                                  DateTimeStyles.AllowWhiteSpaces);
+				date.Year = d.Year;
+				date.Month = d.Month;
+				date.Day = d.Day;
+				date.Hour = d.Hour;
+				date.Minute = d.Minute;
+				date.Second = d.Second;
+				date.Precision = FMDateTimePrecision.DateAndTime;
+				return true;
+			} catch { }
+			
+			// fall back on just parsing a date
+			try {
+				string[] date_formats = new string[] {
+					"d", "D", "m", "M", "y", "Y"
+				};
+
+				DateTime d = DateTime.ParseExact (str, date_formats, null,
+				                                  DateTimeStyles.AllowWhiteSpaces);
+				date.Year = d.Year;
+				date.Month = d.Month;
+				date.Day = d.Day;
+				date.Precision = FMDateTimePrecision.DateOnly;
+				return true;
+			} catch { }
+			
+			// if nothing else, try a couple of time formats
+			try {
+				string[] time_formats = new string[] {
+					"HH*:mm* tt*", "t",
+					"HH*:mm*:ss* tt*", "T"
+				};
+
+				DateTime d = DateTime.ParseExact (str, time_formats, null,
+				                                  DateTimeStyles.AllowWhiteSpaces);
+				date = FMDateTime.ServerNow;
+				date.Hour = d.Hour;
+				date.Minute = d.Minute;
+				date.Second = d.Second;
+				date.Precision = FMDateTimePrecision.DateAndTime;
+				return true;
+			} catch { }
+			*/
+
+			return false;
+		}
+
+		private static bool ParseInternalFormat (string str, ref FMDateTime date)
+		{
+			FMDateTime orig_date = date;
+		
+			if (internal_format.IsMatch (str)) {
+				Match m = internal_format.Match (str);
+				if (m != null && m.Groups.Count == 8) {
+					int year, month, day, hour, minute, second;
+
+					int.TryParse(m.Groups[1].Value, out year);
+					year += 1700;
+
+					int.TryParse(m.Groups[2].Value, out month);
+					int.TryParse(m.Groups[3].Value, out day);
+					int.TryParse(m.Groups[5].Value, out hour);
+                    int.TryParse(m.Groups[6].Value, out minute);
+                    int.TryParse(m.Groups[7].Value, out second);
+
+					// 1 digit hours apparently have just
+					// had the trailing 0 dropped.  Go figure.
+					if (m.Groups[5].Value.Length == 1) {
+						hour *= 10;
+					}
+
+					// 1 digit minutes do too
+					if (m.Groups[6].Value.Length == 1) {
+						minute *= 10;
+					}
+
+					// 1 digit seconds aren't to be left out
+					if (m.Groups[7].Value.Length == 1) {
+						second *= 10;
+					}
+
+					if (!ValidateYear (year)) {
+						return false;
+					}
+
+					if (date == null) {
+						date = new FMDateTime ();
+					}
+					
+					date.Year = year;
+
+					date.Precision = FMDateTimePrecision.YearOnly;
+					if (m.Groups[5].Value != String.Empty
+					    && month > 0 && day > 0 && hour > 0) {
+						if (!ValidateDate (year, month, day)
+						    || !ValidateTime (hour, minute, second)) {
+							date = orig_date;
+							return false;
+						}
+
+						date.Month = month;
+						date.Day = day;
+						date.Hour = hour;
+						date.Minute = minute;
+						date.Second = second;
+
+						date.Precision = FMDateTimePrecision.DateAndTime;
+					} else if (m.Groups[3].Value != String.Empty
+					           && month > 0 && day > 0) {
+						if (!ValidateDate (year, month, day)) {
+							date = orig_date;
+							return false;
+						}
+
+						date.Month = month;
+						date.Day = day;
+
+						date.Precision = FMDateTimePrecision.DateOnly;
+					} else if (m.Groups[2].Value != String.Empty
+					           && month > 0) {
+						if (!ValidateYearMonth (year, month)) {
+							date = orig_date;
+							return false;
+						}
+
+						date.Month = month;
+
+						date.Precision = FMDateTimePrecision.YearMonthOnly;
+					}
+
+					return true;
+				}
+			}
+
+			return false;
+		}
+
+		private static bool ValidateYear (int year)
+		{
+			// Sadly, we can't use MaxValue and MinValue due to
+			// this function being used in the
+			// parsing and initialization of those values
+			if (year < 1700 || year > 2699) {
+				return false;
+			}
+			
+			return true;
+		}
+
+		private static bool ValidateYearMonth (int year, int month)
+		{
+			if (!ValidateYear (year)) {
+				return false;
+			}
+
+			int num_months = CurrentCalendar.GetMonthsInYear (year);
+			if (month < 1 || month > num_months) {
+				return false;
+			}
+			
+			return true;
+		}
+
+		private static bool ValidateDate (int year, int month, int day)
+		{
+			if (!ValidateYearMonth (year, month)) {
+				return false;
+			}
+
+			int num_days = CurrentCalendar.GetDaysInMonth (year, month);
+			if (day < 1 || day > num_days) {
+				return false;
+			}
+
+			return true;
+		}
+
+		private static bool ValidateTime (int hour, int minute, int second)
+		{
+			if (hour < 0 || hour > 24) {
+				return false;
+			}
+
+			if (minute < 0 || minute > 59) {
+				return false;
+			}
+
+			if (second < 0 || second > 59) {
+				return false;
+			}
+
+			if (hour == 24 && (minute > 0 || second > 0)) {
+				return false;
+			}
+
+			return true;
+		}
+	}
+
+	public enum FMDateTimePrecision {
+		YearOnly,
+		YearMonthOnly,
+		DateOnly,
+		DateAndTime
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/LoadingSplash.Designer.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/LoadingSplash.Designer.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/LoadingSplash.Designer.cs	(revision 1134)
@@ -0,0 +1,70 @@
+﻿namespace IndianHealthService.ClinicalScheduling
+{
+    partial class LoadingSplash
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.lblLoading = new System.Windows.Forms.Label();
+            this.SuspendLayout();
+            // 
+            // lblLoading
+            // 
+            this.lblLoading.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.lblLoading.AutoSize = true;
+            this.lblLoading.Font = new System.Drawing.Font("Tahoma", 48F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.lblLoading.Location = new System.Drawing.Point(138, 108);
+            this.lblLoading.Name = "lblLoading";
+            this.lblLoading.Size = new System.Drawing.Size(255, 77);
+            this.lblLoading.TabIndex = 0;
+            this.lblLoading.Text = "Loading";
+            this.lblLoading.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+            // 
+            // LoadingSplash
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.BackColor = System.Drawing.SystemColors.ControlLightLight;
+            this.ClientSize = new System.Drawing.Size(537, 315);
+            this.Controls.Add(this.lblLoading);
+            this.ForeColor = System.Drawing.SystemColors.ControlLight;
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+            this.Name = "LoadingSplash";
+            this.ShowIcon = false;
+            this.ShowInTaskbar = false;
+            this.Text = "Form1";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label lblLoading;
+    }
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/LoadingSplash.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/LoadingSplash.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/LoadingSplash.cs	(revision 1134)
@@ -0,0 +1,36 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+    public partial class LoadingSplash : Form
+    {
+        public LoadingSplash()
+        {
+            InitializeComponent();
+        }
+
+        //Generic Delegate for fancy remote invokations
+        public delegate void dAny();
+
+        /// <summary>
+        /// Close a form from another thread
+        /// </summary>
+        public void RemoteClose()
+        {
+            if (InvokeRequired == true)
+            {
+                dAny d = new dAny(this.Close);
+                this.Invoke(d);
+            }
+            else
+                this.Close();
+        }
+    }
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/LoadingSplash.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/LoadingSplash.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/LoadingSplash.resx	(revision 1134)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/Options.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/Options.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/Options.cs	(revision 1134)
@@ -0,0 +1,1148 @@
+//
+// Options.cs
+//
+// Authors:
+//  Jonathan Pryor <jpryor@novell.com>
+//  Federico Di Gregorio <fog@initd.org>
+//
+// Copyright (C) 2008 Novell (http://www.novell.com)
+// Copyright (C) 2009 Federico Di Gregorio.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+// Compile With:
+//   gmcs -debug+ -r:System.Core Options.cs -o:NDesk.Options.dll
+//   gmcs -debug+ -d:LINQ -r:System.Core Options.cs -o:NDesk.Options.dll
+//
+// The LINQ version just changes the implementation of
+// OptionSet.Parse(IEnumerable<string>), and confers no semantic changes.
+
+//
+// A Getopt::Long-inspired option parsing library for C#.
+//
+// NDesk.Options.OptionSet is built upon a key/value table, where the
+// key is a option format string and the value is a delegate that is 
+// invoked when the format string is matched.
+//
+// Option format strings:
+//  Regex-like BNF Grammar: 
+//    name: .+
+//    type: [=:]
+//    sep: ( [^{}]+ | '{' .+ '}' )?
+//    aliases: ( name type sep ) ( '|' name type sep )*
+// 
+// Each '|'-delimited name is an alias for the associated action.  If the
+// format string ends in a '=', it has a required value.  If the format
+// string ends in a ':', it has an optional value.  If neither '=' or ':'
+// is present, no value is supported.  `=' or `:' need only be defined on one
+// alias, but if they are provided on more than one they must be consistent.
+//
+// Each alias portion may also end with a "key/value separator", which is used
+// to split option values if the option accepts > 1 value.  If not specified,
+// it defaults to '=' and ':'.  If specified, it can be any character except
+// '{' and '}' OR the *string* between '{' and '}'.  If no separator should be
+// used (i.e. the separate values should be distinct arguments), then "{}"
+// should be used as the separator.
+//
+// Options are extracted either from the current option by looking for
+// the option name followed by an '=' or ':', or is taken from the
+// following option IFF:
+//  - The current option does not contain a '=' or a ':'
+//  - The current option requires a value (i.e. not a Option type of ':')
+//
+// The `name' used in the option format string does NOT include any leading
+// option indicator, such as '-', '--', or '/'.  All three of these are
+// permitted/required on any named option.
+//
+// Option bundling is permitted so long as:
+//   - '-' is used to start the option group
+//   - all of the bundled options are a single character
+//   - at most one of the bundled options accepts a value, and the value
+//     provided starts from the next character to the end of the string.
+//
+// This allows specifying '-a -b -c' as '-abc', and specifying '-D name=value'
+// as '-Dname=value'.
+//
+// Option processing is disabled by specifying "--".  All options after "--"
+// are returned by OptionSet.Parse() unchanged and unprocessed.
+//
+// Unprocessed options are returned from OptionSet.Parse().
+//
+// Examples:
+//  int verbose = 0;
+//  OptionSet p = new OptionSet ()
+//    .Add ("v", v => ++verbose)
+//    .Add ("name=|value=", v => Console.WriteLine (v));
+//  p.Parse (new string[]{"-v", "--v", "/v", "-name=A", "/name", "B", "extra"});
+//
+// The above would parse the argument string array, and would invoke the
+// lambda expression three times, setting `verbose' to 3 when complete.  
+// It would also print out "A" and "B" to standard output.
+// The returned array would contain the string "extra".
+//
+// C# 3.0 collection initializers are supported and encouraged:
+//  var p = new OptionSet () {
+//    { "h|?|help", v => ShowHelp () },
+//  };
+//
+// System.ComponentModel.TypeConverter is also supported, allowing the use of
+// custom data types in the callback type; TypeConverter.ConvertFromString()
+// is used to convert the value option to an instance of the specified
+// type:
+//
+//  var p = new OptionSet () {
+//    { "foo=", (Foo f) => Console.WriteLine (f.ToString ()) },
+//  };
+//
+// Random other tidbits:
+//  - Boolean options (those w/o '=' or ':' in the option format string)
+//    are explicitly enabled if they are followed with '+', and explicitly
+//    disabled if they are followed with '-':
+//      string a = null;
+//      var p = new OptionSet () {
+//        { "a", s => a = s },
+//      };
+//      p.Parse (new string[]{"-a"});   // sets v != null
+//      p.Parse (new string[]{"-a+"});  // sets v != null
+//      p.Parse (new string[]{"-a-"});  // sets v == null
+//
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Globalization;
+using System.IO;
+using System.Runtime.Serialization;
+using System.Security.Permissions;
+using System.Text;
+using System.Text.RegularExpressions;
+
+#if LINQ
+using System.Linq;
+#endif
+
+#if TEST
+using NDesk.Options;
+#endif
+
+#if NDESK_OPTIONS
+namespace NDesk.Options
+#else
+namespace Mono.Options
+#endif
+{
+	static class StringCoda {
+
+		public static IEnumerable<string> WrappedLines (string self, params int[] widths)
+		{
+			IEnumerable<int> w = widths;
+			return WrappedLines (self, w);
+		}
+
+		public static IEnumerable<string> WrappedLines (string self, IEnumerable<int> widths)
+		{
+			if (widths == null)
+				throw new ArgumentNullException ("widths");
+			return CreateWrappedLinesIterator (self, widths);
+		}
+
+		private static IEnumerable<string> CreateWrappedLinesIterator (string self, IEnumerable<int> widths)
+		{
+			if (string.IsNullOrEmpty (self)) {
+				yield return string.Empty;
+				yield break;
+			}
+			using (var ewidths = widths.GetEnumerator ()) {
+				bool? hw = null;
+				int width = GetNextWidth (ewidths, int.MaxValue, ref hw);
+				int start = 0, end;
+				do {
+					end = GetLineEnd (start, width, self);
+					char c = self [end-1];
+					if (char.IsWhiteSpace (c))
+						--end;
+					bool needContinuation = end != self.Length && !IsEolChar (c);
+					string continuation = "";
+					if (needContinuation) {
+						--end;
+						continuation = "-";
+					}
+					string line = self.Substring (start, end - start) + continuation;
+					yield return line;
+					start = end;
+					if (char.IsWhiteSpace (c))
+						++start;
+					width = GetNextWidth (ewidths, width, ref hw);
+				} while (end < self.Length);
+			}
+		}
+
+		private static int GetNextWidth (IEnumerator<int> ewidths, int curWidth, ref bool? eValid)
+		{
+			if (!eValid.HasValue || (eValid.HasValue && eValid.Value)) {
+				curWidth = (eValid = ewidths.MoveNext ()).Value ? ewidths.Current : curWidth;
+				// '.' is any character, - is for a continuation
+				const string minWidth = ".-";
+				if (curWidth < minWidth.Length)
+					throw new ArgumentOutOfRangeException ("widths",
+							string.Format ("Element must be >= {0}, was {1}.", minWidth.Length, curWidth));
+				return curWidth;
+			}
+			// no more elements, use the last element.
+			return curWidth;
+		}
+
+		private static bool IsEolChar (char c)
+		{
+			return !char.IsLetterOrDigit (c);
+		}
+
+		private static int GetLineEnd (int start, int length, string description)
+		{
+			int end = System.Math.Min (start + length, description.Length);
+			int sep = -1;
+			for (int i = start; i < end; ++i) {
+				if (description [i] == '\n')
+					return i+1;
+				if (IsEolChar (description [i]))
+					sep = i+1;
+			}
+			if (sep == -1 || end == description.Length)
+				return end;
+			return sep;
+		}
+	}
+
+	public class OptionValueCollection : IList, IList<string> {
+
+		List<string> values = new List<string> ();
+		OptionContext c;
+
+		internal OptionValueCollection (OptionContext c)
+		{
+			this.c = c;
+		}
+
+		#region ICollection
+		void ICollection.CopyTo (Array array, int index)  {(values as ICollection).CopyTo (array, index);}
+		bool ICollection.IsSynchronized                   {get {return (values as ICollection).IsSynchronized;}}
+		object ICollection.SyncRoot                       {get {return (values as ICollection).SyncRoot;}}
+		#endregion
+
+		#region ICollection<T>
+		public void Add (string item)                       {values.Add (item);}
+		public void Clear ()                                {values.Clear ();}
+		public bool Contains (string item)                  {return values.Contains (item);}
+		public void CopyTo (string[] array, int arrayIndex) {values.CopyTo (array, arrayIndex);}
+		public bool Remove (string item)                    {return values.Remove (item);}
+		public int Count                                    {get {return values.Count;}}
+		public bool IsReadOnly                              {get {return false;}}
+		#endregion
+
+		#region IEnumerable
+		IEnumerator IEnumerable.GetEnumerator () {return values.GetEnumerator ();}
+		#endregion
+
+		#region IEnumerable<T>
+		public IEnumerator<string> GetEnumerator () {return values.GetEnumerator ();}
+		#endregion
+
+		#region IList
+		int IList.Add (object value)                {return (values as IList).Add (value);}
+		bool IList.Contains (object value)          {return (values as IList).Contains (value);}
+		int IList.IndexOf (object value)            {return (values as IList).IndexOf (value);}
+		void IList.Insert (int index, object value) {(values as IList).Insert (index, value);}
+		void IList.Remove (object value)            {(values as IList).Remove (value);}
+		void IList.RemoveAt (int index)             {(values as IList).RemoveAt (index);}
+		bool IList.IsFixedSize                      {get {return false;}}
+		object IList.this [int index]               {get {return this [index];} set {(values as IList)[index] = value;}}
+		#endregion
+
+		#region IList<T>
+		public int IndexOf (string item)            {return values.IndexOf (item);}
+		public void Insert (int index, string item) {values.Insert (index, item);}
+		public void RemoveAt (int index)            {values.RemoveAt (index);}
+
+		private void AssertValid (int index)
+		{
+			if (c.Option == null)
+				throw new InvalidOperationException ("OptionContext.Option is null.");
+			if (index >= c.Option.MaxValueCount)
+				throw new ArgumentOutOfRangeException ("index");
+			if (c.Option.OptionValueType == OptionValueType.Required &&
+					index >= values.Count)
+				throw new OptionException (string.Format (
+							c.OptionSet.MessageLocalizer ("Missing required value for option '{0}'."), c.OptionName), 
+						c.OptionName);
+		}
+
+		public string this [int index] {
+			get {
+				AssertValid (index);
+				return index >= values.Count ? null : values [index];
+			}
+			set {
+				values [index] = value;
+			}
+		}
+		#endregion
+
+		public List<string> ToList ()
+		{
+			return new List<string> (values);
+		}
+
+		public string[] ToArray ()
+		{
+			return values.ToArray ();
+		}
+
+		public override string ToString ()
+		{
+			return string.Join (", ", values.ToArray ());
+		}
+	}
+
+	public class OptionContext {
+		private Option                option;
+		private string                name;
+		private int                   index;
+		private OptionSet             set;
+		private OptionValueCollection c;
+
+		public OptionContext (OptionSet set)
+		{
+			this.set = set;
+			this.c   = new OptionValueCollection (this);
+		}
+
+		public Option Option {
+			get {return option;}
+			set {option = value;}
+		}
+
+		public string OptionName { 
+			get {return name;}
+			set {name = value;}
+		}
+
+		public int OptionIndex {
+			get {return index;}
+			set {index = value;}
+		}
+
+		public OptionSet OptionSet {
+			get {return set;}
+		}
+
+		public OptionValueCollection OptionValues {
+			get {return c;}
+		}
+	}
+
+	public enum OptionValueType {
+		None, 
+		Optional,
+		Required,
+	}
+
+	public abstract class Option {
+		string prototype, description;
+		string[] names;
+		OptionValueType type;
+		int count;
+		string[] separators;
+
+		protected Option (string prototype, string description)
+			: this (prototype, description, 1)
+		{
+		}
+
+		protected Option (string prototype, string description, int maxValueCount)
+		{
+			if (prototype == null)
+				throw new ArgumentNullException ("prototype");
+			if (prototype.Length == 0)
+				throw new ArgumentException ("Cannot be the empty string.", "prototype");
+			if (maxValueCount < 0)
+				throw new ArgumentOutOfRangeException ("maxValueCount");
+
+			this.prototype   = prototype;
+			this.names       = prototype.Split ('|');
+			this.description = description;
+			this.count       = maxValueCount;
+			this.type        = ParsePrototype ();
+
+			if (this.count == 0 && type != OptionValueType.None)
+				throw new ArgumentException (
+						"Cannot provide maxValueCount of 0 for OptionValueType.Required or " +
+							"OptionValueType.Optional.",
+						"maxValueCount");
+			if (this.type == OptionValueType.None && maxValueCount > 1)
+				throw new ArgumentException (
+						string.Format ("Cannot provide maxValueCount of {0} for OptionValueType.None.", maxValueCount),
+						"maxValueCount");
+			if (Array.IndexOf (names, "<>") >= 0 && 
+					((names.Length == 1 && this.type != OptionValueType.None) ||
+					 (names.Length > 1 && this.MaxValueCount > 1)))
+				throw new ArgumentException (
+						"The default option handler '<>' cannot require values.",
+						"prototype");
+		}
+
+		public string           Prototype       {get {return prototype;}}
+		public string           Description     {get {return description;}}
+		public OptionValueType  OptionValueType {get {return type;}}
+		public int              MaxValueCount   {get {return count;}}
+
+		public string[] GetNames ()
+		{
+			return (string[]) names.Clone ();
+		}
+
+		public string[] GetValueSeparators ()
+		{
+			if (separators == null)
+				return new string [0];
+			return (string[]) separators.Clone ();
+		}
+
+		protected static T Parse<T> (string value, OptionContext c)
+		{
+			Type tt = typeof (T);
+			bool nullable = tt.IsValueType && tt.IsGenericType && 
+				!tt.IsGenericTypeDefinition && 
+				tt.GetGenericTypeDefinition () == typeof (Nullable<>);
+			Type targetType = nullable ? tt.GetGenericArguments () [0] : typeof (T);
+			TypeConverter conv = TypeDescriptor.GetConverter (targetType);
+			T t = default (T);
+			try {
+				if (value != null)
+					t = (T) conv.ConvertFromString (value);
+			}
+			catch (Exception e) {
+				throw new OptionException (
+						string.Format (
+							c.OptionSet.MessageLocalizer ("Could not convert string `{0}' to type {1} for option `{2}'."),
+							value, targetType.Name, c.OptionName),
+						c.OptionName, e);
+			}
+			return t;
+		}
+
+		internal string[] Names           {get {return names;}}
+		internal string[] ValueSeparators {get {return separators;}}
+
+		static readonly char[] NameTerminator = new char[]{'=', ':'};
+
+		private OptionValueType ParsePrototype ()
+		{
+			char type = '\0';
+			List<string> seps = new List<string> ();
+			for (int i = 0; i < names.Length; ++i) {
+				string name = names [i];
+				if (name.Length == 0)
+					throw new ArgumentException ("Empty option names are not supported.", "prototype");
+
+				int end = name.IndexOfAny (NameTerminator);
+				if (end == -1)
+					continue;
+				names [i] = name.Substring (0, end);
+				if (type == '\0' || type == name [end])
+					type = name [end];
+				else 
+					throw new ArgumentException (
+							string.Format ("Conflicting option types: '{0}' vs. '{1}'.", type, name [end]),
+							"prototype");
+				AddSeparators (name, end, seps);
+			}
+
+			if (type == '\0')
+				return OptionValueType.None;
+
+			if (count <= 1 && seps.Count != 0)
+				throw new ArgumentException (
+						string.Format ("Cannot provide key/value separators for Options taking {0} value(s).", count),
+						"prototype");
+			if (count > 1) {
+				if (seps.Count == 0)
+					this.separators = new string[]{":", "="};
+				else if (seps.Count == 1 && seps [0].Length == 0)
+					this.separators = null;
+				else
+					this.separators = seps.ToArray ();
+			}
+
+			return type == '=' ? OptionValueType.Required : OptionValueType.Optional;
+		}
+
+		private static void AddSeparators (string name, int end, ICollection<string> seps)
+		{
+			int start = -1;
+			for (int i = end+1; i < name.Length; ++i) {
+				switch (name [i]) {
+					case '{':
+						if (start != -1)
+							throw new ArgumentException (
+									string.Format ("Ill-formed name/value separator found in \"{0}\".", name),
+									"prototype");
+						start = i+1;
+						break;
+					case '}':
+						if (start == -1)
+							throw new ArgumentException (
+									string.Format ("Ill-formed name/value separator found in \"{0}\".", name),
+									"prototype");
+						seps.Add (name.Substring (start, i-start));
+						start = -1;
+						break;
+					default:
+						if (start == -1)
+							seps.Add (name [i].ToString ());
+						break;
+				}
+			}
+			if (start != -1)
+				throw new ArgumentException (
+						string.Format ("Ill-formed name/value separator found in \"{0}\".", name),
+						"prototype");
+		}
+
+		public void Invoke (OptionContext c)
+		{
+			OnParseComplete (c);
+			c.OptionName  = null;
+			c.Option      = null;
+			c.OptionValues.Clear ();
+		}
+
+		protected abstract void OnParseComplete (OptionContext c);
+
+		public override string ToString ()
+		{
+			return Prototype;
+		}
+	}
+
+	[Serializable]
+	public class OptionException : Exception {
+		private string option;
+
+		public OptionException ()
+		{
+		}
+
+		public OptionException (string message, string optionName)
+			: base (message)
+		{
+			this.option = optionName;
+		}
+
+		public OptionException (string message, string optionName, Exception innerException)
+			: base (message, innerException)
+		{
+			this.option = optionName;
+		}
+
+		protected OptionException (SerializationInfo info, StreamingContext context)
+			: base (info, context)
+		{
+			this.option = info.GetString ("OptionName");
+		}
+
+		public string OptionName {
+			get {return this.option;}
+		}
+
+		[SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)]
+		public override void GetObjectData (SerializationInfo info, StreamingContext context)
+		{
+			base.GetObjectData (info, context);
+			info.AddValue ("OptionName", option);
+		}
+	}
+
+	public delegate void OptionAction<TKey, TValue> (TKey key, TValue value);
+
+	public class OptionSet : KeyedCollection<string, Option>
+	{
+		public OptionSet ()
+			: this (delegate (string f) {return f;})
+		{
+		}
+
+		public OptionSet (Converter<string, string> localizer)
+		{
+			this.localizer = localizer;
+		}
+
+		Converter<string, string> localizer;
+
+		public Converter<string, string> MessageLocalizer {
+			get {return localizer;}
+		}
+
+		protected override string GetKeyForItem (Option item)
+		{
+			if (item == null)
+				throw new ArgumentNullException ("option");
+			if (item.Names != null && item.Names.Length > 0)
+				return item.Names [0];
+			// This should never happen, as it's invalid for Option to be
+			// constructed w/o any names.
+			throw new InvalidOperationException ("Option has no names!");
+		}
+
+		[Obsolete ("Use KeyedCollection.this[string]")]
+		protected Option GetOptionForName (string option)
+		{
+			if (option == null)
+				throw new ArgumentNullException ("option");
+			try {
+				return base [option];
+			}
+			catch (KeyNotFoundException) {
+				return null;
+			}
+		}
+
+		protected override void InsertItem (int index, Option item)
+		{
+			base.InsertItem (index, item);
+			AddImpl (item);
+		}
+
+		protected override void RemoveItem (int index)
+		{
+			base.RemoveItem (index);
+			Option p = Items [index];
+			// KeyedCollection.RemoveItem() handles the 0th item
+			for (int i = 1; i < p.Names.Length; ++i) {
+				Dictionary.Remove (p.Names [i]);
+			}
+		}
+
+		protected override void SetItem (int index, Option item)
+		{
+			base.SetItem (index, item);
+			RemoveItem (index);
+			AddImpl (item);
+		}
+
+		private void AddImpl (Option option)
+		{
+			if (option == null)
+				throw new ArgumentNullException ("option");
+			List<string> added = new List<string> (option.Names.Length);
+			try {
+				// KeyedCollection.InsertItem/SetItem handle the 0th name.
+				for (int i = 1; i < option.Names.Length; ++i) {
+					Dictionary.Add (option.Names [i], option);
+					added.Add (option.Names [i]);
+				}
+			}
+			catch (Exception) {
+				foreach (string name in added)
+					Dictionary.Remove (name);
+				throw;
+			}
+		}
+
+		public new OptionSet Add (Option option)
+		{
+			base.Add (option);
+			return this;
+		}
+
+		sealed class ActionOption : Option {
+			Action<OptionValueCollection> action;
+
+			public ActionOption (string prototype, string description, int count, Action<OptionValueCollection> action)
+				: base (prototype, description, count)
+			{
+				if (action == null)
+					throw new ArgumentNullException ("action");
+				this.action = action;
+			}
+
+			protected override void OnParseComplete (OptionContext c)
+			{
+				action (c.OptionValues);
+			}
+		}
+
+		public OptionSet Add (string prototype, Action<string> action)
+		{
+			return Add (prototype, null, action);
+		}
+
+		public OptionSet Add (string prototype, string description, Action<string> action)
+		{
+			if (action == null)
+				throw new ArgumentNullException ("action");
+			Option p = new ActionOption (prototype, description, 1, 
+					delegate (OptionValueCollection v) { action (v [0]); });
+			base.Add (p);
+			return this;
+		}
+
+		public OptionSet Add (string prototype, OptionAction<string, string> action)
+		{
+			return Add (prototype, null, action);
+		}
+
+		public OptionSet Add (string prototype, string description, OptionAction<string, string> action)
+		{
+			if (action == null)
+				throw new ArgumentNullException ("action");
+			Option p = new ActionOption (prototype, description, 2, 
+					delegate (OptionValueCollection v) {action (v [0], v [1]);});
+			base.Add (p);
+			return this;
+		}
+
+		sealed class ActionOption<T> : Option {
+			Action<T> action;
+
+			public ActionOption (string prototype, string description, Action<T> action)
+				: base (prototype, description, 1)
+			{
+				if (action == null)
+					throw new ArgumentNullException ("action");
+				this.action = action;
+			}
+
+			protected override void OnParseComplete (OptionContext c)
+			{
+				action (Parse<T> (c.OptionValues [0], c));
+			}
+		}
+
+		sealed class ActionOption<TKey, TValue> : Option {
+			OptionAction<TKey, TValue> action;
+
+			public ActionOption (string prototype, string description, OptionAction<TKey, TValue> action)
+				: base (prototype, description, 2)
+			{
+				if (action == null)
+					throw new ArgumentNullException ("action");
+				this.action = action;
+			}
+
+			protected override void OnParseComplete (OptionContext c)
+			{
+				action (
+						Parse<TKey> (c.OptionValues [0], c),
+						Parse<TValue> (c.OptionValues [1], c));
+			}
+		}
+
+		public OptionSet Add<T> (string prototype, Action<T> action)
+		{
+			return Add (prototype, null, action);
+		}
+
+		public OptionSet Add<T> (string prototype, string description, Action<T> action)
+		{
+			return Add (new ActionOption<T> (prototype, description, action));
+		}
+
+		public OptionSet Add<TKey, TValue> (string prototype, OptionAction<TKey, TValue> action)
+		{
+			return Add (prototype, null, action);
+		}
+
+		public OptionSet Add<TKey, TValue> (string prototype, string description, OptionAction<TKey, TValue> action)
+		{
+			return Add (new ActionOption<TKey, TValue> (prototype, description, action));
+		}
+
+		protected virtual OptionContext CreateOptionContext ()
+		{
+			return new OptionContext (this);
+		}
+
+#if LINQ
+		public List<string> Parse (IEnumerable<string> arguments)
+		{
+			bool process = true;
+			OptionContext c = CreateOptionContext ();
+			c.OptionIndex = -1;
+			var def = GetOptionForName ("<>");
+			var unprocessed = 
+				from argument in arguments
+				where ++c.OptionIndex >= 0 && (process || def != null)
+					? process
+						? argument == "--" 
+							? (process = false)
+							: !Parse (argument, c)
+								? def != null 
+									? Unprocessed (null, def, c, argument) 
+									: true
+								: false
+						: def != null 
+							? Unprocessed (null, def, c, argument)
+							: true
+					: true
+				select argument;
+			List<string> r = unprocessed.ToList ();
+			if (c.Option != null)
+				c.Option.Invoke (c);
+			return r;
+		}
+#else
+		public List<string> Parse (IEnumerable<string> arguments)
+		{
+			OptionContext c = CreateOptionContext ();
+			c.OptionIndex = -1;
+			bool process = true;
+			List<string> unprocessed = new List<string> ();
+			Option def = Contains ("<>") ? this ["<>"] : null;
+			foreach (string argument in arguments) {
+				++c.OptionIndex;
+				if (argument == "--") {
+					process = false;
+					continue;
+				}
+				if (!process) {
+					Unprocessed (unprocessed, def, c, argument);
+					continue;
+				}
+				if (!Parse (argument, c))
+					Unprocessed (unprocessed, def, c, argument);
+			}
+			if (c.Option != null)
+				c.Option.Invoke (c);
+			return unprocessed;
+		}
+#endif
+
+		private static bool Unprocessed (ICollection<string> extra, Option def, OptionContext c, string argument)
+		{
+			if (def == null) {
+				extra.Add (argument);
+				return false;
+			}
+			c.OptionValues.Add (argument);
+			c.Option = def;
+			c.Option.Invoke (c);
+			return false;
+		}
+
+		private readonly Regex ValueOption = new Regex (
+			@"^(?<flag>--|-|/)(?<name>[^:=]+)((?<sep>[:=])(?<value>.*))?$");
+
+		protected bool GetOptionParts (string argument, out string flag, out string name, out string sep, out string value)
+		{
+			if (argument == null)
+				throw new ArgumentNullException ("argument");
+
+			flag = name = sep = value = null;
+			Match m = ValueOption.Match (argument);
+			if (!m.Success) {
+				return false;
+			}
+			flag  = m.Groups ["flag"].Value;
+			name  = m.Groups ["name"].Value;
+			if (m.Groups ["sep"].Success && m.Groups ["value"].Success) {
+				sep   = m.Groups ["sep"].Value;
+				value = m.Groups ["value"].Value;
+			}
+			return true;
+		}
+
+		protected virtual bool Parse (string argument, OptionContext c)
+		{
+			if (c.Option != null) {
+				ParseValue (argument, c);
+				return true;
+			}
+
+			string f, n, s, v;
+			if (!GetOptionParts (argument, out f, out n, out s, out v))
+				return false;
+
+			Option p;
+			if (Contains (n)) {
+				p = this [n];
+				c.OptionName = f + n;
+				c.Option     = p;
+				switch (p.OptionValueType) {
+					case OptionValueType.None:
+						c.OptionValues.Add (n);
+						c.Option.Invoke (c);
+						break;
+					case OptionValueType.Optional:
+					case OptionValueType.Required: 
+						ParseValue (v, c);
+						break;
+				}
+				return true;
+			}
+			// no match; is it a bool option?
+			if (ParseBool (argument, n, c))
+				return true;
+			// is it a bundled option?
+			if (ParseBundledValue (f, string.Concat (n + s + v), c))
+				return true;
+
+			return false;
+		}
+
+		private void ParseValue (string option, OptionContext c)
+		{
+			if (option != null)
+				foreach (string o in c.Option.ValueSeparators != null 
+						? option.Split (c.Option.ValueSeparators, StringSplitOptions.None)
+						: new string[]{option}) {
+					c.OptionValues.Add (o);
+				}
+			if (c.OptionValues.Count == c.Option.MaxValueCount || 
+					c.Option.OptionValueType == OptionValueType.Optional)
+				c.Option.Invoke (c);
+			else if (c.OptionValues.Count > c.Option.MaxValueCount) {
+				throw new OptionException (localizer (string.Format (
+								"Error: Found {0} option values when expecting {1}.", 
+								c.OptionValues.Count, c.Option.MaxValueCount)),
+						c.OptionName);
+			}
+		}
+
+		private bool ParseBool (string option, string n, OptionContext c)
+		{
+			Option p;
+			string rn;
+			if (n.Length >= 1 && (n [n.Length-1] == '+' || n [n.Length-1] == '-') &&
+					Contains ((rn = n.Substring (0, n.Length-1)))) {
+				p = this [rn];
+				string v = n [n.Length-1] == '+' ? option : null;
+				c.OptionName  = option;
+				c.Option      = p;
+				c.OptionValues.Add (v);
+				p.Invoke (c);
+				return true;
+			}
+			return false;
+		}
+
+		private bool ParseBundledValue (string f, string n, OptionContext c)
+		{
+			if (f != "-")
+				return false;
+			for (int i = 0; i < n.Length; ++i) {
+				Option p;
+				string opt = f + n [i].ToString ();
+				string rn = n [i].ToString ();
+				if (!Contains (rn)) {
+					if (i == 0)
+						return false;
+					throw new OptionException (string.Format (localizer (
+									"Cannot bundle unregistered option '{0}'."), opt), opt);
+				}
+				p = this [rn];
+				switch (p.OptionValueType) {
+					case OptionValueType.None:
+						Invoke (c, opt, n, p);
+						break;
+					case OptionValueType.Optional:
+					case OptionValueType.Required: {
+						string v     = n.Substring (i+1);
+						c.Option     = p;
+						c.OptionName = opt;
+						ParseValue (v.Length != 0 ? v : null, c);
+						return true;
+					}
+					default:
+						throw new InvalidOperationException ("Unknown OptionValueType: " + p.OptionValueType);
+				}
+			}
+			return true;
+		}
+
+		private static void Invoke (OptionContext c, string name, string value, Option option)
+		{
+			c.OptionName  = name;
+			c.Option      = option;
+			c.OptionValues.Add (value);
+			option.Invoke (c);
+		}
+
+		private const int OptionWidth = 29;
+
+		public void WriteOptionDescriptions (TextWriter o)
+		{
+			foreach (Option p in this) {
+				int written = 0;
+				if (!WriteOptionPrototype (o, p, ref written))
+					continue;
+
+				if (written < OptionWidth)
+					o.Write (new string (' ', OptionWidth - written));
+				else {
+					o.WriteLine ();
+					o.Write (new string (' ', OptionWidth));
+				}
+
+				bool indent = false;
+				string prefix = new string (' ', OptionWidth+2);
+				foreach (string line in GetLines (localizer (GetDescription (p.Description)))) {
+					if (indent) 
+						o.Write (prefix);
+					o.WriteLine (line);
+					indent = true;
+				}
+			}
+		}
+
+		bool WriteOptionPrototype (TextWriter o, Option p, ref int written)
+		{
+			string[] names = p.Names;
+
+			int i = GetNextOptionIndex (names, 0);
+			if (i == names.Length)
+				return false;
+
+			if (names [i].Length == 1) {
+				Write (o, ref written, "  -");
+				Write (o, ref written, names [0]);
+			}
+			else {
+				Write (o, ref written, "      --");
+				Write (o, ref written, names [0]);
+			}
+
+			for ( i = GetNextOptionIndex (names, i+1); 
+					i < names.Length; i = GetNextOptionIndex (names, i+1)) {
+				Write (o, ref written, ", ");
+				Write (o, ref written, names [i].Length == 1 ? "-" : "--");
+				Write (o, ref written, names [i]);
+			}
+
+			if (p.OptionValueType == OptionValueType.Optional ||
+					p.OptionValueType == OptionValueType.Required) {
+				if (p.OptionValueType == OptionValueType.Optional) {
+					Write (o, ref written, localizer ("["));
+				}
+				Write (o, ref written, localizer ("=" + GetArgumentName (0, p.MaxValueCount, p.Description)));
+				string sep = p.ValueSeparators != null && p.ValueSeparators.Length > 0 
+					? p.ValueSeparators [0]
+					: " ";
+				for (int c = 1; c < p.MaxValueCount; ++c) {
+					Write (o, ref written, localizer (sep + GetArgumentName (c, p.MaxValueCount, p.Description)));
+				}
+				if (p.OptionValueType == OptionValueType.Optional) {
+					Write (o, ref written, localizer ("]"));
+				}
+			}
+			return true;
+		}
+
+		static int GetNextOptionIndex (string[] names, int i)
+		{
+			while (i < names.Length && names [i] == "<>") {
+				++i;
+			}
+			return i;
+		}
+
+		static void Write (TextWriter o, ref int n, string s)
+		{
+			n += s.Length;
+			o.Write (s);
+		}
+
+		private static string GetArgumentName (int index, int maxIndex, string description)
+		{
+			if (description == null)
+				return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1);
+			string[] nameStart;
+			if (maxIndex == 1)
+				nameStart = new string[]{"{0:", "{"};
+			else
+				nameStart = new string[]{"{" + index + ":"};
+			for (int i = 0; i < nameStart.Length; ++i) {
+				int start, j = 0;
+				do {
+					start = description.IndexOf (nameStart [i], j);
+				} while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false);
+				if (start == -1)
+					continue;
+				int end = description.IndexOf ("}", start);
+				if (end == -1)
+					continue;
+				return description.Substring (start + nameStart [i].Length, end - start - nameStart [i].Length);
+			}
+			return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1);
+		}
+
+		private static string GetDescription (string description)
+		{
+			if (description == null)
+				return string.Empty;
+			StringBuilder sb = new StringBuilder (description.Length);
+			int start = -1;
+			for (int i = 0; i < description.Length; ++i) {
+				switch (description [i]) {
+					case '{':
+						if (i == start) {
+							sb.Append ('{');
+							start = -1;
+						}
+						else if (start < 0)
+							start = i + 1;
+						break;
+					case '}':
+						if (start < 0) {
+							if ((i+1) == description.Length || description [i+1] != '}')
+								throw new InvalidOperationException ("Invalid option description: " + description);
+							++i;
+							sb.Append ("}");
+						}
+						else {
+							sb.Append (description.Substring (start, i - start));
+							start = -1;
+						}
+						break;
+					case ':':
+						if (start < 0)
+							goto default;
+						start = i + 1;
+						break;
+					default:
+						if (start < 0)
+							sb.Append (description [i]);
+						break;
+				}
+			}
+			return sb.ToString ();
+		}
+
+		private static IEnumerable<string> GetLines (string description)
+		{
+			return StringCoda.WrappedLines (description, 
+					80 - OptionWidth, 
+					80 - OptionWidth - 2);
+		}
+	}
+}
+
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/Patient.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/Patient.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/Patient.cs	(revision 1134)
@@ -0,0 +1,63 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+
+    /// <summary>
+    /// You guessed it.
+    /// </summary>
+    public enum Sex
+    {
+        Male, Female
+    };
+
+    /// <summary>
+    /// Puppet standing for a Real Patient
+    /// </summary>
+    public class Patient
+    {
+        public int DFN { get; set; }
+        public string Name { get; set; }
+        public Sex Sex;
+        public DateTime DOB { get; set; }
+        public string ID { get; set; }
+        public string HRN { get; set; }
+        public List<CGAppointment> Appointments { get; set; }
+        public string Street { get; set; }
+        public string City { get; set; }
+        public string State { get; set; }
+        public string Zip { get; set; }
+        public string Country { get; set; }
+        public string Email { get; set; }
+        public string HomePhone { get; set; }
+        public string WorkPHone { get; set; }
+        public string CellPhone { get; set; }
+        public TimeSpan Age
+        {
+            get 
+            { 
+                return (DateTime.Today - this.DOB); 
+            }
+        }
+
+        /// <summary>
+        /// Returns User Friendly Age. If Age < 5, then Years and Months
+        /// If Age > 5, then only Years.
+        /// Humans tend to round down their ages. So I follow the same rule here.
+        /// </summary>
+        public string UserFriendlyAge
+        {
+            get
+            {
+                if (Age.TotalDays / 365.24 > 5)
+                    return Math.Floor((Age.TotalDays / 365.24)).ToString() + " " + strings.years;
+                else
+                    return Math.Floor((Age.TotalDays / 365.24)).ToString() + " " + strings.years + " " + strings.and + " "
+                     + Math.Floor(Age.TotalDays % 365.24 / 30).ToString() + " " + strings.months;
+            }
+        }
+    }
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/Printing.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/Printing.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/Printing.cs	(revision 1134)
@@ -0,0 +1,732 @@
+﻿using System;
+using System.Drawing.Printing;
+using System.Drawing;
+using System.Text;
+using System.Drawing.Drawing2D;
+using System.Linq;
+using System.Data;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+    public partial class Printing
+    { 
+        /// <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
+        /// <param name="resourceToPrint">The resouce to print</param>
+        /// <param name="apptPrinting">Current Appointment printing</param>
+        /// <param name="pageNumber">Current page number</param>
+        /// <remarks>beg and end have no effect on operation--they are there for documentation for user only</remarks>
+        public virtual void PrintAppointments(dsPatientApptDisplay2 ds, PrintPageEventArgs e, DateTime beg, DateTime end, int resourceToPrint, ref int apptPrinting, int pageNumber)
+        {
+            Graphics g = e.Graphics;
+            //g.PageUnit = GraphicsUnit.Millimeter;
+            //SizeF szVCB = g.VisibleClipBounds.Size;
+            //PointF[] ptszVCB = {new PointF(szVCB.Width,szVCB.Height)};
+            //g.TransformPoints(CoordinateSpace.Page, CoordinateSpace.Device, ptszVCB);
+            //Create Fonts
+            Font f8 = new Font(FontFamily.GenericSerif, 8);
+            Font f10 = new Font(FontFamily.GenericSerif, 10);
+            Font f14bold = new Font(FontFamily.GenericSerif, 14, FontStyle.Bold);
+            
+            //Center Alignment for some stuff
+            StringFormat sf = new StringFormat();
+            sf.Alignment = StringAlignment.Center;
+            
+            //Header
+            g.DrawString("Confidential Patient Information", f8, Brushes.Black, e.PageBounds, sf);
+            
+            //Footer
+            sf.Alignment = StringAlignment.Center;
+            sf.LineAlignment = StringAlignment.Far;
+            g.DrawString("Page " + pageNumber, f8, Brushes.Black, e.PageBounds, sf);
+
+            //Typical manipulable print area
+            Rectangle printArea = e.MarginBounds;
+            Rectangle pageArea = e.PageBounds;
+            Rectangle headerArea = new Rectangle()
+            {
+                X = e.MarginBounds.X,
+                Y = e.PageBounds.Y,
+                Height = e.MarginBounds.Y - e.PageBounds.Y,
+                Width = e.MarginBounds.Width
+            };
+            Rectangle footerArea = new Rectangle()
+            {
+                X = e.MarginBounds.X,
+                Y = e.MarginBounds.Height + headerArea.Height,
+                Width = e.MarginBounds.Width,
+                Height = pageArea.Height - (e.MarginBounds.Height + headerArea.Height)
+            };
+
+            //print footer
+            StringFormat sfFooter = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
+            string s = strings.Printed + ": " + DateTime.Now.ToString();
+            Font fFooter = new Font(FontFamily.GenericSerif, 7);
+            g.DrawString(s, fFooter, Brushes.Black, footerArea, sfFooter);
+
+            //resource we want to print
+            dsPatientApptDisplay2.BSDXResourceRow r = ds.BSDXResource[resourceToPrint];
+            
+            //header
+            string toprint;
+            if (beg.Date == end.Date) toprint = "Appointments for " + r.RESOURCE_NAME + " on " + beg.ToLongDateString();
+            else toprint = "Appointments for " + r.RESOURCE_NAME + " from " + beg.ToShortDateString() + " to "
+                + end.ToShortDateString();
+            g.DrawString(toprint, f14bold, Brushes.Black, printArea);
+            
+            //Move print area down
+            int titleHeight = (int)g.MeasureString(toprint, f14bold, printArea.Size).Height;
+            printArea.Height -= titleHeight;
+            printArea.Y += titleHeight;
+
+            //Draw Line
+            g.DrawLine(new Pen(Brushes.Black, 0), printArea.X, printArea.Y, printArea.X + printArea.Width, printArea.Y);
+            
+            //Move print area down
+            printArea.Y += 5; 
+            printArea.Height -= 5;
+            
+            System.Data.DataRow[] appts = r.GetChildRows(ds.Relations[0]); //ds has only one relation 
+
+            StringFormat sf2 = new StringFormat();                 //sf to hold tab stops
+            sf2.SetTabStops(50, new float[] { 100, 250, 25 });     
+
+            //appt printed starts at zero
+            while (apptPrinting < appts.Length)
+            {
+                dsPatientApptDisplay2.PatientApptsRow a = (dsPatientApptDisplay2.PatientApptsRow)appts[apptPrinting];
+                
+                StringBuilder apptPrintStr = new StringBuilder(200); 
+                apptPrintStr.AppendLine(a.ApptDate.ToString() + "\t" + a.Name + " (" + a.Sex + ")" + "\t" + "DOB: " + a.DOB.ToShortDateString() + "\t" + "ID: " + a.HRN);
+                apptPrintStr.AppendLine("P: " + a.HOMEPHONE + "\t" + "Address: " + a.STREET + ", " + a.CITY + ", " + a.STATE + " " + a.ZIP);
+                apptPrintStr.AppendLine("Note: " + a.NOTE);
+                apptPrintStr.AppendLine("Appointment made by " + a.APPT_MADE_BY + " on " + a.DATE_APPT_MADE);
+
+                int printedApptHeight = (int)g.MeasureString(apptPrintStr.ToString(), f10, printArea.Width).Height;
+                if (printedApptHeight > printArea.Height) // too much to print -- move to next page
+                    // but don't increment the appointment to print since we haven't printed it yet.
+                    // i.e. apptPrinting stays the same.
+                {
+                    e.HasMorePages = true;
+                    break;
+                }
+   
+                //otherwise print it
+                g.DrawString(apptPrintStr.ToString(), f10, Brushes.Black, printArea, sf2);
+                
+                //Move print area down
+                printArea.Y += printedApptHeight + 3;
+                printArea.Height -= printedApptHeight + 3;
+
+                //Draw a divider line
+                Point pt1 = new Point((int)(printArea.X + printArea.Width * 0.25), printArea.Y);
+                Point pt2 = new Point((int)(printArea.X + printArea.Width * 0.75), printArea.Y);
+                g.DrawLine(Pens.Gray, pt1, pt2);
+
+                //move down, again
+                printArea.Y += 3;
+                printArea.Height -= 3;
+
+                //go to the next appointment
+                apptPrinting++;
+            }
+
+
+            g.Dispose();
+        }
+
+        /// <summary>
+        /// Prints a single appointment slip to give to the patient
+        /// </summary>
+        /// <param name="appt">The Appointment to print</param>
+        /// <param name="e">PrintPageEventArgs from PrintDocument Print handler</param>
+        public virtual void PrintAppointmentSlip(CGAppointment appt, PrintPageEventArgs e)
+        {
+            // Prep
+            Graphics g = e.Graphics;
+            Rectangle printArea = e.MarginBounds;
+            Rectangle pageArea = e.PageBounds;
+            Rectangle headerArea = new Rectangle()
+            {
+                X = e.MarginBounds.X,
+                Y = e.PageBounds.Y,
+                Height = e.MarginBounds.Y - e.PageBounds.Y,
+                Width = e.MarginBounds.Width
+            };
+            Rectangle footerArea = new Rectangle()
+            {
+                X = e.MarginBounds.X,
+                Y = e.MarginBounds.Height + headerArea.Height,
+                Width = e.MarginBounds.Width,
+                Height = pageArea.Height - (e.MarginBounds.Height + headerArea.Height)
+            };
+
+            string s;
+
+            // A few fonts
+            Font fTitle = new Font(FontFamily.GenericSerif, 24, FontStyle.Bold); //for title
+            Font fBody = new Font(FontFamily.GenericSerif, 12);
+            Font fGroupTitle = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Bold);
+
+            StringFormat sfCenterCenter = new StringFormat()
+            {
+                 Alignment = StringAlignment.Center,
+                 LineAlignment = StringAlignment.Center
+            };
+            
+            // Draw Header
+            string division = CGDocumentManager.Current.ConnectInfo.DivisionName;
+            g.DrawString(division, fBody, Brushes.Black, headerArea, sfCenterCenter);
+
+            const int watermarkLength = 75;
+
+            // Move down for optional form paper
+            printArea.Y += watermarkLength;
+            printArea.Height -= watermarkLength;
+
+            // Draw Title
+            StringFormat sfCenter = new StringFormat();
+            sfCenter.Alignment = StringAlignment.Center; //for title & header
+
+            //string s = "Appointment Reminder Slip";
+            s = strings.ApptReminderSlip;
+            g.DrawString(s, fTitle, Brushes.Black, printArea, sfCenter); //title
+
+            // move down
+            int titleHeight = (int)g.MeasureString(s, 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;
+
+            // draw curved rectangle.
+            Rectangle personalInfoRectangle = new Rectangle(e.MarginBounds.X, printArea.Y + 30, 280, 300);
+            using (GraphicsPath path = GetRoundedRectPath(personalInfoRectangle, 10))
+            {
+                g.DrawPath(Pens.Black, path);
+            }
+
+            // group header
+            s = strings.PtInfo;
+            StringFormat sf3 = new StringFormat(System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft ? StringFormatFlags.DirectionRightToLeft : 0);
+            g.DrawString(s, fGroupTitle, Brushes.Black, new Rectangle(personalInfoRectangle.X, personalInfoRectangle.Y - 20,personalInfoRectangle.Width, 20),sf3);
+            
+            // inner rectangle for drawing strings:
+            Rectangle personalInfoInnerRectangle = new Rectangle(personalInfoRectangle.X + 20, personalInfoRectangle.Y + 20, 280 - 40, 300 - 40);
+            
+            // Strings to write
+            StringBuilder sb = new StringBuilder(500);
+            sb.AppendLine(strings.Name + ":" + "\t" + appt.Patient.Name);
+            sb.AppendLine();
+            sb.AppendLine(strings.ID + ":" + "\t" + appt.Patient.ID);
+            sb.AppendLine();
+            sb.AppendLine(strings.DOB + ":" + "\t" + appt.Patient.DOB.ToShortDateString());
+            sb.AppendLine();
+            sb.AppendLine(strings.Age + ":" + "\t" + appt.Patient.UserFriendlyAge);
+            sb.AppendLine();
+            s = appt.Patient.Sex == Sex.Male ? strings.Male : strings.Female;
+            sb.AppendLine(strings.Sex + ":" + "\t" + s);
+
+            // Draw them
+            sf3 = new StringFormat(System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft ? StringFormatFlags.DirectionRightToLeft : 0);
+            sf3.SetTabStops(0, new float[] {75} );
+            sf3.SetDigitSubstitution(System.Threading.Thread.CurrentThread.CurrentUICulture.LCID, StringDigitSubstitute.Traditional);
+            g.DrawString(sb.ToString(), fBody, Brushes.Black, personalInfoInnerRectangle, sf3);
+
+            // draw curved rectangle
+            Rectangle apptInfoRectangle = new Rectangle(e.MarginBounds.X + e.MarginBounds.Width - 280, printArea.Y + 30, 280, 300);
+            using (GraphicsPath path = GetRoundedRectPath(apptInfoRectangle, 10))
+            {
+                g.DrawPath(Pens.Black, path);
+            }
+
+            s = strings.ApptInfo;
+            // group header
+            g.DrawString(s, fGroupTitle, Brushes.Black, new Rectangle(apptInfoRectangle.X, apptInfoRectangle.Y - 20,apptInfoRectangle.Width, 20), sf3);
+
+            // Strings to write
+            sb = new StringBuilder();
+            sb.AppendLine(strings.Clinic + ":" + "\t" + appt.Resource);
+            sb.AppendLine();
+            sb.AppendLine(strings.Date + ":" + "\t" + appt.StartTime.ToShortDateString());
+            sb.AppendLine();
+            sb.AppendLine(strings.Day + ":" + "\t" + appt.StartTime.ToString("dddd"));
+            sb.AppendLine();
+            sb.AppendLine(strings.Time + ":" + "\t" + appt.StartTime.ToShortTimeString());
+
+            // Draw them
+            Rectangle apptInfoInnerRectangle = new Rectangle(apptInfoRectangle.X + 20, apptInfoRectangle.Y + 20, 280 - 40, 300 - 40);
+
+            // Draw them
+            g.DrawString(sb.ToString(), fBody, Brushes.Black, apptInfoInnerRectangle, sf3);
+
+            // Move Drawing Rectangle Down
+            printArea.Y += 300 + 30 + 20;
+            printArea.Height -= 300 + 30 + 20;
+
+            // Draw New Line
+            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
+            printArea.Y += 5;
+            printArea.Height -= 5;
+
+            // Draw new Title
+            s = strings.ClinicInstructions;
+            g.DrawString(s, fTitle, Brushes.Black, printArea, sfCenter); //title
+
+            // move down
+            titleHeight = (int)g.MeasureString(s, fTitle, printArea.Width).Height;
+            printArea.Y += titleHeight;
+            printArea.Height -= titleHeight;
+
+            // Draw New Line
+            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
+            printArea.Y += 15;
+            printArea.Height -= 15;
+
+            // Get Resource Clinic Appointment Letter Text
+            DataTable resources = CGDocumentManager.Current.GlobalDataSet.Tables["Resources"];
+
+            string ltrTxt = (from resource in resources.AsEnumerable()
+                             where resource.Field<string>("RESOURCE_NAME") == appt.Resource
+                             select resource.Field<string>("LETTER_TEXT")).SingleOrDefault<string>();
+
+            if (String.IsNullOrWhiteSpace(ltrTxt)) ltrTxt = strings.NoInstructionsProvided;
+
+            g.DrawString(ltrTxt, fBody, Brushes.Black, printArea, sf3);
+
+            int ltrTxtHeight = (int)g.MeasureString(ltrTxt, fBody).Height;
+
+            printArea.Y += ltrTxtHeight + 15;
+            printArea.Height -= ltrTxtHeight + 15;
+
+            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
+            printArea.Y += 5;
+            printArea.Height -= 5;
+
+            s = strings.Notes;
+            g.DrawString(s, fTitle, Brushes.Black, printArea, sfCenter); // Notes title
+            
+            // move down
+            titleHeight = (int)g.MeasureString(s, fTitle, printArea.Width).Height;
+            printArea.Y += titleHeight;
+            printArea.Height -= titleHeight;
+
+            // Draw New Line
+            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
+            printArea.Y += 15;
+            printArea.Height -= 15;
+
+            // Draw Notes Area
+            using (GraphicsPath path = GetRoundedRectPath(printArea, 15))
+            {
+                g.DrawPath(Pens.Black, path);
+            }
+
+            //use sf0 to print the footer (center all the way)
+            s = strings.Printed + ": " + DateTime.Now.ToString();
+            Font fFooter = new Font(FontFamily.GenericSerif, 7);
+            g.DrawString(s, fFooter, Brushes.Black, footerArea, sfCenterCenter);
+
+            g.Dispose();
+        }
+
+
+        private GraphicsPath GetRoundedRectPath(Rectangle rect, int radius)
+        {
+            int diameter = 2 * radius;
+           
+            Rectangle arcRect = new Rectangle(rect.Location, new Size(diameter, diameter));
+            GraphicsPath path = new GraphicsPath();
+            
+            path.AddArc(arcRect, 180, 90); //top left
+            arcRect.X = rect.Right - diameter;
+            path.AddArc(arcRect, 270, 90); // top right
+            arcRect.Y = rect.Bottom - diameter;
+            path.AddArc(arcRect, 0, 90); // bottom right
+            arcRect.X = rect.Left;
+            path.AddArc(arcRect, 90, 90); // bottom left
+
+            path.CloseFigure();
+
+            return path;
+        }
+
+        /// <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>
+        public virtual void PrintReminderLetter(dsPatientApptDisplay2.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 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;
+
+            //Text Direction
+            StringFormat sf2 = new StringFormat();
+            if (System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.IsRightToLeft)
+                sf2.FormatFlags = StringFormatFlags.DirectionRightToLeft;
+
+            // write missive
+            g.DrawString(letter, fBody, Brushes.Black, printArea, sf2);
+
+            //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);
+
+            g.Dispose();
+        }
+       
+        /// <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>
+        public virtual void PrintCancelLetter(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 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;
+
+            //Text Direction
+            StringFormat sf2 = new StringFormat();
+            if (System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.IsRightToLeft)
+                sf2.FormatFlags = StringFormatFlags.DirectionRightToLeft;
+            
+            // write missive
+            g.DrawString(letter, fBody, Brushes.Black, printArea, sf2);
+
+            //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);
+
+            g.Dispose();
+        }
+
+        /// <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 virtual 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;
+
+            //Text Direction
+            StringFormat sf2 = new StringFormat();
+            if (System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.IsRightToLeft)
+                sf2.FormatFlags = StringFormatFlags.DirectionRightToLeft;
+
+            // write missive
+            g.DrawString(letter, fBody, Brushes.Black, printArea, sf2);
+
+            //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);
+
+            g.Dispose();
+        }
+
+        /// <summary>
+        /// Print message on a page; typically that there are no appointments to be found.
+        /// Or just a test message to verify that printing works.
+        /// </summary>
+        /// <param name="msg">The exact string to print.</param>
+        /// <param name="e">Print Page event args</param>
+        public virtual void PrintMessage(string msg, PrintPageEventArgs e)
+        {
+            e.Graphics.DrawString(msg, new Font(FontFamily.GenericSerif, 14),
+                Brushes.Black, e.MarginBounds);
+            e.Graphics.Dispose();
+        }
+
+        /// <summary>
+        /// Print Routing Slip
+        /// </summary>
+        /// <param name="a">Appointment Data Structure</param>
+        /// <param name="title">String to print for title</param>
+        /// <param name="e">etc</param>
+        public virtual void PrintRoutingSlip(CGAppointment appt, int apptOrder, PrintPageEventArgs e)
+        {
+            // Prep
+            Graphics g = e.Graphics;
+            Rectangle printArea = e.MarginBounds;
+            Rectangle pageArea = e.PageBounds;
+            Rectangle headerArea = new Rectangle()
+            {
+                X = e.MarginBounds.X,
+                Y = e.PageBounds.Y,
+                Height = e.MarginBounds.Y - e.PageBounds.Y,
+                Width = e.MarginBounds.Width
+            };
+            Rectangle footerArea = new Rectangle()
+            {
+                X = e.MarginBounds.X,
+                Y = e.MarginBounds.Height + headerArea.Height,
+                Width = e.MarginBounds.Width,
+                Height = pageArea.Height - (e.MarginBounds.Height + headerArea.Height)
+            };
+
+            const int part1Height = 400;
+            string s;
+
+            // A few fonts
+            Font fTitle = new Font(FontFamily.GenericSerif, 24, FontStyle.Bold); //for title
+            Font fBody = new Font(FontFamily.GenericSerif, 12);
+            Font fGroupTitle = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Bold);
+
+            StringFormat sf0 = new StringFormat()
+            {
+                Alignment = StringAlignment.Center,
+                LineAlignment = StringAlignment.Center
+            };
+
+            // Draw Header
+            string division = CGDocumentManager.Current.ConnectInfo.DivisionName;
+            g.DrawString(division, fBody, Brushes.Black, headerArea, sf0);
+
+            const int watermarkLength = 75;
+
+            // Move down for optional form paper
+            printArea.Y += watermarkLength;
+            printArea.Height -= watermarkLength;
+
+            // Draw Title
+            StringFormat sf = new StringFormat();
+            sf.Alignment = StringAlignment.Center; //for title & header
+            string title = strings.RoutingSlip;
+            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;
+
+            // draw curved rectangle.
+            Rectangle personalInfoRectangle = new Rectangle(e.MarginBounds.X, printArea.Y + 30, 280, part1Height);
+            using (GraphicsPath path = GetRoundedRectPath(personalInfoRectangle, 10))
+            {
+                g.DrawPath(Pens.Black, path);
+            }
+
+            // group header
+            s = strings.PtInfo;
+            StringFormat sf3 = new StringFormat(System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft ? StringFormatFlags.DirectionRightToLeft : 0);
+            g.DrawString(s, fGroupTitle, Brushes.Black, new Rectangle(personalInfoRectangle.X, personalInfoRectangle.Y - 20, personalInfoRectangle.Width, 20), sf3);
+
+            StringFormat sf4 = new StringFormat(System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft ? StringFormatFlags.DirectionRightToLeft : 0);
+            sf4.SetTabStops(0, new float[] { 75 });
+            sf4.SetDigitSubstitution(System.Threading.Thread.CurrentThread.CurrentUICulture.LCID, StringDigitSubstitute.Traditional);
+
+            // inner rectangle for drawing strings:
+            Rectangle personalInfoInnerRectangle = new Rectangle(personalInfoRectangle.X + 20, personalInfoRectangle.Y + 20, personalInfoRectangle.Width - 40, personalInfoRectangle.Height - 40);
+
+            // Strings to write
+            StringBuilder sb = new StringBuilder(500);
+            sb.AppendLine(strings.Name + ":" + "\t" + appt.Patient.Name);
+            sb.AppendLine();
+            sb.AppendLine(strings.ID + ":" + "\t" + appt.Patient.ID);
+            sb.AppendLine();
+            sb.AppendLine(strings.DOB + ":" + "\t" + appt.Patient.DOB.ToShortDateString());
+            sb.AppendLine();
+            sb.AppendLine(strings.Age + ":" + "\t" + appt.Patient.UserFriendlyAge);
+            //sb.AppendLine();
+            //sb.AppendLine("Sex:" + "\t" + appt.Patient.Sex.ToString());
+
+            // Draw them
+            g.DrawString(sb.ToString(), fBody, Brushes.Black, personalInfoInnerRectangle, sf4);
+
+            // draw curved rectangle
+            Rectangle apptInfoRectangle = new Rectangle(e.MarginBounds.X + e.MarginBounds.Width - 280, printArea.Y + 30, 280, part1Height);
+            using (GraphicsPath path = GetRoundedRectPath(apptInfoRectangle, 10))
+            {
+                g.DrawPath(Pens.Black, path);
+            }
+
+            // group header
+            s = strings.ApptInfo;
+            g.DrawString(s, fGroupTitle, Brushes.Black, new Rectangle(apptInfoRectangle.X, apptInfoRectangle.Y - 20, apptInfoRectangle.Width, 20), sf3);
+
+            // Strings to write
+            sb = new StringBuilder();
+            sb.AppendLine(strings.Clinic + ":");
+            sb.AppendLine(appt.Resource);
+            sb.AppendLine();
+            sb.AppendLine(strings.AppointmentProvider + ":"); 
+            sb.AppendLine((appt.Provider == null) ? strings.none : appt.Provider.ToString());  //Appt Provider or (none) if null
+            sb.AppendLine();
+            sb.AppendLine(strings.PatientOrder + ":" + "\t" + apptOrder);
+            sb.AppendLine(strings.Date + ":" + "\t" + appt.StartTime.ToShortDateString() + " " + appt.StartTime.ToShortTimeString());
+            sb.AppendLine();
+            sb.AppendLine(strings.AppointmentNote + ":");
+            sb.AppendLine(String.IsNullOrWhiteSpace(appt.Note)? strings.none : appt.Note);
+
+            // Draw them
+            Rectangle apptInfoInnerRectangle = new Rectangle(apptInfoRectangle.X + 20, apptInfoRectangle.Y + 20, apptInfoRectangle.Width - 40, apptInfoRectangle.Height - 40);
+
+            // Draw them
+            g.DrawString(sb.ToString(), fBody, Brushes.Black, apptInfoInnerRectangle, sf4);
+
+            // Move Drawing Rectangle Down
+            printArea.Y += apptInfoRectangle.Height + 30 + 20;
+            printArea.Height -= apptInfoRectangle.Height + 30 + 20;
+
+            // Draw New Line
+            using (Pen dashpen = new Pen(Color.Black))
+            {
+                dashpen.DashStyle = DashStyle.Dash;
+                g.DrawLine(dashpen, printArea.Location, new Point(printArea.Right, printArea.Y));
+            }
+
+            printArea.Y += 5;
+            printArea.Height -= 5;
+
+            s = strings.ScratchArea;
+            g.DrawString(s, fGroupTitle, Brushes.Black, printArea, sf3); 
+
+            // move down
+            printArea.Y += 240;
+            printArea.Height -= 240;
+
+            using (Pen dashpen = new Pen(Color.Black))
+            {
+                dashpen.DashStyle = DashStyle.Dot;
+                g.DrawLine(dashpen, printArea.Location, new Point(printArea.Right, printArea.Y));
+            }
+
+            printArea.Y += 5;
+            printArea.Height -= 5;
+
+            s = strings.NextAppointmentInstructions;
+            g.DrawString(s, fGroupTitle, Brushes.Black, printArea, sf3);
+
+            // Draw Footer
+            //use sf0 to print the footer (center all the way)
+            s = strings.Printed + ": " + DateTime.Now.ToString();
+            Font fFooter = new Font(FontFamily.GenericSerif, 7);
+            g.DrawString(s, fFooter, Brushes.Black, footerArea, sf0);
+
+            g.Dispose();
+
+        }
+
+    }
+    public abstract class PrintingCreator
+    {
+        public abstract Printing PrintFactory();
+    }
+
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/Provider.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/Provider.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/Provider.cs	(revision 1134)
@@ -0,0 +1,22 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+    /// <summary>
+    /// Provider puppet
+    /// </summary>
+    public class Provider
+    {
+        public int IEN { get; set; }
+        public string Name { get; set; }
+        public bool Default { get; set; }
+
+        public override string ToString()
+        {
+            return Name;
+        }
+    }
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/RPC_Calls.txt
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/RPC_Calls.txt	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/RPC_Calls.txt	(revision 1134)
@@ -0,0 +1,87 @@
+Find all ""BSDX ", Subfolders, Find Results 1, "Current Project"
+  CGAVDocument.cs(196):				string sSql = "BSDX CANCEL AVAILABILITY^" + nApptID.ToString();
+ # CGAVDocument.cs(235):				string sSql = "BSDX ADD NEW AVAILABILITY^" + sStart + "^" + sEnd + "^" + sTypeID + "^" + sResource + "^" +  sSlots + "^" + sNote;
+ # CGAVDocument.cs(303):				string sSql = "BSDX ADD NEW AVAILABILITY^" + sStart + "^" + sEnd + "^" + sTypeID + "^" + sResource + "^" +  sSlots + "^" + sNote;
+  CGAVView.cs(622)://				sSql = "BSDX RAISE EVENT^" + sEvent + "^" + sParams + "^^";
+  CGAVView.cs(669):				RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+  CGAVView.cs(728):				RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+  CGAVView.cs(771):					RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+  CGAVView.cs(906):				RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+ # CGAVView.cs(1015):					string sSql = "BSDX CANCEL AV BY DATE^" + sResourceID + "^" + sStart + "^" + sEnd;
+  CGAVView.cs(1051):					RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+  CGAVView.cs(1265):				RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+  CGAVView.cs(1267):					RaiseRPMSEvent("BSDX SCHEDULE", m_Document.DocName);
+ # CGDocument.cs(745):			string sSql = "BSDX ADD NEW APPOINTMENT^" + sStart + "^" + sEnd + "^" + sPatID + "^" + sResource + "^" + sLen + "^" + sNote + "^" + sApptID ;
+  CGDocument.cs(771):				string sSql = "BSDX EDIT APPOINTMENT^" + nApptID.ToString() + "^" + sNote;
+  CGDocument.cs(804):			string sSql = "BSDX CHECKIN APPOINTMENT^" + nApptID.ToString() + "^" + sCheckIn + "^";
+  CGDocument.cs(833):			string sSql = "BSDX CANCEL APPOINTMENT^" + nApptID.ToString();
+ # CGDocument.cs(917):				string sSql = "BSDX REBOOK NEXT BLOCK^" + dStart.ToString("M/d/yyyy@H:mm")+ "^" + a.Resource + "^" + nAVType.ToString();
+ # CGDocument.cs(996):			string sSql = "BSDX REBOOK SET^" + sApptKey + "^" + sRebookedTo;
+  CGDocument.cs(1013):			string sSql = "BSDX NOSHOW^" + nApptID.ToString();
+  CGDocumentManager.cs(59):			if (e.BMXEvent == "BSDX CALL WORKSTATIONS")
+  CGDocumentManager.cs(67):				_current.m_ConnectInfo.RaiseEvent("BSDX WORKSTATION REPORT", sParam, true);
+  CGDocumentManager.cs(69):			if (e.BMXEvent == "BSDX ADMIN MESSAGE")
+  CGDocumentManager.cs(75):			if (e.BMXEvent == "BSDX ADMIN SHUTDOWN")
+  CGDocumentManager.cs(201):					m_ConnectInfo.UnSubscribeEvent("BSDX SCHEDULE");
+  CGDocumentManager.cs(202):					m_ConnectInfo.UnSubscribeEvent("BSDX CALL WORKSTATIONS");
+  CGDocumentManager.cs(365):				_current.m_ConnectInfo.SubscribeEvent("BSDX SCHEDULE");
+  CGDocumentManager.cs(366):				_current.m_ConnectInfo.SubscribeEvent("BSDX CALL WORKSTATIONS");
+  CGDocumentManager.cs(367):				_current.m_ConnectInfo.SubscribeEvent("BSDX ADMIN MESSAGE");
+  CGDocumentManager.cs(368):				_current.m_ConnectInfo.SubscribeEvent("BSDX ADMIN SHUTDOWN");
+  CGDocumentManager.cs(451):			string sCommandText = "BSDX GET ACCESS GROUP TYPES";
+  CGDocumentManager.cs(458):			string sCommandText = "BSDX RESOURCES^" + m_ConnectInfo.DUZ;
+  CGDocumentManager.cs(469):			string sCommandText = "BSDX RESOURCE GROUPS BY USER^" + m_ConnectInfo.DUZ;
+  CGDocumentManager.cs(481):			string sCommandText = "BSDX GROUP RESOURCE^" + m_ConnectInfo.DUZ;
+  CGDocumentManager.cs(490):			string sCommandText = "BSDX SCHEDULE USER";
+  CGDocumentManager.cs(587):			sCommandText = "BSDX HOSPITAL LOCATION";
+  CGDocumentManager.cs(778):				m_ConnectInfo.UnSubscribeEvent("BSDX SCHEDULE");
+ # CGSchedLib.cs(41):			string sSql = "BSDX CREATE APPT SCHEDULE^" + sResName + "^" + sStart + "^" + sEnd ;
+ # CGSchedLib.cs(130):			string sSql = "BSDX TYPE BLOCKS OVERLAP^" + sStart + "^" + sEnd + "^" + sResourceName ;//+ "^" + sSource;
+ # CGSchedLib.cs(288):			string sSql = "BSDX CREATE ASGND SLOT SCHED^" + sResourceName + "^" + sStart + "^" + sEnd + "^" + sApptTypeIDs + "^" + sSearchInfo; //+ "^" + sSTType ;
+ # CGSchedLib.cs(365):			string sSql = "BSDX APPT BLOCKS OVERLAP^" + sStart + "^" + sEnd + "^" + sResourceName ;//+ "^"  + sSTType;
+  CGView.cs(172):				if (e.BMXEvent != "BSDX SCHEDULE")
+  CGView.cs(1804):					RaiseRPMSEvent("BSDX SCHEDULE" , m_Document.DocName);
+  CGView.cs(1926):					RaiseRPMSEvent("BSDX SCHEDULE" , m_Document.DocName);
+  CGView.cs(2058):					RaiseRPMSEvent("BSDX SCHEDULE" , m_Document.DocName);
+  CGView.cs(2160):					RaiseRPMSEvent("BSDX SCHEDULE" , m_Document.DocName);
+  CGView.cs(2267):				RaiseRPMSEvent("BSDX SCHEDULE" , m_Document.DocName);
+  CGView.cs(2745):				RaiseRPMSEvent("BSDX SCHEDULE"  , e.Resource);
+  CGView.cs(2747):					RaiseRPMSEvent("BSDX SCHEDULE", e.OldResource);
+  CGView.cs(2919):				RaiseRPMSEvent("BSDX SCHEDULE"  , e.Resource);
+  CGView.cs(2921):					RaiseRPMSEvent("BSDX SCHEDULE", e.OldResource);
+  DAL.cs(37):            string cmd = String.Format("BSDX SCHEDULING USER INFO^{0}", DUZ);
+  DAL.cs(68):            string cmd = String.Format("BSDX CLINIC LETTERS^{0}^{1}^{2}", sClinicList, sBegin, sEnd);
+  DAL.cs(82):            string cmd = String.Format("BSDX RESOURCE LETTERS^{0}", sClinicList);
+  DAL.cs(101):            string cmd = String.Format("BSDX REBOOK CLINIC LIST^{0}^{1}^{2}", sClinicList, sBegin, sEnd);
+  DAL.cs(107):            string cmd = String.Format("BSDX REBOOK LIST^{0}", sApptList);
+  DAL.cs(115):            string cmd = String.Format("BSDX CANCEL CLINIC LIST^{0}^{1}^{2}", sClinicList, sBegin, sEnd);
+  DAppointPage.cs(578):				sSql = "BSDX GET BASIC REG INFO^" + m_sPatientIEN;
+  DCheckIn.cs(218):                string sCommandText = "BSDX HOSP LOC PROVIDERS^" + nHospLoc;
+ # DCopyAppts.cs(189):				string sSql = "BSDX COPY APPOINTMENTS^" + m_ResourceID + "^" + m_HospLocationID + "^" + m_dtBegin.ToShortDateString() + "^" + m_dtEnd.ToShortDateString();
+  DCopyAppts.cs(227):				string sSql = "BSDX COPY APPOINTMENT CANCEL^" + m_sTask;
+  DCopyAppts.cs(253):                //string sSql = "BSDX COPY APPOINTMENT STATUS^" + m_sTask;
+  DManagement.cs(144):			m_DocManager.ConnectInfo.SubscribeEvent("BSDX WORKSTATION REPORT");
+  DManagement.cs(1286):				string sSql = "BSDX ADD/EDIT RESOURCE^" + sResourceID + "|" + sResourceName + "|" + sInactive + "|" + sHospLocID + "|" + sTimeScale + "|" + sLetterText + "|" + sNoShowLetter + "|" + sCancellationLetter;
+  DManagement.cs(1357):				string sSql = "BSDX ADD/EDIT RESOURCE^" + sResourceID + "|" + sResourceName + "|" + sInactive + "|" + sHospLocID + "|" + sTimeScale + "|" + sLetterText + "|" + sNoShowLetter + "|" + sCancellationLetter;
+  DManagement.cs(1472):			string sSql = "BSDX ADD/EDIT RESOURCEUSER^" + "0" + "|" + sOverbook + "|" + sModifySchedule + "|" + m_nResourceID + "|" + sUserID + "|" + sAppointments;
+  DManagement.cs(1502):			string sSql = "BSDX ADD/EDIT RESOURCEUSER^" + nSelectedResourceUserID.ToString() + "|" + sOverbook + "|" + sModifySchedule + "|" + m_nResourceID + "|" + sUserID + "|" + sAppointments ;
+  DManagement.cs(1517):			string sSql = "BSDX DELETE RESOURCEUSER^" + nSelectedResourceUserID.ToString();
+  DManagement.cs(1585):				string sSql = "BSDX ADD/EDIT RESOURCE GROUP^0|" + sResGroupName;
+  DManagement.cs(1679):			string sSql = "BSDX DELETE RESOURCE GROUP^" + m_sResourceGroupName;
+  DManagement.cs(1723):			string sSql = "BSDX ADD RES GROUP ITEM^" + m_nResourceGroupID.ToString() + "^" + nResID.ToString();
+  DManagement.cs(1746):			string sSql = "BSDX DELETE RES GROUP ITEM^" + nSelectedResourceGroupID.ToString() + "^" + nSelectedResourceItemID.ToString();
+  DManagement.cs(1804):				string sSql = "BSDX ADD/EDIT RESOURCE GROUP^" + nRGID.ToString() + "|" + sResGroupName;
+  DManagement.cs(1871):				string sSql = "BSDX ADD/EDIT ACCESS TYPE^" + sIEN + "|" + sAccessTypeName + "|" + sInactive + "|" + sColor + "|" + sRed + "|" + sGreen + "|" + sBlue;
+  DManagement.cs(1927):				string sSql = "BSDX ADD/EDIT ACCESS TYPE^0|" + sAccessTypeName + "|" + sInactive + "|" + sColor + "|" + sRed + "|" + sGreen + "|" + sBlue;
+  DManagement.cs(2053):				string sSql = "BSDX ADD/EDIT ACCESS GROUP^0|" + sAccessGroupName;
+  DManagement.cs(2093):			string sSql = "BSDX DELETE ACCESS GROUP^" + this.m_nAccessGroupID;
+  DManagement.cs(2139):				string sSql = "BSDX ADD/EDIT ACCESS GROUP^" + nAccessGroupID.ToString() + "|" + sAccessGroupName;
+  DManagement.cs(2183):				string sSql = "BSDX ADD ACCESS GROUP ITEM^" + m_nAccessGroupID.ToString() + "^" + nAccessTypeID.ToString();
+  DManagement.cs(2220):				string sSql = "BSDX DELETE ACCESS GROUP ITEM^" + nSelectedAccessGroupID.ToString() + "^" + nSelectedAccessGroupItemID.ToString();
+  DManagement.cs(2328):			this.m_DocManager.ConnectInfo.RaiseEvent("BSDX CALL WORKSTATIONS", "A", true);
+  DManagement.cs(2338):				if (e.BMXEvent == "BSDX WORKSTATION REPORT")
+  DManagement.cs(2371):			m_DocManager.ConnectInfo.UnSubscribeEvent("BSDX WORKSTATION REPORT");
+  DManagement.cs(2388):			this.m_DocManager.ConnectInfo.RaiseEvent("BSDX ADMIN MESSAGE", sMessage, false);
+  DManagement.cs(2397):			this.m_DocManager.ConnectInfo.RaiseEvent("BSDX ADMIN SHUTDOWN", txtSendMessage.Text, false);
+  DPatientLookup.cs(202):			sSql = "BSDX SPACEBAR SET^AUPNPAT(^" + m_sPatientIEN;
+  UCPatientAppts.cs(29):                string sSql = "BSDX PATIENT APPT DISPLAY^" + nPatientID.ToString();
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/UCPatientAppts.Designer.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/UCPatientAppts.Designer.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/UCPatientAppts.Designer.cs	(revision 1134)
@@ -0,0 +1,203 @@
+﻿namespace IndianHealthService.ClinicalScheduling
+{
+    partial class UCPatientAppts
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            this.dgAppts = new System.Windows.Forms.DataGridView();
+            this.apptDateDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.clinicDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.aPPTMADEBYDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.dATEAPPTMADEDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.nOTEDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.patientApptsBindingSource = new System.Windows.Forms.BindingSource(this.components);
+            this.dsPatientApptDisplay2BindingSource = new System.Windows.Forms.BindingSource(this.components);
+            this.dsPatientApptDisplay2 = new IndianHealthService.ClinicalScheduling.dsPatientApptDisplay2();
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.btnPrint = new System.Windows.Forms.Button();
+            this.chkPastAppts = new System.Windows.Forms.CheckBox();
+            this.printDialog1 = new System.Windows.Forms.PrintDialog();
+            this.PrintPtAppts = new System.Drawing.Printing.PrintDocument();
+            ((System.ComponentModel.ISupportInitialize)(this.dgAppts)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.patientApptsBindingSource)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.dsPatientApptDisplay2BindingSource)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.dsPatientApptDisplay2)).BeginInit();
+            this.panel1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // dgAppts
+            // 
+            this.dgAppts.AllowUserToAddRows = false;
+            this.dgAppts.AllowUserToDeleteRows = false;
+            this.dgAppts.AutoGenerateColumns = false;
+            this.dgAppts.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.dgAppts.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+            this.apptDateDataGridViewTextBoxColumn,
+            this.clinicDataGridViewTextBoxColumn,
+            this.aPPTMADEBYDataGridViewTextBoxColumn,
+            this.dATEAPPTMADEDataGridViewTextBoxColumn,
+            this.nOTEDataGridViewTextBoxColumn});
+            this.dgAppts.DataSource = this.patientApptsBindingSource;
+            this.dgAppts.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.dgAppts.Location = new System.Drawing.Point(0, 32);
+            this.dgAppts.Name = "dgAppts";
+            this.dgAppts.ReadOnly = true;
+            this.dgAppts.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.CellSelect;
+            this.dgAppts.ShowEditingIcon = false;
+            this.dgAppts.Size = new System.Drawing.Size(544, 171);
+            this.dgAppts.TabIndex = 2;
+            // 
+            // apptDateDataGridViewTextBoxColumn
+            // 
+            this.apptDateDataGridViewTextBoxColumn.DataPropertyName = "ApptDate";
+            this.apptDateDataGridViewTextBoxColumn.HeaderText = "Date";
+            this.apptDateDataGridViewTextBoxColumn.Name = "apptDateDataGridViewTextBoxColumn";
+            this.apptDateDataGridViewTextBoxColumn.ReadOnly = true;
+            // 
+            // clinicDataGridViewTextBoxColumn
+            // 
+            this.clinicDataGridViewTextBoxColumn.DataPropertyName = "Clinic";
+            this.clinicDataGridViewTextBoxColumn.HeaderText = "Clinic";
+            this.clinicDataGridViewTextBoxColumn.Name = "clinicDataGridViewTextBoxColumn";
+            this.clinicDataGridViewTextBoxColumn.ReadOnly = true;
+            // 
+            // aPPTMADEBYDataGridViewTextBoxColumn
+            // 
+            this.aPPTMADEBYDataGridViewTextBoxColumn.DataPropertyName = "APPT_MADE_BY";
+            this.aPPTMADEBYDataGridViewTextBoxColumn.HeaderText = "Made By";
+            this.aPPTMADEBYDataGridViewTextBoxColumn.Name = "aPPTMADEBYDataGridViewTextBoxColumn";
+            this.aPPTMADEBYDataGridViewTextBoxColumn.ReadOnly = true;
+            // 
+            // dATEAPPTMADEDataGridViewTextBoxColumn
+            // 
+            this.dATEAPPTMADEDataGridViewTextBoxColumn.DataPropertyName = "DATE_APPT_MADE";
+            this.dATEAPPTMADEDataGridViewTextBoxColumn.HeaderText = "Made on";
+            this.dATEAPPTMADEDataGridViewTextBoxColumn.Name = "dATEAPPTMADEDataGridViewTextBoxColumn";
+            this.dATEAPPTMADEDataGridViewTextBoxColumn.ReadOnly = true;
+            // 
+            // nOTEDataGridViewTextBoxColumn
+            // 
+            this.nOTEDataGridViewTextBoxColumn.DataPropertyName = "NOTE";
+            this.nOTEDataGridViewTextBoxColumn.HeaderText = "Note";
+            this.nOTEDataGridViewTextBoxColumn.Name = "nOTEDataGridViewTextBoxColumn";
+            this.nOTEDataGridViewTextBoxColumn.ReadOnly = true;
+            // 
+            // patientApptsBindingSource
+            // 
+            this.patientApptsBindingSource.DataMember = "PatientAppts";
+            this.patientApptsBindingSource.DataSource = this.dsPatientApptDisplay2BindingSource;
+            // 
+            // dsPatientApptDisplay2BindingSource
+            // 
+            this.dsPatientApptDisplay2BindingSource.DataSource = this.dsPatientApptDisplay2;
+            this.dsPatientApptDisplay2BindingSource.Position = 0;
+            // 
+            // dsPatientApptDisplay2
+            // 
+            this.dsPatientApptDisplay2.DataSetName = "dsPatientApptDisplay2";
+            this.dsPatientApptDisplay2.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
+            // 
+            // panel1
+            // 
+            this.panel1.Controls.Add(this.btnPrint);
+            this.panel1.Controls.Add(this.chkPastAppts);
+            this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
+            this.panel1.Location = new System.Drawing.Point(0, 0);
+            this.panel1.Name = "panel1";
+            this.panel1.Size = new System.Drawing.Size(544, 32);
+            this.panel1.TabIndex = 3;
+            // 
+            // btnPrint
+            // 
+            this.btnPrint.Location = new System.Drawing.Point(3, 3);
+            this.btnPrint.Name = "btnPrint";
+            this.btnPrint.Size = new System.Drawing.Size(75, 23);
+            this.btnPrint.TabIndex = 1;
+            this.btnPrint.Text = "Print";
+            this.btnPrint.UseVisualStyleBackColor = true;
+            this.btnPrint.Click += new System.EventHandler(this.btnPrint_Click);
+            // 
+            // chkPastAppts
+            // 
+            this.chkPastAppts.Anchor = System.Windows.Forms.AnchorStyles.Right;
+            this.chkPastAppts.AutoSize = true;
+            this.chkPastAppts.Location = new System.Drawing.Point(389, 3);
+            this.chkPastAppts.Name = "chkPastAppts";
+            this.chkPastAppts.Size = new System.Drawing.Size(152, 17);
+            this.chkPastAppts.TabIndex = 0;
+            this.chkPastAppts.Text = "Include Past Appointments";
+            this.chkPastAppts.UseVisualStyleBackColor = true;
+            this.chkPastAppts.CheckedChanged += new System.EventHandler(this.chkPastAppts_CheckedChanged);
+            // 
+            // printDialog1
+            // 
+            this.printDialog1.Document = this.PrintPtAppts;
+            this.printDialog1.UseEXDialog = true;
+            // 
+            // PrintPtAppts
+            // 
+            this.PrintPtAppts.DocumentName = "Print Patient Appointments";
+            this.PrintPtAppts.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.PrintPtAppts_PrintPage);
+            this.PrintPtAppts.QueryPageSettings += new System.Drawing.Printing.QueryPageSettingsEventHandler(this.PrintPtAppts_QueryPageSettings);
+            // 
+            // UCPatientAppts
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.dgAppts);
+            this.Controls.Add(this.panel1);
+            this.Name = "UCPatientAppts";
+            this.Size = new System.Drawing.Size(544, 203);
+            ((System.ComponentModel.ISupportInitialize)(this.dgAppts)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.patientApptsBindingSource)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.dsPatientApptDisplay2BindingSource)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.dsPatientApptDisplay2)).EndInit();
+            this.panel1.ResumeLayout(false);
+            this.panel1.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.DataGridView dgAppts;
+        private System.Windows.Forms.DataGridViewTextBoxColumn apptDateDataGridViewTextBoxColumn;
+        private System.Windows.Forms.DataGridViewTextBoxColumn clinicDataGridViewTextBoxColumn;
+        private System.Windows.Forms.DataGridViewTextBoxColumn aPPTMADEBYDataGridViewTextBoxColumn;
+        private System.Windows.Forms.DataGridViewTextBoxColumn dATEAPPTMADEDataGridViewTextBoxColumn;
+        private System.Windows.Forms.DataGridViewTextBoxColumn nOTEDataGridViewTextBoxColumn;
+        private System.Windows.Forms.BindingSource patientApptsBindingSource;
+        private System.Windows.Forms.BindingSource dsPatientApptDisplay2BindingSource;
+        private dsPatientApptDisplay2 dsPatientApptDisplay2;
+        private System.Windows.Forms.Panel panel1;
+        private System.Windows.Forms.CheckBox chkPastAppts;
+        private System.Windows.Forms.Button btnPrint;
+        private System.Windows.Forms.PrintDialog printDialog1;
+        private System.Drawing.Printing.PrintDocument PrintPtAppts;
+    }
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/UCPatientAppts.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/UCPatientAppts.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/UCPatientAppts.cs	(revision 1134)
@@ -0,0 +1,160 @@
+﻿using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using IndianHealthService.BMXNet;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+    /// <summary>
+    /// User Control that shows patient's appointments and allows printing
+    /// </summary>
+    public partial class UCPatientAppts : UserControl
+    {
+        DataTable dtAppt; // Main table
+        DataView dvAppt; // Manipulated view of table
+        int rowToPrint; // Used in printing
+        /// <summary>
+        /// Ctor - Creates control and populates data into datagridview
+        /// </summary>
+        /// <param name="docManager">Document Manager from main context</param>
+        /// <param name="nPatientID">Patient IEN</param>
+        public UCPatientAppts(CGDocumentManager docManager, int nPatientID)
+        {
+            InitializeComponent();
+            try
+            {
+                string sSql = "BSDX PATIENT APPT DISPLAY^" + nPatientID.ToString();
+                dtAppt = docManager.RPMSDataTable(sSql, "PatientAppts");
+            }
+            catch (Exception ex) { MessageBox.Show(ex.Message); }
+
+            SetPastFilter(false);
+            
+            // dgAppts.DataSource = dvAppt;
+        }
+        /// <summary>
+        /// Sets the filter for the DataView on whether to show past appointments or not
+        /// Uses LINQ. Must use .Net 3.5 or above. Hope the LINQ is self-explanatory.
+        /// </summary>
+        /// <param name="ShowPastAppts">boolean - self explanatory</param>
+        void SetPastFilter(bool ShowPastAppts)
+        {
+            if (ShowPastAppts)
+            {
+                var uncancelledAppts = from appt in dtAppt.AsEnumerable()
+                                       orderby appt.Field<DateTime>("ApptDate")
+                                       select appt;
+
+                dvAppt = uncancelledAppts.AsDataView();
+            }
+            else
+            {
+                var uncancelledAppts = from appt in dtAppt.AsEnumerable()
+                                       where appt.Field<DateTime>("ApptDate") > DateTime.Today
+                                       orderby appt.Field<DateTime>("ApptDate")
+                                       select appt;
+
+                dvAppt = uncancelledAppts.AsDataView();
+            }
+
+            // It's strange that I have to bind it here; but look like dvAppt points to a new memory
+            // location when reassigned up above in the LINQ statement, so we have to rebind it.
+            dgAppts.DataSource = dvAppt;
+        }
+
+        private void chkPastAppts_CheckedChanged(object sender, EventArgs e)
+        {
+            if (chkPastAppts.Checked) SetPastFilter(true);
+            else SetPastFilter(false);
+        }
+
+        private void PrintPtAppts_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
+        {
+            Graphics g = e.Graphics;
+            Font Serif12Bold = new Font(FontFamily.GenericSerif, 12, FontStyle.Bold);
+            Font Serif12 = new Font(FontFamily.GenericSerif, 12);
+            Font Serif14 = new Font(FontFamily.GenericSerif, 14);
+            Rectangle startDrawRectangle = e.MarginBounds;
+            int widthPerColumn = e.MarginBounds.Width/dgAppts.Columns.Count;
+            int Serif12Height = (int)Serif12.GetHeight();
+            
+            //Draw Header
+            StringFormat sf1 = new StringFormat();
+            sf1.Alignment = StringAlignment.Center;
+            g.DrawString("Appointment Listing", Serif14, Brushes.Black, startDrawRectangle, sf1);
+
+            startDrawRectangle.Y += (int)Serif14.GetHeight();
+
+            g.DrawString("Confidential Patient Information", Serif12, Brushes.Black, startDrawRectangle, sf1);
+            
+            startDrawRectangle.Y += Serif12Height * 2;
+
+            //Patient Name + Sex + DOB
+            string identifier = "Patient Name: " + dtAppt.Rows[0]["Name"] + "\tSex: " + dtAppt.Rows[0]["Sex"]
+                + "\tDate of Birth: " + dtAppt.Rows[0]["DOB"];
+            g.DrawString(identifier, Serif12, Brushes.Black, startDrawRectangle);
+
+            startDrawRectangle.Y += Serif12Height * 2;
+
+            foreach (DataGridViewColumn col in dgAppts.Columns)
+            {
+                g.DrawString(col.HeaderText, Serif12Bold, Brushes.Black, startDrawRectangle);
+                startDrawRectangle.X += widthPerColumn;
+            }
+            startDrawRectangle.Y += Serif12Height;
+
+            // rowToPrint initialized in print button handler. Helps us keep track of which row we
+            // are on, so that, just in case we need an extra page to print, we would know where
+            // we left off. Royal we of course.
+            for ( ; rowToPrint<dgAppts.Rows.Count; rowToPrint++)
+            {
+                // Post facto statement -- This is starting to look like Mumps...
+                // Start drawing a new page if you hit the bottom margin...
+                // Y incremented at the bottom of the for loop; but checked here
+                // because I need for statement stuff to happen first
+                if (startDrawRectangle.Y > e.MarginBounds.Bottom)
+                {
+                    e.HasMorePages = true;
+                    break;
+                } 
+
+                startDrawRectangle.X = e.MarginBounds.X;
+
+                foreach (DataGridViewCell cell in dgAppts.Rows[rowToPrint].Cells)
+                {
+                    g.DrawString(cell.Value.ToString(), Serif12, Brushes.Black, startDrawRectangle);
+                    startDrawRectangle.X += widthPerColumn;
+                }
+
+                startDrawRectangle.Y += Serif12Height;
+
+            }             
+        }
+
+        private void btnPrint_Click(object sender, EventArgs e)
+        {
+            //Fixes bug reported by EHS. Don't print if there are no appointments as this causes null ref
+            if (dtAppt.Rows.Count == 0)
+            {
+                MessageBox.Show("No Appointments to Print", "Nothing to Print");
+                return;
+            }
+
+            rowToPrint = 0; //reset row to print
+            DialogResult res = printDialog1.ShowDialog();
+            if (res == DialogResult.OK) this.printDialog1.Document.Print();
+        }
+
+        /// <summary>
+        /// Sets default page orientation to landscape.
+        /// </summary>
+        private void PrintPtAppts_QueryPageSettings(object sender, System.Drawing.Printing.QueryPageSettingsEventArgs e)
+        {
+            e.PageSettings.Landscape = true;
+        }
+
+    }
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/UCPatientAppts.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/UCPatientAppts.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/UCPatientAppts.resx	(revision 1134)
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="patientApptsBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>412, 17</value>
+  </metadata>
+  <metadata name="dsPatientApptDisplay2BindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>179, 17</value>
+  </metadata>
+  <metadata name="dsPatientApptDisplay2.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="printDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>597, 17</value>
+  </metadata>
+  <metadata name="PrintPtAppts.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>709, 17</value>
+  </metadata>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/UserPreferences.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/UserPreferences.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/UserPreferences.cs	(revision 1134)
@@ -0,0 +1,40 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+    /// <summary>
+    /// Designed to keep user preferences. Gets settings from DB in constructor; Writes them back when changed.
+    /// </summary>
+    public class UserPreferences
+    {
+        bool _printAppointmentSlipAutomacially;
+        bool _printRoutingSlipAutomatically;
+        
+        public UserPreferences()
+        {
+            _printAppointmentSlipAutomacially = CGDocumentManager.Current.DAL.AutoPrintAppointmentSlip;
+            _printRoutingSlipAutomatically = CGDocumentManager.Current.DAL.AutoPrintRoutingSlip;
+            
+        }
+
+        public bool PrintAppointmentSlipAutomacially {
+            get { return _printAppointmentSlipAutomacially; }
+            set
+            {
+                CGDocumentManager.Current.DAL.AutoPrintAppointmentSlip = _printAppointmentSlipAutomacially = value; 
+            }
+        }
+
+        public bool PrintRoutingSlipAutomatically
+        {
+            get { return _printRoutingSlipAutomatically; }
+            set 
+            { 
+                CGDocumentManager.Current.DAL.AutoPrintRoutingSlip = _printRoutingSlipAutomatically = value; 
+            }
+        }
+    }
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dInputText.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dInputText.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dInputText.cs	(revision 1134)
@@ -0,0 +1,136 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace IndianHealthService.ClinicalScheduling
+{
+	/// <summary>
+	/// Summary description for dInputText.
+	/// </summary>
+	public class dInputText : System.Windows.Forms.Form
+	{
+		private System.Windows.Forms.Panel pnlPageBottom;
+		private System.Windows.Forms.Button cmdCancel;
+		private System.Windows.Forms.TextBox txtInput;
+		private System.Windows.Forms.Button cmdOK;
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.Container components = null;
+
+		public dInputText()
+		{
+			InitializeComponent();
+		}
+
+		public string DialogTitle
+		{
+			get
+			{
+				return this.Text;
+			}
+			set
+			{
+				this.Text = value;
+			}
+		}
+
+		public string TextValue
+		{
+			get
+			{
+				return this.txtInput.Text;
+			}
+			set
+			{
+				this.txtInput.Text = value;
+			}
+		}
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose( bool disposing )
+		{
+			if( disposing )
+			{
+				if(components != null)
+				{
+					components.Dispose();
+				}
+			}
+			base.Dispose( disposing );
+		}
+
+		#region Windows Form Designer generated code
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.pnlPageBottom = new System.Windows.Forms.Panel();
+			this.cmdOK = new System.Windows.Forms.Button();
+			this.cmdCancel = new System.Windows.Forms.Button();
+			this.txtInput = new System.Windows.Forms.TextBox();
+			this.pnlPageBottom.SuspendLayout();
+			this.SuspendLayout();
+			// 
+			// pnlPageBottom
+			// 
+			this.pnlPageBottom.Controls.Add(this.cmdOK);
+			this.pnlPageBottom.Controls.Add(this.cmdCancel);
+			this.pnlPageBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.pnlPageBottom.Location = new System.Drawing.Point(0, 230);
+			this.pnlPageBottom.Name = "pnlPageBottom";
+			this.pnlPageBottom.Size = new System.Drawing.Size(496, 40);
+			this.pnlPageBottom.TabIndex = 4;
+			// 
+			// cmdOK
+			// 
+			this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+			this.cmdOK.Location = new System.Drawing.Point(272, 8);
+			this.cmdOK.Name = "cmdOK";
+			this.cmdOK.Size = new System.Drawing.Size(96, 24);
+			this.cmdOK.TabIndex = 1;
+			this.cmdOK.Text = "OK";
+			// 
+			// cmdCancel
+			// 
+			this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.cmdCancel.Location = new System.Drawing.Point(384, 8);
+			this.cmdCancel.Name = "cmdCancel";
+			this.cmdCancel.Size = new System.Drawing.Size(96, 24);
+			this.cmdCancel.TabIndex = 2;
+			this.cmdCancel.Text = "Cancel";
+			// 
+			// txtInput
+			// 
+			this.txtInput.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.txtInput.Location = new System.Drawing.Point(0, 0);
+			this.txtInput.Multiline = true;
+			this.txtInput.Name = "txtInput";
+			this.txtInput.Size = new System.Drawing.Size(496, 230);
+			this.txtInput.TabIndex = 0;
+			this.txtInput.Text = "";
+			// 
+			// dInputText
+			// 
+			this.AcceptButton = this.cmdOK;
+			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+			this.CancelButton = this.cmdCancel;
+			this.ClientSize = new System.Drawing.Size(496, 270);
+			this.Controls.Add(this.txtInput);
+			this.Controls.Add(this.pnlPageBottom);
+			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+			this.Name = "dInputText";
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "Clinical Scheduling";
+			this.pnlPageBottom.ResumeLayout(false);
+			this.ResumeLayout(false);
+
+		}
+		#endregion
+	}
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dInputText.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dInputText.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dInputText.resx	(revision 1134)
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 1.3
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">1.3</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1">this is my long string</data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        [base64 mime encoded serialized .NET Framework object]
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        [base64 mime encoded string representing a byte array form of the .NET Framework object]
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used forserialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>1.3</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="pnlPageBottom.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="pnlPageBottom.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="pnlPageBottom.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="pnlPageBottom.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="pnlPageBottom.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="pnlPageBottom.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdOK.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdOK.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdCancel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="cmdCancel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="cmdCancel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtInput.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="txtInput.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="txtInput.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+  <data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>(Default)</value>
+  </data>
+  <data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </data>
+  <data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>8, 8</value>
+  </data>
+  <data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.Name">
+    <value>dInputText</value>
+  </data>
+  <data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>80</value>
+  </data>
+  <data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </data>
+  <data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>Private</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsPatientApptDisplay2.Designer.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsPatientApptDisplay2.Designer.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsPatientApptDisplay2.Designer.cs	(revision 1134)
@@ -0,0 +1,1729 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.1
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+#pragma warning disable 1591
+
+namespace IndianHealthService.ClinicalScheduling {
+    
+    
+    /// <summary>
+    ///Represents a strongly typed in-memory cache of data.
+    ///</summary>
+    [global::System.Serializable()]
+    [global::System.ComponentModel.DesignerCategoryAttribute("code")]
+    [global::System.ComponentModel.ToolboxItem(true)]
+    [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedDataSetSchema")]
+    [global::System.Xml.Serialization.XmlRootAttribute("dsPatientApptDisplay2")]
+    [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.DataSet")]
+    public partial class dsPatientApptDisplay2 : global::System.Data.DataSet {
+        
+        private PatientApptsDataTable tablePatientAppts;
+        
+        private BSDXResourceDataTable tableBSDXResource;
+        
+        private global::System.Data.DataRelation relationFK_BSDXResource_PatientAppts;
+        
+        private global::System.Data.SchemaSerializationMode _schemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema;
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public dsPatientApptDisplay2() {
+            this.BeginInit();
+            this.InitClass();
+            global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
+            base.Tables.CollectionChanged += schemaChangedHandler;
+            base.Relations.CollectionChanged += schemaChangedHandler;
+            this.EndInit();
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected dsPatientApptDisplay2(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : 
+                base(info, context, false) {
+            if ((this.IsBinarySerialized(info, context) == true)) {
+                this.InitVars(false);
+                global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler1 = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
+                this.Tables.CollectionChanged += schemaChangedHandler1;
+                this.Relations.CollectionChanged += schemaChangedHandler1;
+                return;
+            }
+            string strSchema = ((string)(info.GetValue("XmlSchema", typeof(string))));
+            if ((this.DetermineSchemaSerializationMode(info, context) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
+                global::System.Data.DataSet ds = new global::System.Data.DataSet();
+                ds.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema)));
+                if ((ds.Tables["PatientAppts"] != null)) {
+                    base.Tables.Add(new PatientApptsDataTable(ds.Tables["PatientAppts"]));
+                }
+                if ((ds.Tables["BSDXResource"] != null)) {
+                    base.Tables.Add(new BSDXResourceDataTable(ds.Tables["BSDXResource"]));
+                }
+                this.DataSetName = ds.DataSetName;
+                this.Prefix = ds.Prefix;
+                this.Namespace = ds.Namespace;
+                this.Locale = ds.Locale;
+                this.CaseSensitive = ds.CaseSensitive;
+                this.EnforceConstraints = ds.EnforceConstraints;
+                this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
+                this.InitVars();
+            }
+            else {
+                this.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema)));
+            }
+            this.GetSerializationData(info, context);
+            global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
+            base.Tables.CollectionChanged += schemaChangedHandler;
+            this.Relations.CollectionChanged += schemaChangedHandler;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.Browsable(false)]
+        [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)]
+        public PatientApptsDataTable PatientAppts {
+            get {
+                return this.tablePatientAppts;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.Browsable(false)]
+        [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)]
+        public BSDXResourceDataTable BSDXResource {
+            get {
+                return this.tableBSDXResource;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.BrowsableAttribute(true)]
+        [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Visible)]
+        public override global::System.Data.SchemaSerializationMode SchemaSerializationMode {
+            get {
+                return this._schemaSerializationMode;
+            }
+            set {
+                this._schemaSerializationMode = value;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)]
+        public new global::System.Data.DataTableCollection Tables {
+            get {
+                return base.Tables;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)]
+        public new global::System.Data.DataRelationCollection Relations {
+            get {
+                return base.Relations;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected override void InitializeDerivedDataSet() {
+            this.BeginInit();
+            this.InitClass();
+            this.EndInit();
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public override global::System.Data.DataSet Clone() {
+            dsPatientApptDisplay2 cln = ((dsPatientApptDisplay2)(base.Clone()));
+            cln.InitVars();
+            cln.SchemaSerializationMode = this.SchemaSerializationMode;
+            return cln;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected override bool ShouldSerializeTables() {
+            return false;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected override bool ShouldSerializeRelations() {
+            return false;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected override void ReadXmlSerializable(global::System.Xml.XmlReader reader) {
+            if ((this.DetermineSchemaSerializationMode(reader) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
+                this.Reset();
+                global::System.Data.DataSet ds = new global::System.Data.DataSet();
+                ds.ReadXml(reader);
+                if ((ds.Tables["PatientAppts"] != null)) {
+                    base.Tables.Add(new PatientApptsDataTable(ds.Tables["PatientAppts"]));
+                }
+                if ((ds.Tables["BSDXResource"] != null)) {
+                    base.Tables.Add(new BSDXResourceDataTable(ds.Tables["BSDXResource"]));
+                }
+                this.DataSetName = ds.DataSetName;
+                this.Prefix = ds.Prefix;
+                this.Namespace = ds.Namespace;
+                this.Locale = ds.Locale;
+                this.CaseSensitive = ds.CaseSensitive;
+                this.EnforceConstraints = ds.EnforceConstraints;
+                this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
+                this.InitVars();
+            }
+            else {
+                this.ReadXml(reader);
+                this.InitVars();
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected override global::System.Xml.Schema.XmlSchema GetSchemaSerializable() {
+            global::System.IO.MemoryStream stream = new global::System.IO.MemoryStream();
+            this.WriteXmlSchema(new global::System.Xml.XmlTextWriter(stream, null));
+            stream.Position = 0;
+            return global::System.Xml.Schema.XmlSchema.Read(new global::System.Xml.XmlTextReader(stream), null);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        internal void InitVars() {
+            this.InitVars(true);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        internal void InitVars(bool initTable) {
+            this.tablePatientAppts = ((PatientApptsDataTable)(base.Tables["PatientAppts"]));
+            if ((initTable == true)) {
+                if ((this.tablePatientAppts != null)) {
+                    this.tablePatientAppts.InitVars();
+                }
+            }
+            this.tableBSDXResource = ((BSDXResourceDataTable)(base.Tables["BSDXResource"]));
+            if ((initTable == true)) {
+                if ((this.tableBSDXResource != null)) {
+                    this.tableBSDXResource.InitVars();
+                }
+            }
+            this.relationFK_BSDXResource_PatientAppts = this.Relations["FK_BSDXResource_PatientAppts"];
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        private void InitClass() {
+            this.DataSetName = "dsPatientApptDisplay2";
+            this.Prefix = "";
+            this.Namespace = "http://tempuri.org/dsPatientApptDisplay2.xsd";
+            this.EnforceConstraints = true;
+            this.SchemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema;
+            this.tablePatientAppts = new PatientApptsDataTable();
+            base.Tables.Add(this.tablePatientAppts);
+            this.tableBSDXResource = new BSDXResourceDataTable();
+            base.Tables.Add(this.tableBSDXResource);
+            global::System.Data.ForeignKeyConstraint fkc;
+            fkc = new global::System.Data.ForeignKeyConstraint("FK_BSDXResource_PatientAppts", new global::System.Data.DataColumn[] {
+                        this.tableBSDXResource.RESOURCEIDColumn}, new global::System.Data.DataColumn[] {
+                        this.tablePatientAppts.RESOURCEIDColumn});
+            this.tablePatientAppts.Constraints.Add(fkc);
+            fkc.AcceptRejectRule = global::System.Data.AcceptRejectRule.None;
+            fkc.DeleteRule = global::System.Data.Rule.Cascade;
+            fkc.UpdateRule = global::System.Data.Rule.Cascade;
+            this.relationFK_BSDXResource_PatientAppts = new global::System.Data.DataRelation("FK_BSDXResource_PatientAppts", new global::System.Data.DataColumn[] {
+                        this.tableBSDXResource.RESOURCEIDColumn}, new global::System.Data.DataColumn[] {
+                        this.tablePatientAppts.RESOURCEIDColumn}, false);
+            this.Relations.Add(this.relationFK_BSDXResource_PatientAppts);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        private bool ShouldSerializePatientAppts() {
+            return false;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        private bool ShouldSerializeBSDXResource() {
+            return false;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        private void SchemaChanged(object sender, global::System.ComponentModel.CollectionChangeEventArgs e) {
+            if ((e.Action == global::System.ComponentModel.CollectionChangeAction.Remove)) {
+                this.InitVars();
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedDataSetSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+            dsPatientApptDisplay2 ds = new dsPatientApptDisplay2();
+            global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+            global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+            global::System.Xml.Schema.XmlSchemaAny any = new global::System.Xml.Schema.XmlSchemaAny();
+            any.Namespace = ds.Namespace;
+            sequence.Items.Add(any);
+            type.Particle = sequence;
+            global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+            if (xs.Contains(dsSchema.TargetNamespace)) {
+                global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+                global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+                try {
+                    global::System.Xml.Schema.XmlSchema schema = null;
+                    dsSchema.Write(s1);
+                    for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+                        schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+                        s2.SetLength(0);
+                        schema.Write(s2);
+                        if ((s1.Length == s2.Length)) {
+                            s1.Position = 0;
+                            s2.Position = 0;
+                            for (; ((s1.Position != s1.Length) 
+                                        && (s1.ReadByte() == s2.ReadByte())); ) {
+                                ;
+                            }
+                            if ((s1.Position == s1.Length)) {
+                                return type;
+                            }
+                        }
+                    }
+                }
+                finally {
+                    if ((s1 != null)) {
+                        s1.Close();
+                    }
+                    if ((s2 != null)) {
+                        s2.Close();
+                    }
+                }
+            }
+            xs.Add(dsSchema);
+            return type;
+        }
+        
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public delegate void PatientApptsRowChangeEventHandler(object sender, PatientApptsRowChangeEvent e);
+        
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public delegate void BSDXResourceRowChangeEventHandler(object sender, BSDXResourceRowChangeEvent e);
+        
+        /// <summary>
+        ///Represents the strongly named DataTable class.
+        ///</summary>
+        [global::System.Serializable()]
+        [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
+        public partial class PatientApptsDataTable : global::System.Data.DataTable, global::System.Collections.IEnumerable {
+            
+            private global::System.Data.DataColumn columnName;
+            
+            private global::System.Data.DataColumn columnDOB;
+            
+            private global::System.Data.DataColumn columnSex;
+            
+            private global::System.Data.DataColumn columnHRN;
+            
+            private global::System.Data.DataColumn columnApptDate;
+            
+            private global::System.Data.DataColumn columnClinic;
+            
+            private global::System.Data.DataColumn columnTypeStatus;
+            
+            private global::System.Data.DataColumn columnRESOURCEID;
+            
+            private global::System.Data.DataColumn columnAPPT_MADE_BY;
+            
+            private global::System.Data.DataColumn columnDATE_APPT_MADE;
+            
+            private global::System.Data.DataColumn columnNOTE;
+            
+            private global::System.Data.DataColumn columnSTREET;
+            
+            private global::System.Data.DataColumn columnCITY;
+            
+            private global::System.Data.DataColumn columnSTATE;
+            
+            private global::System.Data.DataColumn columnZIP;
+            
+            private global::System.Data.DataColumn columnHOMEPHONE;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PatientApptsDataTable() {
+                this.TableName = "PatientAppts";
+                this.BeginInit();
+                this.InitClass();
+                this.EndInit();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            internal PatientApptsDataTable(global::System.Data.DataTable table) {
+                this.TableName = table.TableName;
+                if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
+                    this.CaseSensitive = table.CaseSensitive;
+                }
+                if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
+                    this.Locale = table.Locale;
+                }
+                if ((table.Namespace != table.DataSet.Namespace)) {
+                    this.Namespace = table.Namespace;
+                }
+                this.Prefix = table.Prefix;
+                this.MinimumCapacity = table.MinimumCapacity;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected PatientApptsDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : 
+                    base(info, context) {
+                this.InitVars();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn NameColumn {
+                get {
+                    return this.columnName;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn DOBColumn {
+                get {
+                    return this.columnDOB;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn SexColumn {
+                get {
+                    return this.columnSex;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn HRNColumn {
+                get {
+                    return this.columnHRN;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn ApptDateColumn {
+                get {
+                    return this.columnApptDate;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn ClinicColumn {
+                get {
+                    return this.columnClinic;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn TypeStatusColumn {
+                get {
+                    return this.columnTypeStatus;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn RESOURCEIDColumn {
+                get {
+                    return this.columnRESOURCEID;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn APPT_MADE_BYColumn {
+                get {
+                    return this.columnAPPT_MADE_BY;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn DATE_APPT_MADEColumn {
+                get {
+                    return this.columnDATE_APPT_MADE;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn NOTEColumn {
+                get {
+                    return this.columnNOTE;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn STREETColumn {
+                get {
+                    return this.columnSTREET;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn CITYColumn {
+                get {
+                    return this.columnCITY;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn STATEColumn {
+                get {
+                    return this.columnSTATE;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn ZIPColumn {
+                get {
+                    return this.columnZIP;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn HOMEPHONEColumn {
+                get {
+                    return this.columnHOMEPHONE;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            [global::System.ComponentModel.Browsable(false)]
+            public int Count {
+                get {
+                    return this.Rows.Count;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PatientApptsRow this[int index] {
+                get {
+                    return ((PatientApptsRow)(this.Rows[index]));
+                }
+            }
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event PatientApptsRowChangeEventHandler PatientApptsRowChanging;
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event PatientApptsRowChangeEventHandler PatientApptsRowChanged;
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event PatientApptsRowChangeEventHandler PatientApptsRowDeleting;
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event PatientApptsRowChangeEventHandler PatientApptsRowDeleted;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void AddPatientApptsRow(PatientApptsRow row) {
+                this.Rows.Add(row);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PatientApptsRow AddPatientApptsRow(
+                        string Name, 
+                        System.DateTime DOB, 
+                        string Sex, 
+                        string HRN, 
+                        System.DateTime ApptDate, 
+                        string Clinic, 
+                        string TypeStatus, 
+                        BSDXResourceRow parentBSDXResourceRowByFK_BSDXResource_PatientAppts, 
+                        string APPT_MADE_BY, 
+                        System.DateTime DATE_APPT_MADE, 
+                        string NOTE, 
+                        string STREET, 
+                        string CITY, 
+                        string STATE, 
+                        string ZIP, 
+                        string HOMEPHONE) {
+                PatientApptsRow rowPatientApptsRow = ((PatientApptsRow)(this.NewRow()));
+                object[] columnValuesArray = new object[] {
+                        Name,
+                        DOB,
+                        Sex,
+                        HRN,
+                        ApptDate,
+                        Clinic,
+                        TypeStatus,
+                        null,
+                        APPT_MADE_BY,
+                        DATE_APPT_MADE,
+                        NOTE,
+                        STREET,
+                        CITY,
+                        STATE,
+                        ZIP,
+                        HOMEPHONE};
+                if ((parentBSDXResourceRowByFK_BSDXResource_PatientAppts != null)) {
+                    columnValuesArray[7] = parentBSDXResourceRowByFK_BSDXResource_PatientAppts[0];
+                }
+                rowPatientApptsRow.ItemArray = columnValuesArray;
+                this.Rows.Add(rowPatientApptsRow);
+                return rowPatientApptsRow;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public virtual global::System.Collections.IEnumerator GetEnumerator() {
+                return this.Rows.GetEnumerator();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public override global::System.Data.DataTable Clone() {
+                PatientApptsDataTable cln = ((PatientApptsDataTable)(base.Clone()));
+                cln.InitVars();
+                return cln;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override global::System.Data.DataTable CreateInstance() {
+                return new PatientApptsDataTable();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            internal void InitVars() {
+                this.columnName = base.Columns["Name"];
+                this.columnDOB = base.Columns["DOB"];
+                this.columnSex = base.Columns["Sex"];
+                this.columnHRN = base.Columns["HRN"];
+                this.columnApptDate = base.Columns["ApptDate"];
+                this.columnClinic = base.Columns["Clinic"];
+                this.columnTypeStatus = base.Columns["TypeStatus"];
+                this.columnRESOURCEID = base.Columns["RESOURCEID"];
+                this.columnAPPT_MADE_BY = base.Columns["APPT_MADE_BY"];
+                this.columnDATE_APPT_MADE = base.Columns["DATE_APPT_MADE"];
+                this.columnNOTE = base.Columns["NOTE"];
+                this.columnSTREET = base.Columns["STREET"];
+                this.columnCITY = base.Columns["CITY"];
+                this.columnSTATE = base.Columns["STATE"];
+                this.columnZIP = base.Columns["ZIP"];
+                this.columnHOMEPHONE = base.Columns["HOMEPHONE"];
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            private void InitClass() {
+                this.columnName = new global::System.Data.DataColumn("Name", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnName);
+                this.columnDOB = new global::System.Data.DataColumn("DOB", typeof(global::System.DateTime), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnDOB);
+                this.columnSex = new global::System.Data.DataColumn("Sex", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnSex);
+                this.columnHRN = new global::System.Data.DataColumn("HRN", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnHRN);
+                this.columnApptDate = new global::System.Data.DataColumn("ApptDate", typeof(global::System.DateTime), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnApptDate);
+                this.columnClinic = new global::System.Data.DataColumn("Clinic", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnClinic);
+                this.columnTypeStatus = new global::System.Data.DataColumn("TypeStatus", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnTypeStatus);
+                this.columnRESOURCEID = new global::System.Data.DataColumn("RESOURCEID", typeof(int), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnRESOURCEID);
+                this.columnAPPT_MADE_BY = new global::System.Data.DataColumn("APPT_MADE_BY", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnAPPT_MADE_BY);
+                this.columnDATE_APPT_MADE = new global::System.Data.DataColumn("DATE_APPT_MADE", typeof(global::System.DateTime), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnDATE_APPT_MADE);
+                this.columnNOTE = new global::System.Data.DataColumn("NOTE", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnNOTE);
+                this.columnSTREET = new global::System.Data.DataColumn("STREET", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnSTREET);
+                this.columnCITY = new global::System.Data.DataColumn("CITY", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnCITY);
+                this.columnSTATE = new global::System.Data.DataColumn("STATE", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnSTATE);
+                this.columnZIP = new global::System.Data.DataColumn("ZIP", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnZIP);
+                this.columnHOMEPHONE = new global::System.Data.DataColumn("HOMEPHONE", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnHOMEPHONE);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PatientApptsRow NewPatientApptsRow() {
+                return ((PatientApptsRow)(this.NewRow()));
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
+                return new PatientApptsRow(builder);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override global::System.Type GetRowType() {
+                return typeof(PatientApptsRow);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowChanged(e);
+                if ((this.PatientApptsRowChanged != null)) {
+                    this.PatientApptsRowChanged(this, new PatientApptsRowChangeEvent(((PatientApptsRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowChanging(e);
+                if ((this.PatientApptsRowChanging != null)) {
+                    this.PatientApptsRowChanging(this, new PatientApptsRowChangeEvent(((PatientApptsRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowDeleted(e);
+                if ((this.PatientApptsRowDeleted != null)) {
+                    this.PatientApptsRowDeleted(this, new PatientApptsRowChangeEvent(((PatientApptsRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowDeleting(e);
+                if ((this.PatientApptsRowDeleting != null)) {
+                    this.PatientApptsRowDeleting(this, new PatientApptsRowChangeEvent(((PatientApptsRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void RemovePatientApptsRow(PatientApptsRow row) {
+                this.Rows.Remove(row);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+                global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+                global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+                dsPatientApptDisplay2 ds = new dsPatientApptDisplay2();
+                global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();
+                any1.Namespace = "http://www.w3.org/2001/XMLSchema";
+                any1.MinOccurs = new decimal(0);
+                any1.MaxOccurs = decimal.MaxValue;
+                any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+                sequence.Items.Add(any1);
+                global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();
+                any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
+                any2.MinOccurs = new decimal(1);
+                any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+                sequence.Items.Add(any2);
+                global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();
+                attribute1.Name = "namespace";
+                attribute1.FixedValue = ds.Namespace;
+                type.Attributes.Add(attribute1);
+                global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();
+                attribute2.Name = "tableTypeName";
+                attribute2.FixedValue = "PatientApptsDataTable";
+                type.Attributes.Add(attribute2);
+                type.Particle = sequence;
+                global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+                if (xs.Contains(dsSchema.TargetNamespace)) {
+                    global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+                    global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+                    try {
+                        global::System.Xml.Schema.XmlSchema schema = null;
+                        dsSchema.Write(s1);
+                        for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+                            schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+                            s2.SetLength(0);
+                            schema.Write(s2);
+                            if ((s1.Length == s2.Length)) {
+                                s1.Position = 0;
+                                s2.Position = 0;
+                                for (; ((s1.Position != s1.Length) 
+                                            && (s1.ReadByte() == s2.ReadByte())); ) {
+                                    ;
+                                }
+                                if ((s1.Position == s1.Length)) {
+                                    return type;
+                                }
+                            }
+                        }
+                    }
+                    finally {
+                        if ((s1 != null)) {
+                            s1.Close();
+                        }
+                        if ((s2 != null)) {
+                            s2.Close();
+                        }
+                    }
+                }
+                xs.Add(dsSchema);
+                return type;
+            }
+        }
+        
+        /// <summary>
+        ///Represents the strongly named DataTable class.
+        ///</summary>
+        [global::System.Serializable()]
+        [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
+        public partial class BSDXResourceDataTable : global::System.Data.DataTable, global::System.Collections.IEnumerable {
+            
+            private global::System.Data.DataColumn columnRESOURCEID;
+            
+            private global::System.Data.DataColumn columnRESOURCE_NAME;
+            
+            private global::System.Data.DataColumn columnLETTER_TEXT;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public BSDXResourceDataTable() {
+                this.TableName = "BSDXResource";
+                this.BeginInit();
+                this.InitClass();
+                this.EndInit();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            internal BSDXResourceDataTable(global::System.Data.DataTable table) {
+                this.TableName = table.TableName;
+                if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
+                    this.CaseSensitive = table.CaseSensitive;
+                }
+                if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
+                    this.Locale = table.Locale;
+                }
+                if ((table.Namespace != table.DataSet.Namespace)) {
+                    this.Namespace = table.Namespace;
+                }
+                this.Prefix = table.Prefix;
+                this.MinimumCapacity = table.MinimumCapacity;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected BSDXResourceDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : 
+                    base(info, context) {
+                this.InitVars();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn RESOURCEIDColumn {
+                get {
+                    return this.columnRESOURCEID;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn RESOURCE_NAMEColumn {
+                get {
+                    return this.columnRESOURCE_NAME;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn LETTER_TEXTColumn {
+                get {
+                    return this.columnLETTER_TEXT;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            [global::System.ComponentModel.Browsable(false)]
+            public int Count {
+                get {
+                    return this.Rows.Count;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public BSDXResourceRow this[int index] {
+                get {
+                    return ((BSDXResourceRow)(this.Rows[index]));
+                }
+            }
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event BSDXResourceRowChangeEventHandler BSDXResourceRowChanging;
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event BSDXResourceRowChangeEventHandler BSDXResourceRowChanged;
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event BSDXResourceRowChangeEventHandler BSDXResourceRowDeleting;
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event BSDXResourceRowChangeEventHandler BSDXResourceRowDeleted;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void AddBSDXResourceRow(BSDXResourceRow row) {
+                this.Rows.Add(row);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public BSDXResourceRow AddBSDXResourceRow(int RESOURCEID, string RESOURCE_NAME, string LETTER_TEXT) {
+                BSDXResourceRow rowBSDXResourceRow = ((BSDXResourceRow)(this.NewRow()));
+                object[] columnValuesArray = new object[] {
+                        RESOURCEID,
+                        RESOURCE_NAME,
+                        LETTER_TEXT};
+                rowBSDXResourceRow.ItemArray = columnValuesArray;
+                this.Rows.Add(rowBSDXResourceRow);
+                return rowBSDXResourceRow;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public virtual global::System.Collections.IEnumerator GetEnumerator() {
+                return this.Rows.GetEnumerator();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public override global::System.Data.DataTable Clone() {
+                BSDXResourceDataTable cln = ((BSDXResourceDataTable)(base.Clone()));
+                cln.InitVars();
+                return cln;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override global::System.Data.DataTable CreateInstance() {
+                return new BSDXResourceDataTable();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            internal void InitVars() {
+                this.columnRESOURCEID = base.Columns["RESOURCEID"];
+                this.columnRESOURCE_NAME = base.Columns["RESOURCE_NAME"];
+                this.columnLETTER_TEXT = base.Columns["LETTER_TEXT"];
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            private void InitClass() {
+                this.columnRESOURCEID = new global::System.Data.DataColumn("RESOURCEID", typeof(int), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnRESOURCEID);
+                this.columnRESOURCE_NAME = new global::System.Data.DataColumn("RESOURCE_NAME", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnRESOURCE_NAME);
+                this.columnLETTER_TEXT = new global::System.Data.DataColumn("LETTER_TEXT", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnLETTER_TEXT);
+                this.Constraints.Add(new global::System.Data.UniqueConstraint("kBSDXResourceID", new global::System.Data.DataColumn[] {
+                                this.columnRESOURCEID}, false));
+                this.columnRESOURCEID.AllowDBNull = false;
+                this.columnRESOURCEID.Unique = true;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public BSDXResourceRow NewBSDXResourceRow() {
+                return ((BSDXResourceRow)(this.NewRow()));
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
+                return new BSDXResourceRow(builder);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override global::System.Type GetRowType() {
+                return typeof(BSDXResourceRow);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowChanged(e);
+                if ((this.BSDXResourceRowChanged != null)) {
+                    this.BSDXResourceRowChanged(this, new BSDXResourceRowChangeEvent(((BSDXResourceRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowChanging(e);
+                if ((this.BSDXResourceRowChanging != null)) {
+                    this.BSDXResourceRowChanging(this, new BSDXResourceRowChangeEvent(((BSDXResourceRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowDeleted(e);
+                if ((this.BSDXResourceRowDeleted != null)) {
+                    this.BSDXResourceRowDeleted(this, new BSDXResourceRowChangeEvent(((BSDXResourceRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowDeleting(e);
+                if ((this.BSDXResourceRowDeleting != null)) {
+                    this.BSDXResourceRowDeleting(this, new BSDXResourceRowChangeEvent(((BSDXResourceRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void RemoveBSDXResourceRow(BSDXResourceRow row) {
+                this.Rows.Remove(row);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+                global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+                global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+                dsPatientApptDisplay2 ds = new dsPatientApptDisplay2();
+                global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();
+                any1.Namespace = "http://www.w3.org/2001/XMLSchema";
+                any1.MinOccurs = new decimal(0);
+                any1.MaxOccurs = decimal.MaxValue;
+                any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+                sequence.Items.Add(any1);
+                global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();
+                any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
+                any2.MinOccurs = new decimal(1);
+                any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+                sequence.Items.Add(any2);
+                global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();
+                attribute1.Name = "namespace";
+                attribute1.FixedValue = ds.Namespace;
+                type.Attributes.Add(attribute1);
+                global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();
+                attribute2.Name = "tableTypeName";
+                attribute2.FixedValue = "BSDXResourceDataTable";
+                type.Attributes.Add(attribute2);
+                type.Particle = sequence;
+                global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+                if (xs.Contains(dsSchema.TargetNamespace)) {
+                    global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+                    global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+                    try {
+                        global::System.Xml.Schema.XmlSchema schema = null;
+                        dsSchema.Write(s1);
+                        for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+                            schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+                            s2.SetLength(0);
+                            schema.Write(s2);
+                            if ((s1.Length == s2.Length)) {
+                                s1.Position = 0;
+                                s2.Position = 0;
+                                for (; ((s1.Position != s1.Length) 
+                                            && (s1.ReadByte() == s2.ReadByte())); ) {
+                                    ;
+                                }
+                                if ((s1.Position == s1.Length)) {
+                                    return type;
+                                }
+                            }
+                        }
+                    }
+                    finally {
+                        if ((s1 != null)) {
+                            s1.Close();
+                        }
+                        if ((s2 != null)) {
+                            s2.Close();
+                        }
+                    }
+                }
+                xs.Add(dsSchema);
+                return type;
+            }
+        }
+        
+        /// <summary>
+        ///Represents strongly named DataRow class.
+        ///</summary>
+        public partial class PatientApptsRow : global::System.Data.DataRow {
+            
+            private PatientApptsDataTable tablePatientAppts;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            internal PatientApptsRow(global::System.Data.DataRowBuilder rb) : 
+                    base(rb) {
+                this.tablePatientAppts = ((PatientApptsDataTable)(this.Table));
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string Name {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.NameColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'Name\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.NameColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public System.DateTime DOB {
+                get {
+                    try {
+                        return ((global::System.DateTime)(this[this.tablePatientAppts.DOBColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'DOB\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.DOBColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string Sex {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.SexColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'Sex\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.SexColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string HRN {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.HRNColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'HRN\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.HRNColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public System.DateTime ApptDate {
+                get {
+                    try {
+                        return ((global::System.DateTime)(this[this.tablePatientAppts.ApptDateColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'ApptDate\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.ApptDateColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string Clinic {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.ClinicColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'Clinic\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.ClinicColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string TypeStatus {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.TypeStatusColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'TypeStatus\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.TypeStatusColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public int RESOURCEID {
+                get {
+                    try {
+                        return ((int)(this[this.tablePatientAppts.RESOURCEIDColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'RESOURCEID\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.RESOURCEIDColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string APPT_MADE_BY {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.APPT_MADE_BYColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'APPT_MADE_BY\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.APPT_MADE_BYColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public System.DateTime DATE_APPT_MADE {
+                get {
+                    try {
+                        return ((global::System.DateTime)(this[this.tablePatientAppts.DATE_APPT_MADEColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'DATE_APPT_MADE\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.DATE_APPT_MADEColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string NOTE {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.NOTEColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'NOTE\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.NOTEColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string STREET {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.STREETColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'STREET\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.STREETColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string CITY {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.CITYColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'CITY\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.CITYColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string STATE {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.STATEColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'STATE\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.STATEColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string ZIP {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.ZIPColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'ZIP\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.ZIPColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string HOMEPHONE {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.HOMEPHONEColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'HOMEPHONE\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.HOMEPHONEColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public BSDXResourceRow BSDXResourceRow {
+                get {
+                    return ((BSDXResourceRow)(this.GetParentRow(this.Table.ParentRelations["FK_BSDXResource_PatientAppts"])));
+                }
+                set {
+                    this.SetParentRow(value, this.Table.ParentRelations["FK_BSDXResource_PatientAppts"]);
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsNameNull() {
+                return this.IsNull(this.tablePatientAppts.NameColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetNameNull() {
+                this[this.tablePatientAppts.NameColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsDOBNull() {
+                return this.IsNull(this.tablePatientAppts.DOBColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetDOBNull() {
+                this[this.tablePatientAppts.DOBColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsSexNull() {
+                return this.IsNull(this.tablePatientAppts.SexColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetSexNull() {
+                this[this.tablePatientAppts.SexColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsHRNNull() {
+                return this.IsNull(this.tablePatientAppts.HRNColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetHRNNull() {
+                this[this.tablePatientAppts.HRNColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsApptDateNull() {
+                return this.IsNull(this.tablePatientAppts.ApptDateColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetApptDateNull() {
+                this[this.tablePatientAppts.ApptDateColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsClinicNull() {
+                return this.IsNull(this.tablePatientAppts.ClinicColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetClinicNull() {
+                this[this.tablePatientAppts.ClinicColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsTypeStatusNull() {
+                return this.IsNull(this.tablePatientAppts.TypeStatusColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetTypeStatusNull() {
+                this[this.tablePatientAppts.TypeStatusColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsRESOURCEIDNull() {
+                return this.IsNull(this.tablePatientAppts.RESOURCEIDColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetRESOURCEIDNull() {
+                this[this.tablePatientAppts.RESOURCEIDColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsAPPT_MADE_BYNull() {
+                return this.IsNull(this.tablePatientAppts.APPT_MADE_BYColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetAPPT_MADE_BYNull() {
+                this[this.tablePatientAppts.APPT_MADE_BYColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsDATE_APPT_MADENull() {
+                return this.IsNull(this.tablePatientAppts.DATE_APPT_MADEColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetDATE_APPT_MADENull() {
+                this[this.tablePatientAppts.DATE_APPT_MADEColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsNOTENull() {
+                return this.IsNull(this.tablePatientAppts.NOTEColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetNOTENull() {
+                this[this.tablePatientAppts.NOTEColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsSTREETNull() {
+                return this.IsNull(this.tablePatientAppts.STREETColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetSTREETNull() {
+                this[this.tablePatientAppts.STREETColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsCITYNull() {
+                return this.IsNull(this.tablePatientAppts.CITYColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetCITYNull() {
+                this[this.tablePatientAppts.CITYColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsSTATENull() {
+                return this.IsNull(this.tablePatientAppts.STATEColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetSTATENull() {
+                this[this.tablePatientAppts.STATEColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsZIPNull() {
+                return this.IsNull(this.tablePatientAppts.ZIPColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetZIPNull() {
+                this[this.tablePatientAppts.ZIPColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsHOMEPHONENull() {
+                return this.IsNull(this.tablePatientAppts.HOMEPHONEColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetHOMEPHONENull() {
+                this[this.tablePatientAppts.HOMEPHONEColumn] = global::System.Convert.DBNull;
+            }
+        }
+        
+        /// <summary>
+        ///Represents strongly named DataRow class.
+        ///</summary>
+        public partial class BSDXResourceRow : global::System.Data.DataRow {
+            
+            private BSDXResourceDataTable tableBSDXResource;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            internal BSDXResourceRow(global::System.Data.DataRowBuilder rb) : 
+                    base(rb) {
+                this.tableBSDXResource = ((BSDXResourceDataTable)(this.Table));
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public int RESOURCEID {
+                get {
+                    return ((int)(this[this.tableBSDXResource.RESOURCEIDColumn]));
+                }
+                set {
+                    this[this.tableBSDXResource.RESOURCEIDColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string RESOURCE_NAME {
+                get {
+                    try {
+                        return ((string)(this[this.tableBSDXResource.RESOURCE_NAMEColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'RESOURCE_NAME\' in table \'BSDXResource\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tableBSDXResource.RESOURCE_NAMEColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string LETTER_TEXT {
+                get {
+                    try {
+                        return ((string)(this[this.tableBSDXResource.LETTER_TEXTColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'LETTER_TEXT\' in table \'BSDXResource\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tableBSDXResource.LETTER_TEXTColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsRESOURCE_NAMENull() {
+                return this.IsNull(this.tableBSDXResource.RESOURCE_NAMEColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetRESOURCE_NAMENull() {
+                this[this.tableBSDXResource.RESOURCE_NAMEColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsLETTER_TEXTNull() {
+                return this.IsNull(this.tableBSDXResource.LETTER_TEXTColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetLETTER_TEXTNull() {
+                this[this.tableBSDXResource.LETTER_TEXTColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PatientApptsRow[] GetPatientApptsRows() {
+                if ((this.Table.ChildRelations["FK_BSDXResource_PatientAppts"] == null)) {
+                    return new PatientApptsRow[0];
+                }
+                else {
+                    return ((PatientApptsRow[])(base.GetChildRows(this.Table.ChildRelations["FK_BSDXResource_PatientAppts"])));
+                }
+            }
+        }
+        
+        /// <summary>
+        ///Row event argument class
+        ///</summary>
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public class PatientApptsRowChangeEvent : global::System.EventArgs {
+            
+            private PatientApptsRow eventRow;
+            
+            private global::System.Data.DataRowAction eventAction;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PatientApptsRowChangeEvent(PatientApptsRow row, global::System.Data.DataRowAction action) {
+                this.eventRow = row;
+                this.eventAction = action;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PatientApptsRow Row {
+                get {
+                    return this.eventRow;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataRowAction Action {
+                get {
+                    return this.eventAction;
+                }
+            }
+        }
+        
+        /// <summary>
+        ///Row event argument class
+        ///</summary>
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public class BSDXResourceRowChangeEvent : global::System.EventArgs {
+            
+            private BSDXResourceRow eventRow;
+            
+            private global::System.Data.DataRowAction eventAction;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public BSDXResourceRowChangeEvent(BSDXResourceRow row, global::System.Data.DataRowAction action) {
+                this.eventRow = row;
+                this.eventAction = action;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public BSDXResourceRow Row {
+                get {
+                    return this.eventRow;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataRowAction Action {
+                get {
+                    return this.eventAction;
+                }
+            }
+        }
+    }
+}
+
+#pragma warning restore 1591
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsPatientApptDisplay2.xsd
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsPatientApptDisplay2.xsd	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsPatientApptDisplay2.xsd	(revision 1134)
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema id="dsPatientApptDisplay2" targetNamespace="http://tempuri.org/dsPatientApptDisplay2.xsd" xmlns:mstns="http://tempuri.org/dsPatientApptDisplay2.xsd" xmlns="http://tempuri.org/dsPatientApptDisplay2.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop" attributeFormDefault="qualified" elementFormDefault="qualified">
+  <xs:annotation>
+    <xs:appinfo source="urn:schemas-microsoft-com:xml-msdatasource">
+      <DataSource DefaultConnectionIndex="0" FunctionsComponentName="QueriesTableAdapter" Modifier="AutoLayout, AnsiClass, Class, Public" SchemaSerializationMode="IncludeSchema" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+        <Connections />
+        <Tables />
+        <Sources />
+      </DataSource>
+    </xs:appinfo>
+  </xs:annotation>
+  <xs:element name="dsPatientApptDisplay2" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:Generator_UserDSName="dsPatientApptDisplay2" msprop:Generator_DataSetName="dsPatientApptDisplay2">
+    <xs:complexType>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element name="PatientAppts" msprop:Generator_UserTableName="PatientAppts" msprop:Generator_RowDeletedName="PatientApptsRowDeleted" msprop:Generator_TableClassName="PatientApptsDataTable" msprop:Generator_RowChangedName="PatientApptsRowChanged" msprop:Generator_RowClassName="PatientApptsRow" msprop:Generator_RowChangingName="PatientApptsRowChanging" msprop:Generator_RowEvArgName="PatientApptsRowChangeEvent" msprop:Generator_RowEvHandlerName="PatientApptsRowChangeEventHandler" msprop:Generator_TablePropName="PatientAppts" msprop:Generator_TableVarName="tablePatientAppts" msprop:Generator_RowDeletingName="PatientApptsRowDeleting">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element name="Name" msprop:Generator_UserColumnName="Name" msprop:Generator_ColumnPropNameInRow="Name" msprop:Generator_ColumnVarNameInTable="columnName" msprop:Generator_ColumnPropNameInTable="NameColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="DOB" msprop:Generator_UserColumnName="DOB" msprop:Generator_ColumnPropNameInRow="DOB" msprop:Generator_ColumnVarNameInTable="columnDOB" msprop:Generator_ColumnPropNameInTable="DOBColumn" type="xs:date" minOccurs="0" />
+              <xs:element name="Sex" msprop:Generator_UserColumnName="Sex" msprop:Generator_ColumnPropNameInRow="Sex" msprop:Generator_ColumnVarNameInTable="columnSex" msprop:Generator_ColumnPropNameInTable="SexColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="HRN" msprop:Generator_UserColumnName="HRN" msprop:Generator_ColumnPropNameInRow="HRN" msprop:Generator_ColumnVarNameInTable="columnHRN" msprop:Generator_ColumnPropNameInTable="HRNColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="ApptDate" msprop:Generator_UserColumnName="ApptDate" msprop:Generator_ColumnPropNameInRow="ApptDate" msprop:Generator_ColumnVarNameInTable="columnApptDate" msprop:Generator_ColumnPropNameInTable="ApptDateColumn" type="xs:date" minOccurs="0" />
+              <xs:element name="Clinic" msprop:Generator_UserColumnName="Clinic" msprop:Generator_ColumnPropNameInRow="Clinic" msprop:Generator_ColumnVarNameInTable="columnClinic" msprop:Generator_ColumnPropNameInTable="ClinicColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="TypeStatus" msprop:Generator_UserColumnName="TypeStatus" msprop:Generator_ColumnPropNameInRow="TypeStatus" msprop:Generator_ColumnVarNameInTable="columnTypeStatus" msprop:Generator_ColumnPropNameInTable="TypeStatusColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="RESOURCEID" msprop:Generator_UserColumnName="RESOURCEID" msprop:Generator_ColumnPropNameInRow="RESOURCEID" msprop:Generator_ColumnVarNameInTable="columnRESOURCEID" msprop:Generator_ColumnPropNameInTable="RESOURCEIDColumn" type="xs:int" minOccurs="0" />
+              <xs:element name="APPT_MADE_BY" msprop:Generator_UserColumnName="APPT_MADE_BY" msprop:Generator_ColumnPropNameInRow="APPT_MADE_BY" msprop:Generator_ColumnVarNameInTable="columnAPPT_MADE_BY" msprop:Generator_ColumnPropNameInTable="APPT_MADE_BYColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="DATE_APPT_MADE" msprop:Generator_UserColumnName="DATE_APPT_MADE" msprop:Generator_ColumnPropNameInRow="DATE_APPT_MADE" msprop:Generator_ColumnVarNameInTable="columnDATE_APPT_MADE" msprop:Generator_ColumnPropNameInTable="DATE_APPT_MADEColumn" type="xs:date" minOccurs="0" />
+              <xs:element name="NOTE" msprop:Generator_UserColumnName="NOTE" msprop:Generator_ColumnPropNameInRow="NOTE" msprop:Generator_ColumnVarNameInTable="columnNOTE" msprop:Generator_ColumnPropNameInTable="NOTEColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="STREET" msprop:Generator_UserColumnName="STREET" msprop:Generator_ColumnPropNameInRow="STREET" msprop:Generator_ColumnVarNameInTable="columnSTREET" msprop:Generator_ColumnPropNameInTable="STREETColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="CITY" msprop:Generator_UserColumnName="CITY" msprop:Generator_ColumnPropNameInRow="CITY" msprop:Generator_ColumnVarNameInTable="columnCITY" msprop:Generator_ColumnPropNameInTable="CITYColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="STATE" msprop:Generator_UserColumnName="STATE" msprop:Generator_ColumnPropNameInRow="STATE" msprop:Generator_ColumnVarNameInTable="columnSTATE" msprop:Generator_ColumnPropNameInTable="STATEColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="ZIP" msprop:Generator_UserColumnName="ZIP" msprop:Generator_ColumnPropNameInRow="ZIP" msprop:Generator_ColumnVarNameInTable="columnZIP" msprop:Generator_ColumnPropNameInTable="ZIPColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="HOMEPHONE" msprop:Generator_UserColumnName="HOMEPHONE" msprop:Generator_ColumnPropNameInRow="HOMEPHONE" msprop:Generator_ColumnVarNameInTable="columnHOMEPHONE" msprop:Generator_ColumnPropNameInTable="HOMEPHONEColumn" type="xs:string" minOccurs="0" />
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element name="BSDXResource" msprop:Generator_UserTableName="BSDXResource" msprop:Generator_RowDeletedName="BSDXResourceRowDeleted" msprop:Generator_TableClassName="BSDXResourceDataTable" msprop:Generator_RowChangedName="BSDXResourceRowChanged" msprop:Generator_RowClassName="BSDXResourceRow" msprop:Generator_RowChangingName="BSDXResourceRowChanging" msprop:Generator_RowEvArgName="BSDXResourceRowChangeEvent" msprop:Generator_RowEvHandlerName="BSDXResourceRowChangeEventHandler" msprop:Generator_TablePropName="BSDXResource" msprop:Generator_TableVarName="tableBSDXResource" msprop:Generator_RowDeletingName="BSDXResourceRowDeleting">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element name="RESOURCEID" msprop:Generator_UserColumnName="RESOURCEID" msprop:Generator_ColumnPropNameInRow="RESOURCEID" msprop:Generator_ColumnVarNameInTable="columnRESOURCEID" msprop:Generator_ColumnPropNameInTable="RESOURCEIDColumn" type="xs:int" />
+              <xs:element name="RESOURCE_NAME" msprop:Generator_UserColumnName="RESOURCE_NAME" msprop:Generator_ColumnPropNameInRow="RESOURCE_NAME" msprop:Generator_ColumnVarNameInTable="columnRESOURCE_NAME" msprop:Generator_ColumnPropNameInTable="RESOURCE_NAMEColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="LETTER_TEXT" msprop:Generator_UserColumnName="LETTER_TEXT" msprop:Generator_ColumnPropNameInRow="LETTER_TEXT" msprop:Generator_ColumnVarNameInTable="columnLETTER_TEXT" msprop:Generator_ColumnPropNameInTable="LETTER_TEXTColumn" type="xs:string" minOccurs="0" />
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+      </xs:choice>
+    </xs:complexType>
+    <xs:unique name="kBSDXResourceID">
+      <xs:selector xpath=".//mstns:BSDXResource" />
+      <xs:field xpath="mstns:RESOURCEID" />
+    </xs:unique>
+    <xs:keyref name="FK_BSDXResource_PatientAppts" refer="kBSDXResourceID" msprop:rel_Generator_UserRelationName="FK_BSDXResource_PatientAppts" msprop:rel_Generator_RelationVarName="relationFK_BSDXResource_PatientAppts" msprop:rel_Generator_UserChildTable="PatientAppts" msprop:rel_Generator_UserParentTable="BSDXResource" msprop:rel_Generator_ParentPropName="BSDXResourceRow" msprop:rel_Generator_ChildPropName="GetPatientApptsRows">
+      <xs:selector xpath=".//mstns:PatientAppts" />
+      <xs:field xpath="mstns:RESOURCEID" />
+    </xs:keyref>
+  </xs:element>
+</xs:schema>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsPatientApptDisplay2.xsx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsPatientApptDisplay2.xsx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsPatientApptDisplay2.xsx	(revision 1134)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--This file is auto-generated by the XML Schema Designer. It holds layout information for components on the designer surface.-->
+<XSDDesignerLayout layoutVersion="2" viewPortLeft="0" viewPortTop="0" zoom="100">
+    <PatientAppts_XmlElement left="1693" top="635" width="6403" height="5503" selected="0" zOrder="1" index="0" expanded="1" />
+    <BSDXResource_XmlElement left="11218" top="1403" width="7514" height="3810" selected="0" zOrder="2" index="1" expanded="1" />
+    <BSDXResourcePatientAppts_XmlKeyref left="9314" top="3135" width="503" height="503" selected="0" zOrder="4" />
+</XSDDesignerLayout>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsRebookAppts.Designer.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsRebookAppts.Designer.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsRebookAppts.Designer.cs	(revision 1134)
@@ -0,0 +1,1857 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.1
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+#pragma warning disable 1591
+
+namespace IndianHealthService.ClinicalScheduling {
+    
+    
+    /// <summary>
+    ///Represents a strongly typed in-memory cache of data.
+    ///</summary>
+    [global::System.Serializable()]
+    [global::System.ComponentModel.DesignerCategoryAttribute("code")]
+    [global::System.ComponentModel.ToolboxItem(true)]
+    [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedDataSetSchema")]
+    [global::System.Xml.Serialization.XmlRootAttribute("dsRebookAppts")]
+    [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.DataSet")]
+    public partial class dsRebookAppts : global::System.Data.DataSet {
+        
+        private PatientApptsDataTable tablePatientAppts;
+        
+        private BSDXResourceDataTable tableBSDXResource;
+        
+        private global::System.Data.DataRelation relationFK_BSDXResource_PatientAppts;
+        
+        private global::System.Data.SchemaSerializationMode _schemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema;
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public dsRebookAppts() {
+            this.BeginInit();
+            this.InitClass();
+            global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
+            base.Tables.CollectionChanged += schemaChangedHandler;
+            base.Relations.CollectionChanged += schemaChangedHandler;
+            this.EndInit();
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected dsRebookAppts(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : 
+                base(info, context, false) {
+            if ((this.IsBinarySerialized(info, context) == true)) {
+                this.InitVars(false);
+                global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler1 = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
+                this.Tables.CollectionChanged += schemaChangedHandler1;
+                this.Relations.CollectionChanged += schemaChangedHandler1;
+                return;
+            }
+            string strSchema = ((string)(info.GetValue("XmlSchema", typeof(string))));
+            if ((this.DetermineSchemaSerializationMode(info, context) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
+                global::System.Data.DataSet ds = new global::System.Data.DataSet();
+                ds.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema)));
+                if ((ds.Tables["PatientAppts"] != null)) {
+                    base.Tables.Add(new PatientApptsDataTable(ds.Tables["PatientAppts"]));
+                }
+                if ((ds.Tables["BSDXResource"] != null)) {
+                    base.Tables.Add(new BSDXResourceDataTable(ds.Tables["BSDXResource"]));
+                }
+                this.DataSetName = ds.DataSetName;
+                this.Prefix = ds.Prefix;
+                this.Namespace = ds.Namespace;
+                this.Locale = ds.Locale;
+                this.CaseSensitive = ds.CaseSensitive;
+                this.EnforceConstraints = ds.EnforceConstraints;
+                this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
+                this.InitVars();
+            }
+            else {
+                this.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema)));
+            }
+            this.GetSerializationData(info, context);
+            global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
+            base.Tables.CollectionChanged += schemaChangedHandler;
+            this.Relations.CollectionChanged += schemaChangedHandler;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.Browsable(false)]
+        [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)]
+        public PatientApptsDataTable PatientAppts {
+            get {
+                return this.tablePatientAppts;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.Browsable(false)]
+        [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)]
+        public BSDXResourceDataTable BSDXResource {
+            get {
+                return this.tableBSDXResource;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.BrowsableAttribute(true)]
+        [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Visible)]
+        public override global::System.Data.SchemaSerializationMode SchemaSerializationMode {
+            get {
+                return this._schemaSerializationMode;
+            }
+            set {
+                this._schemaSerializationMode = value;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)]
+        public new global::System.Data.DataTableCollection Tables {
+            get {
+                return base.Tables;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)]
+        public new global::System.Data.DataRelationCollection Relations {
+            get {
+                return base.Relations;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected override void InitializeDerivedDataSet() {
+            this.BeginInit();
+            this.InitClass();
+            this.EndInit();
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public override global::System.Data.DataSet Clone() {
+            dsRebookAppts cln = ((dsRebookAppts)(base.Clone()));
+            cln.InitVars();
+            cln.SchemaSerializationMode = this.SchemaSerializationMode;
+            return cln;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected override bool ShouldSerializeTables() {
+            return false;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected override bool ShouldSerializeRelations() {
+            return false;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected override void ReadXmlSerializable(global::System.Xml.XmlReader reader) {
+            if ((this.DetermineSchemaSerializationMode(reader) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
+                this.Reset();
+                global::System.Data.DataSet ds = new global::System.Data.DataSet();
+                ds.ReadXml(reader);
+                if ((ds.Tables["PatientAppts"] != null)) {
+                    base.Tables.Add(new PatientApptsDataTable(ds.Tables["PatientAppts"]));
+                }
+                if ((ds.Tables["BSDXResource"] != null)) {
+                    base.Tables.Add(new BSDXResourceDataTable(ds.Tables["BSDXResource"]));
+                }
+                this.DataSetName = ds.DataSetName;
+                this.Prefix = ds.Prefix;
+                this.Namespace = ds.Namespace;
+                this.Locale = ds.Locale;
+                this.CaseSensitive = ds.CaseSensitive;
+                this.EnforceConstraints = ds.EnforceConstraints;
+                this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
+                this.InitVars();
+            }
+            else {
+                this.ReadXml(reader);
+                this.InitVars();
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected override global::System.Xml.Schema.XmlSchema GetSchemaSerializable() {
+            global::System.IO.MemoryStream stream = new global::System.IO.MemoryStream();
+            this.WriteXmlSchema(new global::System.Xml.XmlTextWriter(stream, null));
+            stream.Position = 0;
+            return global::System.Xml.Schema.XmlSchema.Read(new global::System.Xml.XmlTextReader(stream), null);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        internal void InitVars() {
+            this.InitVars(true);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        internal void InitVars(bool initTable) {
+            this.tablePatientAppts = ((PatientApptsDataTable)(base.Tables["PatientAppts"]));
+            if ((initTable == true)) {
+                if ((this.tablePatientAppts != null)) {
+                    this.tablePatientAppts.InitVars();
+                }
+            }
+            this.tableBSDXResource = ((BSDXResourceDataTable)(base.Tables["BSDXResource"]));
+            if ((initTable == true)) {
+                if ((this.tableBSDXResource != null)) {
+                    this.tableBSDXResource.InitVars();
+                }
+            }
+            this.relationFK_BSDXResource_PatientAppts = this.Relations["FK_BSDXResource_PatientAppts"];
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        private void InitClass() {
+            this.DataSetName = "dsRebookAppts";
+            this.Prefix = "";
+            this.Namespace = "http://tempuri.org/dsRebookAppts.xsd";
+            this.EnforceConstraints = true;
+            this.SchemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema;
+            this.tablePatientAppts = new PatientApptsDataTable();
+            base.Tables.Add(this.tablePatientAppts);
+            this.tableBSDXResource = new BSDXResourceDataTable();
+            base.Tables.Add(this.tableBSDXResource);
+            global::System.Data.ForeignKeyConstraint fkc;
+            fkc = new global::System.Data.ForeignKeyConstraint("FK_BSDXResource_PatientAppts", new global::System.Data.DataColumn[] {
+                        this.tableBSDXResource.RESOURCEIDColumn}, new global::System.Data.DataColumn[] {
+                        this.tablePatientAppts.RESOURCEIDColumn});
+            this.tablePatientAppts.Constraints.Add(fkc);
+            fkc.AcceptRejectRule = global::System.Data.AcceptRejectRule.None;
+            fkc.DeleteRule = global::System.Data.Rule.Cascade;
+            fkc.UpdateRule = global::System.Data.Rule.Cascade;
+            this.relationFK_BSDXResource_PatientAppts = new global::System.Data.DataRelation("FK_BSDXResource_PatientAppts", new global::System.Data.DataColumn[] {
+                        this.tableBSDXResource.RESOURCEIDColumn}, new global::System.Data.DataColumn[] {
+                        this.tablePatientAppts.RESOURCEIDColumn}, false);
+            this.Relations.Add(this.relationFK_BSDXResource_PatientAppts);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        private bool ShouldSerializePatientAppts() {
+            return false;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        private bool ShouldSerializeBSDXResource() {
+            return false;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        private void SchemaChanged(object sender, global::System.ComponentModel.CollectionChangeEventArgs e) {
+            if ((e.Action == global::System.ComponentModel.CollectionChangeAction.Remove)) {
+                this.InitVars();
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedDataSetSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+            dsRebookAppts ds = new dsRebookAppts();
+            global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+            global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+            global::System.Xml.Schema.XmlSchemaAny any = new global::System.Xml.Schema.XmlSchemaAny();
+            any.Namespace = ds.Namespace;
+            sequence.Items.Add(any);
+            type.Particle = sequence;
+            global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+            if (xs.Contains(dsSchema.TargetNamespace)) {
+                global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+                global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+                try {
+                    global::System.Xml.Schema.XmlSchema schema = null;
+                    dsSchema.Write(s1);
+                    for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+                        schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+                        s2.SetLength(0);
+                        schema.Write(s2);
+                        if ((s1.Length == s2.Length)) {
+                            s1.Position = 0;
+                            s2.Position = 0;
+                            for (; ((s1.Position != s1.Length) 
+                                        && (s1.ReadByte() == s2.ReadByte())); ) {
+                                ;
+                            }
+                            if ((s1.Position == s1.Length)) {
+                                return type;
+                            }
+                        }
+                    }
+                }
+                finally {
+                    if ((s1 != null)) {
+                        s1.Close();
+                    }
+                    if ((s2 != null)) {
+                        s2.Close();
+                    }
+                }
+            }
+            xs.Add(dsSchema);
+            return type;
+        }
+        
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public delegate void PatientApptsRowChangeEventHandler(object sender, PatientApptsRowChangeEvent e);
+        
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public delegate void BSDXResourceRowChangeEventHandler(object sender, BSDXResourceRowChangeEvent e);
+        
+        /// <summary>
+        ///Represents the strongly named DataTable class.
+        ///</summary>
+        [global::System.Serializable()]
+        [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
+        public partial class PatientApptsDataTable : global::System.Data.DataTable, global::System.Collections.IEnumerable {
+            
+            private global::System.Data.DataColumn columnName;
+            
+            private global::System.Data.DataColumn columnDOB;
+            
+            private global::System.Data.DataColumn columnSex;
+            
+            private global::System.Data.DataColumn columnHRN;
+            
+            private global::System.Data.DataColumn columnNewApptDate;
+            
+            private global::System.Data.DataColumn columnClinic;
+            
+            private global::System.Data.DataColumn columnTypeStatus;
+            
+            private global::System.Data.DataColumn columnRESOURCEID;
+            
+            private global::System.Data.DataColumn columnAPPT_MADE_BY;
+            
+            private global::System.Data.DataColumn columnDATE_APPT_MADE;
+            
+            private global::System.Data.DataColumn columnNOTE;
+            
+            private global::System.Data.DataColumn columnSTREET;
+            
+            private global::System.Data.DataColumn columnCITY;
+            
+            private global::System.Data.DataColumn columnSTATE;
+            
+            private global::System.Data.DataColumn columnZIP;
+            
+            private global::System.Data.DataColumn columnHOMEPHONE;
+            
+            private global::System.Data.DataColumn columnOldApptDate;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PatientApptsDataTable() {
+                this.TableName = "PatientAppts";
+                this.BeginInit();
+                this.InitClass();
+                this.EndInit();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            internal PatientApptsDataTable(global::System.Data.DataTable table) {
+                this.TableName = table.TableName;
+                if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
+                    this.CaseSensitive = table.CaseSensitive;
+                }
+                if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
+                    this.Locale = table.Locale;
+                }
+                if ((table.Namespace != table.DataSet.Namespace)) {
+                    this.Namespace = table.Namespace;
+                }
+                this.Prefix = table.Prefix;
+                this.MinimumCapacity = table.MinimumCapacity;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected PatientApptsDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : 
+                    base(info, context) {
+                this.InitVars();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn NameColumn {
+                get {
+                    return this.columnName;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn DOBColumn {
+                get {
+                    return this.columnDOB;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn SexColumn {
+                get {
+                    return this.columnSex;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn HRNColumn {
+                get {
+                    return this.columnHRN;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn NewApptDateColumn {
+                get {
+                    return this.columnNewApptDate;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn ClinicColumn {
+                get {
+                    return this.columnClinic;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn TypeStatusColumn {
+                get {
+                    return this.columnTypeStatus;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn RESOURCEIDColumn {
+                get {
+                    return this.columnRESOURCEID;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn APPT_MADE_BYColumn {
+                get {
+                    return this.columnAPPT_MADE_BY;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn DATE_APPT_MADEColumn {
+                get {
+                    return this.columnDATE_APPT_MADE;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn NOTEColumn {
+                get {
+                    return this.columnNOTE;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn STREETColumn {
+                get {
+                    return this.columnSTREET;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn CITYColumn {
+                get {
+                    return this.columnCITY;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn STATEColumn {
+                get {
+                    return this.columnSTATE;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn ZIPColumn {
+                get {
+                    return this.columnZIP;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn HOMEPHONEColumn {
+                get {
+                    return this.columnHOMEPHONE;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn OldApptDateColumn {
+                get {
+                    return this.columnOldApptDate;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            [global::System.ComponentModel.Browsable(false)]
+            public int Count {
+                get {
+                    return this.Rows.Count;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PatientApptsRow this[int index] {
+                get {
+                    return ((PatientApptsRow)(this.Rows[index]));
+                }
+            }
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event PatientApptsRowChangeEventHandler PatientApptsRowChanging;
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event PatientApptsRowChangeEventHandler PatientApptsRowChanged;
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event PatientApptsRowChangeEventHandler PatientApptsRowDeleting;
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event PatientApptsRowChangeEventHandler PatientApptsRowDeleted;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void AddPatientApptsRow(PatientApptsRow row) {
+                this.Rows.Add(row);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PatientApptsRow AddPatientApptsRow(
+                        string Name, 
+                        System.DateTime DOB, 
+                        string Sex, 
+                        string HRN, 
+                        System.DateTime NewApptDate, 
+                        string Clinic, 
+                        string TypeStatus, 
+                        BSDXResourceRow parentBSDXResourceRowByFK_BSDXResource_PatientAppts, 
+                        string APPT_MADE_BY, 
+                        System.DateTime DATE_APPT_MADE, 
+                        string NOTE, 
+                        string STREET, 
+                        string CITY, 
+                        string STATE, 
+                        string ZIP, 
+                        string HOMEPHONE, 
+                        System.DateTime OldApptDate) {
+                PatientApptsRow rowPatientApptsRow = ((PatientApptsRow)(this.NewRow()));
+                object[] columnValuesArray = new object[] {
+                        Name,
+                        DOB,
+                        Sex,
+                        HRN,
+                        NewApptDate,
+                        Clinic,
+                        TypeStatus,
+                        null,
+                        APPT_MADE_BY,
+                        DATE_APPT_MADE,
+                        NOTE,
+                        STREET,
+                        CITY,
+                        STATE,
+                        ZIP,
+                        HOMEPHONE,
+                        OldApptDate};
+                if ((parentBSDXResourceRowByFK_BSDXResource_PatientAppts != null)) {
+                    columnValuesArray[7] = parentBSDXResourceRowByFK_BSDXResource_PatientAppts[0];
+                }
+                rowPatientApptsRow.ItemArray = columnValuesArray;
+                this.Rows.Add(rowPatientApptsRow);
+                return rowPatientApptsRow;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public virtual global::System.Collections.IEnumerator GetEnumerator() {
+                return this.Rows.GetEnumerator();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public override global::System.Data.DataTable Clone() {
+                PatientApptsDataTable cln = ((PatientApptsDataTable)(base.Clone()));
+                cln.InitVars();
+                return cln;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override global::System.Data.DataTable CreateInstance() {
+                return new PatientApptsDataTable();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            internal void InitVars() {
+                this.columnName = base.Columns["Name"];
+                this.columnDOB = base.Columns["DOB"];
+                this.columnSex = base.Columns["Sex"];
+                this.columnHRN = base.Columns["HRN"];
+                this.columnNewApptDate = base.Columns["NewApptDate"];
+                this.columnClinic = base.Columns["Clinic"];
+                this.columnTypeStatus = base.Columns["TypeStatus"];
+                this.columnRESOURCEID = base.Columns["RESOURCEID"];
+                this.columnAPPT_MADE_BY = base.Columns["APPT_MADE_BY"];
+                this.columnDATE_APPT_MADE = base.Columns["DATE_APPT_MADE"];
+                this.columnNOTE = base.Columns["NOTE"];
+                this.columnSTREET = base.Columns["STREET"];
+                this.columnCITY = base.Columns["CITY"];
+                this.columnSTATE = base.Columns["STATE"];
+                this.columnZIP = base.Columns["ZIP"];
+                this.columnHOMEPHONE = base.Columns["HOMEPHONE"];
+                this.columnOldApptDate = base.Columns["OldApptDate"];
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            private void InitClass() {
+                this.columnName = new global::System.Data.DataColumn("Name", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnName);
+                this.columnDOB = new global::System.Data.DataColumn("DOB", typeof(global::System.DateTime), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnDOB);
+                this.columnSex = new global::System.Data.DataColumn("Sex", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnSex);
+                this.columnHRN = new global::System.Data.DataColumn("HRN", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnHRN);
+                this.columnNewApptDate = new global::System.Data.DataColumn("NewApptDate", typeof(global::System.DateTime), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnNewApptDate);
+                this.columnClinic = new global::System.Data.DataColumn("Clinic", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnClinic);
+                this.columnTypeStatus = new global::System.Data.DataColumn("TypeStatus", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnTypeStatus);
+                this.columnRESOURCEID = new global::System.Data.DataColumn("RESOURCEID", typeof(int), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnRESOURCEID);
+                this.columnAPPT_MADE_BY = new global::System.Data.DataColumn("APPT_MADE_BY", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnAPPT_MADE_BY);
+                this.columnDATE_APPT_MADE = new global::System.Data.DataColumn("DATE_APPT_MADE", typeof(global::System.DateTime), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnDATE_APPT_MADE);
+                this.columnNOTE = new global::System.Data.DataColumn("NOTE", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnNOTE);
+                this.columnSTREET = new global::System.Data.DataColumn("STREET", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnSTREET);
+                this.columnCITY = new global::System.Data.DataColumn("CITY", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnCITY);
+                this.columnSTATE = new global::System.Data.DataColumn("STATE", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnSTATE);
+                this.columnZIP = new global::System.Data.DataColumn("ZIP", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnZIP);
+                this.columnHOMEPHONE = new global::System.Data.DataColumn("HOMEPHONE", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnHOMEPHONE);
+                this.columnOldApptDate = new global::System.Data.DataColumn("OldApptDate", typeof(global::System.DateTime), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnOldApptDate);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PatientApptsRow NewPatientApptsRow() {
+                return ((PatientApptsRow)(this.NewRow()));
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
+                return new PatientApptsRow(builder);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override global::System.Type GetRowType() {
+                return typeof(PatientApptsRow);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowChanged(e);
+                if ((this.PatientApptsRowChanged != null)) {
+                    this.PatientApptsRowChanged(this, new PatientApptsRowChangeEvent(((PatientApptsRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowChanging(e);
+                if ((this.PatientApptsRowChanging != null)) {
+                    this.PatientApptsRowChanging(this, new PatientApptsRowChangeEvent(((PatientApptsRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowDeleted(e);
+                if ((this.PatientApptsRowDeleted != null)) {
+                    this.PatientApptsRowDeleted(this, new PatientApptsRowChangeEvent(((PatientApptsRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowDeleting(e);
+                if ((this.PatientApptsRowDeleting != null)) {
+                    this.PatientApptsRowDeleting(this, new PatientApptsRowChangeEvent(((PatientApptsRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void RemovePatientApptsRow(PatientApptsRow row) {
+                this.Rows.Remove(row);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+                global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+                global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+                dsRebookAppts ds = new dsRebookAppts();
+                global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();
+                any1.Namespace = "http://www.w3.org/2001/XMLSchema";
+                any1.MinOccurs = new decimal(0);
+                any1.MaxOccurs = decimal.MaxValue;
+                any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+                sequence.Items.Add(any1);
+                global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();
+                any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
+                any2.MinOccurs = new decimal(1);
+                any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+                sequence.Items.Add(any2);
+                global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();
+                attribute1.Name = "namespace";
+                attribute1.FixedValue = ds.Namespace;
+                type.Attributes.Add(attribute1);
+                global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();
+                attribute2.Name = "tableTypeName";
+                attribute2.FixedValue = "PatientApptsDataTable";
+                type.Attributes.Add(attribute2);
+                type.Particle = sequence;
+                global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+                if (xs.Contains(dsSchema.TargetNamespace)) {
+                    global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+                    global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+                    try {
+                        global::System.Xml.Schema.XmlSchema schema = null;
+                        dsSchema.Write(s1);
+                        for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+                            schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+                            s2.SetLength(0);
+                            schema.Write(s2);
+                            if ((s1.Length == s2.Length)) {
+                                s1.Position = 0;
+                                s2.Position = 0;
+                                for (; ((s1.Position != s1.Length) 
+                                            && (s1.ReadByte() == s2.ReadByte())); ) {
+                                    ;
+                                }
+                                if ((s1.Position == s1.Length)) {
+                                    return type;
+                                }
+                            }
+                        }
+                    }
+                    finally {
+                        if ((s1 != null)) {
+                            s1.Close();
+                        }
+                        if ((s2 != null)) {
+                            s2.Close();
+                        }
+                    }
+                }
+                xs.Add(dsSchema);
+                return type;
+            }
+        }
+        
+        /// <summary>
+        ///Represents the strongly named DataTable class.
+        ///</summary>
+        [global::System.Serializable()]
+        [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
+        public partial class BSDXResourceDataTable : global::System.Data.DataTable, global::System.Collections.IEnumerable {
+            
+            private global::System.Data.DataColumn columnRESOURCEID;
+            
+            private global::System.Data.DataColumn columnRESOURCE_NAME;
+            
+            private global::System.Data.DataColumn columnLETTER_TEXT;
+            
+            private global::System.Data.DataColumn columnNO_SHOW_LETTER;
+            
+            private global::System.Data.DataColumn columnCLINIC_CANCELLATION_LETTER;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public BSDXResourceDataTable() {
+                this.TableName = "BSDXResource";
+                this.BeginInit();
+                this.InitClass();
+                this.EndInit();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            internal BSDXResourceDataTable(global::System.Data.DataTable table) {
+                this.TableName = table.TableName;
+                if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
+                    this.CaseSensitive = table.CaseSensitive;
+                }
+                if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
+                    this.Locale = table.Locale;
+                }
+                if ((table.Namespace != table.DataSet.Namespace)) {
+                    this.Namespace = table.Namespace;
+                }
+                this.Prefix = table.Prefix;
+                this.MinimumCapacity = table.MinimumCapacity;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected BSDXResourceDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : 
+                    base(info, context) {
+                this.InitVars();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn RESOURCEIDColumn {
+                get {
+                    return this.columnRESOURCEID;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn RESOURCE_NAMEColumn {
+                get {
+                    return this.columnRESOURCE_NAME;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn LETTER_TEXTColumn {
+                get {
+                    return this.columnLETTER_TEXT;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn NO_SHOW_LETTERColumn {
+                get {
+                    return this.columnNO_SHOW_LETTER;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn CLINIC_CANCELLATION_LETTERColumn {
+                get {
+                    return this.columnCLINIC_CANCELLATION_LETTER;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            [global::System.ComponentModel.Browsable(false)]
+            public int Count {
+                get {
+                    return this.Rows.Count;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public BSDXResourceRow this[int index] {
+                get {
+                    return ((BSDXResourceRow)(this.Rows[index]));
+                }
+            }
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event BSDXResourceRowChangeEventHandler BSDXResourceRowChanging;
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event BSDXResourceRowChangeEventHandler BSDXResourceRowChanged;
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event BSDXResourceRowChangeEventHandler BSDXResourceRowDeleting;
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event BSDXResourceRowChangeEventHandler BSDXResourceRowDeleted;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void AddBSDXResourceRow(BSDXResourceRow row) {
+                this.Rows.Add(row);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public BSDXResourceRow AddBSDXResourceRow(int RESOURCEID, string RESOURCE_NAME, string LETTER_TEXT, string NO_SHOW_LETTER, string CLINIC_CANCELLATION_LETTER) {
+                BSDXResourceRow rowBSDXResourceRow = ((BSDXResourceRow)(this.NewRow()));
+                object[] columnValuesArray = new object[] {
+                        RESOURCEID,
+                        RESOURCE_NAME,
+                        LETTER_TEXT,
+                        NO_SHOW_LETTER,
+                        CLINIC_CANCELLATION_LETTER};
+                rowBSDXResourceRow.ItemArray = columnValuesArray;
+                this.Rows.Add(rowBSDXResourceRow);
+                return rowBSDXResourceRow;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public virtual global::System.Collections.IEnumerator GetEnumerator() {
+                return this.Rows.GetEnumerator();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public override global::System.Data.DataTable Clone() {
+                BSDXResourceDataTable cln = ((BSDXResourceDataTable)(base.Clone()));
+                cln.InitVars();
+                return cln;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override global::System.Data.DataTable CreateInstance() {
+                return new BSDXResourceDataTable();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            internal void InitVars() {
+                this.columnRESOURCEID = base.Columns["RESOURCEID"];
+                this.columnRESOURCE_NAME = base.Columns["RESOURCE_NAME"];
+                this.columnLETTER_TEXT = base.Columns["LETTER_TEXT"];
+                this.columnNO_SHOW_LETTER = base.Columns["NO_SHOW_LETTER"];
+                this.columnCLINIC_CANCELLATION_LETTER = base.Columns["CLINIC_CANCELLATION_LETTER"];
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            private void InitClass() {
+                this.columnRESOURCEID = new global::System.Data.DataColumn("RESOURCEID", typeof(int), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnRESOURCEID);
+                this.columnRESOURCE_NAME = new global::System.Data.DataColumn("RESOURCE_NAME", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnRESOURCE_NAME);
+                this.columnLETTER_TEXT = new global::System.Data.DataColumn("LETTER_TEXT", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnLETTER_TEXT);
+                this.columnNO_SHOW_LETTER = new global::System.Data.DataColumn("NO_SHOW_LETTER", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnNO_SHOW_LETTER);
+                this.columnCLINIC_CANCELLATION_LETTER = new global::System.Data.DataColumn("CLINIC_CANCELLATION_LETTER", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnCLINIC_CANCELLATION_LETTER);
+                this.Constraints.Add(new global::System.Data.UniqueConstraint("kBSDXResourceID", new global::System.Data.DataColumn[] {
+                                this.columnRESOURCEID}, false));
+                this.columnRESOURCEID.AllowDBNull = false;
+                this.columnRESOURCEID.Unique = true;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public BSDXResourceRow NewBSDXResourceRow() {
+                return ((BSDXResourceRow)(this.NewRow()));
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
+                return new BSDXResourceRow(builder);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override global::System.Type GetRowType() {
+                return typeof(BSDXResourceRow);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowChanged(e);
+                if ((this.BSDXResourceRowChanged != null)) {
+                    this.BSDXResourceRowChanged(this, new BSDXResourceRowChangeEvent(((BSDXResourceRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowChanging(e);
+                if ((this.BSDXResourceRowChanging != null)) {
+                    this.BSDXResourceRowChanging(this, new BSDXResourceRowChangeEvent(((BSDXResourceRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowDeleted(e);
+                if ((this.BSDXResourceRowDeleted != null)) {
+                    this.BSDXResourceRowDeleted(this, new BSDXResourceRowChangeEvent(((BSDXResourceRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowDeleting(e);
+                if ((this.BSDXResourceRowDeleting != null)) {
+                    this.BSDXResourceRowDeleting(this, new BSDXResourceRowChangeEvent(((BSDXResourceRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void RemoveBSDXResourceRow(BSDXResourceRow row) {
+                this.Rows.Remove(row);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+                global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+                global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+                dsRebookAppts ds = new dsRebookAppts();
+                global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();
+                any1.Namespace = "http://www.w3.org/2001/XMLSchema";
+                any1.MinOccurs = new decimal(0);
+                any1.MaxOccurs = decimal.MaxValue;
+                any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+                sequence.Items.Add(any1);
+                global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();
+                any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
+                any2.MinOccurs = new decimal(1);
+                any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+                sequence.Items.Add(any2);
+                global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();
+                attribute1.Name = "namespace";
+                attribute1.FixedValue = ds.Namespace;
+                type.Attributes.Add(attribute1);
+                global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();
+                attribute2.Name = "tableTypeName";
+                attribute2.FixedValue = "BSDXResourceDataTable";
+                type.Attributes.Add(attribute2);
+                type.Particle = sequence;
+                global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+                if (xs.Contains(dsSchema.TargetNamespace)) {
+                    global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+                    global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+                    try {
+                        global::System.Xml.Schema.XmlSchema schema = null;
+                        dsSchema.Write(s1);
+                        for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+                            schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+                            s2.SetLength(0);
+                            schema.Write(s2);
+                            if ((s1.Length == s2.Length)) {
+                                s1.Position = 0;
+                                s2.Position = 0;
+                                for (; ((s1.Position != s1.Length) 
+                                            && (s1.ReadByte() == s2.ReadByte())); ) {
+                                    ;
+                                }
+                                if ((s1.Position == s1.Length)) {
+                                    return type;
+                                }
+                            }
+                        }
+                    }
+                    finally {
+                        if ((s1 != null)) {
+                            s1.Close();
+                        }
+                        if ((s2 != null)) {
+                            s2.Close();
+                        }
+                    }
+                }
+                xs.Add(dsSchema);
+                return type;
+            }
+        }
+        
+        /// <summary>
+        ///Represents strongly named DataRow class.
+        ///</summary>
+        public partial class PatientApptsRow : global::System.Data.DataRow {
+            
+            private PatientApptsDataTable tablePatientAppts;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            internal PatientApptsRow(global::System.Data.DataRowBuilder rb) : 
+                    base(rb) {
+                this.tablePatientAppts = ((PatientApptsDataTable)(this.Table));
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string Name {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.NameColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'Name\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.NameColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public System.DateTime DOB {
+                get {
+                    try {
+                        return ((global::System.DateTime)(this[this.tablePatientAppts.DOBColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'DOB\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.DOBColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string Sex {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.SexColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'Sex\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.SexColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string HRN {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.HRNColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'HRN\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.HRNColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public System.DateTime NewApptDate {
+                get {
+                    try {
+                        return ((global::System.DateTime)(this[this.tablePatientAppts.NewApptDateColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'NewApptDate\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.NewApptDateColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string Clinic {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.ClinicColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'Clinic\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.ClinicColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string TypeStatus {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.TypeStatusColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'TypeStatus\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.TypeStatusColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public int RESOURCEID {
+                get {
+                    try {
+                        return ((int)(this[this.tablePatientAppts.RESOURCEIDColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'RESOURCEID\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.RESOURCEIDColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string APPT_MADE_BY {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.APPT_MADE_BYColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'APPT_MADE_BY\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.APPT_MADE_BYColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public System.DateTime DATE_APPT_MADE {
+                get {
+                    try {
+                        return ((global::System.DateTime)(this[this.tablePatientAppts.DATE_APPT_MADEColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'DATE_APPT_MADE\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.DATE_APPT_MADEColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string NOTE {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.NOTEColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'NOTE\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.NOTEColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string STREET {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.STREETColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'STREET\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.STREETColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string CITY {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.CITYColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'CITY\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.CITYColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string STATE {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.STATEColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'STATE\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.STATEColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string ZIP {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.ZIPColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'ZIP\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.ZIPColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string HOMEPHONE {
+                get {
+                    try {
+                        return ((string)(this[this.tablePatientAppts.HOMEPHONEColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'HOMEPHONE\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.HOMEPHONEColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public System.DateTime OldApptDate {
+                get {
+                    try {
+                        return ((global::System.DateTime)(this[this.tablePatientAppts.OldApptDateColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'OldApptDate\' in table \'PatientAppts\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePatientAppts.OldApptDateColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public BSDXResourceRow BSDXResourceRow {
+                get {
+                    return ((BSDXResourceRow)(this.GetParentRow(this.Table.ParentRelations["FK_BSDXResource_PatientAppts"])));
+                }
+                set {
+                    this.SetParentRow(value, this.Table.ParentRelations["FK_BSDXResource_PatientAppts"]);
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsNameNull() {
+                return this.IsNull(this.tablePatientAppts.NameColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetNameNull() {
+                this[this.tablePatientAppts.NameColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsDOBNull() {
+                return this.IsNull(this.tablePatientAppts.DOBColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetDOBNull() {
+                this[this.tablePatientAppts.DOBColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsSexNull() {
+                return this.IsNull(this.tablePatientAppts.SexColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetSexNull() {
+                this[this.tablePatientAppts.SexColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsHRNNull() {
+                return this.IsNull(this.tablePatientAppts.HRNColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetHRNNull() {
+                this[this.tablePatientAppts.HRNColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsNewApptDateNull() {
+                return this.IsNull(this.tablePatientAppts.NewApptDateColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetNewApptDateNull() {
+                this[this.tablePatientAppts.NewApptDateColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsClinicNull() {
+                return this.IsNull(this.tablePatientAppts.ClinicColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetClinicNull() {
+                this[this.tablePatientAppts.ClinicColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsTypeStatusNull() {
+                return this.IsNull(this.tablePatientAppts.TypeStatusColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetTypeStatusNull() {
+                this[this.tablePatientAppts.TypeStatusColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsRESOURCEIDNull() {
+                return this.IsNull(this.tablePatientAppts.RESOURCEIDColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetRESOURCEIDNull() {
+                this[this.tablePatientAppts.RESOURCEIDColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsAPPT_MADE_BYNull() {
+                return this.IsNull(this.tablePatientAppts.APPT_MADE_BYColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetAPPT_MADE_BYNull() {
+                this[this.tablePatientAppts.APPT_MADE_BYColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsDATE_APPT_MADENull() {
+                return this.IsNull(this.tablePatientAppts.DATE_APPT_MADEColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetDATE_APPT_MADENull() {
+                this[this.tablePatientAppts.DATE_APPT_MADEColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsNOTENull() {
+                return this.IsNull(this.tablePatientAppts.NOTEColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetNOTENull() {
+                this[this.tablePatientAppts.NOTEColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsSTREETNull() {
+                return this.IsNull(this.tablePatientAppts.STREETColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetSTREETNull() {
+                this[this.tablePatientAppts.STREETColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsCITYNull() {
+                return this.IsNull(this.tablePatientAppts.CITYColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetCITYNull() {
+                this[this.tablePatientAppts.CITYColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsSTATENull() {
+                return this.IsNull(this.tablePatientAppts.STATEColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetSTATENull() {
+                this[this.tablePatientAppts.STATEColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsZIPNull() {
+                return this.IsNull(this.tablePatientAppts.ZIPColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetZIPNull() {
+                this[this.tablePatientAppts.ZIPColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsHOMEPHONENull() {
+                return this.IsNull(this.tablePatientAppts.HOMEPHONEColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetHOMEPHONENull() {
+                this[this.tablePatientAppts.HOMEPHONEColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsOldApptDateNull() {
+                return this.IsNull(this.tablePatientAppts.OldApptDateColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetOldApptDateNull() {
+                this[this.tablePatientAppts.OldApptDateColumn] = global::System.Convert.DBNull;
+            }
+        }
+        
+        /// <summary>
+        ///Represents strongly named DataRow class.
+        ///</summary>
+        public partial class BSDXResourceRow : global::System.Data.DataRow {
+            
+            private BSDXResourceDataTable tableBSDXResource;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            internal BSDXResourceRow(global::System.Data.DataRowBuilder rb) : 
+                    base(rb) {
+                this.tableBSDXResource = ((BSDXResourceDataTable)(this.Table));
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public int RESOURCEID {
+                get {
+                    return ((int)(this[this.tableBSDXResource.RESOURCEIDColumn]));
+                }
+                set {
+                    this[this.tableBSDXResource.RESOURCEIDColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string RESOURCE_NAME {
+                get {
+                    try {
+                        return ((string)(this[this.tableBSDXResource.RESOURCE_NAMEColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'RESOURCE_NAME\' in table \'BSDXResource\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tableBSDXResource.RESOURCE_NAMEColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string LETTER_TEXT {
+                get {
+                    try {
+                        return ((string)(this[this.tableBSDXResource.LETTER_TEXTColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'LETTER_TEXT\' in table \'BSDXResource\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tableBSDXResource.LETTER_TEXTColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string NO_SHOW_LETTER {
+                get {
+                    try {
+                        return ((string)(this[this.tableBSDXResource.NO_SHOW_LETTERColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'NO_SHOW_LETTER\' in table \'BSDXResource\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tableBSDXResource.NO_SHOW_LETTERColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string CLINIC_CANCELLATION_LETTER {
+                get {
+                    try {
+                        return ((string)(this[this.tableBSDXResource.CLINIC_CANCELLATION_LETTERColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'CLINIC_CANCELLATION_LETTER\' in table \'BSDXResource\' is DBNu" +
+                                "ll.", e);
+                    }
+                }
+                set {
+                    this[this.tableBSDXResource.CLINIC_CANCELLATION_LETTERColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsRESOURCE_NAMENull() {
+                return this.IsNull(this.tableBSDXResource.RESOURCE_NAMEColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetRESOURCE_NAMENull() {
+                this[this.tableBSDXResource.RESOURCE_NAMEColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsLETTER_TEXTNull() {
+                return this.IsNull(this.tableBSDXResource.LETTER_TEXTColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetLETTER_TEXTNull() {
+                this[this.tableBSDXResource.LETTER_TEXTColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsNO_SHOW_LETTERNull() {
+                return this.IsNull(this.tableBSDXResource.NO_SHOW_LETTERColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetNO_SHOW_LETTERNull() {
+                this[this.tableBSDXResource.NO_SHOW_LETTERColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsCLINIC_CANCELLATION_LETTERNull() {
+                return this.IsNull(this.tableBSDXResource.CLINIC_CANCELLATION_LETTERColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetCLINIC_CANCELLATION_LETTERNull() {
+                this[this.tableBSDXResource.CLINIC_CANCELLATION_LETTERColumn] = global::System.Convert.DBNull;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PatientApptsRow[] GetPatientApptsRows() {
+                if ((this.Table.ChildRelations["FK_BSDXResource_PatientAppts"] == null)) {
+                    return new PatientApptsRow[0];
+                }
+                else {
+                    return ((PatientApptsRow[])(base.GetChildRows(this.Table.ChildRelations["FK_BSDXResource_PatientAppts"])));
+                }
+            }
+        }
+        
+        /// <summary>
+        ///Row event argument class
+        ///</summary>
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public class PatientApptsRowChangeEvent : global::System.EventArgs {
+            
+            private PatientApptsRow eventRow;
+            
+            private global::System.Data.DataRowAction eventAction;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PatientApptsRowChangeEvent(PatientApptsRow row, global::System.Data.DataRowAction action) {
+                this.eventRow = row;
+                this.eventAction = action;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PatientApptsRow Row {
+                get {
+                    return this.eventRow;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataRowAction Action {
+                get {
+                    return this.eventAction;
+                }
+            }
+        }
+        
+        /// <summary>
+        ///Row event argument class
+        ///</summary>
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public class BSDXResourceRowChangeEvent : global::System.EventArgs {
+            
+            private BSDXResourceRow eventRow;
+            
+            private global::System.Data.DataRowAction eventAction;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public BSDXResourceRowChangeEvent(BSDXResourceRow row, global::System.Data.DataRowAction action) {
+                this.eventRow = row;
+                this.eventAction = action;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public BSDXResourceRow Row {
+                get {
+                    return this.eventRow;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataRowAction Action {
+                get {
+                    return this.eventAction;
+                }
+            }
+        }
+    }
+}
+
+#pragma warning restore 1591
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsRebookAppts.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsRebookAppts.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsRebookAppts.cs	(revision 1134)
@@ -0,0 +1,9 @@
+﻿namespace IndianHealthService.ClinicalScheduling {
+    
+    
+    public partial class dsRebookAppts {
+        partial class BSDXResourceDataTable
+        {
+        }
+    }
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsRebookAppts.xsd
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsRebookAppts.xsd	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsRebookAppts.xsd	(revision 1134)
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema id="dsRebookAppts" targetNamespace="http://tempuri.org/dsRebookAppts.xsd" xmlns:mstns="http://tempuri.org/dsRebookAppts.xsd" xmlns="http://tempuri.org/dsRebookAppts.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop" attributeFormDefault="qualified" elementFormDefault="qualified">
+  <xs:annotation>
+    <xs:appinfo source="urn:schemas-microsoft-com:xml-msdatasource">
+      <DataSource DefaultConnectionIndex="0" FunctionsComponentName="QueriesTableAdapter" Modifier="AutoLayout, AnsiClass, Class, Public" SchemaSerializationMode="IncludeSchema" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+        <Connections />
+        <Tables />
+        <Sources />
+      </DataSource>
+    </xs:appinfo>
+  </xs:annotation>
+  <xs:element name="dsRebookAppts" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:Generator_UserDSName="dsRebookAppts" msprop:Generator_DataSetName="dsRebookAppts">
+    <xs:complexType>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element name="PatientAppts" msprop:Generator_UserTableName="PatientAppts" msprop:Generator_RowDeletedName="PatientApptsRowDeleted" msprop:Generator_TableClassName="PatientApptsDataTable" msprop:Generator_RowChangedName="PatientApptsRowChanged" msprop:Generator_RowClassName="PatientApptsRow" msprop:Generator_RowChangingName="PatientApptsRowChanging" msprop:Generator_RowEvArgName="PatientApptsRowChangeEvent" msprop:Generator_RowEvHandlerName="PatientApptsRowChangeEventHandler" msprop:Generator_TablePropName="PatientAppts" msprop:Generator_TableVarName="tablePatientAppts" msprop:Generator_RowDeletingName="PatientApptsRowDeleting">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element name="Name" msprop:Generator_UserColumnName="Name" msprop:Generator_ColumnPropNameInRow="Name" msprop:Generator_ColumnVarNameInTable="columnName" msprop:Generator_ColumnPropNameInTable="NameColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="DOB" msprop:Generator_UserColumnName="DOB" msprop:Generator_ColumnPropNameInRow="DOB" msprop:Generator_ColumnVarNameInTable="columnDOB" msprop:Generator_ColumnPropNameInTable="DOBColumn" type="xs:date" minOccurs="0" />
+              <xs:element name="Sex" msprop:Generator_UserColumnName="Sex" msprop:Generator_ColumnPropNameInRow="Sex" msprop:Generator_ColumnVarNameInTable="columnSex" msprop:Generator_ColumnPropNameInTable="SexColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="HRN" msprop:Generator_UserColumnName="HRN" msprop:Generator_ColumnPropNameInRow="HRN" msprop:Generator_ColumnVarNameInTable="columnHRN" msprop:Generator_ColumnPropNameInTable="HRNColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="NewApptDate" msprop:Generator_UserColumnName="NewApptDate" msprop:Generator_ColumnPropNameInRow="NewApptDate" msprop:Generator_ColumnVarNameInTable="columnNewApptDate" msprop:Generator_ColumnPropNameInTable="NewApptDateColumn" type="xs:date" minOccurs="0" />
+              <xs:element name="Clinic" msprop:Generator_UserColumnName="Clinic" msprop:Generator_ColumnPropNameInRow="Clinic" msprop:Generator_ColumnVarNameInTable="columnClinic" msprop:Generator_ColumnPropNameInTable="ClinicColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="TypeStatus" msprop:Generator_UserColumnName="TypeStatus" msprop:Generator_ColumnPropNameInRow="TypeStatus" msprop:Generator_ColumnVarNameInTable="columnTypeStatus" msprop:Generator_ColumnPropNameInTable="TypeStatusColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="RESOURCEID" msprop:Generator_UserColumnName="RESOURCEID" msprop:Generator_ColumnPropNameInRow="RESOURCEID" msprop:Generator_ColumnVarNameInTable="columnRESOURCEID" msprop:Generator_ColumnPropNameInTable="RESOURCEIDColumn" type="xs:int" minOccurs="0" />
+              <xs:element name="APPT_MADE_BY" msprop:Generator_UserColumnName="APPT_MADE_BY" msprop:Generator_ColumnPropNameInRow="APPT_MADE_BY" msprop:Generator_ColumnVarNameInTable="columnAPPT_MADE_BY" msprop:Generator_ColumnPropNameInTable="APPT_MADE_BYColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="DATE_APPT_MADE" msprop:Generator_UserColumnName="DATE_APPT_MADE" msprop:Generator_ColumnPropNameInRow="DATE_APPT_MADE" msprop:Generator_ColumnVarNameInTable="columnDATE_APPT_MADE" msprop:Generator_ColumnPropNameInTable="DATE_APPT_MADEColumn" type="xs:date" minOccurs="0" />
+              <xs:element name="NOTE" msprop:Generator_UserColumnName="NOTE" msprop:Generator_ColumnPropNameInRow="NOTE" msprop:Generator_ColumnVarNameInTable="columnNOTE" msprop:Generator_ColumnPropNameInTable="NOTEColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="STREET" msprop:Generator_UserColumnName="STREET" msprop:Generator_ColumnPropNameInRow="STREET" msprop:Generator_ColumnVarNameInTable="columnSTREET" msprop:Generator_ColumnPropNameInTable="STREETColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="CITY" msprop:Generator_UserColumnName="CITY" msprop:Generator_ColumnPropNameInRow="CITY" msprop:Generator_ColumnVarNameInTable="columnCITY" msprop:Generator_ColumnPropNameInTable="CITYColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="STATE" msprop:Generator_UserColumnName="STATE" msprop:Generator_ColumnPropNameInRow="STATE" msprop:Generator_ColumnVarNameInTable="columnSTATE" msprop:Generator_ColumnPropNameInTable="STATEColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="ZIP" msprop:Generator_UserColumnName="ZIP" msprop:Generator_ColumnPropNameInRow="ZIP" msprop:Generator_ColumnVarNameInTable="columnZIP" msprop:Generator_ColumnPropNameInTable="ZIPColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="HOMEPHONE" msprop:Generator_UserColumnName="HOMEPHONE" msprop:Generator_ColumnPropNameInRow="HOMEPHONE" msprop:Generator_ColumnVarNameInTable="columnHOMEPHONE" msprop:Generator_ColumnPropNameInTable="HOMEPHONEColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="OldApptDate" msprop:Generator_UserColumnName="OldApptDate" msprop:Generator_ColumnPropNameInRow="OldApptDate" msprop:Generator_ColumnVarNameInTable="columnOldApptDate" msprop:Generator_ColumnPropNameInTable="OldApptDateColumn" type="xs:date" minOccurs="0" />
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element name="BSDXResource" msprop:Generator_UserTableName="BSDXResource" msprop:Generator_RowDeletedName="BSDXResourceRowDeleted" msprop:Generator_TableClassName="BSDXResourceDataTable" msprop:Generator_RowChangedName="BSDXResourceRowChanged" msprop:Generator_RowClassName="BSDXResourceRow" msprop:Generator_RowChangingName="BSDXResourceRowChanging" msprop:Generator_RowEvArgName="BSDXResourceRowChangeEvent" msprop:Generator_RowEvHandlerName="BSDXResourceRowChangeEventHandler" msprop:Generator_TablePropName="BSDXResource" msprop:Generator_TableVarName="tableBSDXResource" msprop:Generator_RowDeletingName="BSDXResourceRowDeleting">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element name="RESOURCEID" msprop:Generator_UserColumnName="RESOURCEID" msprop:Generator_ColumnPropNameInRow="RESOURCEID" msprop:Generator_ColumnVarNameInTable="columnRESOURCEID" msprop:Generator_ColumnPropNameInTable="RESOURCEIDColumn" type="xs:int" />
+              <xs:element name="RESOURCE_NAME" msprop:Generator_UserColumnName="RESOURCE_NAME" msprop:Generator_ColumnPropNameInRow="RESOURCE_NAME" msprop:Generator_ColumnVarNameInTable="columnRESOURCE_NAME" msprop:Generator_ColumnPropNameInTable="RESOURCE_NAMEColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="LETTER_TEXT" msprop:Generator_UserColumnName="LETTER_TEXT" msprop:Generator_ColumnPropNameInRow="LETTER_TEXT" msprop:Generator_ColumnVarNameInTable="columnLETTER_TEXT" msprop:Generator_ColumnPropNameInTable="LETTER_TEXTColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="NO_SHOW_LETTER" msprop:Generator_UserColumnName="NO_SHOW_LETTER" msprop:Generator_ColumnPropNameInRow="NO_SHOW_LETTER" msprop:Generator_ColumnVarNameInTable="columnNO_SHOW_LETTER" msprop:Generator_ColumnPropNameInTable="NO_SHOW_LETTERColumn" type="xs:string" minOccurs="0" />
+              <xs:element name="CLINIC_CANCELLATION_LETTER" msprop:Generator_UserColumnName="CLINIC_CANCELLATION_LETTER" msprop:Generator_ColumnPropNameInRow="CLINIC_CANCELLATION_LETTER" msprop:Generator_ColumnVarNameInTable="columnCLINIC_CANCELLATION_LETTER" msprop:Generator_ColumnPropNameInTable="CLINIC_CANCELLATION_LETTERColumn" type="xs:string" minOccurs="0" />
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+      </xs:choice>
+    </xs:complexType>
+    <xs:unique name="kBSDXResourceID">
+      <xs:selector xpath=".//mstns:BSDXResource" />
+      <xs:field xpath="mstns:RESOURCEID" />
+    </xs:unique>
+    <xs:keyref name="FK_BSDXResource_PatientAppts" refer="kBSDXResourceID" msprop:rel_Generator_UserRelationName="FK_BSDXResource_PatientAppts" msprop:rel_Generator_RelationVarName="relationFK_BSDXResource_PatientAppts" msprop:rel_Generator_UserChildTable="PatientAppts" msprop:rel_Generator_UserParentTable="BSDXResource" msprop:rel_Generator_ParentPropName="BSDXResourceRow" msprop:rel_Generator_ChildPropName="GetPatientApptsRows">
+      <xs:selector xpath=".//mstns:PatientAppts" />
+      <xs:field xpath="mstns:RESOURCEID" />
+    </xs:keyref>
+  </xs:element>
+</xs:schema>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsRebookAppts.xsx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsRebookAppts.xsx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/dsRebookAppts.xsx	(revision 1134)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--This file is auto-generated by the XML Schema Designer. It holds layout information for components on the designer surface.-->
+<XSDDesignerLayout layoutVersion="2" viewPortLeft="0" viewPortTop="0" zoom="100">
+    <PatientAppts_XmlElement left="450" top="424" width="5821" height="9313" selected="0" zOrder="1" index="0" expanded="1" />
+    <BSDXResource_XmlElement left="9155" top="1561" width="5291" height="3810" selected="0" zOrder="2" index="1" expanded="1" />
+    <BSDXResourcePatientAppts_XmlKeyref left="6786" top="4766" width="503" height="503" selected="0" zOrder="4" />
+</XSDDesignerLayout>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/strings.Designer.cs
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/strings.Designer.cs	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/strings.Designer.cs	(revision 1134)
@@ -0,0 +1,315 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.1
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace IndianHealthService.ClinicalScheduling {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class strings {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal strings() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("IndianHealthService.ClinicalScheduling.strings", typeof(strings).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Age.
+        /// </summary>
+        internal static string Age {
+            get {
+                return ResourceManager.GetString("Age", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &amp;.
+        /// </summary>
+        internal static string and {
+            get {
+                return ResourceManager.GetString("and", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Appointment Note.
+        /// </summary>
+        internal static string AppointmentNote {
+            get {
+                return ResourceManager.GetString("AppointmentNote", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Appointment Provider.
+        /// </summary>
+        internal static string AppointmentProvider {
+            get {
+                return ResourceManager.GetString("AppointmentProvider", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Appointment Details.
+        /// </summary>
+        internal static string ApptInfo {
+            get {
+                return ResourceManager.GetString("ApptInfo", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Appointment Reminder Slip.
+        /// </summary>
+        internal static string ApptReminderSlip {
+            get {
+                return ResourceManager.GetString("ApptReminderSlip", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Clinic.
+        /// </summary>
+        internal static string Clinic {
+            get {
+                return ResourceManager.GetString("Clinic", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Clinic Instructions.
+        /// </summary>
+        internal static string ClinicInstructions {
+            get {
+                return ResourceManager.GetString("ClinicInstructions", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Date.
+        /// </summary>
+        internal static string Date {
+            get {
+                return ResourceManager.GetString("Date", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Day.
+        /// </summary>
+        internal static string Day {
+            get {
+                return ResourceManager.GetString("Day", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to DOB.
+        /// </summary>
+        internal static string DOB {
+            get {
+                return ResourceManager.GetString("DOB", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Female.
+        /// </summary>
+        internal static string Female {
+            get {
+                return ResourceManager.GetString("Female", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to ID#.
+        /// </summary>
+        internal static string ID {
+            get {
+                return ResourceManager.GetString("ID", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Male.
+        /// </summary>
+        internal static string Male {
+            get {
+                return ResourceManager.GetString("Male", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to months.
+        /// </summary>
+        internal static string months {
+            get {
+                return ResourceManager.GetString("months", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Name.
+        /// </summary>
+        internal static string Name {
+            get {
+                return ResourceManager.GetString("Name", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Next Appointment Instructions.
+        /// </summary>
+        internal static string NextAppointmentInstructions {
+            get {
+                return ResourceManager.GetString("NextAppointmentInstructions", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to (no instructions provided).
+        /// </summary>
+        internal static string NoInstructionsProvided {
+            get {
+                return ResourceManager.GetString("NoInstructionsProvided", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to (none).
+        /// </summary>
+        internal static string none {
+            get {
+                return ResourceManager.GetString("none", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Notes.
+        /// </summary>
+        internal static string Notes {
+            get {
+                return ResourceManager.GetString("Notes", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Patient Order.
+        /// </summary>
+        internal static string PatientOrder {
+            get {
+                return ResourceManager.GetString("PatientOrder", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Printed.
+        /// </summary>
+        internal static string Printed {
+            get {
+                return ResourceManager.GetString("Printed", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Patient Information.
+        /// </summary>
+        internal static string PtInfo {
+            get {
+                return ResourceManager.GetString("PtInfo", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Routing Slip.
+        /// </summary>
+        internal static string RoutingSlip {
+            get {
+                return ResourceManager.GetString("RoutingSlip", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Scratch Area.
+        /// </summary>
+        internal static string ScratchArea {
+            get {
+                return ResourceManager.GetString("ScratchArea", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Sex.
+        /// </summary>
+        internal static string Sex {
+            get {
+                return ResourceManager.GetString("Sex", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Time.
+        /// </summary>
+        internal static string Time {
+            get {
+                return ResourceManager.GetString("Time", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to years.
+        /// </summary>
+        internal static string years {
+            get {
+                return ResourceManager.GetString("years", resourceCulture);
+            }
+        }
+    }
+}
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/strings.ar.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/strings.ar.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/strings.ar.resx	(revision 1134)
@@ -0,0 +1,204 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="Age" xml:space="preserve">
+    <value>العمر</value>
+  </data>
+  <data name="and" xml:space="preserve">
+    <value>و</value>
+  </data>
+  <data name="ApptInfo" xml:space="preserve">
+    <value>تفاصيل الموعد</value>
+  </data>
+  <data name="ApptReminderSlip" xml:space="preserve">
+    <value>بطاقة المراجعة</value>
+  </data>
+  <data name="Clinic" xml:space="preserve">
+    <value>العيادة</value>
+  </data>
+  <data name="ClinicInstructions" xml:space="preserve">
+    <value>تعليمات العيادة</value>
+  </data>
+  <data name="Date" xml:space="preserve">
+    <value>الموعد</value>
+  </data>
+  <data name="Day" xml:space="preserve">
+    <value>اليوم</value>
+  </data>
+  <data name="DOB" xml:space="preserve">
+    <value>تاريخ الميلاد</value>
+  </data>
+  <data name="ID" xml:space="preserve">
+    <value>الرقم الوطني</value>
+  </data>
+  <data name="months" xml:space="preserve">
+    <value>أشهر</value>
+  </data>
+  <data name="Name" xml:space="preserve">
+    <value>اللأسم</value>
+  </data>
+  <data name="NoInstructionsProvided" xml:space="preserve">
+    <value>لا تعليمات مرافقة</value>
+  </data>
+  <data name="Notes" xml:space="preserve">
+    <value>ملاحظات</value>
+  </data>
+  <data name="Printed" xml:space="preserve">
+    <value>طبعت</value>
+  </data>
+  <data name="PtInfo" xml:space="preserve">
+    <value>معلومات المريض</value>
+  </data>
+  <data name="Sex" xml:space="preserve">
+    <value>الجنس</value>
+  </data>
+  <data name="Time" xml:space="preserve">
+    <value>الوقت</value>
+  </data>
+  <data name="years" xml:space="preserve">
+    <value>سنة</value>
+  </data>
+  <data name="Female" xml:space="preserve">
+    <value>أنثى</value>
+  </data>
+  <data name="Male" xml:space="preserve">
+    <value>ذكر</value>
+  </data>
+  <data name="AppointmentNote" xml:space="preserve">
+    <value>ملاحضات الموعد</value>
+  </data>
+  <data name="AppointmentProvider" xml:space="preserve">
+    <value>الموعد عند</value>
+  </data>
+  <data name="NextAppointmentInstructions" xml:space="preserve">
+    <value>تعليمات الموعد القادم</value>
+  </data>
+  <data name="none" xml:space="preserve">
+    <value>(غير متوفر)</value>
+  </data>
+  <data name="PatientOrder" xml:space="preserve">
+    <value>دور المريض</value>
+  </data>
+  <data name="RoutingSlip" xml:space="preserve">
+    <value>قسيمة التوجيه</value>
+  </data>
+  <data name="ScratchArea" xml:space="preserve">
+    <value>ملاحضات زائدة</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/strings.resx
===================================================================
--- Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/strings.resx	(revision 1134)
+++ Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/strings.resx	(revision 1134)
@@ -0,0 +1,204 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="Age" xml:space="preserve">
+    <value>Age</value>
+  </data>
+  <data name="and" xml:space="preserve">
+    <value>&amp;</value>
+  </data>
+  <data name="ApptInfo" xml:space="preserve">
+    <value>Appointment Details</value>
+  </data>
+  <data name="ApptReminderSlip" xml:space="preserve">
+    <value>Appointment Reminder Slip</value>
+  </data>
+  <data name="Clinic" xml:space="preserve">
+    <value>Clinic</value>
+  </data>
+  <data name="ClinicInstructions" xml:space="preserve">
+    <value>Clinic Instructions</value>
+  </data>
+  <data name="Date" xml:space="preserve">
+    <value>Date</value>
+  </data>
+  <data name="Day" xml:space="preserve">
+    <value>Day</value>
+  </data>
+  <data name="DOB" xml:space="preserve">
+    <value>DOB</value>
+  </data>
+  <data name="ID" xml:space="preserve">
+    <value>ID#</value>
+  </data>
+  <data name="months" xml:space="preserve">
+    <value>months</value>
+  </data>
+  <data name="Name" xml:space="preserve">
+    <value>Name</value>
+  </data>
+  <data name="NoInstructionsProvided" xml:space="preserve">
+    <value>(no instructions provided)</value>
+  </data>
+  <data name="Notes" xml:space="preserve">
+    <value>Notes</value>
+  </data>
+  <data name="Printed" xml:space="preserve">
+    <value>Printed</value>
+  </data>
+  <data name="PtInfo" xml:space="preserve">
+    <value>Patient Information</value>
+  </data>
+  <data name="Sex" xml:space="preserve">
+    <value>Sex</value>
+  </data>
+  <data name="Time" xml:space="preserve">
+    <value>Time</value>
+  </data>
+  <data name="years" xml:space="preserve">
+    <value>years</value>
+  </data>
+  <data name="Female" xml:space="preserve">
+    <value>Female</value>
+  </data>
+  <data name="Male" xml:space="preserve">
+    <value>Male</value>
+  </data>
+  <data name="AppointmentNote" xml:space="preserve">
+    <value>Appointment Note</value>
+  </data>
+  <data name="AppointmentProvider" xml:space="preserve">
+    <value>Appointment Provider</value>
+  </data>
+  <data name="NextAppointmentInstructions" xml:space="preserve">
+    <value>Next Appointment Instructions</value>
+  </data>
+  <data name="none" xml:space="preserve">
+    <value>(none)</value>
+  </data>
+  <data name="PatientOrder" xml:space="preserve">
+    <value>Patient Order</value>
+  </data>
+  <data name="RoutingSlip" xml:space="preserve">
+    <value>Routing Slip</value>
+  </data>
+  <data name="ScratchArea" xml:space="preserve">
+    <value>Scratch Area</value>
+  </data>
+</root>
Index: Scheduling/branches/Radiology-Support/doc/AUTHORS.txt
===================================================================
--- Scheduling/branches/Radiology-Support/doc/AUTHORS.txt	(revision 1134)
+++ Scheduling/branches/Radiology-Support/doc/AUTHORS.txt	(revision 1134)
@@ -0,0 +1,3 @@
+The original software was written by Indian Health Service Programmers for RPMS. Notably, Horace Whitt.
+
+Ported by Sam Habiel to VISTA.
Index: Scheduling/branches/Radiology-Support/doc/AlNajjarsList.txt
===================================================================
--- Scheduling/branches/Radiology-Support/doc/AlNajjarsList.txt	(revision 1134)
+++ Scheduling/branches/Radiology-Support/doc/AlNajjarsList.txt	(revision 1134)
@@ -0,0 +1,32 @@
+Dear Sam
+This is my wish list for the Scheduling GUI:
+1.  Cancel the Walk-in appointments.
+2.  Make the manager for the division not for the Data Base.
+3.  Map the Clerks (Users) to the Groups not the clinics.
+4.  System should inform the users if there is another appointment to the same clinic, not Just only information in the appointment screen.
+5.  Activate Find Available appointment Function.
+6.  Add New Key to the system; allow the manager to map users to the clinics without having access to add and edit the clinics.
+7.  In the Re-book function; system should inform the users if there is no available clinic; not just do nothing the users confused; specially if they are new in the system
+8.  Error massages should be more clear for the end Users.
+9.  Select the provider from the Check-in option.
+10. Fix appointment transfer between the clinics. Specially if we have two windows.
+11. Make the reason for the cancellation editable can be configured site Specific.
+12. Overbook limit and it can be edited as in VistA Scheduling.
+13. Can know how dont checked-out from the system through the Clinical Scheduling GUI.
+14. Generate a report from the system, tell us about the Check-in & Check-out status.
+15. Time Scale should be for the manager only, clerk cant change it.
+16. For the appointment cancelation, if we can cancel it by group and Re-Book it by group.
+17. Change VistA Server should be only for the manager.
+18. Change VistA Division should be only for the manager.
+19. If the I close the Last Windows in the clinical Scheduling GUI the system should ask me are you sure to close this program
+20. A tool that allow us to edit the schedule without go to each day to change.
+21. If I apply a new template to the clinic the system should ask me if I want to delete the previous one.
+22. System should check the patient appointments, patient should not have two appointment at the same time( I should explain it for you )
+23. Adding blocks in groups not individually.
+24. If we change the default time slot for the clinic the system should change the access block time automatically.
+25. If I inactivate the clinic in VistA it should reflects in GUI.
+26. If we can make the users in groups. i.e. MRs group, OP clinics Group and map them to the resource groups
+27. Copy appointments should be working will.
+28. Not all the work stations in the system can seen in the GUI.
+
+I know there are a lot of clarification for my points. I will call you to explain it.
Index: Scheduling/branches/Radiology-Support/doc/COPYING.txt
===================================================================
--- Scheduling/branches/Radiology-Support/doc/COPYING.txt	(revision 1134)
+++ Scheduling/branches/Radiology-Support/doc/COPYING.txt	(revision 1134)
@@ -0,0 +1,3 @@
+This software is licensed by me, Sam Habiel, its only current programmer for VISTA, under LGPL.
+
+See LGPL here: http://www.gnu.org/licenses/lgpl.html
Index: Scheduling/branches/Radiology-Support/doc/COPYRIGHT.txt
===================================================================
--- Scheduling/branches/Radiology-Support/doc/COPYRIGHT.txt	(revision 1134)
+++ Scheduling/branches/Radiology-Support/doc/COPYRIGHT.txt	(revision 1134)
@@ -0,0 +1,1 @@
+No copyright is claimed on this source code.
Index: Scheduling/branches/Radiology-Support/doc/ChangeLog.txt
===================================================================
--- Scheduling/branches/Radiology-Support/doc/ChangeLog.txt	(revision 1134)
+++ Scheduling/branches/Radiology-Support/doc/ChangeLog.txt	(revision 1134)
@@ -0,0 +1,148 @@
+Nov 2009: First commit into svn of Alpha Version of Scheduling GUI (v2.2)
+
+V2.2
+Version downgraded to 1.0 to reflect state of software.
+
+v1.1 (released June 7 2010)
+- Removed references to "View EHR" from ctxCalendarGrid and DAppointPage.
+- Remove references to IHS; typically "IHS Clinical Scheduling" becomes "Clinical Scheduling"
+- Remove the non-functioning CalendarGrid.dll and associated project files.
+- Add the code from CalendarGrid.dll generated using reflector.exe to ClinicalScheduling.csproj
+- Removed user-interface references to RPMS.
+- Fixes in BSDX27 referring to a routine that doesn't exist in VISTA. References changed to BSDXAPI.
+- Reworked DAppointPage. 
+- Removed dependence of DPatientApptDisplay on Crystal Reports. 
+- Added UserControl UCPatientAppts to encapsulate functionality of DPatientApptDisplay; right now it does not include printing. 
+- DAppointPage now uses UCPatientAppts to provide functionality of seeing patient's previous appointments. DPatientApptDisplay does not yet, but will soon.
+- Better printing in UCPatientAppts.
+- Removal of Crystal Reports
+- Partial Rework of Clinic Patient List report
+- Other reports that used Crystal don't work yet.
+- Fixes for Strongly typed DataTables (change the RESOURCEID from uint to int) to support table merge from untyped table.
+- Support for command line arguments: /s= for server /p= for port /a= for access code /v= for verify code. Only the following combinations work: none; /s and /p; /s, /p, /a, /v (/e added later for encoding in v1.4).
+- Tiny bug fixes to fix compile errors
+- Some debugging code to attach the program to the console to print messages.
+- Letters:
+-- Cancellation letters now work.
+-- Initial work on Rebook Letters.
+- Provided framework for Rebook letters; but they don't work.
+- Added the appointment dates to the printed letters.
+- Made more keyboard shortcuts on the main menu.
+- New kids build for all above
+
+v1.2 (released June 19 2010):
+- CGView: Added various shortcuts keys for menus; removed extra overbook prompt after booking if doing an overbook. You already get one before booking.
+- CGDocumentManager: Mickey mouse connection check to prevent prompting for access and verify if there's no connection to VISTA.
+- CGDocumentManager: Test SQL statement to retrieve Hospital Locations and default providers associated with them. (doesn't work, moved to new routine later).
+- Remove garbage file {85FE etc}.rpt
+- DCheckIn.cs: Handling of providers for hospital locations (HL). If provider(s) assigned to HL linked to resource, they are brought over and if a default one is in VISTA, it's picked as the default in the combobox. If no default, combobox defaults to <None>. If resource not linked to HL, then all providers in system brought over, and combobox default is <None>.
+- CGDocumentManager.cs: Remove loading of ClinicSetupParameters file. File doesn't exist in VISTA.
+- DResource.cs: Remove handling of same file.
+- New Routine BSDXGPRV to get providers associated with hospital location
+- Support for Routing Slip printing.
+- Version change from 1.1 to 1.2 in preparation for release.
+- Printing.cs: Addition of PrintRoutingSlip method.
+- CGView.cs: Handling of printing of routing slip if chosen in DCheckIn.cs
+- CGView.cs: New context option to re-print routing slip
+- DCheckIn.cs: toolTip1 to explain that routing slip will print on the default printer.
+- New kids build
+
+v1.3 (released August 18th 2010):
+- Support for multiple encodings.
+- Some refactoring of code into DAL.cs for Data Access.
+- Addition of Fileman date code (not used yet).
+- Removal of .config and .xml file from bin/Release/
+- Removal of BMXNet20.dll to replace with BMXNet21.dll for multiple encoding support
+- Updated mulitple routines and C# files - Send FM dates from VISTA rather than regular dates to support i18n (platform independent dates)
+- Fix pre-existing bug in rebooking. Now it works.
+- Printing from the print preview window just printed empty lists. Now fixed. (also in branch 1.2.1).
+- Updated Appointment Page and routine:
+- Adds the following fields in Contact Info tab:
+-- 1. Cell Phone
+-- 2. Email address
+-- 3. Country
+- Search by Primary ID now works.
+- Start of week now machine culture sensitive (default always 1 day after start of week per culture). Change in CGDocument.cs
+- Removal of SSN references in DPatientLookup.cs
+- Updated kids post-init to remove harmful entries to GUI scheduling in protocol file from SDAM APPOINTMENT EVENTS
+- New KIDS build
+
+v1.4 (released September 17 2010):
+- Make combo boxes in DManagement searchable (in MS Lingo AutoComplete).
+- Make sure that all DManagement lists and combo boxes are sorted.
+- Fix bug of not showing appointments in 7 day view if arabic locale on machine.
+- Fix printing of routing slip (add clinic and fix appointment time and HRN)
+- Add RTL support for letters printed in Arabic Locale.
+- StartDate for CGAVView, 1st try.
+- CGDocument uses StartDate from Current thread locale rather than current culture. Enables controlling the behavior of the Scheduling GUI via thread locale.
+- CGAVDocument contains changes for start day of grid based on weekday locale and colummns
+- CGAVView: Shortcut keys; correct updating when number of columns is changed in grid
+- CGDocument: changes for start day of grid. Modified algorithm.
+- DAccessTemplate: Takes any weekday now for applying a template, not just Monday. Then calculation of start day is done in CGAVView based on locale in the same algorithm that the rest of the GUI uses.
+- DAppointPage: Now says Mobile/Cell instead of Cell Phone.
+- Added a note in the DAccessTemplate to say that you have to select the right 5 or 7 day view based on what you originally saved.
+- Support for checking encoding on the server (if supports UTF-8 and encoding not specified, uses UTF-8; otherwise uses what locale says).
+- /e encoding start-up flag now supported.
+
+v1.4.1 (released September 29th 2010)
+- Drag and drop is fixed. It reference a non-existent cancellation reason, so it failed.
+- If a patient has a Patient Cancelled appointment, scheduling the patient at the same time doesn't work anymore.
+- MAKE^BSDXAPI occasionally failed. Use of Old Fileman API not successful. New Fileman API seems to work better in MAKE for filing data into patient subfile of appointment subfile of Hosp Location file.
+- Logging into the right division didn't work properly. Now it does. Required changes in BMX.
+- Appointments in Past now trigger a warning.
+- Change Project file format to VS 2010.
+- More extensive notes files.
+- New Kids build.
+
+v1.4.2 (released December 12th 2010)
+- Finally, the transaction bugs that happens on high volume GT.M systems are fixed.
+- Fixes 1 day view drawing bug, causing yesterday's appointments to show as if they were today.
+- Updating the Note in the Edit appointment context menu now updates both BSDX APPOINTMENT file and HOSPITAL LOCATION.
+- Walk-in appointments now count towards slots left calcuations.
+- Default open location for apply template dialog is now the last folder navigated to.
+- Drag and drop and Delete Message Boxes (prompts) for users when manipulating Access Blocks have been removed (no need for them).
+- Printing from the View Apppointment user control (visible in the Make Appointment dialog) no longer causes an error if there are no appointments for patients.
+- Saving access slots is not async, but that causes other bugs because of multiple threads accessing data concurrently. It's an intermediate fix until a better saving program can be devised using BMX Updatable DataTables.
+- Access block grid now refreshes itself after access blocks are added from a template. No need to change dates to see the effect.
+- New option in Access block grid to mass delete access blocks on File menu (tied to Ctrl-D).
+- Can make appointments longer than 240 minutes when using a linked Resource (PIMS issue).
+- Patient Appointment List now does not show cancelled appointments.
+- Patient Appointment List now shows the names of the clinics as what you called them in the Scheduling GUI, not what they are called in VISTA.
+- New kids build
+
+v1.5 (Alpha released Jan 27 2010, Alpha 2 end of Feb, Alpha 3 Mar 30)
+- Speed issues very much mitigated.
+- Ability to Cancel checked-in appointments (including walk-ins) added.
+- Grid now responds to mouse wheel movements
+- Clearer error messages for end users.
+- Splash screen Upon Start-up with progress bar
+- Check-in Dialog cleaned up from extraneous elements; new algorithm for parsing out providers.
+- BSDX Checkin Appointment has changed parameters.
+- Application wide error handlers to handle application errors.
+- Various focus issues with main form fixed (but these are causing some side effects).
+- DateTime Picker format and behavior change. Schedule is no longer updated based on a value change but only when leaving the box or pressing the enter key.
+- Splash screen when opening new clinics or changing dates added to main form.
+- Polling for events and responding to them is now done asynchornously.
+- A lot of refactoring to avoid calling the server when it's not needed. This involved not asking the server for updates after each operation as that's very expensive.
+- Main form will be responsible for redrawing itself; not by the data manager.
+- Algorithms to calculate remaining slots and for finding empty slots are now much improved. Slots are now time scale sensitive; contiguous slots are joined toether.
+- More comprehensive message to user on Status Bar on what original slot has as well as what the current selection from the grid comes up.
+- Custom printing framework (not used though) incorporated into main code base. Thanks Tariq.
+- Holiday lookup is now better and won't fail when you use a different culture.
+- New print slip when an appointment is make.
+- Find Appointment Dialog now works very reliably.
+- Sex of patient now pulled in the appointment objects; however, support for that is not universal yet (e.g. Walk-in's don't have a Sex yet!)
+- DOB of patient now pulled; more universal; also there is an object that calculates the patient age.
+- User choices for printing appointment and routing slip are now saved to VISTA in parameters.
+- New command line flag, /culture, to set the main thread's CurrentUICulture.
+- Routing Slip now prints patient order.
+- Bug when redrawing appointments while saving Slots on the Edit Resource Availability window fixed.
+- New context menu option on Grid to uncheck-in a patient
+- New context menu option to Print Clinic Schedules for Today, Tomorrow, and 3 days from today.
+- New logic to prevent checked-in appointments from being deleted.
+- Context menus for Noshow and Undo noshow have changed logic for when they become enabled.
+- Events are not going to be raised back to the originating control anymore.
+- Appointment Reminder Slip has been Arabized, and an extra resource is shipped in order to accomplish that.
+- Version check added in the load logic.
+- Upon Demand refresh by pressing F5 added to CalendarGrid.
+- Time scales are now sensitive to the original time scale of the clinic. You can increase them, but you can't decrease them.
Index: Scheduling/branches/Radiology-Support/doc/README.txt
===================================================================
--- Scheduling/branches/Radiology-Support/doc/README.txt	(revision 1134)
+++ Scheduling/branches/Radiology-Support/doc/README.txt	(revision 1134)
@@ -0,0 +1,140 @@
+BSDX 1.42 for WorldVista
+Licensed under LGPL.
+
+This is a Scheduling GUI package. 
+
+Pre-requisites:
+FM 22
+Kernel 8
+XB 3 or above
+SD 5.3
+SD 5.3 patch 11310 (to fix a problem with the code)
+BMX 2.21
+
+For a Virgin WorldVistA 6-08 release install the following in this order:
+1. XB 4                 (see https://trac.opensourcevista.net/browser/IHS-VA_UTILITIES-XB/tag/rel_20091207) 
+2. BMX 2.21              (see https://trac.opensourcevista.net/browser/BMXNET_RPMS_dotNET_UTILITIES-BMX/trunk/k)
+3. XWB 1.1 patch 113102 (see https://trac.opensourcevista.net/browser/BMXNET_RPMS_dotNET_UTILITIES-BMX/trunk/k)
+4. BSDX 1.42            (see https://trac.opensourcevista.net/browser/Scheduling/trunk/kids)
+5. SD 5.3 patch 11310   (see https://trac.opensourcevista.net/browser/Scheduling/trunk/kids)
+
+Client (download from https://trac.opensourcevista.net/browser/Scheduling/trunk/cs/bsdx0200GUISourceCode/bin/Release):
+ClinicalScheduling.exe
+BMXNet22.dll
+
+Client does not need installation. Both files have to be located in the same folder.
+
+For users who used a previous version, you only need to download and install BSDX 1.42 kids and ClinicalScheduling.exe plus the BMXNet22.dll library. If BMX Server version is outdated, you need to install the new version.
+
+Post-installation tasks:
+After installation, complete the following tasks to configure Windows Scheduling:
+1. Using VISTA tools, assign the BSDXMENU security key. All scheduling users
+must have the BSDXZMENU security key.
+2. Users who are also scheduling managers must have the BSDXZMGR key
+assigned. The BSDXZMGR key permits access to the Scheduling Management
+menu in the client application. This menu supports the creation of clinics and
+clinic groups, assignment of users to clinics, designation of user access, and other management activities. For further details, see the User Manual.
+3. Make the BMXRPC and BSDXPRC menu options available to scheduling users.
+These options must be somewhere in the user's path, either as a secondary option
+or as members of a menu to which the user has access.
+4. Use Scheduling Management to configure 
+a. Resources (clinics)
+b. Users to work with those clinics
+c. Resource Groups, then add the clinics to the resource groups.
+d. Access Types
+e. Access Type Groups
+(see below for more details).
+5. Restart the program, and edit the resource availablility by right clicking on it in the tree.
+
+If you don't do these steps, the program won't work.
+See the User Manual for detailed instructions. 
+
+Detailed Clinic Configuration Instructions:
+The program is in a sort of an intermediate state; it doesn't edit PIMS clinics directly, but can be linked to them if you want appointments and check-ins to show up in PIMS. This program can work without ever being linked to PIMS clinics.
+
+If you need to use PIMS clinics, here is how you do the set-up:
+0. First, make sure you have BMXRPC and BSDXRPC in your menu path and that you have BSDXZMGR for Sched GUI set-up and DG SUPERVISOR TO set up PIMS clinics on roll and scroll.
+1. Create the PIMS clinics using SDBUILD menu in VISTA. The GUI uses the following fields from the Hospital Location file
+ - Clinic Name
+ - Inactivation Date/Reactivation Date for deciding whether to display it.
+ - Default Provider multiple for populating the default providers
+ - Division (not currently used, but will be in the future)
+2. Create the resources in the GUI, and tie each of them to the clinics as needed.
+3. For each resource, you need to add authorized users. These users must hold the BSDXZMENU key or else, they won't show up. You may see users with XUPROGMODE. These will always show up.
+4. Create Resource Groups, and add resources to them. Without this, the tree on the side won't show up; and without this tree, users cannot select a schedule.
+5. Set-up At least 1 access type
+6. Set-up At least 1 access group
+7. Restart 
+8. Create slots for each of the clinics. You can save them as files and re-use them.
+
+Known Bugs:
+- Users booking appointments at exactly the same time for the same clinic doesn't work properly (concurrency issues).
+- Various usability issues that are apparent in the program. E.g. you need to click before you right click, drag and drop has no visiual assist to show what you are dragging and where to, etc.
+- Remaining slots calculation does not work properly if you have more than 1 slot per access block (Najjar says that it doesn't work for 1 slot either if you change the time scale). (being fixed in v 1.5).
+- Find Appointments function is not operational in Scheduling GUI (fixed in 1.5)
+- IDs in Scheduling GUI reflect the HRN not the Primary ID
+- Cannot cancel a walk-in appointment in Scheduling... (fixed in 1.5)
+- No handling of invalid access code when saving access slots.
+- No Ctrl-C & Ctrl-V handling
+- No Insert & Delete button handling
+- Grids don't respond to mouse wheel movement. (fixed in 1.5)
+- Appointment drag and drop to the same time at a different clinic doesn't work (complains that the patient already has an appointment at this time).
+- Appointment drap and drop between different windows doesn't cancel the original appointment.
+- Rebooking under certain conditions causes system hangs. Two issues: Program doesn't increment requested available appointment from VISTA, and doesn't deal properly with an appointment that doesn't have a access type (ie an appointment that is not in an Access block).
+- Speed issues (see below) <better in 1.5>
+- Date on Appt List header in Arabic doesn't show up correctly.
+- Error massages should be clearer for the end Users <fixed in 1.5>
+- Event raise for clinic groups raises the name of the group not the clinic. The receiving end in the C# code compares and checks for the clinic. <fixed in 1.5>
+- When making a walk-in appointment, it lets you cancel check-in by pressing the cancel button, yet walk-in continues to be made.
+- If user has no access to any schedules but has access to application (has BSDXZMENU key), opening the appointment menu causes a crash.
+
+
+Other Bugs:
+Put them on the trac server where you got this software.
+
+Enhancement requests:
+- Show Appointment Status in patient information windows. In other words show if the appointment is a future, checked-in, checked-out, or canceled status. (Oroville)
+- Allow all users to access all clinics by default (EHS/PHH)
+- Summary Schedule report based on Clinic Schedule report. Remove Phone, Address, Appointment Made By, and on fields.
+- Alert user if a patient already has an appointment in the same clinic for today.
+- Print Appointment Letter when Appointment is made (PHH Users workflow). (solved in 1.5)
+- Make printing an extensible module for end user customization (Oroville and PHH) (solved in 1.5; not documented).
+- Be able to print mutiple copies of a report (request of a PHH user).
+- Appointment List print out doesn't show the date and time printed. (solved in 1.5)
+- Add patient order to the routing slip (solved in 1.5)
+- Double-click should open make appoitment
+- Double-click on appointment should edit appointment
+- Click right click issue on grid
+- Add right-click on tvClinics to Print schedule for the clinic (solved in 1.5)
+- Add ability to Cancel Walk-in appointments <Najjar> (solved in 1.5)
+- Make the manager for the division not for the Data Base <Najjar>
+- Map the Clerks (Users) to the Groups not the clinics <Najjar>
+- Add New Key to the system; allow the manager to map users to the clinics without having access to add and edit the clinics
+- In the Re-book function; system should inform the users if there is no available clinic, not just do nothing.
+- Select the provider from the Check-in option should print the provider on the routing slip (sovled in 1.5)
+- Make the reason for the cancellation editable can be configured site Specific
+- Have an overbook limit and it can be edited as in VistA Scheduling
+- Show a indicator if a patient got checked out or not.
+- Generate a report from the system, tell us about the Check-in & Check-out status
+- Change VistA Server should be only for the manager only
+- If the I close the Last Windows in the clinical Scheduling GUI the system should ask me "Are you sure to close this program?"
+- A tool that allow us to edit the schedule without go to each day to change
+- If I apply a new template to the clinic the system should ask me if I want to delete the previous one
+- Adding blocks in groups not individually
+- If I inactivate the clinic in VistA it should reflects in GUI
+- If we can make the users in groups. i.e. MRs group, OP clinics Group and map them to the resource groups
+- Add an option to change the locale independent of the Windows locale (Khamis; PHH) <not doable>; changed date format instead in v 1.5
+- Show today's column in a different color.
+- Show Holiday columns in a different color.
+- Be able to copy appointments in mass from one clinic to another.
+- Manager functions: Send message and Shutdown sends message or shuts down all users, not just individual users.
+- SMS to remind patients of appointments.
+
+Speed issues:
+- Loading takes a long time <solved in 1.5>
+- Search <enter> Select <enter> <enter> takes a long time when adding appointment <solved in 1.5>
+- Wait cursor when updating <solved in 1.5>
+- Checkin takes a long time <solved in 1.5>
+- Printing the routing slip takes a slightly longer than necessary time <not an issue in main version>
+- Select patient dialog takes a tiny while to show up. <solved in 1.5>
+- Date-change selection not optimal (calls server with each tiny change) <solved in 1.5>
Index: Scheduling/branches/Radiology-Support/doc/StepsForSchedRelease.txt
===================================================================
--- Scheduling/branches/Radiology-Support/doc/StepsForSchedRelease.txt	(revision 1134)
+++ Scheduling/branches/Radiology-Support/doc/StepsForSchedRelease.txt	(revision 1134)
@@ -0,0 +1,24 @@
+Steps for Creating a new Release for Scheduling GUI.
+1. Increment version number on the GUI (both assembly and file).
+2. Compile GUI and dll in release mode. Update svn.
+3. Increment version number in the BSDX APPLICATION file.
+4. Copy kids build into new kids build, incrementing the version number.
+5. Edit build. Change Date Distributed.
+6. Change version number on routines using the Update Version Number option.
+7. Copy modified routines just created from patches back to svn directory. Update svn.
+8. Write out the build, and update svn with the new build.
+9. Update Readme file with new version. Add any tidbits if necessary.
+0. Update the Change Log.
+
+Steps for Creating a new Release for BMX
+1. Increment version number on the GUI (assembly and file).
+2. Compile GUI and dll in release mode. Update svn.
+3. Increment version number in the BMX APPLICATION file.
+4. Copy kids build into new kids build, incrementing the version number.
+5. Edit build. Change Date Distributed.
+6. Change version number on routines using the Update Version Number option.
+7. Copy modified routines just created from patches back to svn directory. Update svn.
+8. Write out the build, and update svn with the new build.
+9. Update Readme file with new version. Add any tidbits if necessary.
+0. Update the Change Log.
+
Index: Scheduling/branches/Radiology-Support/doc/manual_changes.txt
===================================================================
--- Scheduling/branches/Radiology-Support/doc/manual_changes.txt	(revision 1134)
+++ Scheduling/branches/Radiology-Support/doc/manual_changes.txt	(revision 1134)
@@ -0,0 +1,25 @@
+References to RPMS across the Manual
+
+Section 2.7: There are short keys now. Eg Ctrl+1; Ctrl+5.
+Section 3.3.3: Same thing.
+Section 4.3: You can search by the following:
+- SSN
+- Primary ID
+- Date of Birth
+- Health Record Number
+Screenshot 4-13: Different.
+ - View EHR button no longer there as this doesn't work on VISTA.
+ - View appointments substituted by a list of appointments.
+ - Fields are different.
+Screenshot 4-16: Different.
+ - Dialogs are re-arranged.
+Section 4.10: Change reference to PCC to PCE.
+Screenshot 4-19: Incorrect. Adds Default Provider.
+Section 5.1: All screenshots are different.
+Section 5.3: All screenshots are different. Some instructions need to be different.
+6.1.2.3: Shortcuts are available.
+6.1.5.2: Step 7: Starting Week (Monday): That should just be "Starting Week". I had to change the code for that since it didn't work for Jordan.
+6.2.1.3: Screenshot and manual are incorrect. Users need the key BSDXZMENU not access to PIMS to be visible in the drop down list. To be honest, the program still says the incorrect thing.
+Screenshot 6-45: Dialog changed. Description above and below needs to be adjusted.
+Section 8: Up to you whether you want to include.
+Section 11: Change, obviously
Index: Scheduling/branches/Radiology-Support/kids/BSDX_0142.k
===================================================================
--- Scheduling/branches/Radiology-Support/kids/BSDX_0142.k	(revision 1134)
+++ Scheduling/branches/Radiology-Support/kids/BSDX_0142.k	(revision 1134)
@@ -0,0 +1,12676 @@
+KIDS Distribution saved on Dec 07, 2010@01:24:23
+Scheduling GUI v 1.42
+**KIDS**:BSDX 1.42^
+
+**INSTALL NAME**
+BSDX 1.42
+"BLD",7653,0)
+BSDX 1.42^IHS Windows Scheduling^^3101207^n
+"BLD",7653,1,0)
+^^1^1^3101207^^^^
+"BLD",7653,1,1,0)
+Clinical Scheduling M Server support routines, files, options and RPCs.
+"BLD",7653,4,0)
+^9.64PA^9002018.5^9
+"BLD",7653,4,9002018.1,0)
+9002018.1
+"BLD",7653,4,9002018.1,222)
+y^y^f^^n^^n^o^n
+"BLD",7653,4,9002018.15,0)
+9002018.15
+"BLD",7653,4,9002018.15,222)
+y^y^f^^n^^n^o^n
+"BLD",7653,4,9002018.2,0)
+9002018.2
+"BLD",7653,4,9002018.2,222)
+y^y^f^^n^^n^o^n
+"BLD",7653,4,9002018.3,0)
+9002018.3
+"BLD",7653,4,9002018.3,222)
+y^y^f^^n^^n^o^n
+"BLD",7653,4,9002018.35,0)
+9002018.35
+"BLD",7653,4,9002018.35,222)
+y^y^f^^n^^n^o^n
+"BLD",7653,4,9002018.38,0)
+9002018.38
+"BLD",7653,4,9002018.38,222)
+y^y^f^^n^^n^o^n
+"BLD",7653,4,9002018.39,0)
+9002018.39
+"BLD",7653,4,9002018.39,222)
+y^y^f^^n^^n^o^n
+"BLD",7653,4,9002018.4,0)
+9002018.4
+"BLD",7653,4,9002018.4,222)
+y^y^f^^n^^n^o^n
+"BLD",7653,4,9002018.5,0)
+9002018.5
+"BLD",7653,4,9002018.5,222)
+y^y^f^^n^^y^o^n
+"BLD",7653,4,"B",9002018.1,9002018.1)
+
+"BLD",7653,4,"B",9002018.15,9002018.15)
+
+"BLD",7653,4,"B",9002018.2,9002018.2)
+
+"BLD",7653,4,"B",9002018.3,9002018.3)
+
+"BLD",7653,4,"B",9002018.35,9002018.35)
+
+"BLD",7653,4,"B",9002018.38,9002018.38)
+
+"BLD",7653,4,"B",9002018.39,9002018.39)
+
+"BLD",7653,4,"B",9002018.4,9002018.4)
+
+"BLD",7653,4,"B",9002018.5,9002018.5)
+
+"BLD",7653,6.3)
+9
+"BLD",7653,"ABPKG")
+n
+"BLD",7653,"INIT")
+V0200^BSDX2E
+"BLD",7653,"KRN",0)
+^9.67PA^8989.52^19
+"BLD",7653,"KRN",.4,0)
+.4
+"BLD",7653,"KRN",.4,"NM",0)
+^9.68A^^
+"BLD",7653,"KRN",.401,0)
+.401
+"BLD",7653,"KRN",.402,0)
+.402
+"BLD",7653,"KRN",.403,0)
+.403
+"BLD",7653,"KRN",.5,0)
+.5
+"BLD",7653,"KRN",.84,0)
+.84
+"BLD",7653,"KRN",3.6,0)
+3.6
+"BLD",7653,"KRN",3.8,0)
+3.8
+"BLD",7653,"KRN",9.2,0)
+9.2
+"BLD",7653,"KRN",9.8,0)
+9.8
+"BLD",7653,"KRN",9.8,"NM",0)
+^9.68A^36^36
+"BLD",7653,"KRN",9.8,"NM",1,0)
+BSDX01^^0^B107139484
+"BLD",7653,"KRN",9.8,"NM",2,0)
+BSDX02^^0^B16323271
+"BLD",7653,"KRN",9.8,"NM",3,0)
+BSDX03^^0^B2855259
+"BLD",7653,"KRN",9.8,"NM",4,0)
+BSDX04^^0^B31079316
+"BLD",7653,"KRN",9.8,"NM",5,0)
+BSDX05^^0^B10878471
+"BLD",7653,"KRN",9.8,"NM",6,0)
+BSDX06^^0^B6812445
+"BLD",7653,"KRN",9.8,"NM",7,0)
+BSDX07^^0^B188811791
+"BLD",7653,"KRN",9.8,"NM",8,0)
+BSDX08^^0^B140041473
+"BLD",7653,"KRN",9.8,"NM",9,0)
+BSDX09^^0^B35707298
+"BLD",7653,"KRN",9.8,"NM",10,0)
+BSDX12^^0^B7203579
+"BLD",7653,"KRN",9.8,"NM",11,0)
+BSDX13^^0^B9772451
+"BLD",7653,"KRN",9.8,"NM",12,0)
+BSDX14^^0^B6450810
+"BLD",7653,"KRN",9.8,"NM",13,0)
+BSDX15^^0^B5327807
+"BLD",7653,"KRN",9.8,"NM",14,0)
+BSDX16^^0^B11948965
+"BLD",7653,"KRN",9.8,"NM",15,0)
+BSDX17^^0^B2072173
+"BLD",7653,"KRN",9.8,"NM",16,0)
+BSDX18^^0^B87953431
+"BLD",7653,"KRN",9.8,"NM",17,0)
+BSDX19^^0^B7890401
+"BLD",7653,"KRN",9.8,"NM",18,0)
+BSDX20^^0^B5911607
+"BLD",7653,"KRN",9.8,"NM",19,0)
+BSDX21^^0^B8672065
+"BLD",7653,"KRN",9.8,"NM",20,0)
+BSDX22^^0^B9479861
+"BLD",7653,"KRN",9.8,"NM",21,0)
+BSDX23^^0^B8488013
+"BLD",7653,"KRN",9.8,"NM",22,0)
+BSDX24^^0^B13455014
+"BLD",7653,"KRN",9.8,"NM",23,0)
+BSDX25^^0^B16070744
+"BLD",7653,"KRN",9.8,"NM",24,0)
+BSDX26^^0^B30714245
+"BLD",7653,"KRN",9.8,"NM",25,0)
+BSDX27^^0^B133007616
+"BLD",7653,"KRN",9.8,"NM",26,0)
+BSDX28^^0^B32389827
+"BLD",7653,"KRN",9.8,"NM",27,0)
+BSDX29^^0^B51424449
+"BLD",7653,"KRN",9.8,"NM",28,0)
+BSDX30^^0^B6616255
+"BLD",7653,"KRN",9.8,"NM",29,0)
+BSDX31^^0^B67823338
+"BLD",7653,"KRN",9.8,"NM",30,0)
+BSDX32^^0^B17196738
+"BLD",7653,"KRN",9.8,"NM",31,0)
+BSDX33^^0^B14923306
+"BLD",7653,"KRN",9.8,"NM",32,0)
+BSDX34^^0^B43182525
+"BLD",7653,"KRN",9.8,"NM",33,0)
+BSDX35^^0^B8147998
+"BLD",7653,"KRN",9.8,"NM",34,0)
+BSDX11^^0^B6358791
+"BLD",7653,"KRN",9.8,"NM",35,0)
+BSDXAPI^^0^B105784370
+"BLD",7653,"KRN",9.8,"NM",36,0)
+BSDXGPRV^^0^B4804670
+"BLD",7653,"KRN",9.8,"NM","B","BSDX01",1)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX02",2)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX03",3)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX04",4)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX05",5)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX06",6)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX07",7)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX08",8)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX09",9)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX11",34)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX12",10)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX13",11)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX14",12)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX15",13)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX16",14)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX17",15)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX18",16)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX19",17)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX20",18)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX21",19)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX22",20)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX23",21)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX24",22)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX25",23)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX26",24)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX27",25)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX28",26)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX29",27)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX30",28)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX31",29)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX32",30)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX33",31)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX34",32)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDX35",33)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDXAPI",35)
+
+"BLD",7653,"KRN",9.8,"NM","B","BSDXGPRV",36)
+
+"BLD",7653,"KRN",19,0)
+19
+"BLD",7653,"KRN",19,"NM",0)
+^9.68A^1^1
+"BLD",7653,"KRN",19,"NM",1,0)
+BSDXRPC^^0
+"BLD",7653,"KRN",19,"NM","B","BSDXRPC",1)
+
+"BLD",7653,"KRN",19.1,0)
+19.1
+"BLD",7653,"KRN",19.1,"NM",0)
+^9.68A^2^2
+"BLD",7653,"KRN",19.1,"NM",1,0)
+BSDXZMENU^^0
+"BLD",7653,"KRN",19.1,"NM",2,0)
+BSDXZMGR^^0
+"BLD",7653,"KRN",19.1,"NM","B","BSDXZMENU",1)
+
+"BLD",7653,"KRN",19.1,"NM","B","BSDXZMGR",2)
+
+"BLD",7653,"KRN",101,0)
+101
+"BLD",7653,"KRN",101,"NM",0)
+^9.68A^4^4
+"BLD",7653,"KRN",101,"NM",1,0)
+BSDX ADD APPOINTMENT^^0
+"BLD",7653,"KRN",101,"NM",2,0)
+BSDX CANCEL APPOINTMENT^^0
+"BLD",7653,"KRN",101,"NM",3,0)
+BSDX CHECKIN APPOINTMENT^^0
+"BLD",7653,"KRN",101,"NM",4,0)
+BSDX NOSHOW APPOINTMENT^^0
+"BLD",7653,"KRN",101,"NM","B","BSDX ADD APPOINTMENT",1)
+
+"BLD",7653,"KRN",101,"NM","B","BSDX CANCEL APPOINTMENT",2)
+
+"BLD",7653,"KRN",101,"NM","B","BSDX CHECKIN APPOINTMENT",3)
+
+"BLD",7653,"KRN",101,"NM","B","BSDX NOSHOW APPOINTMENT",4)
+
+"BLD",7653,"KRN",409.61,0)
+409.61
+"BLD",7653,"KRN",771,0)
+771
+"BLD",7653,"KRN",870,0)
+870
+"BLD",7653,"KRN",8989.51,0)
+8989.51
+"BLD",7653,"KRN",8989.52,0)
+8989.52
+"BLD",7653,"KRN",8994,0)
+8994
+"BLD",7653,"KRN",8994,"NM",0)
+^9.68A^59^56
+"BLD",7653,"KRN",8994,"NM",1,0)
+BSDX ADD NEW APPOINTMENT^^0
+"BLD",7653,"KRN",8994,"NM",2,0)
+BSDX ADD NEW AVAILABILITY^^0
+"BLD",7653,"KRN",8994,"NM",3,0)
+BSDX APPT BLOCKS OVERLAP^^0
+"BLD",7653,"KRN",8994,"NM",4,0)
+BSDX CANCEL APPOINTMENT^^0
+"BLD",7653,"KRN",8994,"NM",5,0)
+BSDX CANCEL AVAILABILITY^^0
+"BLD",7653,"KRN",8994,"NM",6,0)
+BSDX CREATE APPT SCHEDULE^^0
+"BLD",7653,"KRN",8994,"NM",7,0)
+BSDX CREATE ASGND SLOT SCHED^^0
+"BLD",7653,"KRN",8994,"NM",10,0)
+BSDX GET BASIC REG INFO^^0
+"BLD",7653,"KRN",8994,"NM",12,0)
+BSDX TYPE BLOCKS OVERLAP^^0
+"BLD",7653,"KRN",8994,"NM",13,0)
+BSDX ADD/EDIT ACCESS TYPE^^0
+"BLD",7653,"KRN",8994,"NM",14,0)
+BSDX GET ACCESS GROUP TYPES^^0
+"BLD",7653,"KRN",8994,"NM",15,0)
+BSDX GROUP RESOURCE^^0
+"BLD",7653,"KRN",8994,"NM",16,0)
+BSDX RESOURCE GROUPS BY USER^^0
+"BLD",7653,"KRN",8994,"NM",17,0)
+BSDX ADD/EDIT RESOURCEUSER^^0
+"BLD",7653,"KRN",8994,"NM",18,0)
+BSDX DELETE RESOURCEUSER^^0
+"BLD",7653,"KRN",8994,"NM",19,0)
+BSDX SCHEDULE USER^^0
+"BLD",7653,"KRN",8994,"NM",20,0)
+BSDX ADD/EDIT RESOURCE^^0
+"BLD",7653,"KRN",8994,"NM",21,0)
+BSDX SCHEDULING USER INFO^^0
+"BLD",7653,"KRN",8994,"NM",22,0)
+BSDX RESOURCES^^0
+"BLD",7653,"KRN",8994,"NM",23,0)
+BSDX ADD/EDIT RESOURCE GROUP^^0
+"BLD",7653,"KRN",8994,"NM",24,0)
+BSDX DELETE RESOURCE GROUP^^0
+"BLD",7653,"KRN",8994,"NM",25,0)
+BSDX DELETE RES GROUP ITEM^^0
+"BLD",7653,"KRN",8994,"NM",26,0)
+BSDX DEPARTMENT RESOURCE^^0
+"BLD",7653,"KRN",8994,"NM",27,0)
+BSDX DEPARTMENTS BY USER^^0
+"BLD",7653,"KRN",8994,"NM",28,0)
+BSDX RESOURCES BY USER^^0
+"BLD",7653,"KRN",8994,"NM",29,0)
+BSDX ADD ACCESS GROUP ITEM^^0
+"BLD",7653,"KRN",8994,"NM",30,0)
+BSDX ADD RES GROUP ITEM^^0
+"BLD",7653,"KRN",8994,"NM",31,0)
+BSDX ADD/EDIT ACCESS GROUP^^0
+"BLD",7653,"KRN",8994,"NM",32,0)
+BSDX DELETE ACCESS GROUP^^0
+"BLD",7653,"KRN",8994,"NM",33,0)
+BSDX DELETE ACCESS GROUP ITEM^^0
+"BLD",7653,"KRN",8994,"NM",34,0)
+BSDX REGISTER EVENT^^0
+"BLD",7653,"KRN",8994,"NM",35,0)
+BSDX UNREGISTER EVENT^^0
+"BLD",7653,"KRN",8994,"NM",36,0)
+BSDX RAISE EVENT^^0
+"BLD",7653,"KRN",8994,"NM",37,0)
+BSDX SEARCH AVAILABILITY^^0
+"BLD",7653,"KRN",8994,"NM",38,0)
+BSDX CHECKIN APPOINTMENT^^0
+"BLD",7653,"KRN",8994,"NM",39,0)
+BSDX EDIT APPOINTMENT^^0
+"BLD",7653,"KRN",8994,"NM",40,0)
+BSDX PATIENT APPT DISPLAY^^0
+"BLD",7653,"KRN",8994,"NM",41,0)
+BSDXPatientLookupRS^^0
+"BLD",7653,"KRN",8994,"NM",42,0)
+BSDX SPACEBAR SET^^0
+"BLD",7653,"KRN",8994,"NM",43,0)
+BSDX COPY APPOINTMENT CANCEL^^0
+"BLD",7653,"KRN",8994,"NM",44,0)
+BSDX COPY APPOINTMENT STATUS^^0
+"BLD",7653,"KRN",8994,"NM",45,0)
+BSDX COPY APPOINTMENTS^^0
+"BLD",7653,"KRN",8994,"NM",46,0)
+BSDX CLINIC LETTERS^^0
+"BLD",7653,"KRN",8994,"NM",47,0)
+BSDX NOSHOW^^0
+"BLD",7653,"KRN",8994,"NM",48,0)
+BSDX IM HERE^^0
+"BLD",7653,"KRN",8994,"NM",49,0)
+BSDX HOSPITAL LOCATION^^0
+"BLD",7653,"KRN",8994,"NM",50,0)
+BSDX CLINIC SETUP^^0
+"BLD",7653,"KRN",8994,"NM",51,0)
+BSDX REBOOK LIST^^0
+"BLD",7653,"KRN",8994,"NM",52,0)
+BSDX REBOOK CLINIC LIST^^0
+"BLD",7653,"KRN",8994,"NM",53,0)
+BSDX REBOOK SET^^0
+"BLD",7653,"KRN",8994,"NM",54,0)
+BSDX RESOURCE LETTERS^^0
+"BLD",7653,"KRN",8994,"NM",55,0)
+BSDX CANCEL CLINIC LIST^^0
+"BLD",7653,"KRN",8994,"NM",56,0)
+BSDX CANCEL AV BY DATE^^0
+"BLD",7653,"KRN",8994,"NM",57,0)
+BSDX REBOOK NEXT BLOCK^^0
+"BLD",7653,"KRN",8994,"NM",58,0)
+BSDX EHR PATIENT^^0
+"BLD",7653,"KRN",8994,"NM",59,0)
+BSDX HOSP LOC PROVIDERS^^0
+"BLD",7653,"KRN",8994,"NM","B","BSDX ADD ACCESS GROUP ITEM",29)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX ADD NEW APPOINTMENT",1)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX ADD NEW AVAILABILITY",2)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX ADD RES GROUP ITEM",30)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX ADD/EDIT ACCESS GROUP",31)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX ADD/EDIT ACCESS TYPE",13)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX ADD/EDIT RESOURCE",20)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX ADD/EDIT RESOURCE GROUP",23)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX ADD/EDIT RESOURCEUSER",17)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX APPT BLOCKS OVERLAP",3)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX CANCEL APPOINTMENT",4)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX CANCEL AV BY DATE",56)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX CANCEL AVAILABILITY",5)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX CANCEL CLINIC LIST",55)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX CHECKIN APPOINTMENT",38)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX CLINIC LETTERS",46)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX CLINIC SETUP",50)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX COPY APPOINTMENT CANCEL",43)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX COPY APPOINTMENT STATUS",44)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX COPY APPOINTMENTS",45)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX CREATE APPT SCHEDULE",6)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX CREATE ASGND SLOT SCHED",7)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX DELETE ACCESS GROUP",32)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX DELETE ACCESS GROUP ITEM",33)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX DELETE RES GROUP ITEM",25)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX DELETE RESOURCE GROUP",24)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX DELETE RESOURCEUSER",18)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX DEPARTMENT RESOURCE",26)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX DEPARTMENTS BY USER",27)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX EDIT APPOINTMENT",39)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX EHR PATIENT",58)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX GET ACCESS GROUP TYPES",14)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX GET BASIC REG INFO",10)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX GROUP RESOURCE",15)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX HOSP LOC PROVIDERS",59)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX HOSPITAL LOCATION",49)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX IM HERE",48)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX NOSHOW",47)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX PATIENT APPT DISPLAY",40)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX RAISE EVENT",36)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX REBOOK CLINIC LIST",52)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX REBOOK LIST",51)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX REBOOK NEXT BLOCK",57)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX REBOOK SET",53)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX REGISTER EVENT",34)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX RESOURCE GROUPS BY USER",16)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX RESOURCE LETTERS",54)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX RESOURCES",22)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX RESOURCES BY USER",28)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX SCHEDULE USER",19)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX SCHEDULING USER INFO",21)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX SEARCH AVAILABILITY",37)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX SPACEBAR SET",42)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX TYPE BLOCKS OVERLAP",12)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDX UNREGISTER EVENT",35)
+
+"BLD",7653,"KRN",8994,"NM","B","BSDXPatientLookupRS",41)
+
+"BLD",7653,"KRN","B",.4,.4)
+
+"BLD",7653,"KRN","B",.401,.401)
+
+"BLD",7653,"KRN","B",.402,.402)
+
+"BLD",7653,"KRN","B",.403,.403)
+
+"BLD",7653,"KRN","B",.5,.5)
+
+"BLD",7653,"KRN","B",.84,.84)
+
+"BLD",7653,"KRN","B",3.6,3.6)
+
+"BLD",7653,"KRN","B",3.8,3.8)
+
+"BLD",7653,"KRN","B",9.2,9.2)
+
+"BLD",7653,"KRN","B",9.8,9.8)
+
+"BLD",7653,"KRN","B",19,19)
+
+"BLD",7653,"KRN","B",19.1,19.1)
+
+"BLD",7653,"KRN","B",101,101)
+
+"BLD",7653,"KRN","B",409.61,409.61)
+
+"BLD",7653,"KRN","B",771,771)
+
+"BLD",7653,"KRN","B",870,870)
+
+"BLD",7653,"KRN","B",8989.51,8989.51)
+
+"BLD",7653,"KRN","B",8989.52,8989.52)
+
+"BLD",7653,"KRN","B",8994,8994)
+
+"BLD",7653,"PRE")
+BSDX2E
+"BLD",7653,"QUES",0)
+^9.62^^
+"BLD",7653,"REQB",0)
+^9.611^^
+"DATA",9002018.5,1,0)
+1^42^3101207.0043
+"FIA",9002018.1)
+BSDX RESOURCE
+"FIA",9002018.1,0)
+^BSDXRES(
+"FIA",9002018.1,0,0)
+9002018.1
+"FIA",9002018.1,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.1,0,10)
+
+"FIA",9002018.1,0,11)
+
+"FIA",9002018.1,0,"RLRO")
+
+"FIA",9002018.1,0,"VR")
+1.42^BSDX
+"FIA",9002018.1,9002018.1)
+0
+"FIA",9002018.1,9002018.11)
+0
+"FIA",9002018.1,9002018.11201)
+0
+"FIA",9002018.1,9002018.11301)
+0
+"FIA",9002018.1,9002018.12001)
+0
+"FIA",9002018.15)
+BSDX RESOURCE USER
+"FIA",9002018.15,0)
+^BSDXRSU(
+"FIA",9002018.15,0,0)
+9002018.15P
+"FIA",9002018.15,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.15,0,10)
+
+"FIA",9002018.15,0,11)
+
+"FIA",9002018.15,0,"RLRO")
+
+"FIA",9002018.15,0,"VR")
+1.42^BSDX
+"FIA",9002018.15,9002018.15)
+0
+"FIA",9002018.2)
+BSDX RESOURCE GROUP
+"FIA",9002018.2,0)
+^BSDXDEPT(
+"FIA",9002018.2,0,0)
+9002018.2
+"FIA",9002018.2,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.2,0,10)
+
+"FIA",9002018.2,0,11)
+
+"FIA",9002018.2,0,"RLRO")
+
+"FIA",9002018.2,0,"VR")
+1.42^BSDX
+"FIA",9002018.2,9002018.2)
+0
+"FIA",9002018.2,9002018.21)
+0
+"FIA",9002018.3)
+BSDX ACCESS BLOCK
+"FIA",9002018.3,0)
+^BSDXAB(
+"FIA",9002018.3,0,0)
+9002018.3PA
+"FIA",9002018.3,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.3,0,10)
+
+"FIA",9002018.3,0,11)
+
+"FIA",9002018.3,0,"RLRO")
+
+"FIA",9002018.3,0,"VR")
+1.42^BSDX
+"FIA",9002018.3,9002018.3)
+0
+"FIA",9002018.3,9002018.31)
+0
+"FIA",9002018.35)
+BSDX ACCESS TYPE
+"FIA",9002018.35,0)
+^BSDXTYPE(
+"FIA",9002018.35,0,0)
+9002018.35
+"FIA",9002018.35,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.35,0,10)
+
+"FIA",9002018.35,0,11)
+
+"FIA",9002018.35,0,"RLRO")
+
+"FIA",9002018.35,0,"VR")
+1.42^BSDX
+"FIA",9002018.35,9002018.35)
+0
+"FIA",9002018.38)
+BSDX ACCESS GROUP
+"FIA",9002018.38,0)
+^BSDXAGP(
+"FIA",9002018.38,0,0)
+9002018.38
+"FIA",9002018.38,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.38,0,10)
+
+"FIA",9002018.38,0,11)
+
+"FIA",9002018.38,0,"RLRO")
+
+"FIA",9002018.38,0,"VR")
+1.42^BSDX
+"FIA",9002018.38,9002018.38)
+0
+"FIA",9002018.39)
+BSDX ACCESS GROUP TYPE
+"FIA",9002018.39,0)
+^BSDXAGTP(
+"FIA",9002018.39,0,0)
+9002018.39P
+"FIA",9002018.39,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.39,0,10)
+
+"FIA",9002018.39,0,11)
+
+"FIA",9002018.39,0,"RLRO")
+
+"FIA",9002018.39,0,"VR")
+1.42^BSDX
+"FIA",9002018.39,9002018.39)
+0
+"FIA",9002018.4)
+BSDX APPOINTMENT
+"FIA",9002018.4,0)
+^BSDXAPPT(
+"FIA",9002018.4,0,0)
+9002018.4DA
+"FIA",9002018.4,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.4,0,10)
+
+"FIA",9002018.4,0,11)
+
+"FIA",9002018.4,0,"RLRO")
+
+"FIA",9002018.4,0,"VR")
+1.42^BSDX
+"FIA",9002018.4,9002018.4)
+0
+"FIA",9002018.4,9002018.41)
+0
+"FIA",9002018.5)
+BSDX APPLICATION
+"FIA",9002018.5,0)
+^BSDXAPPL(
+"FIA",9002018.5,0,0)
+9002018.5
+"FIA",9002018.5,0,1)
+y^y^f^^n^^y^o^n
+"FIA",9002018.5,0,10)
+
+"FIA",9002018.5,0,11)
+
+"FIA",9002018.5,0,"RLRO")
+
+"FIA",9002018.5,0,"VR")
+1.42^BSDX
+"FIA",9002018.5,9002018.5)
+0
+"INIT")
+V0200^BSDX2E
+"IX",9002018.39,9002018.39,"AC",0)
+9002018.39^AC^INDEX OF ACCESS GROUP, ACCESS TYPE^R^^R^IR^I^9002018.39^^^^^S
+"IX",9002018.39,9002018.39,"AC",1)
+S ^BSDXAGTP("AC",$E(X(1),1,30),$E(X(2),1,30),DA)=""
+"IX",9002018.39,9002018.39,"AC",2)
+K ^BSDXAGTP("AC",$E(X(1),1,30),$E(X(2),1,30),DA)
+"IX",9002018.39,9002018.39,"AC",2.5)
+K ^BSDXAGTP("AC")
+"IX",9002018.39,9002018.39,"AC",11.1,0)
+^.114IA^2^2
+"IX",9002018.39,9002018.39,"AC",11.1,1,0)
+1^F^9002018.39^.01^30^1^F
+"IX",9002018.39,9002018.39,"AC",11.1,1,3)
+
+"IX",9002018.39,9002018.39,"AC",11.1,2,0)
+2^F^9002018.39^.02^30^2^F
+"IX",9002018.39,9002018.39,"AC",11.1,2,3)
+
+"KRN",19,10987,-1)
+0^1
+"KRN",19,10987,0)
+BSDXRPC^WINDOWS SCHEDULING PROCEDURE CALLS^^B^^^^^^^^IHS Windows Scheduling
+"KRN",19,10987,1,0)
+^19.06^4^4^3100618^^
+"KRN",19,10987,1,1,0)
+This option hosts RPCs in the BSDX namespace.  Windows Scheduling users
+"KRN",19,10987,1,2,0)
+ mustg have access to this option
+"KRN",19,10987,1,3,0)
+ 
+"KRN",19,10987,1,4,0)
+in order to use Windows Scheduling.
+"KRN",19,10987,99.1)
+61545,63078
+"KRN",19,10987,"RPC",0)
+^19.05P^56^56
+"KRN",19,10987,"RPC",1,0)
+BSDX ADD ACCESS GROUP ITEM
+"KRN",19,10987,"RPC",2,0)
+BSDX ADD NEW APPOINTMENT
+"KRN",19,10987,"RPC",3,0)
+BSDX ADD NEW AVAILABILITY
+"KRN",19,10987,"RPC",4,0)
+BSDX ADD RES GROUP ITEM
+"KRN",19,10987,"RPC",5,0)
+BSDX ADD/EDIT ACCESS GROUP
+"KRN",19,10987,"RPC",6,0)
+BSDX ADD/EDIT ACCESS TYPE
+"KRN",19,10987,"RPC",7,0)
+BSDX ADD/EDIT RESOURCE
+"KRN",19,10987,"RPC",8,0)
+BSDX ADD/EDIT RESOURCE GROUP
+"KRN",19,10987,"RPC",9,0)
+BSDX ADD/EDIT RESOURCEUSER
+"KRN",19,10987,"RPC",10,0)
+BSDX APPT BLOCKS OVERLAP
+"KRN",19,10987,"RPC",11,0)
+BSDX CANCEL APPOINTMENT
+"KRN",19,10987,"RPC",12,0)
+BSDX CANCEL AVAILABILITY
+"KRN",19,10987,"RPC",13,0)
+BSDX CHECKIN APPOINTMENT
+"KRN",19,10987,"RPC",14,0)
+BSDX CREATE APPT SCHEDULE
+"KRN",19,10987,"RPC",15,0)
+BSDX CREATE ASGND SLOT SCHED
+"KRN",19,10987,"RPC",16,0)
+BSDX DELETE ACCESS GROUP
+"KRN",19,10987,"RPC",17,0)
+BSDX DELETE ACCESS GROUP ITEM
+"KRN",19,10987,"RPC",18,0)
+BSDX DELETE RES GROUP ITEM
+"KRN",19,10987,"RPC",19,0)
+BSDX DELETE RESOURCE GROUP
+"KRN",19,10987,"RPC",20,0)
+BSDX DELETE RESOURCEUSER
+"KRN",19,10987,"RPC",21,0)
+BSDX DEPARTMENT RESOURCE
+"KRN",19,10987,"RPC",22,0)
+BSDX DEPARTMENTS BY USER
+"KRN",19,10987,"RPC",23,0)
+BSDX EDIT APPOINTMENT
+"KRN",19,10987,"RPC",24,0)
+BSDX GET ACCESS GROUP TYPES
+"KRN",19,10987,"RPC",25,0)
+BSDX GET BASIC REG INFO
+"KRN",19,10987,"RPC",26,0)
+BSDX GROUP RESOURCE
+"KRN",19,10987,"RPC",27,0)
+BSDX PATIENT APPT DISPLAY
+"KRN",19,10987,"RPC",28,0)
+BSDX RAISE EVENT
+"KRN",19,10987,"RPC",29,0)
+BSDX REGISTER EVENT
+"KRN",19,10987,"RPC",30,0)
+BSDX RESOURCE GROUPS BY USER
+"KRN",19,10987,"RPC",31,0)
+BSDX RESOURCES
+"KRN",19,10987,"RPC",32,0)
+BSDX RESOURCES BY USER
+"KRN",19,10987,"RPC",33,0)
+BSDX SCHEDULE USER
+"KRN",19,10987,"RPC",34,0)
+BSDX SCHEDULING USER INFO
+"KRN",19,10987,"RPC",35,0)
+BSDX SEARCH AVAILABILITY
+"KRN",19,10987,"RPC",36,0)
+BSDX TYPE BLOCKS OVERLAP
+"KRN",19,10987,"RPC",37,0)
+BSDX UNREGISTER EVENT
+"KRN",19,10987,"RPC",38,0)
+BSDXPatientLookupRS
+"KRN",19,10987,"RPC",39,0)
+BSDX SPACEBAR SET
+"KRN",19,10987,"RPC",40,0)
+BSDX COPY APPOINTMENTS
+"KRN",19,10987,"RPC",41,0)
+BSDX COPY APPOINTMENT CANCEL
+"KRN",19,10987,"RPC",42,0)
+BSDX COPY APPOINTMENT STATUS
+"KRN",19,10987,"RPC",43,0)
+BSDX CLINIC LETTERS
+"KRN",19,10987,"RPC",44,0)
+BSDX NOSHOW
+"KRN",19,10987,"RPC",45,0)
+BSDX IM HERE
+"KRN",19,10987,"RPC",46,0)
+BSDX HOSPITAL LOCATION
+"KRN",19,10987,"RPC",47,0)
+BSDX CLINIC SETUP
+"KRN",19,10987,"RPC",49,0)
+BSDX REBOOK LIST
+"KRN",19,10987,"RPC",50,0)
+BSDX REBOOK CLINIC LIST
+"KRN",19,10987,"RPC",51,0)
+BSDX REBOOK SET
+"KRN",19,10987,"RPC",52,0)
+BSDX RESOURCE LETTERS
+"KRN",19,10987,"RPC",53,0)
+BSDX CANCEL CLINIC LIST
+"KRN",19,10987,"RPC",54,0)
+BSDX CANCEL AV BY DATE
+"KRN",19,10987,"RPC",55,0)
+BSDX REBOOK NEXT BLOCK
+"KRN",19,10987,"RPC",56,0)
+BSDX HOSP LOC PROVIDERS
+"KRN",19,10987,"U")
+WINDOWS SCHEDULING PROCEDURE C
+"KRN",19.1,480,-1)
+0^1
+"KRN",19.1,480,0)
+BSDXZMENU^IHS Windows Scheduling
+"KRN",19.1,481,-1)
+0^2
+"KRN",19.1,481,0)
+BSDXZMGR^IHS Windows Scheduling Manager
+"KRN",101,4262,-1)
+0^2
+"KRN",101,4262,0)
+BSDX CANCEL APPOINTMENT^BSDX CANCEL APPOINTMENT^^A^^^^^^^^
+"KRN",101,4262,1,0)
+^^4^4^3040915^
+"KRN",101,4262,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4262,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4262,1,3,0)
+cancel an appointment in the IHS Windows Scheduling package
+"KRN",101,4262,1,4,0)
+when the corresponding appointment in RPMS Scheduling is cancelled.
+"KRN",101,4262,4)
+^^^BSDX CANCEL APPOINTMENT
+"KRN",101,4262,20)
+I $G(SDAMEVT)=2,$D(^BSDXAPPL) D CANEVT^BSDX08($G(DFN),$G(SDT),$G(SDCL))
+"KRN",101,4262,99)
+61598,46412
+"KRN",101,4263,-1)
+0^1
+"KRN",101,4263,0)
+BSDX ADD APPOINTMENT^BSDX ADD APPOINTMENT^^A^^^^^^^^
+"KRN",101,4263,1,0)
+^101.06^4^4^3040915^^
+"KRN",101,4263,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4263,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4263,1,3,0)
+add an appointment in the IHS Windows Scheduling package
+"KRN",101,4263,1,4,0)
+when the corresponding appointment in RPMS Scheduling is added.
+"KRN",101,4263,4)
+^^^BSDX ADD APPOINTMENT
+"KRN",101,4263,20)
+I $G(SDAMEVT)=1,$D(^BSDXAPPL) D ADDEVT^BSDX07($G(DFN),$G(SDT),$G(SDCL),$G(SDDA))
+"KRN",101,4263,99)
+61598,46412
+"KRN",101,4264,-1)
+0^4
+"KRN",101,4264,0)
+BSDX NOSHOW APPOINTMENT^BSDX NOSHOW APPOINTMENT^^A^^^^^^^^
+"KRN",101,4264,1,0)
+^101.06^4^4^3040915^^
+"KRN",101,4264,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4264,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4264,1,3,0)
+no-show an appointment in the IHS Windows Scheduling package
+"KRN",101,4264,1,4,0)
+when the corresponding appointment in RPMS Scheduling is no-showed.
+"KRN",101,4264,4)
+^^^BSDX NOSHOW APPOINTMENT
+"KRN",101,4264,20)
+I $G(SDAMEVT)=3,$D(^BSDXAPPL) D NOSEVT^BSDX31($G(DFN),$G(SDT),$G(SDCL))
+"KRN",101,4264,99)
+61598,46412
+"KRN",101,4265,-1)
+0^3
+"KRN",101,4265,0)
+BSDX CHECKIN APPOINTMENT^BSDX CHECKIN APPOINTMENT^^A^^^^^^^^
+"KRN",101,4265,1,0)
+^101.06^4^4^3040915^^^
+"KRN",101,4265,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4265,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4265,1,3,0)
+check in an appointment in the IHS Windows Scheduling package
+"KRN",101,4265,1,4,0)
+when the corresponding appointment in RPMS Scheduling is checked in.
+"KRN",101,4265,4)
+^^^BSDX CHECKIN APPOINTMENT
+"KRN",101,4265,20)
+I $G(SDAMEVT)=4,$D(^BSDXAPPL) D CHKEVT^BSDX25($G(DFN),$G(SDT),$G(SDCL))
+"KRN",101,4265,99)
+61598,46412
+"KRN",8994,2440,-1)
+0^16
+"KRN",8994,2440,0)
+BSDX RESOURCE GROUPS BY USER^DEPUSR^BSDX01^4
+"KRN",8994,2441,-1)
+0^22
+"KRN",8994,2441,0)
+BSDX RESOURCES^RESUSR^BSDX01^4
+"KRN",8994,2442,-1)
+0^6
+"KRN",8994,2442,0)
+BSDX CREATE APPT SCHEDULE^CRSCH^BSDX02^4
+"KRN",8994,2443,-1)
+0^1
+"KRN",8994,2443,0)
+BSDX ADD NEW APPOINTMENT^APPADD^BSDX07^4
+"KRN",8994,2444,-1)
+0^4
+"KRN",8994,2444,0)
+BSDX CANCEL APPOINTMENT^APPDEL^BSDX08^4
+"KRN",8994,2445,-1)
+0^7
+"KRN",8994,2445,0)
+BSDX CREATE ASGND SLOT SCHED^CASSCH^BSDX04^4
+"KRN",8994,2446,-1)
+0^2
+"KRN",8994,2446,0)
+BSDX ADD NEW AVAILABILITY^AVADD^BSDX12^4
+"KRN",8994,2447,-1)
+0^5
+"KRN",8994,2447,0)
+BSDX CANCEL AVAILABILITY^AVDEL^BSDX13^4
+"KRN",8994,2448,-1)
+0^3
+"KRN",8994,2448,0)
+BSDX APPT BLOCKS OVERLAP^APBLKOV^BSDX05^4
+"KRN",8994,2449,-1)
+0^12
+"KRN",8994,2449,0)
+BSDX TYPE BLOCKS OVERLAP^TPBLKOV^BSDX06^4
+"KRN",8994,2450,-1)
+0^10
+"KRN",8994,2450,0)
+BSDX GET BASIC REG INFO^GETREGA^BSDX09^4
+"KRN",8994,2451,-1)
+0^15
+"KRN",8994,2451,0)
+BSDX GROUP RESOURCE^DEPRES^BSDX01^4
+"KRN",8994,2452,-1)
+0^13
+"KRN",8994,2452,0)
+BSDX ADD/EDIT ACCESS TYPE^ACCTYP^BSDX14^4
+"KRN",8994,2453,-1)
+0^14
+"KRN",8994,2453,0)
+BSDX GET ACCESS GROUP TYPES^GRPTYP^BSDX15^4
+"KRN",8994,2454,-1)
+0^20
+"KRN",8994,2454,0)
+BSDX ADD/EDIT RESOURCE^RSRC^BSDX16^4
+"KRN",8994,2455,-1)
+0^19
+"KRN",8994,2455,0)
+BSDX SCHEDULE USER^SCHUSR^BSDX17^4
+"KRN",8994,2456,-1)
+0^18
+"KRN",8994,2456,0)
+BSDX DELETE RESOURCEUSER^DELRU^BSDX18^4
+"KRN",8994,2457,-1)
+0^17
+"KRN",8994,2457,0)
+BSDX ADD/EDIT RESOURCEUSER^ADDRU^BSDX18^4
+"KRN",8994,2458,-1)
+0^21
+"KRN",8994,2458,0)
+BSDX SCHEDULING USER INFO^SUINFO^BSDX01^4
+"KRN",8994,2459,-1)
+0^23
+"KRN",8994,2459,0)
+BSDX ADD/EDIT RESOURCE GROUP^ADDRG^BSDX19^4
+"KRN",8994,2460,-1)
+0^24
+"KRN",8994,2460,0)
+BSDX DELETE RESOURCE GROUP^DELRG^BSDX19^4
+"KRN",8994,2461,-1)
+0^27
+"KRN",8994,2461,0)
+BSDX DEPARTMENTS BY USER^DEPUSR^BSDX01^4
+"KRN",8994,2462,-1)
+0^28
+"KRN",8994,2462,0)
+BSDX RESOURCES BY USER^RESUSR^BSDX01^4
+"KRN",8994,2463,-1)
+0^26
+"KRN",8994,2463,0)
+BSDX DEPARTMENT RESOURCE^DEPRES^BSDX01^4
+"KRN",8994,2464,-1)
+0^25
+"KRN",8994,2464,0)
+BSDX DELETE RES GROUP ITEM^DELRGI^BSDX20^4
+"KRN",8994,2465,-1)
+0^30
+"KRN",8994,2465,0)
+BSDX ADD RES GROUP ITEM^ADDRGI^BSDX20^4
+"KRN",8994,2466,-1)
+0^31
+"KRN",8994,2466,0)
+BSDX ADD/EDIT ACCESS GROUP^ADDAG^BSDX21^4
+"KRN",8994,2467,-1)
+0^32
+"KRN",8994,2467,0)
+BSDX DELETE ACCESS GROUP^DELAG^BSDX21^4
+"KRN",8994,2468,-1)
+0^29
+"KRN",8994,2468,0)
+BSDX ADD ACCESS GROUP ITEM^ADDAGI^BSDX22^4
+"KRN",8994,2469,-1)
+0^33
+"KRN",8994,2469,0)
+BSDX DELETE ACCESS GROUP ITEM^DELAGI^BSDX22^4
+"KRN",8994,2470,-1)
+0^34
+"KRN",8994,2470,0)
+BSDX REGISTER EVENT^REGEVNT^BSDX23^4
+"KRN",8994,2471,-1)
+0^35
+"KRN",8994,2471,0)
+BSDX UNREGISTER EVENT^UNREG^BSDX23^4
+"KRN",8994,2472,-1)
+0^36
+"KRN",8994,2472,0)
+BSDX RAISE EVENT^RAISEVNT^BSDX23^4
+"KRN",8994,2473,-1)
+0^37
+"KRN",8994,2473,0)
+BSDX SEARCH AVAILABILITY^SEARCH^BSDX24^4
+"KRN",8994,2474,-1)
+0^38
+"KRN",8994,2474,0)
+BSDX CHECKIN APPOINTMENT^CHECKIN^BSDX25^4
+"KRN",8994,2475,-1)
+0^39
+"KRN",8994,2475,0)
+BSDX EDIT APPOINTMENT^EDITAPT^BSDX26^4
+"KRN",8994,2476,-1)
+0^40
+"KRN",8994,2476,0)
+BSDX PATIENT APPT DISPLAY^PADISP^BSDX27^4
+"KRN",8994,2477,-1)
+0^41
+"KRN",8994,2477,0)
+BSDXPatientLookupRS^PTLOOKRS^BSDX28^1
+"KRN",8994,2478,-1)
+0^42
+"KRN",8994,2478,0)
+BSDX SPACEBAR SET^SPACE^BSDX30^4
+"KRN",8994,2479,-1)
+0^45
+"KRN",8994,2479,0)
+BSDX COPY APPOINTMENTS^BSDXCP^BSDX29^4
+"KRN",8994,2480,-1)
+0^44
+"KRN",8994,2480,0)
+BSDX COPY APPOINTMENT STATUS^CPSTAT^BSDX29^4
+"KRN",8994,2481,-1)
+0^43
+"KRN",8994,2481,0)
+BSDX COPY APPOINTMENT CANCEL^CPCANC^BSDX29^4
+"KRN",8994,2482,-1)
+0^46
+"KRN",8994,2482,0)
+BSDX CLINIC LETTERS^CLDISP^BSDX27^4
+"KRN",8994,2483,-1)
+0^47
+"KRN",8994,2483,0)
+BSDX NOSHOW^NOSHOW^BSDX31^4
+"KRN",8994,2484,-1)
+0^48
+"KRN",8994,2484,0)
+BSDX IM HERE^IMHERE^BSDX31^1
+"KRN",8994,2484,1,0)
+^^2^2^3040304^
+"KRN",8994,2484,1,1,0)
+Returns a simple value to client.  Used to establish continued existence
+"KRN",8994,2484,1,2,0)
+of the client to the server; resets the server READ timeout.
+"KRN",8994,2485,-1)
+0^49
+"KRN",8994,2485,0)
+BSDX HOSPITAL LOCATION^HOSPLOC^BSDX32^4
+"KRN",8994,2486,-1)
+0^50
+"KRN",8994,2486,0)
+BSDX CLINIC SETUP^CLNSET^BSDX32^4
+"KRN",8994,2487,-1)
+0^51
+"KRN",8994,2487,0)
+BSDX REBOOK LIST^RBLETT^BSDX34^4
+"KRN",8994,2488,-1)
+0^52
+"KRN",8994,2488,0)
+BSDX REBOOK CLINIC LIST^RBCLIN^BSDX34^4
+"KRN",8994,2489,-1)
+0^53
+"KRN",8994,2489,0)
+BSDX REBOOK SET^SETRBK^BSDX33^4
+"KRN",8994,2490,-1)
+0^54
+"KRN",8994,2490,0)
+BSDX RESOURCE LETTERS^RSRCLTR^BSDX35^4
+"KRN",8994,2491,-1)
+0^55
+"KRN",8994,2491,0)
+BSDX CANCEL CLINIC LIST^CANCLIN^BSDX34^4
+"KRN",8994,2492,-1)
+0^56
+"KRN",8994,2492,0)
+BSDX CANCEL AV BY DATE^AVDELDT^BSDX13^4
+"KRN",8994,2493,-1)
+0^57
+"KRN",8994,2493,0)
+BSDX REBOOK NEXT BLOCK^RBNEXT^BSDX33^4
+"KRN",8994,2494,-1)
+0^58
+"KRN",8994,2494,0)
+BSDX EHR PATIENT^EHRPT^BSDX30^4
+"KRN",8994,2501,-1)
+0^59
+"KRN",8994,2501,0)
+BSDX HOSP LOC PROVIDERS^P^BSDXGPRV^4
+"MBREQ")
+0
+"ORD",3,19.1)
+19.1;3;1;;KEY^XPDTA1;;;KEYF2^XPDIA1;;KEYDEL^XPDIA1
+"ORD",3,19.1,0)
+SECURITY KEY
+"ORD",15,101)
+101;15;;;PRO^XPDTA;PROF1^XPDIA;PROE1^XPDIA;PROF2^XPDIA;;PRODEL^XPDIA
+"ORD",15,101,0)
+PROTOCOL
+"ORD",16,8994)
+8994;16;1;;;;;;;RPCDEL^XPDIA1
+"ORD",16,8994,0)
+REMOTE PROCEDURE
+"ORD",18,19)
+19;18;;;OPT^XPDTA;OPTF1^XPDIA;OPTE1^XPDIA;OPTF2^XPDIA;;OPTDEL^XPDIA
+"ORD",18,19,0)
+OPTION
+"PKG",211,-1)
+1^1
+"PKG",211,0)
+IHS Windows Scheduling^BSDX^IHS Windows Scheduling Extensions
+"PKG",211,20,0)
+^9.402P^^
+"PKG",211,22,0)
+^9.49I^1^1
+"PKG",211,22,1,0)
+1.42^3101207
+"PKG",211,22,1,1,0)
+^^1^1^3101207
+"PKG",211,22,1,1,1,0)
+Clinical Scheduling M Server support routines, files, options and RPCs.
+"PKG",211,"VERSION")
+1.42
+"PRE")
+BSDX2E
+"QUES","XPF1",0)
+Y
+"QUES","XPF1","??")
+^D REP^XPDH
+"QUES","XPF1","A")
+Shall I write over your |FLAG| File
+"QUES","XPF1","B")
+YES
+"QUES","XPF1","M")
+D XPF1^XPDIQ
+"QUES","XPF2",0)
+Y
+"QUES","XPF2","??")
+^D DTA^XPDH
+"QUES","XPF2","A")
+Want my data |FLAG| yours
+"QUES","XPF2","B")
+YES
+"QUES","XPF2","M")
+D XPF2^XPDIQ
+"QUES","XPI1",0)
+YO
+"QUES","XPI1","??")
+^D INHIBIT^XPDH
+"QUES","XPI1","A")
+Want KIDS to INHIBIT LOGONs during the install
+"QUES","XPI1","B")
+NO
+"QUES","XPI1","M")
+D XPI1^XPDIQ
+"QUES","XPM1",0)
+PO^VA(200,:EM
+"QUES","XPM1","??")
+^D MG^XPDH
+"QUES","XPM1","A")
+Enter the Coordinator for Mail Group '|FLAG|'
+"QUES","XPM1","B")
+
+"QUES","XPM1","M")
+D XPM1^XPDIQ
+"QUES","XPO1",0)
+Y
+"QUES","XPO1","??")
+^D MENU^XPDH
+"QUES","XPO1","A")
+Want KIDS to Rebuild Menu Trees Upon Completion of Install
+"QUES","XPO1","B")
+NO
+"QUES","XPO1","M")
+D XPO1^XPDIQ
+"QUES","XPZ1",0)
+Y
+"QUES","XPZ1","??")
+^D OPT^XPDH
+"QUES","XPZ1","A")
+Want to DISABLE Scheduled Options, Menu Options, and Protocols
+"QUES","XPZ1","B")
+NO
+"QUES","XPZ1","M")
+D XPZ1^XPDIQ
+"QUES","XPZ2",0)
+Y
+"QUES","XPZ2","??")
+^D RTN^XPDH
+"QUES","XPZ2","A")
+Want to MOVE routines to other CPUs
+"QUES","XPZ2","B")
+NO
+"QUES","XPZ2","M")
+D XPZ2^XPDIQ
+"RTN")
+37
+"RTN","BSDX01")
+0^1^B107139484
+"RTN","BSDX01",1,0)
+BSDX01 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 9/29/10 10:20am
+"RTN","BSDX01",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX01",3,0)
+ ;
+"RTN","BSDX01",4,0)
+SUINFOD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",5,0)
+ ;D DEBUG^%Serenji("SUINFO^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",6,0)
+ ;
+"RTN","BSDX01",7,0)
+ Q
+"RTN","BSDX01",8,0)
+ ;
+"RTN","BSDX01",9,0)
+SUINFO(BSDXY,BSDXDUZ)  ;EP
+"RTN","BSDX01",10,0)
+ ;Called by BSDX SCHEDULING USER INFO
+"RTN","BSDX01",11,0)
+ ;Returns ADO Recordset having column MANAGER
+"RTN","BSDX01",12,0)
+ ;MANAGER = YES if user has keys BSDXZMGR or XUPROGMODE
+"RTN","BSDX01",13,0)
+ ;
+"RTN","BSDX01",14,0)
+ N BSDXMGR,BSDXERR
+"RTN","BSDX01",15,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",16,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",17,0)
+ S BSDXI=0
+"RTN","BSDX01",18,0)
+ S BSDXERR=""
+"RTN","BSDX01",19,0)
+ S ^BSDXTMP($J,BSDXI)="T00010MANAGER"_$C(30)
+"RTN","BSDX01",20,0)
+ ;Check SECURITY KEY file for BSDXZMGR or XUPROGMODE keys
+"RTN","BSDX01",21,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",22,0)
+ S BSDXMGR=$$APSEC("BSDXZMGR",BSDXDUZ)
+"RTN","BSDX01",23,0)
+ S BSDXMGR=$S(BSDXMGR=1:"YES",1:"NO")
+"RTN","BSDX01",24,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX01",25,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXMGR_$C(30)
+"RTN","BSDX01",26,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",27,0)
+ Q
+"RTN","BSDX01",28,0)
+DEPUSRD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",29,0)
+ ;
+"RTN","BSDX01",30,0)
+ ;
+"RTN","BSDX01",31,0)
+ ;D DEBUG^%Serenji("DEPUSR^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",32,0)
+ ;
+"RTN","BSDX01",33,0)
+ Q
+"RTN","BSDX01",34,0)
+ ;
+"RTN","BSDX01",35,0)
+DEPUSR(BSDXY,BSDXDUZ)  ;EP
+"RTN","BSDX01",36,0)
+ ;Called by BSDX RESOURCE GROUPS BY USER
+"RTN","BSDX01",37,0)
+ ;Returns ADO Recordset with all ACTIVE resource group names to which user has access
+"RTN","BSDX01",38,0)
+ ;based on entries in BSDX RESOURCE USER file (Say this again for myself: Groups ONLY!!)
+"RTN","BSDX01",39,0)
+ ;If BSDXDUZ=0 then returns all department names for current DUZ
+"RTN","BSDX01",40,0)
+    ;if not linked, always returned.
+"RTN","BSDX01",41,0)
+ ;If user BSDXDUZ possesses the key BSDXZMGR or XUPROGMODE
+"RTN","BSDX01",42,0)
+ ;then ALL resource group names are returned regardless of whether any active resources
+"RTN","BSDX01",43,0)
+ ;are associated with the group or not.
+"RTN","BSDX01",44,0)
+ ;
+"RTN","BSDX01",45,0)
+ ;
+"RTN","BSDX01",46,0)
+ N BSDXERR,BSDXRET,BSDXIEN,BSDXRES,BSDXDEP,BSDXDDR,BSDXDEPN,BSDXRDAT,BSDXRNOD,BSDXI
+"RTN","BSDX01",47,0)
+ N BSDXMGR,BSDXNOD
+"RTN","BSDX01",48,0)
+ K ^BSDXTEMP($J)
+"RTN","BSDX01",49,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",50,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",51,0)
+ S BSDXI=0
+"RTN","BSDX01",52,0)
+ S BSDXERR=""
+"RTN","BSDX01",53,0)
+ S ^BSDXTMP($J,BSDXI)="I00020RESOURCE_GROUPID^T00030RESOURCE_GROUP"_$C(30)
+"RTN","BSDX01",54,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",55,0)
+ ;Check SECURITY KEY file for BSDXZMGR or XUPROGMODE keys
+"RTN","BSDX01",56,0)
+ S BSDXMGR=$$APSEC("BSDXZMGR",BSDXDUZ)
+"RTN","BSDX01",57,0)
+ ;
+"RTN","BSDX01",58,0)
+ ;User does not have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",59,0)
+ ;$O THRU AC XREF OF BSDX RESOURCE USER
+"RTN","BSDX01",60,0)
+ I 'BSDXMGR,$D(^BSDXRSU("AC",BSDXDUZ)) S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRSU("AC",BSDXDUZ,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",61,0)
+ . S BSDXRES=$P(^BSDXRSU(BSDXIEN,0),U)
+"RTN","BSDX01",62,0)
+ . Q:'$D(^BSDXDEPT("AB",BSDXRES))  ; If not part of a group, quit ("AB" is the whole file index for the resource multiple in Group file)
+"RTN","BSDX01",63,0)
+    . ; Q:'$$INDIV2(BSDXRES)  ; If not in the same division as user, quit
+"RTN","BSDX01",64,0)
+ . S BSDXRNOD=^BSDXRES(BSDXRES,0)
+"RTN","BSDX01",65,0)
+ . ;QUIT if the resource is inactive
+"RTN","BSDX01",66,0)
+ . Q:$P(BSDXRNOD,U,2)=1
+"RTN","BSDX01",67,0)
+ . S BSDXDEP=0 F  S BSDXDEP=$O(^BSDXDEPT("AB",BSDXRES,BSDXDEP)) Q:'+BSDXDEP  D
+"RTN","BSDX01",68,0)
+ . . Q:'$D(^BSDXDEPT(BSDXDEP,0))
+"RTN","BSDX01",69,0)
+ . . Q:$D(^BSDXTEMP($J,BSDXDEP))
+"RTN","BSDX01",70,0)
+ . . S ^BSDXTEMP($J,BSDXDEP)=""
+"RTN","BSDX01",71,0)
+ . . S BSDXDEPN=$P(^BSDXDEPT(BSDXDEP,0),U)
+"RTN","BSDX01",72,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX01",73,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXDEP_U_BSDXDEPN_$C(30)
+"RTN","BSDX01",74,0)
+ . . Q
+"RTN","BSDX01",75,0)
+ . Q
+"RTN","BSDX01",76,0)
+ ;
+"RTN","BSDX01",77,0)
+ ;User does have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",78,0)
+ ;$O THRU BSDX RESOURCE GROUP file directly
+"RTN","BSDX01",79,0)
+ I BSDXMGR S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXDEPT(BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",80,0)
+ . Q:'$D(^BSDXDEPT(BSDXIEN,0))
+"RTN","BSDX01",81,0)
+ . S BSDXNOD=^BSDXDEPT(BSDXIEN,0)
+"RTN","BSDX01",82,0)
+ . S BSDXDEPN=$P(BSDXNOD,U)
+"RTN","BSDX01",83,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX01",84,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXDEPN_$C(30)
+"RTN","BSDX01",85,0)
+ . Q
+"RTN","BSDX01",86,0)
+ ;
+"RTN","BSDX01",87,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",88,0)
+ Q
+"RTN","BSDX01",89,0)
+ ;
+"RTN","BSDX01",90,0)
+ ;
+"RTN","BSDX01",91,0)
+RESUSRD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",92,0)
+ ;
+"RTN","BSDX01",93,0)
+ ;
+"RTN","BSDX01",94,0)
+ ;D DEBUG^%Serenji("RESUSR^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",95,0)
+ ;
+"RTN","BSDX01",96,0)
+ Q
+"RTN","BSDX01",97,0)
+ ;
+"RTN","BSDX01",98,0)
+RESUSR(BSDXY,BSDXDUZ) ;EP
+"RTN","BSDX01",99,0)
+ ;Returns ADO Recordset with ALL RESOURCE names
+"RTN","BSDX01",100,0)
+ ;Inactive RESOURCES are NOT filtered out
+"RTN","BSDX01",101,0)
+ ;Called by BSDX RESOURCES BY USER
+"RTN","BSDX01",102,0)
+ ;
+"RTN","BSDX01",103,0)
+ N BSDXERR,BSDXRET,BSDXIEN,BSDXRES,BSDXDEP,BSDXDDR,BSDXDEPN,BSDXRDAT,BSDXRNOD,BSDXI,BSDX,BSDXLTR
+"RTN","BSDX01",104,0)
+ N BSDXNOS,BSDXCAN
+"RTN","BSDX01",105,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",106,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",107,0)
+ S BSDXI=0
+"RTN","BSDX01",108,0)
+ S BSDXERR=""
+"RTN","BSDX01",109,0)
+ S ^BSDXTMP($J,BSDXI)="I00010RESOURCEID^T00030RESOURCE_NAME^T00010INACTIVE^I00010TIMESCALE^I00010HOSPITAL_LOCATION_ID^T00030LETTER_TEXT^T00030NO_SHOW_LETTER"
+"RTN","BSDX01",110,0)
+ S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^T00030CLINIC_CANCELLATION_LETTER^I00010VIEW^I00010OVERBOOK^I00010MODIFY_SCHEDULE^I00010MODIFY_APPOINTMENTS"_$C(30)
+"RTN","BSDX01",111,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",112,0)
+ ;$O THRU AC XREF OF BSDX RESOURCE USER
+"RTN","BSDX01",113,0)
+ ;Rmoved these lines in order to just return all resource names
+"RTN","BSDX01",114,0)
+ ;I $D(^BSDXRSU("AC",BSDXDUZ)) S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRSU("AC",BSDXDUZ,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",115,0)
+ ;. S BSDXRES=$P(^BSDXRSU(BSDXIEN,0),U)
+"RTN","BSDX01",116,0)
+ ;
+"RTN","BSDX01",117,0)
+ ;$O THRU BSDX RESOURCE File
+"RTN","BSDX01",118,0)
+ S BSDXRES=0 F  S BSDXRES=$O(^BSDXRES(BSDXRES)) Q:'+BSDXRES  D
+"RTN","BSDX01",119,0)
+ . Q:'$D(^BSDXRES(BSDXRES,0))
+"RTN","BSDX01",120,0)
+ . S BSDXRNOD=^BSDXRES(BSDXRES,0)
+"RTN","BSDX01",121,0)
+ . N BSDXSC S BSDXSC=$P(BSDXRNOD,U,4)  ; Hospital Location
+"RTN","BSDX01",122,0)
+    . ;Q:$P(BSDXRNOD,U,2)=1  ;Inactive resources not filtered
+"RTN","BSDX01",123,0)
+ . ;S BSDXRDAT=$P(BSDXRNOD,U,1,4)
+"RTN","BSDX01",124,0)
+ . ;I '$$INDIV(BSDXSC) QUIT  ; If not in division, quit
+"RTN","BSDX01",125,0)
+    . K BSDXRDAT
+"RTN","BSDX01",126,0)
+ . F BSDX=1:1:4 S $P(BSDXRDAT,U,BSDX)=$P(BSDXRNOD,U,BSDX)
+"RTN","BSDX01",127,0)
+ . S BSDXRDAT=BSDXRES_U_BSDXRDAT
+"RTN","BSDX01",128,0)
+ . ;Get letter text from wp field
+"RTN","BSDX01",129,0)
+ . S BSDXLTR=""
+"RTN","BSDX01",130,0)
+ . I $D(^BSDXRES(BSDXRES,1)) D
+"RTN","BSDX01",131,0)
+ . . S BSDXIEN=0
+"RTN","BSDX01",132,0)
+ . . F  S BSDXIEN=$O(^BSDXRES(BSDXRES,1,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",133,0)
+ . . . S BSDXLTR=BSDXLTR_$G(^BSDXRES(BSDXRES,1,BSDXIEN,0))
+"RTN","BSDX01",134,0)
+ . . . S BSDXLTR=BSDXLTR_$C(13)_$C(10)
+"RTN","BSDX01",135,0)
+ . S BSDXNOS=""
+"RTN","BSDX01",136,0)
+ . I $D(^BSDXRES(BSDXRES,12)) D
+"RTN","BSDX01",137,0)
+ . . S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRES(BSDXRES,12,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",138,0)
+ . . . S BSDXNOS=BSDXNOS_$G(^BSDXRES(BSDXRES,12,BSDXIEN,0))
+"RTN","BSDX01",139,0)
+ . . . S BSDXNOS=BSDXNOS_$C(13)_$C(10)
+"RTN","BSDX01",140,0)
+ . S BSDXCAN=""
+"RTN","BSDX01",141,0)
+ . I $D(^BSDXRES(BSDXRES,13)) D
+"RTN","BSDX01",142,0)
+ . . S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRES(BSDXRES,13,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",143,0)
+ . . . S BSDXCAN=BSDXCAN_$G(^BSDXRES(BSDXRES,13,BSDXIEN,0))
+"RTN","BSDX01",144,0)
+ . . . S BSDXCAN=BSDXCAN_$C(13)_$C(10)
+"RTN","BSDX01",145,0)
+ . N BSDXACC,BSDXMGR
+"RTN","BSDX01",146,0)
+ . S BSDXACC="0^0^0^0"
+"RTN","BSDX01",147,0)
+ . S BSDXMGR=$O(^DIC(19.1,"B","BSDXZMGR",0))
+"RTN","BSDX01",148,0)
+ . I +BSDXMGR,$D(^VA(200,BSDXDUZ,51,BSDXMGR)) S BSDXACC="1^1^1^1"
+"RTN","BSDX01",149,0)
+ . S BSDXMGR=$O(^DIC(19.1,"B","XUPROGMODE",0))
+"RTN","BSDX01",150,0)
+ . I +BSDXMGR,$D(^VA(200,BSDXDUZ,51,BSDXMGR)) S BSDXACC="1^1^1^1"
+"RTN","BSDX01",151,0)
+ . I BSDXACC="0^0^0^0" D
+"RTN","BSDX01",152,0)
+ . . N BSDXNOD,BSDXRUID
+"RTN","BSDX01",153,0)
+ . . S BSDXRUID=0
+"RTN","BSDX01",154,0)
+ . . ;Get entry for this user and resource
+"RTN","BSDX01",155,0)
+ . . F  S BSDXRUID=$O(^BSDXRSU("AC",BSDXDUZ,BSDXRUID)) Q:'+BSDXRUID  I $D(^BSDXRSU(BSDXRUID,0)),$P(^(0),U)=BSDXRES Q
+"RTN","BSDX01",156,0)
+ . . Q:'+BSDXRUID
+"RTN","BSDX01",157,0)
+ . . S $P(BSDXACC,U)=1
+"RTN","BSDX01",158,0)
+ . . S BSDXNOD=$G(^BSDXRSU(BSDXRUID,0))
+"RTN","BSDX01",159,0)
+ . . S $P(BSDXACC,U,2)=+$P(BSDXNOD,U,3)
+"RTN","BSDX01",160,0)
+ . . S $P(BSDXACC,U,3)=+$P(BSDXNOD,U,4)
+"RTN","BSDX01",161,0)
+ . . S $P(BSDXACC,U,4)=+$P(BSDXNOD,U,5)
+"RTN","BSDX01",162,0)
+ . S BSDXRDAT=BSDXRDAT_U_BSDXLTR_U_BSDXNOS_U_BSDXCAN_U_BSDXACC
+"RTN","BSDX01",163,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX01",164,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXRDAT_$C(30)
+"RTN","BSDX01",165,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",166,0)
+ Q
+"RTN","BSDX01",167,0)
+ ;
+"RTN","BSDX01",168,0)
+DEPRESD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",169,0)
+ ;
+"RTN","BSDX01",170,0)
+ ;
+"RTN","BSDX01",171,0)
+ ;D DEBUG^%Serenji("DEPRES^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",172,0)
+ ;
+"RTN","BSDX01",173,0)
+ Q
+"RTN","BSDX01",174,0)
+ ;
+"RTN","BSDX01",175,0)
+DEPRES(BSDXY,BSDXDUZ) ;EP
+"RTN","BSDX01",176,0)
+ ;Called by BSDX GROUP RESOURCE
+"RTN","BSDX01",177,0)
+ ;Returns ADO Recordset with all ACTIVE GROUP/RESOURCE combinations
+"RTN","BSDX01",178,0)
+ ;to which user has access based on entries in BSDX RESOURCE USER file
+"RTN","BSDX01",179,0)
+ ;If BSDXDUZ=0 then returns all ACTIVE GROUP/RESOURCE combinations for current DUZ
+"RTN","BSDX01",180,0)
+ ;If user BSDXDUZ possesses the key BSDXZMGR or XUPROGMODE
+"RTN","BSDX01",181,0)
+ ;then ALL ACTIVE resource group names are returned
+"RTN","BSDX01",182,0)
+ ;
+"RTN","BSDX01",183,0)
+ N BSDXERR,BSDXRET,BSDXIEN,BSDXRES,BSDXDEP,BSDXDDR,BSDXDEPN,BSDXRDAT,BSDXRNOD,BSDXI
+"RTN","BSDX01",184,0)
+ N BSDXRESN,BSDXMGR,BSDXRESD,BSDXNOD,BSDXSUBID
+"RTN","BSDX01",185,0)
+ K ^BSDXTEMP($J)
+"RTN","BSDX01",186,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",187,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",188,0)
+ S BSDXI=0
+"RTN","BSDX01",189,0)
+ S BSDXERR=""
+"RTN","BSDX01",190,0)
+ S ^BSDXTMP($J,BSDXI)="I00020RESOURCE_GROUPID^T00030RESOURCE_GROUP^I00020RESOURCE_GROUP_ITEMID^T00030RESOURCE_NAME^I00020RESOURCEID"_$C(30)
+"RTN","BSDX01",191,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",192,0)
+ ;Check SECURITY KEY file for BSDXZMGR or XUPROGMODE keys
+"RTN","BSDX01",193,0)
+ S BSDXMGR=$$APSEC("BSDXZMGR",BSDXDUZ)
+"RTN","BSDX01",194,0)
+ ;
+"RTN","BSDX01",195,0)
+ ;User does not have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",196,0)
+ ;$O THRU AC XREF OF BSDX RESOURCE USER
+"RTN","BSDX01",197,0)
+ I 'BSDXMGR,$D(^BSDXRSU("AC",BSDXDUZ))  S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRSU("AC",BSDXDUZ,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",198,0)
+ . S BSDXRES=$P(^BSDXRSU(BSDXIEN,0),U)
+"RTN","BSDX01",199,0)
+ . Q:'$D(^BSDXDEPT("AB",BSDXRES))  ; Quit if Resource isn't part of any Group
+"RTN","BSDX01",200,0)
+    . ;Q:'$$INDIV2(BSDXRES)  ; Quit if Resource isn't in same division as user.
+"RTN","BSDX01",201,0)
+ . S BSDXRNOD=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX01",202,0)
+ . Q:BSDXRNOD=""
+"RTN","BSDX01",203,0)
+ . ;QUIT if the resource is inactive
+"RTN","BSDX01",204,0)
+ . Q:$P(BSDXRNOD,U,2)=1
+"RTN","BSDX01",205,0)
+ . S BSDXRESN=$P(BSDXRNOD,U)
+"RTN","BSDX01",206,0)
+ . S BSDXDEP=0 F  S BSDXDEP=$O(^BSDXDEPT("AB",BSDXRES,BSDXDEP)) Q:'+BSDXDEP  D
+"RTN","BSDX01",207,0)
+ . . Q:'$D(^BSDXDEPT(BSDXDEP,0))
+"RTN","BSDX01",208,0)
+ . . S BSDXDEPN=$P(^BSDXDEPT(BSDXDEP,0),U)
+"RTN","BSDX01",209,0)
+ . . S BSDXSUBID=$O(^BSDXDEPT(BSDXDEP,1,"B",BSDXRES,0))
+"RTN","BSDX01",210,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX01",211,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXDEP_U_BSDXDEPN_U_BSDXSUBID_U_BSDXRESN_U_BSDXRES_$C(30)
+"RTN","BSDX01",212,0)
+ . Q
+"RTN","BSDX01",213,0)
+ ;
+"RTN","BSDX01",214,0)
+ ;User does have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",215,0)
+ ;$O THRU BSDX RESOURCE GROUP file directly
+"RTN","BSDX01",216,0)
+ I BSDXMGR S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXDEPT(BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",217,0)
+ . Q:'$D(^BSDXDEPT(BSDXIEN,0))
+"RTN","BSDX01",218,0)
+ . S BSDXNOD=^BSDXDEPT(BSDXIEN,0)
+"RTN","BSDX01",219,0)
+ . S BSDXDEPN=$P(BSDXNOD,U)
+"RTN","BSDX01",220,0)
+ . S BSDXRES=0 F  S BSDXRES=$O(^BSDXDEPT(BSDXIEN,1,BSDXRES)) Q:'+BSDXRES  D
+"RTN","BSDX01",221,0)
+ . . N BSDXRESD
+"RTN","BSDX01",222,0)
+ . . Q:'$D(^BSDXDEPT(BSDXIEN,1,BSDXRES,0))  ; Quit if zero node is invalid in multiple
+"RTN","BSDX01",223,0)
+ . . S BSDXRESD=$P(^BSDXDEPT(BSDXIEN,1,BSDXRES,0),"^")
+"RTN","BSDX01",224,0)
+ . . Q:'$D(^BSDXRES(BSDXRESD,0))  ; Quit if zero node of resouce file is invalid
+"RTN","BSDX01",225,0)
+    . . ;Q:'$$INDIV2(BSDXRESD)  ; Quit if resource is not in the same division
+"RTN","BSDX01",226,0)
+ . . S BSDXRNOD=$G(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX01",227,0)
+ . . Q:BSDXRNOD=""
+"RTN","BSDX01",228,0)
+ . . ;QUIT if the resource is inactive
+"RTN","BSDX01",229,0)
+ . . Q:$P(BSDXRNOD,U,2)=1
+"RTN","BSDX01",230,0)
+ . . S BSDXRESN=$P(BSDXRNOD,U)
+"RTN","BSDX01",231,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX01",232,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXDEPN_U_BSDXRES_U_BSDXRESN_U_BSDXRESD_$C(30)
+"RTN","BSDX01",233,0)
+ . . Q
+"RTN","BSDX01",234,0)
+ . Q
+"RTN","BSDX01",235,0)
+ ;
+"RTN","BSDX01",236,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",237,0)
+ Q
+"RTN","BSDX01",238,0)
+ ;
+"RTN","BSDX01",239,0)
+APSEC(BSDXKEY,BSDXDUZ) ;EP - Return TRUE (1) if user has keys BSDXKEY or XUPROGMODE, otherwise, returns FALSE (0)
+"RTN","BSDX01",240,0)
+ ;
+"RTN","BSDX01",241,0)
+ N BSDXIEN,BSDXPROG,BSDXPKEY
+"RTN","BSDX01",242,0)
+ I '$G(BSDXDUZ) Q 0
+"RTN","BSDX01",243,0)
+ ;
+"RTN","BSDX01",244,0)
+ ;Test for programmer mode key
+"RTN","BSDX01",245,0)
+ S BSDXPROG=0
+"RTN","BSDX01",246,0)
+ I $D(^DIC(19.1,"B","XUPROGMODE")) D
+"RTN","BSDX01",247,0)
+ . S BSDXPKEY=$O(^DIC(19.1,"B","XUPROGMODE",0))
+"RTN","BSDX01",248,0)
+ . I '+BSDXPKEY Q
+"RTN","BSDX01",249,0)
+ . I '$D(^VA(200,BSDXDUZ,51,BSDXPKEY,0)) Q
+"RTN","BSDX01",250,0)
+ . S BSDXPROG=1
+"RTN","BSDX01",251,0)
+ I BSDXPROG Q 1
+"RTN","BSDX01",252,0)
+ ;
+"RTN","BSDX01",253,0)
+ I BSDXKEY="" Q 0
+"RTN","BSDX01",254,0)
+ I '$D(^DIC(19.1,"B",BSDXKEY)) Q 0
+"RTN","BSDX01",255,0)
+ S BSDXIEN=$O(^DIC(19.1,"B",BSDXKEY,0))
+"RTN","BSDX01",256,0)
+ I '+BSDXIEN Q 0
+"RTN","BSDX01",257,0)
+ I '$D(^VA(200,BSDXDUZ,51,BSDXIEN,0)) Q 0
+"RTN","BSDX01",258,0)
+ Q 1
+"RTN","BSDX01",259,0)
+INDIV(BSDXSC) ; PEP - Is ^SC clinic in the same DUZ(2) as user?
+"RTN","BSDX01",260,0)
+    ; Input: BSDXSC - Hospital Location IEN
+"RTN","BSDX01",261,0)
+    ; Output: True or False
+"RTN","BSDX01",262,0)
+    I '+BSDXSC QUIT 1  ;If not tied to clinic, yes
+"RTN","BSDX01",263,0)
+    I '$D(^SC(BSDXSC,0)) QUIT 1 ; If Clinic does not exist, yes
+"RTN","BSDX01",264,0)
+    ; Jump to Division:Medical Center Division:Inst File Pointer for
+"RTN","BSDX01",265,0)
+    ; Institution IEN (and get its internal value)
+"RTN","BSDX01",266,0)
+    N DIV S DIV=$$GET1^DIQ(44,BSDXSC_",","3.5:.07","I")
+"RTN","BSDX01",267,0)
+    I DIV="" Q 1 ; If clinic has no division, consider it avial to user.
+"RTN","BSDX01",268,0)
+    I DIV=DUZ(2) Q 1 ; If same, then User is in same Div as Clinic
+"RTN","BSDX01",269,0)
+    E  Q 0 ; Otherwise, no
+"RTN","BSDX01",270,0)
+    QUIT
+"RTN","BSDX01",271,0)
+INDIV2(BSDXRES) ; PEP - Is Resource in the same DUZ(2) as user?
+"RTN","BSDX01",272,0)
+    ; Input BSDXRES - BSDX RESOURCE IEN
+"RTN","BSDX01",273,0)
+    ; Output: True of False
+"RTN","BSDX01",274,0)
+    Q $$INDIV($P($G(^BSDXRES(BSDXRES,0)),U,4)) ; Extract Hospital Location and send to $$INDIV
+"RTN","BSDX01",275,0)
+UnitTestINDIV 
+"RTN","BSDX01",276,0)
+    W "Testing if they are the same",!
+"RTN","BSDX01",277,0)
+    S DUZ(2)=67
+"RTN","BSDX01",278,0)
+    I '$$INDIV(1) W "ERROR",!
+"RTN","BSDX01",279,0)
+    I '$$INDIV(2) W "ERROR",!
+"RTN","BSDX01",280,0)
+    W "Testing if Div not defined in 44, should be true",!
+"RTN","BSDX01",281,0)
+    I '$$INDIV(3) W "ERROR",!
+"RTN","BSDX01",282,0)
+    W "Testing empty string. Should be true",!
+"RTN","BSDX01",283,0)
+    I '$$INDIV("") W "ERROR",!
+"RTN","BSDX01",284,0)
+    W "Testing if they are different",!
+"RTN","BSDX01",285,0)
+    S DUZ(2)=899
+"RTN","BSDX01",286,0)
+    I $$INDIV(1) W "ERROR",!
+"RTN","BSDX01",287,0)
+    I $$INDIV(2) W "ERROR",!
+"RTN","BSDX01",288,0)
+    QUIT
+"RTN","BSDX01",289,0)
+UnitTestINDIV2 
+"RTN","BSDX01",290,0)
+    W "Testing if they are the same",!
+"RTN","BSDX01",291,0)
+    S DUZ(2)=69
+"RTN","BSDX01",292,0)
+    I $$INDIV2(22)'=0 W "ERROR",!
+"RTN","BSDX01",293,0)
+    I $$INDIV2(25)'=1 W "ERROR",!
+"RTN","BSDX01",294,0)
+    I $$INDIV2(26)'=1 W "ERROR",!
+"RTN","BSDX01",295,0)
+    I $$INDIV2(27)'=1 W "ERROR",!
+"RTN","BSDX01",296,0)
+    QUIT
+"RTN","BSDX02")
+0^2^B16323271
+"RTN","BSDX02",1,0)
+BSDX02 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 12:25pm
+"RTN","BSDX02",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX02",3,0)
+    ; 
+"RTN","BSDX02",4,0)
+    ; Change Log
+"RTN","BSDX02",5,0)
+    ; July 15 2010: UJO/SMH - Pass FM dates in instead of US dates for i18n
+"RTN","BSDX02",6,0)
+ ;
+"RTN","BSDX02",7,0)
+ ;
+"RTN","BSDX02",8,0)
+CRSCHD(BSDXY,BSDXRES,BSDXSTART,BSDXEND) ;EP
+"RTN","BSDX02",9,0)
+ ;Entry point for debugging
+"RTN","BSDX02",10,0)
+ ;
+"RTN","BSDX02",11,0)
+ ;D DEBUG^%Serenji("CRSCH^BSDX02(.BSDXY,BSDXRES,BSDXSTART,BSDXEND)")
+"RTN","BSDX02",12,0)
+ Q
+"RTN","BSDX02",13,0)
+ ;
+"RTN","BSDX02",14,0)
+CRSCH(BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXWKIN)     ;
+"RTN","BSDX02",15,0)
+ ;Called by BSDX CREATE APPT SCHEDULE
+"RTN","BSDX02",16,0)
+ ;Create Resource Appointment Schedule recordset
+"RTN","BSDX02",17,0)
+ ;On error, returns 0 in APPOINTMENTID field and error text in NOTE field
+"RTN","BSDX02",18,0)
+ ;
+"RTN","BSDX02",19,0)
+ ;$O Thru ^BSDXAPPT("ARSRC", RESOURCE, STARTTIME, APPTID)
+"RTN","BSDX02",20,0)
+ ;BMXRES is a | delimited list of resource names
+"RTN","BSDX02",21,0)
+ ;BSDXWKIN - If 1, then return walkins, otherwise skip them
+"RTN","BSDX02",22,0)
+ ;9-27-2004 Added walkin to returned datatable
+"RTN","BSDX02",23,0)
+ ;TODO: Change BSDXRES from names to IDs
+"RTN","BSDX02",24,0)
+ ;
+"RTN","BSDX02",25,0)
+ N BSDXERR,BSDXIEN,BSDXDEPD,BSDXDEPN,BSDXRESD,BSDXI,BSDXJ,BSDXRESN,BSDXS,BSDXAD,BSDXZ,BSDXQ,BSDXNOD
+"RTN","BSDX02",26,0)
+ N BSDXPAT,BSDXNOT,BSDXZPCD,BSDXPCD
+"RTN","BSDX02",27,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX02",28,0)
+ S BSDXERR=""
+"RTN","BSDX02",29,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX02",30,0)
+ S ^BSDXTMP($J,0)="I00020APPOINTMENTID^D00030START_TIME^D00030END_TIME^D00030CHECKIN^D00030AUXTIME^I00020PATIENTID^T00030PATIENTNAME^T00030RESOURCENAME^I00005NOSHOW^T00020HRN^I00005ACCESSTYPEID^I00005WALKIN^T00250NOTE"_$C(30)
+"RTN","BSDX02",31,0)
+ D ^XBKVAR S X="ETRAP^BSDX02",@^%ZOSF("TRAP")
+"RTN","BSDX02",32,0)
+ ;
+"RTN","BSDX02",33,0)
+ ; S %DT="T",X=BSDXSTART D ^%DT S BSDXSTART=Y
+"RTN","BSDX02",34,0)
+ ; I BSDXSTART=-1 S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX02",35,0)
+ ; S %DT="T",X=BSDXEND D ^%DT S BSDXEND=Y
+"RTN","BSDX02",36,0)
+ ; I BSDXEND=-1 S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX02",37,0)
+    ;
+"RTN","BSDX02",38,0)
+ S BSDXI=0
+"RTN","BSDX02",39,0)
+ D STRES
+"RTN","BSDX02",40,0)
+ ;
+"RTN","BSDX02",41,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",42,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX02",43,0)
+ Q
+"RTN","BSDX02",44,0)
+ ;
+"RTN","BSDX02",45,0)
+STRES ;
+"RTN","BSDX02",46,0)
+ F BSDXJ=1:1:$L(BSDXRES,"|") S BSDXRESN=$P(BSDXRES,"|",BSDXJ) D
+"RTN","BSDX02",47,0)
+ . Q:BSDXRESN=""
+"RTN","BSDX02",48,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX02",49,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX02",50,0)
+ . Q:'+BSDXRESD
+"RTN","BSDX02",51,0)
+ . Q:'$D(^BSDXAPPT("ARSRC",BSDXRESD))
+"RTN","BSDX02",52,0)
+ . S BSDXS=BSDXSTART-.0001
+"RTN","BSDX02",53,0)
+ . F  S BSDXS=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX02",54,0)
+ . . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D STCOMM(BSDXAD,BSDXRESN)
+"RTN","BSDX02",55,0)
+ Q
+"RTN","BSDX02",56,0)
+ ;
+"RTN","BSDX02",57,0)
+STCOMM(BSDXAD,BSDXRESN)      ;
+"RTN","BSDX02",58,0)
+ ;BSDXAD is the appointment IEN
+"RTN","BSDX02",59,0)
+ N BSDXC,BSDXQ,BSDXZ,BSDXSUBC,BSDXHRN,BSDXPATD,BSDXATID,BSDXISWK
+"RTN","BSDX02",60,0)
+ Q:'$D(^BSDXAPPT(BSDXAD,0))
+"RTN","BSDX02",61,0)
+ S BSDXNOD=^BSDXAPPT(BSDXAD,0)
+"RTN","BSDX02",62,0)
+ Q:$P(BSDXNOD,U,12)]""  ;CANCELLED
+"RTN","BSDX02",63,0)
+ S BSDXISWK=0
+"RTN","BSDX02",64,0)
+ S:$P(BSDXNOD,U,13)="y" BSDXISWK=1
+"RTN","BSDX02",65,0)
+ I +$G(BSDXWKIN) Q:BSDXISWK  ;Don't return walkins if appt is WALKIN and BSDXWKIN is 1
+"RTN","BSDX02",66,0)
+ S BSDXZ=BSDXAD_"^"
+"RTN","BSDX02",67,0)
+ F BSDXQ=1:1:4 D
+"RTN","BSDX02",68,0)
+ . S Y=$P(BSDXNOD,U,BSDXQ)
+"RTN","BSDX02",69,0)
+ . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX02",70,0)
+ . S BSDXZ=BSDXZ_Y_"^"
+"RTN","BSDX02",71,0)
+ S BSDXPATD=$P(BSDXNOD,U,5)
+"RTN","BSDX02",72,0)
+ S BSDXZ=BSDXZ_BSDXPATD_"^" ;PATIENT ID
+"RTN","BSDX02",73,0)
+ S BSDXPAT=""
+"RTN","BSDX02",74,0)
+ I BSDXPATD]"",$D(^DPT(BSDXPATD,0)) S BSDXPAT=$P(^DPT(BSDXPATD,0),U)
+"RTN","BSDX02",75,0)
+ S BSDXZ=BSDXZ_BSDXPAT_"^" ;PATIENT NAME
+"RTN","BSDX02",76,0)
+ S BSDXZ=BSDXZ_BSDXRESN_"^" ;RESOURCENAME
+"RTN","BSDX02",77,0)
+ S BSDXZ=BSDXZ_+$P(BSDXNOD,U,10)_"^" ;NOSHOW
+"RTN","BSDX02",78,0)
+ S BSDXHRN=""
+"RTN","BSDX02",79,0)
+ I $D(DUZ(2)),DUZ(2)>0 S BSDXHRN=$P($G(^AUPNPAT(BSDXPATD,41,DUZ(2),0)),U,2) ;HRN
+"RTN","BSDX02",80,0)
+ S BSDXZ=BSDXZ_BSDXHRN_"^"
+"RTN","BSDX02",81,0)
+ S BSDXATID=$P(BSDXNOD,U,6)
+"RTN","BSDX02",82,0)
+ S:'+BSDXATID BSDXATID=0 ;UNKNOWN TYPE
+"RTN","BSDX02",83,0)
+ S BSDXZ=BSDXZ_BSDXATID_"^"_BSDXISWK_"^"
+"RTN","BSDX02",84,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",85,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXZ
+"RTN","BSDX02",86,0)
+ ;NOTE
+"RTN","BSDX02",87,0)
+ S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXAD,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX02",88,0)
+ . S BSDXNOT=$G(^BSDXAPPT(BSDXAD,1,BSDXQ,0))
+"RTN","BSDX02",89,0)
+ . S:$E(BSDXNOT,$L(BSDXNOT)-1,$L(BSDXNOT))'=" " BSDXNOT=BSDXNOT_" "
+"RTN","BSDX02",90,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX02",91,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXNOT
+"RTN","BSDX02",92,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",93,0)
+ S ^BSDXTMP($J,BSDXI)=$C(30)
+"RTN","BSDX02",94,0)
+ Q
+"RTN","BSDX02",95,0)
+ ;
+"RTN","BSDX02",96,0)
+ERR(BSDXI,BSDXERR) ;Error processing
+"RTN","BSDX02",97,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",98,0)
+ S ^BSDXTMP($J,BSDXI)="0^^^^^^^^^^^"_BSDXERR_$C(30)
+"RTN","BSDX02",99,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",100,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX02",101,0)
+ Q
+"RTN","BSDX02",102,0)
+ ;
+"RTN","BSDX02",103,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX02",104,0)
+ D ^%ZTER
+"RTN","BSDX02",105,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX02",106,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",107,0)
+ D ERR(BSDXI,"BSDX31 Error: "_$G(%ZTERROR))
+"RTN","BSDX02",108,0)
+ Q
+"RTN","BSDX03")
+0^3^B2855259
+"RTN","BSDX03",1,0)
+BSDX03 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX03",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX03",3,0)
+ ;
+"RTN","BSDX03",4,0)
+ ;
+"RTN","BSDX03",5,0)
+ Q
+"RTN","BSDX03",6,0)
+ ;
+"RTN","BSDX03",7,0)
+XR2S(BSDXDA) ;EP
+"RTN","BSDX03",8,0)
+ ;XR2 is the ARSRC xref for the
+"RTN","BSDX03",9,0)
+ ;RESOURCE field of the BSDX APPOINTMENT file
+"RTN","BSDX03",10,0)
+ ;Format is ^BSDXAPPT("ARSRC",RESOURCEID,STARTTIME,APPTID)
+"RTN","BSDX03",11,0)
+ Q:'$D(^BSDXAPPT(BSDXDA,0))
+"RTN","BSDX03",12,0)
+ N BSDXNOD,BSDXAPPID,BSDXRSID,BSDXS
+"RTN","BSDX03",13,0)
+ S BSDXNOD=^BSDXAPPT(BSDXDA,0)
+"RTN","BSDX03",14,0)
+ S BSDXAPPID=BSDXDA
+"RTN","BSDX03",15,0)
+ S BSDXRSID=$P(BSDXNOD,U,7)
+"RTN","BSDX03",16,0)
+ Q:'+BSDXAPPID>0
+"RTN","BSDX03",17,0)
+ Q:'+BSDXRSID>0
+"RTN","BSDX03",18,0)
+ S BSDXS=$P(BSDXNOD,U)
+"RTN","BSDX03",19,0)
+ Q:'+BSDXS
+"RTN","BSDX03",20,0)
+ S ^BSDXAPPT("ARSRC",BSDXRSID,BSDXS,BSDXAPPID)=""
+"RTN","BSDX03",21,0)
+ Q
+"RTN","BSDX03",22,0)
+ ;
+"RTN","BSDX03",23,0)
+XR2K(BSDXA) ;EP
+"RTN","BSDX03",24,0)
+ Q:'$D(^BSDXAPPT(BSDXA,0))
+"RTN","BSDX03",25,0)
+ N BSDXNOD,BSDXAPPID,BSDXRSID,BSDXS
+"RTN","BSDX03",26,0)
+ S BSDXNOD=^BSDXAPPT(BSDXA,0)
+"RTN","BSDX03",27,0)
+ S BSDXAPPID=BSDXA
+"RTN","BSDX03",28,0)
+ S BSDXRSID=$P(BSDXNOD,U,7)
+"RTN","BSDX03",29,0)
+ S BSDXS=$P(BSDXNOD,U)
+"RTN","BSDX03",30,0)
+ Q:'+BSDXAPPID>0
+"RTN","BSDX03",31,0)
+ Q:'+BSDXRSID>0
+"RTN","BSDX03",32,0)
+ Q:'+BSDXS>0
+"RTN","BSDX03",33,0)
+ K ^BSDXAPPT("ARSRC",BSDXRSID,BSDXS,BSDXAPPID)
+"RTN","BSDX03",34,0)
+ Q
+"RTN","BSDX03",35,0)
+XR4S(BSDXDA) ;EP
+"RTN","BSDX03",36,0)
+ ;XR4 is the ARSCT xref for the
+"RTN","BSDX03",37,0)
+ ;STARTTIME field of the BSDX ACCESS BLOCK file
+"RTN","BSDX03",38,0)
+ ;Format is ^BSDXAB("ARSCT",RESOURCEID,STARTTIME,DA)
+"RTN","BSDX03",39,0)
+ Q:'$D(^BSDXAB(BSDXDA,0))
+"RTN","BSDX03",40,0)
+ N BSDXNOD,BSDXR,BSDXS
+"RTN","BSDX03",41,0)
+ S BSDXNOD=^BSDXAB(BSDXDA,0)
+"RTN","BSDX03",42,0)
+ S BSDXR=$P(BSDXNOD,U)
+"RTN","BSDX03",43,0)
+ S BSDXS=$P(BSDXNOD,U,2)
+"RTN","BSDX03",44,0)
+ Q:'+BSDXR>0
+"RTN","BSDX03",45,0)
+ Q:'+BSDXS>0
+"RTN","BSDX03",46,0)
+ S ^BSDXAB("ARSCT",BSDXR,BSDXS,BSDXDA)=""
+"RTN","BSDX03",47,0)
+ Q
+"RTN","BSDX03",48,0)
+ ;
+"RTN","BSDX03",49,0)
+XR4K(BSDXDA) ;EP
+"RTN","BSDX03",50,0)
+ Q:'$D(^BSDXAB(BSDXDA,0))
+"RTN","BSDX03",51,0)
+ N BSDXNOD,BSDXR,BSDXS
+"RTN","BSDX03",52,0)
+ S BSDXNOD=^BSDXAB(BSDXDA,0)
+"RTN","BSDX03",53,0)
+ S BSDXR=$P(BSDXNOD,U)
+"RTN","BSDX03",54,0)
+ S BSDXS=$P(BSDXNOD,U,2)
+"RTN","BSDX03",55,0)
+ Q:'+BSDXR>0
+"RTN","BSDX03",56,0)
+ Q:'+BSDXS>0
+"RTN","BSDX03",57,0)
+ K ^BSDXAB("ARSCT",BSDXR,BSDXS,BSDXDA)
+"RTN","BSDX03",58,0)
+ Q
+"RTN","BSDX04")
+0^4^B31079316
+"RTN","BSDX04",1,0)
+BSDX04 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;  ; 7/15/10 12:44pm
+"RTN","BSDX04",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX04",3,0)
+    ; Change Log:
+"RTN","BSDX04",4,0)
+    ; July 11 2010: Pass BSDXSTART and END as FM dates rather than US formatted dates
+"RTN","BSDX04",5,0)
+    ;       for i18n
+"RTN","BSDX04",6,0)
+ ;
+"RTN","BSDX04",7,0)
+ ;
+"RTN","BSDX04",8,0)
+CASSCHD(BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXTYPES,BSDXSRCH) ;EP
+"RTN","BSDX04",9,0)
+ ;
+"RTN","BSDX04",10,0)
+ ;D DEBUG^%Serenji("CASSCH^BSDX04(.BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXTYPES,BSDXSRCH)")
+"RTN","BSDX04",11,0)
+ ;
+"RTN","BSDX04",12,0)
+ Q
+"RTN","BSDX04",13,0)
+ ;
+"RTN","BSDX04",14,0)
+CASSET ;EP
+"RTN","BSDX04",15,0)
+ ;Error Trap
+"RTN","BSDX04",16,0)
+ D ^%ZTER
+"RTN","BSDX04",17,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=99999
+"RTN","BSDX04",18,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX04",19,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX04",20,0)
+ Q
+"RTN","BSDX04",21,0)
+ ;
+"RTN","BSDX04",22,0)
+CASSCH(BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXTYPES,BSDXSRCH) ;EP
+"RTN","BSDX04",23,0)
+ ;Called by BSDX CREATE ASGND SLOT SCHED
+"RTN","BSDX04",24,0)
+ ;Create Assigned Slot Schedule recordset
+"RTN","BSDX04",25,0)
+ ;This call is used both to create a schedule of availability for the calendar display
+"RTN","BSDX04",26,0)
+ ;and to search for availability in the Find Appointment function
+"RTN","BSDX04",27,0)
+ ;
+"RTN","BSDX04",28,0)
+ ;BSDXRES is resource name
+"RTN","BSDX04",29,0)
+    ;
+"RTN","BSDX04",30,0)
+    ;//smh
+"RTN","BSDX04",31,0)
+    ; BSDXSTART and BSDXEND both passed in FM Format.
+"RTN","BSDX04",32,0)
+    ; BSDXSTART is the Date Portion of FM Date
+"RTN","BSDX04",33,0)
+    ; BSDXEND -- pass date and h,m,s as well
+"RTN","BSDX04",34,0)
+    ;//smh
+"RTN","BSDX04",35,0)
+ ;
+"RTN","BSDX04",36,0)
+ ;BSDXTYPES is |-delimited list of Access Type Names
+"RTN","BSDX04",37,0)
+ ;If BSDXTYPES is "" then the screen passes all types.
+"RTN","BSDX04",38,0)
+ ;
+"RTN","BSDX04",39,0)
+ ;BSDXSRCH is |-delimited search info for the Find Appointment function
+"RTN","BSDX04",40,0)
+ ;First piece is 1 if we are in a Find Appointment call
+"RTN","BSDX04",41,0)
+ ;Second piece is weekday info in the format MTWHFSU
+"RTN","BSDX04",42,0)
+ ;Third piece is AM PM info in the form AP
+"RTN","BSDX04",43,0)
+ ;If 2nd or 3rd pieces are null, the screen for that piece is skipped
+"RTN","BSDX04",44,0)
+ ;
+"RTN","BSDX04",45,0)
+ ;Test lines:
+"RTN","BSDX04",46,0)
+ ;D CASSCH^BSDX04(.RES,"REMILLARD,MIKE","<fmdate>","<fmdate>") ZW RES
+"RTN","BSDX04",47,0)
+ ;BSDX CREATE ASGND SLOT SCHED^ROGERS,BUCK^<fmdate>^<fmdate>^2
+"RTN","BSDX04",48,0)
+ ;S ^HW("BSDX04")=BSDXRES_U_BSDXSTART_U_BSDXEND
+"RTN","BSDX04",49,0)
+ ;
+"RTN","BSDX04",50,0)
+ N BSDXERR,BSDXIEN,BSDXDEP,BSDXTYPED,BSDXTYPE,BSDXALO,BSDXBS,BSDXI,BSDXNEND,BSDXNSTART,BSDXPEND,BSDXRESD,BSDXRESN,BSDXS,BSDXZ,BSDXTMP,BSDXQ,BSDXNOT,BSDXNOD,BSDXAD
+"RTN","BSDX04",51,0)
+ N BSDXSUBCD
+"RTN","BSDX04",52,0)
+ S X="CASSET^BSDX04",@^%ZOSF("TRAP")
+"RTN","BSDX04",53,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX04",54,0)
+ S BSDXERR=""
+"RTN","BSDX04",55,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX04",56,0)
+ S ^BSDXTMP($J,0)="D00030START_TIME^D00030END_TIME^I00010SLOTS^T00030RESOURCE^T00010ACCESS_TYPE^T00250NOTE^I00030AVAILABILITYID"_$C(30)
+"RTN","BSDX04",57,0)
+ S BSDXALO=0,BSDXI=2
+"RTN","BSDX04",58,0)
+ ;
+"RTN","BSDX04",59,0)
+ ;Get Access Type IDs
+"RTN","BSDX04",60,0)
+ N BSDXK,BSDXTYPED,BSDXL
+"RTN","BSDX04",61,0)
+ I '+BSDXSRCH S BSDXTYPED=""
+"RTN","BSDX04",62,0)
+ I +BSDXSRCH F BSDXK=1:1:$L(BSDXTYPES,"|") D
+"RTN","BSDX04",63,0)
+ . S BSDXL=$P(BSDXTYPES,"|",BSDXK)
+"RTN","BSDX04",64,0)
+ . I BSDXL="" S $P(BSDXTYPED,"|",BSDXK)=0 Q
+"RTN","BSDX04",65,0)
+ . I '$D(^BSDXTYPE("B",BSDXL)) S $P(BSDXTYPED,"|",BSDXK)=0 Q
+"RTN","BSDX04",66,0)
+ . S $P(BSDXTYPED,"|",BSDXK)=$O(^BSDXTYPE("B",BSDXL,0))
+"RTN","BSDX04",67,0)
+ ;
+"RTN","BSDX04",68,0)
+ D
+"RTN","BSDX04",69,0)
+ . S BSDXBS=0
+"RTN","BSDX04",70,0)
+ . S BSDXRESN=BSDXRES
+"RTN","BSDX04",71,0)
+ . Q:BSDXRESN=""
+"RTN","BSDX04",72,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX04",73,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0)) Q:'+BSDXRESD
+"RTN","BSDX04",74,0)
+ . Q:'$D(^BSDXAB("ARSCT",BSDXRESD))
+"RTN","BSDX04",75,0)
+ . D STRES(BSDXRESN,BSDXRESD)
+"RTN","BSDX04",76,0)
+ . Q
+"RTN","BSDX04",77,0)
+ ;
+"RTN","BSDX04",78,0)
+ ;start, end, slots, resource, accesstype, note, availabilityid
+"RTN","BSDX04",79,0)
+ ;I '+BSDXSRCH,BSDXALO D
+"RTN","BSDX04",80,0)
+ I BSDXALO D
+"RTN","BSDX04",81,0)
+ . ;If first block start time > input start time then pad with new block
+"RTN","BSDX04",82,0)
+ . I BSDXBS>BSDXSTART K BSDXTMP D
+"RTN","BSDX04",83,0)
+ . . S Y=BSDXSTART X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",84,0)
+ . . S BSDXTMP=Y
+"RTN","BSDX04",85,0)
+ . . S Y=BSDXBS X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",86,0)
+ . . S BSDXTMP=BSDXTMP_"^"_Y_"^0^"_BSDXRESN_"^0^^0"_$C(30)
+"RTN","BSDX04",87,0)
+ . . S ^BSDXTMP($J,1)=BSDXTMP
+"RTN","BSDX04",88,0)
+ . ;
+"RTN","BSDX04",89,0)
+ . ;If first block start time < input start time then trim
+"RTN","BSDX04",90,0)
+ . I BSDXBS<BSDXSTART D
+"RTN","BSDX04",91,0)
+ . . S Y=BSDXSTART
+"RTN","BSDX04",92,0)
+ . . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",93,0)
+ . . S $P(^BSDXTMP($J,2),U,1)=Y
+"RTN","BSDX04",94,0)
+ . ;
+"RTN","BSDX04",95,0)
+ . ;If last block end time < input end time then pad end with new block
+"RTN","BSDX04",96,0)
+ . I BSDXPEND<BSDXEND D
+"RTN","BSDX04",97,0)
+ . . S Y=BSDXPEND X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",98,0)
+ . . S BSDXTMP=Y
+"RTN","BSDX04",99,0)
+ . . S Y=BSDXEND X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",100,0)
+ . . S BSDXTMP=BSDXTMP_"^"_Y_"^0^"_BSDXRESN_"^0^^0"_$C(30)
+"RTN","BSDX04",101,0)
+ . . S ^BSDXTMP($J,BSDXI-1)=BSDXTMP
+"RTN","BSDX04",102,0)
+ . ;
+"RTN","BSDX04",103,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX04",104,0)
+ Q
+"RTN","BSDX04",105,0)
+ ;
+"RTN","BSDX04",106,0)
+STRES(BSDXRESN,BSDXRESD) ;
+"RTN","BSDX04",107,0)
+ ;BSDXRESD is a Resource ID
+"RTN","BSDX04",108,0)
+ ;$O THRU "ARSCT" XREF OF ^BSDXAB
+"RTN","BSDX04",109,0)
+ S BSDXS=$P(BSDXSTART,"."),BSDXS=BSDXS-.0001
+"RTN","BSDX04",110,0)
+ S BSDXNEND=0,BSDXNSTART=0,BSDXPEND=0
+"RTN","BSDX04",111,0)
+ F  S BSDXS=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX04",112,0)
+ . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D STCOMM(BSDXRESN,BSDXRESD,BSDXS,BSDXAD) ;BSDXAD Is the AvailabilityID
+"RTN","BSDX04",113,0)
+ . Q
+"RTN","BSDX04",114,0)
+ Q
+"RTN","BSDX04",115,0)
+ ;
+"RTN","BSDX04",116,0)
+STCOMM(BSDXRESN,BSDXRESD,BSDXS,BSDXAD) ;
+"RTN","BSDX04",117,0)
+ N BSDXNSTART,BSDXNEND,BSDXNOD,Y,BSDXQ,BSDXZ,BSDXATID,BSDXATOK
+"RTN","BSDX04",118,0)
+ Q:'$D(^BSDXAB(BSDXAD,0))
+"RTN","BSDX04",119,0)
+ S BSDXNOD=^BSDXAB(BSDXAD,0)
+"RTN","BSDX04",120,0)
+ S BSDXATID=$P(BSDXNOD,U,5)
+"RTN","BSDX04",121,0)
+ ;
+"RTN","BSDX04",122,0)
+ ;Screen for Access Type
+"RTN","BSDX04",123,0)
+ ;S BSDXATOK=0
+"RTN","BSDX04",124,0)
+ ;I BSDXTYPED="" S BSDXATOK=1
+"RTN","BSDX04",125,0)
+ ;E  D
+"RTN","BSDX04",126,0)
+ ;. F J=1:1:$L(BSDXTYPED,"|") I BSDXATID=$P(BSDXTYPED,"|",J) S BSDXATOK=1 Q
+"RTN","BSDX04",127,0)
+ ;Q:'BSDXATOK
+"RTN","BSDX04",128,0)
+ ;
+"RTN","BSDX04",129,0)
+ ;I +BSDXSRCH
+"RTN","BSDX04",130,0)
+ ;Screen for Weekday
+"RTN","BSDX04",131,0)
+ ;
+"RTN","BSDX04",132,0)
+ ;Screen for AM PM
+"RTN","BSDX04",133,0)
+ ;
+"RTN","BSDX04",134,0)
+ S BSDXZ=""
+"RTN","BSDX04",135,0)
+ S BSDXNSTART=$P(BSDXNOD,U,2)
+"RTN","BSDX04",136,0)
+ S BSDXNEND=$P(BSDXNOD,U,3)
+"RTN","BSDX04",137,0)
+ I BSDXNEND'>BSDXSTART Q  ;End is less than start
+"RTN","BSDX04",138,0)
+ I +BSDXBS=0 S BSDXBS=$P(BSDXNOD,U,2) ;First block start time
+"RTN","BSDX04",139,0)
+ F BSDXQ=2:1:3 D  ;Start and End times
+"RTN","BSDX04",140,0)
+ . S Y=$P(BSDXNOD,U,BSDXQ)
+"RTN","BSDX04",141,0)
+ . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",142,0)
+ . S BSDXZ=BSDXZ_Y_"^"
+"RTN","BSDX04",143,0)
+ S BSDXZ=BSDXZ_$P(BSDXNOD,U,4)_"^" ;SLOTS
+"RTN","BSDX04",144,0)
+ S BSDXZ=BSDXZ_BSDXRESN_"^" ;Resource name
+"RTN","BSDX04",145,0)
+ S BSDXZ=BSDXZ_BSDXATID_"^" ;Access type ID
+"RTN","BSDX04",146,0)
+ S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAB(BSDXAD,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX04",147,0)
+ . S BSDXNOT=BSDXNOT_$G(^BSDXAB(BSDXAD,1,BSDXQ,0))_" "
+"RTN","BSDX04",148,0)
+ S BSDXZ=BSDXZ_BSDXNOT ;_"^"
+"RTN","BSDX04",149,0)
+ ;I '+BSDXSRCH,BSDXPEND,BSDXNSTART>BSDXPEND D  ;Fill in gap between appointment
+"RTN","BSDX04",150,0)
+ I BSDXPEND,BSDXNSTART>BSDXPEND D  ;Fill in gap between appointment
+"RTN","BSDX04",151,0)
+ . S Y=BSDXPEND X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",152,0)
+ . S BSDXTMP=Y
+"RTN","BSDX04",153,0)
+ . S Y=BSDXNSTART X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",154,0)
+ . S BSDXTMP=BSDXTMP_"^"_Y_"^0^"_BSDXRESN_"^0^^0"_$C(30)
+"RTN","BSDX04",155,0)
+ . S ^BSDXTMP($J,BSDXI-1)=BSDXTMP
+"RTN","BSDX04",156,0)
+ S BSDXPEND=BSDXNEND
+"RTN","BSDX04",157,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXZ_"^"_BSDXAD_$C(30)
+"RTN","BSDX04",158,0)
+ S BSDXI=BSDXI+2
+"RTN","BSDX04",159,0)
+ S BSDXALO=1 ;At Least One record will be returned
+"RTN","BSDX04",160,0)
+ Q
+"RTN","BSDX05")
+0^5^B10878471
+"RTN","BSDX05",1,0)
+BSDX05  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 5:36pm
+"RTN","BSDX05",2,0)
+    ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX05",3,0)
+    ;
+"RTN","BSDX05",4,0)
+    ; Change Log:
+"RTN","BSDX05",5,0)
+    ; UJO/SMH - July 11 2010: pass FM Dates for Start and End rather than US Dates
+"RTN","BSDX05",6,0)
+    ; UJO/SMH - Dec 8 2010: In STCOMM, the logic was that an appointment 
+"RTN","BSDX05",7,0)
+    ;  that was a walk-in didn't count towards slot calculations.
+"RTN","BSDX05",8,0)
+    ;  I checked PIMS, and Walk-ins do indeed count towards slot calculations.
+"RTN","BSDX05",9,0)
+    ;  Therefore, I commented this line out:
+"RTN","BSDX05",10,0)
+    ;    ;Q:$P(BSDXNOD,U,13)="y"  ;WALKIN
+"RTN","BSDX05",11,0)
+    ;
+"RTN","BSDX05",12,0)
+APBLKOV(BSDXY,BSDXSTART,BSDXEND,BSDXRES)     ;EP
+"RTN","BSDX05",13,0)
+    ;Called by BSDX APPT BLOCKS OVERLAP
+"RTN","BSDX05",14,0)
+       ; July 11 2010 - pass FM Dates for Start and End rather than US Dates
+"RTN","BSDX05",15,0)
+    ;(Duplicates old qryAppointmentBlocksOverlapB)
+"RTN","BSDX05",16,0)
+    ;BSDXRES is resource name
+"RTN","BSDX05",17,0)
+    ;
+"RTN","BSDX05",18,0)
+    ;Test lines:
+"RTN","BSDX05",19,0)
+    ;D APBLKOV^BSDX05(.RES,"11-8-2000","11-8-2004","WHITT") ZW RES
+"RTN","BSDX05",20,0)
+    ;BSDX APPT BLOCKS OVERLAP^11-8-2000^11-8-2004^WHITT
+"RTN","BSDX05",21,0)
+    ;S ^HW("BSDXD05")=BSDXSTART_U_BSDXEND_U_BSDXRES
+"RTN","BSDX05",22,0)
+    ;
+"RTN","BSDX05",23,0)
+    N BSDXERR,BSDXIEN,BSDXDEP,BSDXBS,BSDXI,BSDXNEND,BSDXNSTART,BSDXPEND,BSDXRESD,BSDXRESN,BSDXS,BSDXAD,BSDXNOD
+"RTN","BSDX05",24,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX05",25,0)
+    S BSDXERR=""
+"RTN","BSDX05",26,0)
+    S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX05",27,0)
+    S ^BSDXTMP($J,0)="D00030START_TIME^D00030END_TIME"_$C(30)
+"RTN","BSDX05",28,0)
+    D
+"RTN","BSDX05",29,0)
+    . S BSDXBS=0
+"RTN","BSDX05",30,0)
+    . S BSDXEND=BSDXEND+.9999 ;Go to end of day
+"RTN","BSDX05",31,0)
+    . S BSDXRESN=BSDXRES
+"RTN","BSDX05",32,0)
+    . Q:BSDXRESN=""
+"RTN","BSDX05",33,0)
+    . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX05",34,0)
+    . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX05",35,0)
+    . Q:'+BSDXRESD
+"RTN","BSDX05",36,0)
+    . Q:'$D(^BSDXAPPT("ARSRC",BSDXRESD))
+"RTN","BSDX05",37,0)
+    . D STRES(BSDXRESD,BSDXSTART,BSDXEND)
+"RTN","BSDX05",38,0)
+    . Q
+"RTN","BSDX05",39,0)
+    ;
+"RTN","BSDX05",40,0)
+    S BSDXI=$G(BSDXI)+1
+"RTN","BSDX05",41,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX05",42,0)
+    Q
+"RTN","BSDX05",43,0)
+    ;
+"RTN","BSDX05",44,0)
+STRES(BSDXRESD,BSDXSTART,BSDXEND)   ;
+"RTN","BSDX05",45,0)
+    ;$O THRU "ARSRC" XREF OF ^BSDXAPPT
+"RTN","BSDX05",46,0)
+    ;Start at the beginning of the day -- appts can't overlap days
+"RTN","BSDX05",47,0)
+    S BSDXS=$P(BSDXSTART,"."),BSDXS=BSDXS-.0001
+"RTN","BSDX05",48,0)
+    S BSDXI=0
+"RTN","BSDX05",49,0)
+    F  S BSDXS=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX05",50,0)
+    . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D STCOMM(BSDXAD) ;BSDXAD Is the AppointmentID
+"RTN","BSDX05",51,0)
+    . Q
+"RTN","BSDX05",52,0)
+    Q
+"RTN","BSDX05",53,0)
+    ;
+"RTN","BSDX05",54,0)
+STCOMM(BSDXAD)  ;
+"RTN","BSDX05",55,0)
+    S BSDXNEND=0,BSDXNSTART=0,BSDXPEND=0
+"RTN","BSDX05",56,0)
+    Q:'$D(^BSDXAPPT(BSDXAD,0))
+"RTN","BSDX05",57,0)
+    S BSDXNOD=^BSDXAPPT(BSDXAD,0)
+"RTN","BSDX05",58,0)
+    Q:$P(BSDXNOD,U,10)=1  ;NO-SHOW Flag
+"RTN","BSDX05",59,0)
+    Q:$P(BSDXNOD,U,12)]""  ;CANCELLED APPT
+"RTN","BSDX05",60,0)
+    ; Q:$P(BSDXNOD,U,13)="y"  ;WALKIN -- new in V 1.42. See top comments.
+"RTN","BSDX05",61,0)
+    S BSDXNSTART=$P(BSDXNOD,U)
+"RTN","BSDX05",62,0)
+    S BSDXNEND=$P(BSDXNOD,U,2)
+"RTN","BSDX05",63,0)
+    I BSDXNEND'>BSDXSTART Q  ;End is less than start
+"RTN","BSDX05",64,0)
+    S Y=BSDXNSTART X ^DD("DD") S BSDXNSTART=$TR(Y,"@"," ")
+"RTN","BSDX05",65,0)
+    S Y=BSDXNEND X ^DD("DD") S BSDXNEND=$TR(Y,"@"," ")
+"RTN","BSDX05",66,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX05",67,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXNSTART_U_BSDXNEND_$C(30)
+"RTN","BSDX05",68,0)
+    Q
+"RTN","BSDX06")
+0^6^B6812445
+"RTN","BSDX06",1,0)
+BSDX06 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 4:51pm
+"RTN","BSDX06",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX06",3,0)
+    ; Change Log:
+"RTN","BSDX06",4,0)
+    ; UJO/SMH: July 15 2010: Change in BSDXSTART and BSDXEND: get
+"RTN","BSDX06",5,0)
+    ; dates in FM format for i18n
+"RTN","BSDX06",6,0)
+ ;
+"RTN","BSDX06",7,0)
+ ;
+"RTN","BSDX06",8,0)
+TPBLKOV(BSDXY,BSDXSTART,BSDXEND,BSDXRES)  ;EP
+"RTN","BSDX06",9,0)
+ ;Called by BSDXD TYPE BLOCKS OVERLAP
+"RTN","BSDX06",10,0)
+ ;(Duplicates old qryTypeBlocksOverlapB)
+"RTN","BSDX06",11,0)
+ ;BSDXRES is resource name
+"RTN","BSDX06",12,0)
+ ;
+"RTN","BSDX06",13,0)
+ ;Test lines:
+"RTN","BSDX06",14,0)
+ ;D TPBLKOV^BSDX06(.RES,"3030513","3030516","REMILLARD,MIKE") ZW RES
+"RTN","BSDX06",15,0)
+ ;BSDX TYPE BLOCKS OVERLAP^303513^3030516^REMILLARD,MIKE
+"RTN","BSDX06",16,0)
+ ;S ^HW("BSDXD06")=BSDXSTART_U_BSDXEND_U_BSDXRES
+"RTN","BSDX06",17,0)
+ ;
+"RTN","BSDX06",18,0)
+ N BSDXERR,BSDXIEN,BSDXDEP,BSDXBS,BSDXI,BSDXNEND,BSDXNSTART,BSDXPEND,BSDXRESD,BSDXRESN,BSDXS,BSDXTPID,BSDXNOD,BSDXAD
+"RTN","BSDX06",19,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX06",20,0)
+ S BSDXERR=""
+"RTN","BSDX06",21,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX06",22,0)
+ S ^BSDXTMP($J,0)="D00030StartTime^D00030EndTime^I00010AppointmentTypeID^I00010AvailabilityID^T00030ResourceName"_$C(30)
+"RTN","BSDX06",23,0)
+ S BSDXI=0
+"RTN","BSDX06",24,0)
+ D
+"RTN","BSDX06",25,0)
+ . S BSDXBS=0
+"RTN","BSDX06",26,0)
+ . I $L(BSDXEND,".")=1 S BSDXEND=BSDXEND+.9999 ;Go to end of day if only date (not time) is passed
+"RTN","BSDX06",27,0)
+ . S BSDXRESN=BSDXRES
+"RTN","BSDX06",28,0)
+ . Q:BSDXRESN=""
+"RTN","BSDX06",29,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX06",30,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX06",31,0)
+ . Q:'+BSDXRESD
+"RTN","BSDX06",32,0)
+ . D STCOMM(BSDXRESN,BSDXRESD)
+"RTN","BSDX06",33,0)
+ . Q
+"RTN","BSDX06",34,0)
+ ;
+"RTN","BSDX06",35,0)
+ S BSDXI=$G(BSDXI)+1
+"RTN","BSDX06",36,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX06",37,0)
+ Q
+"RTN","BSDX06",38,0)
+ ;
+"RTN","BSDX06",39,0)
+STCOMM(BSDXRESN,BSDXRESD) ;EP
+"RTN","BSDX06",40,0)
+ ;
+"RTN","BSDX06",41,0)
+ Q:'$D(^BSDXAB("ARSCT",BSDXRESD))
+"RTN","BSDX06",42,0)
+ Q:'$D(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX06",43,0)
+ ;$O THRU "ARSCT" XREF OF ^BSDXAB
+"RTN","BSDX06",44,0)
+ S BSDXNEND=0,BSDXNSTART=0,BSDXPEND=0
+"RTN","BSDX06",45,0)
+ ;Start at the beginning of the day -- AV Blocks can't overlap days
+"RTN","BSDX06",46,0)
+ S BSDXS=$P(BSDXSTART,"."),BSDXS=BSDXS-.0001
+"RTN","BSDX06",47,0)
+ F  S BSDXS=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX06",48,0)
+ . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D
+"RTN","BSDX06",49,0)
+ . . Q:'$D(^BSDXAB(BSDXAD,0))
+"RTN","BSDX06",50,0)
+ . . S BSDXNOD=^BSDXAB(BSDXAD,0)
+"RTN","BSDX06",51,0)
+ . . S BSDXNSTART=$P(BSDXNOD,U,2)
+"RTN","BSDX06",52,0)
+ . . S BSDXNEND=$P(BSDXNOD,U,3)
+"RTN","BSDX06",53,0)
+ . . I BSDXNEND'>BSDXSTART Q
+"RTN","BSDX06",54,0)
+ . . S Y=BSDXNSTART X ^DD("DD") S BSDXNSTART=$TR(Y,"@"," ")
+"RTN","BSDX06",55,0)
+ . . S Y=BSDXNEND X ^DD("DD") S BSDXNEND=$TR(Y,"@"," ")
+"RTN","BSDX06",56,0)
+ . . S BSDXTPID=$P(BSDXNOD,U,5)
+"RTN","BSDX06",57,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX06",58,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXNSTART_U_BSDXNEND_U_BSDXTPID_U_BSDXAD_U_BSDXRESN_$C(30)
+"RTN","BSDX06",59,0)
+ . . Q
+"RTN","BSDX06",60,0)
+ . Q
+"RTN","BSDX06",61,0)
+ Q
+"RTN","BSDX07")
+0^7^B188811791
+"RTN","BSDX07",1,0)
+BSDX07 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS  ; 12/6/10 12:31pm
+"RTN","BSDX07",2,0)
+    ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX07",3,0)
+    ;
+"RTN","BSDX07",4,0)
+    ; Change Log:
+"RTN","BSDX07",5,0)
+    ; UJO/SMH
+"RTN","BSDX07",6,0)
+    ; v1.3 July 13 2010 - Add support i18n - Dates input as FM dates, not US.
+"RTN","BSDX07",7,0)
+    ; v1.42 Oct 22 2010 - Transaction now restartable by providing arguments
+"RTN","BSDX07",8,0)
+    ;   thanks to Rick Marshall and Zach Gonzalez at Oroville.
+"RTN","BSDX07",9,0)
+    ; v1.42 Oct 30 2010 - Extensive refactoring.
+"RTN","BSDX07",10,0)
+    ;
+"RTN","BSDX07",11,0)
+    ; Error Reference:
+"RTN","BSDX07",12,0)
+    ; -1: Patient Record is locked. This means something is wrong!!!!
+"RTN","BSDX07",13,0)
+    ; -2: Start Time is not a valid Fileman date
+"RTN","BSDX07",14,0)
+    ; -3: End Time is not a valid Fileman date
+"RTN","BSDX07",15,0)
+    ; -4: End Time does not have time inside of it.
+"RTN","BSDX07",16,0)
+    ; -5: BSDXPATID is not numeric
+"RTN","BSDX07",17,0)
+    ; -6: Patient Does not exist in ^DPT
+"RTN","BSDX07",18,0)
+    ; -7: Resource Name does not exist in B index of BSDX RESOURCE
+"RTN","BSDX07",19,0)
+    ; -8: Resouce doesn't exist in ^BSDXRES
+"RTN","BSDX07",20,0)
+    ; -9: Couldn't add appointment to BSDX APPOINTMENT
+"RTN","BSDX07",21,0)
+    ; -10: Couldn't add appointment to files 2 and/or 44
+"RTN","BSDX07",22,0)
+    ; -100: Mumps Error
+"RTN","BSDX07",23,0)
+ 
+"RTN","BSDX07",24,0)
+APPADDD(BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID)    ;EP
+"RTN","BSDX07",25,0)
+    ;Entry point for debugging
+"RTN","BSDX07",26,0)
+    D DEBUG^%Serenji("APPADD^BSDX07(.BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID)")
+"RTN","BSDX07",27,0)
+    Q
+"RTN","BSDX07",28,0)
+    ;
+"RTN","BSDX07",29,0)
+UT ; Unit Tests
+"RTN","BSDX07",30,0)
+    N ZZZ
+"RTN","BSDX07",31,0)
+    ; Test for bad start date
+"RTN","BSDX07",32,0)
+    D APPADD(.ZZZ,2100123,3100123.3,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",33,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-2 W "Error in -2",!
+"RTN","BSDX07",34,0)
+    ; Test for bad end date
+"RTN","BSDX07",35,0)
+    D APPADD(.ZZZ,3100123,2100123.3,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",36,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-3 W "Error in -3",!
+"RTN","BSDX07",37,0)
+    ; Test for end date without time
+"RTN","BSDX07",38,0)
+    D APPADD(.ZZZ,3100123.1,3100123,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",39,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-4 W "Error in -4",!
+"RTN","BSDX07",40,0)
+    ; Test for mumps error
+"RTN","BSDX07",41,0)
+    S bsdxdie=1
+"RTN","BSDX07",42,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",43,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-100 W "Error in -100: M Error",!
+"RTN","BSDX07",44,0)
+    K bsdxdie
+"RTN","BSDX07",45,0)
+    ; Test for TRESTART
+"RTN","BSDX07",46,0)
+    s bsdxrestart=1
+"RTN","BSDX07",47,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",48,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=0&(+$P(^BSDXTMP($J,1),U,2)'=-10) W "Error in TRESTART",!
+"RTN","BSDX07",49,0)
+    k bsdxrestart
+"RTN","BSDX07",50,0)
+    ; Test for non-numeric patient
+"RTN","BSDX07",51,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,"CAT,DOG","Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",52,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-5 W "Error in -5",!
+"RTN","BSDX07",53,0)
+    ; Test for a non-existent patient
+"RTN","BSDX07",54,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,8989898989,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",55,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-6 W "Error in -6",!
+"RTN","BSDX07",56,0)
+    ; Test for a non-existent resource name
+"RTN","BSDX07",57,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"lkajsflkjsadf",30,"Sam's Note",1)
+"RTN","BSDX07",58,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-7 W "Error in -7",!
+"RTN","BSDX07",59,0)
+    ; Test for corrupted resource
+"RTN","BSDX07",60,0)
+    ; Can't test for -8 since it requires DB corruption
+"RTN","BSDX07",61,0)
+    ; Test for inability to add appointment to BSDX Appointment
+"RTN","BSDX07",62,0)
+    ; Also requires something wrong in the DB
+"RTN","BSDX07",63,0)
+    ; Test for inability to add appointment to 2,44
+"RTN","BSDX07",64,0)
+    ; Test by creating a duplicate appointment
+"RTN","BSDX07",65,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",66,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",67,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-10 W "Error in -10",!
+"RTN","BSDX07",68,0)
+    ; Test for normality:
+"RTN","BSDX07",69,0)
+    D APPADD(.ZZZ,3110123.09,3110123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",70,0)
+    ; Does Appt exist?
+"RTN","BSDX07",71,0)
+    N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX07",72,0)
+    I 'APPID W "Error Making Appt-1" QUIT
+"RTN","BSDX07",73,0)
+    I +^BSDXAPPT(APPID,0)'=3110123.09 W "Error Making Appt-2"
+"RTN","BSDX07",74,0)
+    I '$D(^DPT(3,"S",3110123.09)) W "Error Making Appt-3"
+"RTN","BSDX07",75,0)
+    I '$D(^SC(2,"S",3110123.09)) W "Error Making Appt-4"
+"RTN","BSDX07",76,0)
+    QUIT
+"RTN","BSDX07",77,0)
+    ; 
+"RTN","BSDX07",78,0)
+APPADD(BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID) ;EP
+"RTN","BSDX07",79,0)
+    ;Called by RPC: BSDX ADD NEW APPOINTMENT
+"RTN","BSDX07",80,0)
+    ;
+"RTN","BSDX07",81,0)
+    ;Add new appointment to 3 files
+"RTN","BSDX07",82,0)
+    ; - BSDX APPOINTMENT
+"RTN","BSDX07",83,0)
+    ; - Hosp Location Appointment SubSubfile if Resource is linked to clinic
+"RTN","BSDX07",84,0)
+    ; - Patient Appointment Subfile if Resource is linked to clinic
+"RTN","BSDX07",85,0)
+    ;
+"RTN","BSDX07",86,0)
+    ;Paramters:
+"RTN","BSDX07",87,0)
+    ;BSDXY: Global Return (RPC must be set to Global Array)
+"RTN","BSDX07",88,0)
+    ;BSDXSTART: FM Start Date
+"RTN","BSDX07",89,0)
+    ;BSDXEND: FM End Date
+"RTN","BSDX07",90,0)
+    ;BSDXPATID: Patient DFN
+"RTN","BSDX07",91,0)
+    ;BSDXRES is ResourceName in BSDX RESOURCE file (not IEN)
+"RTN","BSDX07",92,0)
+    ;BSDXLEN is the appointment duration in minutes
+"RTN","BSDX07",93,0)
+    ;BSDXNOTE is the Appiontment Note
+"RTN","BSDX07",94,0)
+    ;BSDXATID is used for 2 purposes:
+"RTN","BSDX07",95,0)
+    ; if BSDXATID = "WALKIN" then BSDAPI is called to create a walkin appt.
+"RTN","BSDX07",96,0)
+    ; if BSDXATID = a number, then it is the access type id (used for rebooking)
+"RTN","BSDX07",97,0)
+    ;
+"RTN","BSDX07",98,0)
+    ;Return:
+"RTN","BSDX07",99,0)
+    ; ADO.net Recordset having fields:
+"RTN","BSDX07",100,0)
+    ; AppointmentID and ErrorNumber
+"RTN","BSDX07",101,0)
+    ;
+"RTN","BSDX07",102,0)
+    ;Test lines:
+"RTN","BSDX07",103,0)
+    ;BSDX ADD NEW APPOINTMENT^3091122.0930^3091122.1000^370^Dr Office^30^EXAM^WALKIN
+"RTN","BSDX07",104,0)
+    ;
+"RTN","BSDX07",105,0)
+    ; Return Array; set Return and clear array
+"RTN","BSDX07",106,0)
+    S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX07",107,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX07",108,0)
+    ; $ET
+"RTN","BSDX07",109,0)
+    N $ET S $ET="G ETRAP^BSDX07"
+"RTN","BSDX07",110,0)
+    ; Counter
+"RTN","BSDX07",111,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX07",112,0)
+    ; Lock BSDX node, only to synchronize access to the globals.
+"RTN","BSDX07",113,0)
+    ; It's not expected that the error will ever happen as no filing
+"RTN","BSDX07",114,0)
+    ; is supposed to take 5 seconds.
+"RTN","BSDX07",115,0)
+    L +^BSDXAPPT(BSDXPATID):5 I '$T D ERR(BSDXI,"-1~Patient record is locked. Please contact technical support.") Q
+"RTN","BSDX07",116,0)
+    ; Header Node
+"RTN","BSDX07",117,0)
+    S ^BSDXTMP($J,BSDXI)="I00020APPOINTMENTID^T00100ERRORID"_$C(30)
+"RTN","BSDX07",118,0)
+    ;Restartable Transaction; restore paramters when starting.
+"RTN","BSDX07",119,0)
+    ; (Params restored are what's passed here + BSDXI)
+"RTN","BSDX07",120,0)
+    TSTART (BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID,BSDXI):T="BSDX ADD NEW APPOINTMENT^BSDX07"
+"RTN","BSDX07",121,0)
+    ;
+"RTN","BSDX07",122,0)
+    ; Turn off SDAM APPT PROTOCOL BSDX Entries
+"RTN","BSDX07",123,0)
+    N BSDXNOEV
+"RTN","BSDX07",124,0)
+    S BSDXNOEV=1 ;Don't execute BSDX ADD APPOINTMENT protocol
+"RTN","BSDX07",125,0)
+    ;
+"RTN","BSDX07",126,0)
+    ; Set Error Message to be empty
+"RTN","BSDX07",127,0)
+    N BSDXERR S BSDXERR=0
+"RTN","BSDX07",128,0)
+    ;
+"RTN","BSDX07",129,0)
+    ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX07",130,0)
+    I $G(bsdxdie) S X=1/0
+"RTN","BSDX07",131,0)
+    ;;;test
+"RTN","BSDX07",132,0)
+    ;;;test for TRESTART
+"RTN","BSDX07",133,0)
+    I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX07",134,0)
+    ;;;test
+"RTN","BSDX07",135,0)
+    ;
+"RTN","BSDX07",136,0)
+    ; -- Start and End Date Processing --
+"RTN","BSDX07",137,0)
+    ; If C# sends the dates with extra zeros, remove them
+"RTN","BSDX07",138,0)
+    S BSDXSTART=+BSDXSTART,BSDXEND=+BSDXEND
+"RTN","BSDX07",139,0)
+    ; Are the dates valid? Must be FM Dates > than 2010
+"RTN","BSDX07",140,0)
+    I BSDXSTART'>3100000 D ERR(BSDXI,"-2~BSDX07 Error: Invalid Start Time") Q
+"RTN","BSDX07",141,0)
+    I BSDXEND'>3100000 D ERR(BSDXI,"-3~BSDX07 Error: Invalid End Time") Q
+"RTN","BSDX07",142,0)
+    ; If Ending date doesn't have a time, this is an error
+"RTN","BSDX07",143,0)
+    I $L(BSDXEND,".")=1 D ERR(BSDXI,"-4~BSDX07 Error: Invalid End Time") Q
+"RTN","BSDX07",144,0)
+    ; If the Start Date is greater than the end date, swap dates
+"RTN","BSDX07",145,0)
+    N BSDXTMP
+"RTN","BSDX07",146,0)
+    I BSDXSTART>BSDXEND S BSDXTMP=BSDXEND,BSDXEND=BSDXSTART,BSDXSTART=BSDXTMP
+"RTN","BSDX07",147,0)
+    ;
+"RTN","BSDX07",148,0)
+    ; Check if the patient exists:
+"RTN","BSDX07",149,0)
+    ; - DFN valid number?
+"RTN","BSDX07",150,0)
+    ; - Valid Patient in file 2?
+"RTN","BSDX07",151,0)
+    I '+BSDXPATID D ERR(BSDXI,"-5~BSDX07 Error: Invalid Patient ID") Q 
+"RTN","BSDX07",152,0)
+    I '$D(^DPT(BSDXPATID,0)) D ERR(BSDXI,"-6~BSDX07 Error: Invalid Patient ID") Q
+"RTN","BSDX07",153,0)
+    ;
+"RTN","BSDX07",154,0)
+    ;Validate Resource entry
+"RTN","BSDX07",155,0)
+    I '$D(^BSDXRES("B",BSDXRES)) D ERR(BSDXI,"-7~BSDX07 Error: Invalid Resource ID") Q
+"RTN","BSDX07",156,0)
+    N BSDXRESD ; Resource IEN
+"RTN","BSDX07",157,0)
+    S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0))
+"RTN","BSDX07",158,0)
+    N BSDXRNOD ; Resouce zero node
+"RTN","BSDX07",159,0)
+    S BSDXRNOD=$G(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX07",160,0)
+    I BSDXRNOD="" D ERR(BSDXI,"-8~BSDX07 Error: invalid Resource entry.") Q
+"RTN","BSDX07",161,0)
+    ;
+"RTN","BSDX07",162,0)
+    ; Walk-in (Unscheduled) Appointment?
+"RTN","BSDX07",163,0)
+    N BSDXWKIN S BSDXWKIN=0
+"RTN","BSDX07",164,0)
+    I BSDXATID="WALKIN" S BSDXWKIN=1
+"RTN","BSDX07",165,0)
+    ; Reset Access Type ID if it doesn't say "WALKIN" and isn't a number
+"RTN","BSDX07",166,0)
+    I BSDXATID'?.N&(BSDXATID'="WALKIN") S BSDXATID=""
+"RTN","BSDX07",167,0)
+    ;
+"RTN","BSDX07",168,0)
+    ; Done with all checks, let's make appointment in BSDX APPOINTMENT
+"RTN","BSDX07",169,0)
+    N BSDXAPPTID
+"RTN","BSDX07",170,0)
+    S BSDXAPPTID=$$BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRESD,BSDXATID)
+"RTN","BSDX07",171,0)
+    I 'BSDXAPPTID D ERR(BSDXI,"-9~BSDX07 Error: Unable to add appointment to BSDX APPOINTMENT file.") Q
+"RTN","BSDX07",172,0)
+    I BSDXNOTE]"" D BSDXWP(BSDXAPPTID,BSDXNOTE)
+"RTN","BSDX07",173,0)
+    ;
+"RTN","BSDX07",174,0)
+    ; Then Create Subfiles in 2/44 Appointment
+"RTN","BSDX07",175,0)
+    N BSDXSCD S BSDXSCD=$P(BSDXRNOD,U,4)  ; Hosp Location IEN
+"RTN","BSDX07",176,0)
+    ; Only if we have a valid Hosp Loc can we make an appointment
+"RTN","BSDX07",177,0)
+    I +BSDXSCD,$D(^SC(BSDXSCD,0)) D  I +BSDXERR D ERR(BSDXI,"-10~BSDX07 Error: ~MAKE^BSDAPI returned error code: "_BSDXERR) Q
+"RTN","BSDX07",178,0)
+    . N BSDXC
+"RTN","BSDX07",179,0)
+    . S BSDXC("PAT")=BSDXPATID
+"RTN","BSDX07",180,0)
+    . S BSDXC("CLN")=BSDXSCD
+"RTN","BSDX07",181,0)
+    . S BSDXC("TYP")=3 ;3 for scheduled appts, 4 for walkins
+"RTN","BSDX07",182,0)
+    . S:BSDXWKIN BSDXC("TYP")=4
+"RTN","BSDX07",183,0)
+    . S BSDXC("ADT")=BSDXSTART
+"RTN","BSDX07",184,0)
+    . S BSDXC("LEN")=BSDXLEN
+"RTN","BSDX07",185,0)
+    . S BSDXC("OI")=$E($G(BSDXNOTE),1,150) ;File 44 has 150 character limit on OTHER field
+"RTN","BSDX07",186,0)
+    . S BSDXC("OI")=$TR(BSDXC("OI"),";"," ") ;No semicolons allowed by MAKE^BSDXAPI
+"RTN","BSDX07",187,0)
+    . S BSDXC("OI")=$$STRIP(BSDXC("OI")) ;Strip control characters from note
+"RTN","BSDX07",188,0)
+    . S BSDXC("USR")=DUZ
+"RTN","BSDX07",189,0)
+    . S BSDXERR=$$MAKE^BSDXAPI(.BSDXC)
+"RTN","BSDX07",190,0)
+    . Q:BSDXERR
+"RTN","BSDX07",191,0)
+    . ;Update RPMS Clinic availability
+"RTN","BSDX07",192,0)
+    . D AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN)
+"RTN","BSDX07",193,0)
+    . Q
+"RTN","BSDX07",194,0)
+    ;
+"RTN","BSDX07",195,0)
+    ;Return Recordset
+"RTN","BSDX07",196,0)
+    TCOMMIT
+"RTN","BSDX07",197,0)
+    L -^BSDXAPPT(BSDXPATID)
+"RTN","BSDX07",198,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",199,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXAPPTID_"^"_$C(30)
+"RTN","BSDX07",200,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",201,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX07",202,0)
+    Q
+"RTN","BSDX07",203,0)
+BSDXDEL(BSDXAPPTID) ;Deletes appointment BSDXAPPTID from BSDXAPPOINTMETN
+"RTN","BSDX07",204,0)
+    N DA,DIK
+"RTN","BSDX07",205,0)
+    S DIK="^BSDXAPPT(",DA=BSDXAPPTID
+"RTN","BSDX07",206,0)
+    D ^DIK
+"RTN","BSDX07",207,0)
+    Q
+"RTN","BSDX07",208,0)
+    ;
+"RTN","BSDX07",209,0)
+STRIP(BSDXZ)    ;Replace control characters with spaces
+"RTN","BSDX07",210,0)
+    N BSDXI
+"RTN","BSDX07",211,0)
+    F BSDXI=1:1:$L(BSDXZ) I (32>$A($E(BSDXZ,BSDXI))) S BSDXZ=$E(BSDXZ,1,BSDXI-1)_" "_$E(BSDXZ,BSDXI+1,999)
+"RTN","BSDX07",212,0)
+    Q BSDXZ
+"RTN","BSDX07",213,0)
+    ;
+"RTN","BSDX07",214,0)
+BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRESD,BSDXATID)  ;ADD BSDX APPOINTMENT ENTRY
+"RTN","BSDX07",215,0)
+    ;Returns ien in BSDXAPPT or 0 if failed
+"RTN","BSDX07",216,0)
+    ;Create entry in BSDX APPOINTMENT
+"RTN","BSDX07",217,0)
+    N BSDXAPPTID
+"RTN","BSDX07",218,0)
+    S BSDXFDA(9002018.4,"+1,",.01)=BSDXSTART
+"RTN","BSDX07",219,0)
+    S BSDXFDA(9002018.4,"+1,",.02)=BSDXEND
+"RTN","BSDX07",220,0)
+    S BSDXFDA(9002018.4,"+1,",.05)=BSDXPATID
+"RTN","BSDX07",221,0)
+    S BSDXFDA(9002018.4,"+1,",.07)=BSDXRESD
+"RTN","BSDX07",222,0)
+    S BSDXFDA(9002018.4,"+1,",.08)=$G(DUZ)
+"RTN","BSDX07",223,0)
+    S BSDXFDA(9002018.4,"+1,",.09)=$$NOW^XLFDT
+"RTN","BSDX07",224,0)
+    S:BSDXATID="WALKIN" BSDXFDA(9002018.4,"+1,",.13)="y"
+"RTN","BSDX07",225,0)
+    S:BSDXATID?.N BSDXFDA(9002018.4,"+1,",.06)=BSDXATID
+"RTN","BSDX07",226,0)
+    N BSDXIEN,BSDXMSG
+"RTN","BSDX07",227,0)
+    D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX07",228,0)
+    S BSDXAPPTID=+$G(BSDXIEN(1))
+"RTN","BSDX07",229,0)
+    Q BSDXAPPTID
+"RTN","BSDX07",230,0)
+    ;
+"RTN","BSDX07",231,0)
+BSDXWP(BSDXAPPTID,BSDXNOTE) ;
+"RTN","BSDX07",232,0)
+    ;Add WP field
+"RTN","BSDX07",233,0)
+    I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX07",234,0)
+    I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX07",235,0)
+    I $D(BSDXNOTE(.5)) D
+"RTN","BSDX07",236,0)
+    . D WP^DIE(9002018.4,BSDXAPPTID_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX07",237,0)
+    Q
+"RTN","BSDX07",238,0)
+    ;
+"RTN","BSDX07",239,0)
+ADDEVT(BSDXPATID,BSDXSTART,BSDXSC,BSDXSCDA) ;EP
+"RTN","BSDX07",240,0)
+    ;Called by BSDX ADD APPOINTMENT protocol
+"RTN","BSDX07",241,0)
+    ;BSDXSC=IEN of clinic in ^SC
+"RTN","BSDX07",242,0)
+    ;BSDXSCDA=IEN for ^SC(BSDXSC,"S",BSDXSTART,1,BSDXSCDA). Use to get Length & Note
+"RTN","BSDX07",243,0)
+    ;
+"RTN","BSDX07",244,0)
+    N BSDXNOD,BSDXLEN,BSDXAPPTID,BSDXNODP,BSDXWKIN,BSDXRES
+"RTN","BSDX07",245,0)
+    Q:+$G(BSDXNOEV)
+"RTN","BSDX07",246,0)
+    I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0))
+"RTN","BSDX07",247,0)
+    E  I $D(^BSDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0))
+"RTN","BSDX07",248,0)
+    Q:'+$G(BSDXRES)
+"RTN","BSDX07",249,0)
+    S BSDXNOD=$G(^SC(BSDXSC,"S",BSDXSTART,1,BSDXSCDA,0))
+"RTN","BSDX07",250,0)
+    Q:BSDXNOD=""
+"RTN","BSDX07",251,0)
+    S BSDXNODP=$G(^DPT(BSDXPATID,"S",BSDXSTART,0))
+"RTN","BSDX07",252,0)
+    S BSDXWKIN=""
+"RTN","BSDX07",253,0)
+    S:$P(BSDXNODP,U,7)=4 BSDXWKIN="WALKIN" ;Purpose of Visit field of DPT Appointment subfile
+"RTN","BSDX07",254,0)
+    S BSDXLEN=$P(BSDXNOD,U,2)
+"RTN","BSDX07",255,0)
+    Q:'+BSDXLEN
+"RTN","BSDX07",256,0)
+    S BSDXEND=$$FMADD^XLFDT(BSDXSTART,0,0,BSDXLEN,0)
+"RTN","BSDX07",257,0)
+    S BSDXAPPTID=$$BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXWKIN)
+"RTN","BSDX07",258,0)
+    Q:'+BSDXAPPTID
+"RTN","BSDX07",259,0)
+    S BSDXNOTE=$P(BSDXNOD,U,4)
+"RTN","BSDX07",260,0)
+    I BSDXNOTE]"" D BSDXWP(BSDXAPPTID,BSDXNOTE)
+"RTN","BSDX07",261,0)
+    D ADDEVT3(BSDXRES)
+"RTN","BSDX07",262,0)
+    Q
+"RTN","BSDX07",263,0)
+    ;
+"RTN","BSDX07",264,0)
+ADDEVT3(BSDXRES)    ;
+"RTN","BSDX07",265,0)
+    ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX07",266,0)
+    N BSDXRESN
+"RTN","BSDX07",267,0)
+    S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX07",268,0)
+    Q:BSDXRESN=""
+"RTN","BSDX07",269,0)
+    S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX07",270,0)
+    ;D EVENT^BSDX23("SCHEDULE-"_BSDXRESN,"","","")
+"RTN","BSDX07",271,0)
+    D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX07",272,0)
+    Q
+"RTN","BSDX07",273,0)
+    ;
+"RTN","BSDX07",274,0)
+ERR(BSDXI,BSDXERR)  ;Error processing
+"RTN","BSDX07",275,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",276,0)
+    S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX07",277,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX07",278,0)
+    S ^BSDXTMP($J,BSDXI)="0^"_BSDXERR_$C(30)
+"RTN","BSDX07",279,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",280,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX07",281,0)
+    L -^BSDXAPPT(BSDXPATID)
+"RTN","BSDX07",282,0)
+    Q
+"RTN","BSDX07",283,0)
+    ;
+"RTN","BSDX07",284,0)
+ETRAP   ;EP Error trap entry
+"RTN","BSDX07",285,0)
+    N $ET S $ET="D ^%ZTER HALT"  ; Emergency Error Trap
+"RTN","BSDX07",286,0)
+    ; Rollback, otherwise ^XTER will be empty from future rollback
+"RTN","BSDX07",287,0)
+    I $TL>0 TROLLBACK 
+"RTN","BSDX07",288,0)
+    D ^%ZTER
+"RTN","BSDX07",289,0)
+    S $EC=""  ; Clear Error
+"RTN","BSDX07",290,0)
+    ; Log error message and send to client
+"RTN","BSDX07",291,0)
+    I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX07",292,0)
+    D ERR(BSDXI,"-100~BSDX07 Error: "_$G(%ZTERZE))
+"RTN","BSDX07",293,0)
+    Q
+"RTN","BSDX07",294,0)
+    ;
+"RTN","BSDX07",295,0)
+DAY ;;^SUN^MON^TUES^WEDNES^THURS^FRI^SATUR
+"RTN","BSDX07",296,0)
+    ;
+"RTN","BSDX07",297,0)
+DOW S %=$E(X,1,3),Y=$E(X,4,5),Y=Y>2&'(%#4)+$E("144025036146",Y)
+"RTN","BSDX07",298,0)
+    F %=%:-1:281 S Y=%#4=1+1+Y
+"RTN","BSDX07",299,0)
+    S Y=$E(X,6,7)+Y#7
+"RTN","BSDX07",300,0)
+    Q
+"RTN","BSDX07",301,0)
+    ;
+"RTN","BSDX07",302,0)
+AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN)   ;Update RPMS Clinic availability
+"RTN","BSDX07",303,0)
+    ;SEE SDM1
+"RTN","BSDX07",304,0)
+    N Y,DFN
+"RTN","BSDX07",305,0)
+    N SL,STARTDAY,X,SC,SB,HSI,SI,STR,SDDIF,SDMAX,SDDATE,SDDMAX,SDSDATE,CCXN,MXOK,COV,SDPROG
+"RTN","BSDX07",306,0)
+    N X1,SDEDT,X2,SD,SM,SS,S,SDLOCK,ST,I
+"RTN","BSDX07",307,0)
+    S Y=BSDXSCD,DFN=BSDXPATID
+"RTN","BSDX07",308,0)
+    S SL=$G(^SC(+Y,"SL")),X=$P(SL,U,3),STARTDAY=$S($L(X):X,1:8),SC=Y,SB=STARTDAY-1/100,X=$P(SL,U,6),HSI=$S(X=1:X,X:X,1:4),SI=$S(X="":4,X<3:4,X:X,1:4),STR="#@!$* XXWVUTSRQPONMLKJIHGFEDCBA0123456789jklmnopqrstuvwxyz",SDDIF=$S(HSI<3:8/HSI,1:2) K Y
+"RTN","BSDX07",309,0)
+    ;Determine maximum days for scheduling
+"RTN","BSDX07",310,0)
+    S SDMAX(1)=$P($G(^SC(+SC,"SDP")),U,2) S:'SDMAX(1) SDMAX(1)=365
+"RTN","BSDX07",311,0)
+    S (SDMAX,SDDMAX)=$$FMADD^XLFDT(DT,SDMAX(1))
+"RTN","BSDX07",312,0)
+    S SDDATE=BSDXSTART
+"RTN","BSDX07",313,0)
+    S SDSDATE=SDDATE,SDDATE=SDDATE\1
+"RTN","BSDX07",314,0)
+1   ;L  Q:$D(SDXXX)  S CCXN=0 K MXOK,COV,SDPROT Q:DFN<0  S SC=+SC
+"RTN","BSDX07",315,0)
+    Q:$D(SDXXX)  S CCXN=0 K MXOK,COV,SDPROT Q:DFN<0  S SC=+SC
+"RTN","BSDX07",316,0)
+    S X1=DT,SDEDT=365 S:$D(^SC(SC,"SDP")) SDEDT=$P(^SC(SC,"SDP"),"^",2)
+"RTN","BSDX07",317,0)
+    S X2=SDEDT D C^%DTC S SDEDT=X
+"RTN","BSDX07",318,0)
+    S Y=BSDXSTART
+"RTN","BSDX07",319,0)
+EN1 S (X,SD)=Y,SM=0 D DOW
+"RTN","BSDX07",320,0)
+S   I '$D(^SC(SC,"ST",$P(SD,"."),1)) S SS=+$O(^SC(+SC,"T"_Y,SD)) Q:SS'>0  Q:^(SS,1)=""  S ^SC(+SC,"ST",$P(SD,"."),1)=$E($P($T(DAY),U,Y+2),1,2)_" "_$E(SD,6,7)_$J("",SI+SI-6)_^(1),^(0)=$P(SD,".")
+"RTN","BSDX07",321,0)
+    S S=BSDXLEN
+"RTN","BSDX07",322,0)
+    ;Check if BSDXLEN evenly divisible by appointment length
+"RTN","BSDX07",323,0)
+    S RPMSL=$P(SL,U)
+"RTN","BSDX07",324,0)
+    I BSDXLEN<RPMSL S BSDXLEN=RPMSL
+"RTN","BSDX07",325,0)
+    I BSDXLEN#RPMSL'=0 D
+"RTN","BSDX07",326,0)
+    . S BSDXINC=BSDXLEN\RPMSL
+"RTN","BSDX07",327,0)
+    . S BSDXINC=BSDXINC+1
+"RTN","BSDX07",328,0)
+    . S BSDXLEN=RPMSL*BSDXINC
+"RTN","BSDX07",329,0)
+    S SL=S_U_$P(SL,U,2,99)
+"RTN","BSDX07",330,0)
+SC  S SDLOCK=$S('$D(SDLOCK):1,1:SDLOCK+1) Q:SDLOCK>9
+"RTN","BSDX07",331,0)
+    L +^SC(SC,"ST",$P(SD,"."),1):5 G:'$T SC
+"RTN","BSDX07",332,0)
+    S SDLOCK=0,S=^SC(SC,"ST",$P(SD,"."),1)
+"RTN","BSDX07",333,0)
+    S I=SD#1-SB*100,ST=I#1*SI\.6+($P(I,".")*SI),SS=SL*HSI/60*SDDIF+ST+ST
+"RTN","BSDX07",334,0)
+    I (I<1!'$F(S,"["))&(S'["CAN") L -^SC(SC,"ST",$P(SD,"."),1) Q
+"RTN","BSDX07",335,0)
+    I SM<7 S %=$F(S,"[",SS-1) S:'%!($P(SL,"^",6)<3) %=999 I $F(S,"]",SS)'<%!(SDDIF=2&$E(S,ST+ST+1,SS-1)["[") S SM=7
+"RTN","BSDX07",336,0)
+    ;
+"RTN","BSDX07",337,0)
+SP  I ST+ST>$L(S),$L(S)<80 S S=S_" " G SP
+"RTN","BSDX07",338,0)
+    S SDNOT=1
+"RTN","BSDX07",339,0)
+    S ABORT=0
+"RTN","BSDX07",340,0)
+    F I=ST+ST:SDDIF:SS-SDDIF D  Q:ABORT
+"RTN","BSDX07",341,0)
+    . S ST=$E(S,I+1) S:ST="" ST=" "
+"RTN","BSDX07",342,0)
+    . S Y=$E(STR,$F(STR,ST)-2)
+"RTN","BSDX07",343,0)
+    . I S["CAN"!(ST="X"&($D(^SC(+SC,"ST",$P(SD,"."),"CAN")))) S ABORT=1 Q
+"RTN","BSDX07",344,0)
+    . I Y="" S ABORT=1 Q
+"RTN","BSDX07",345,0)
+    . S:Y'?1NL&(SM<6) SM=6 S ST=$E(S,I+2,999) S:ST="" ST=" " S S=$E(S,1,I)_Y_ST
+"RTN","BSDX07",346,0)
+    . Q
+"RTN","BSDX07",347,0)
+    S ^SC(SC,"ST",$P(SD,"."),1)=S
+"RTN","BSDX07",348,0)
+    L -^SC(SC,"ST",$P(SD,"."),1)
+"RTN","BSDX07",349,0)
+    Q
+"RTN","BSDX08")
+0^8^B140041473
+"RTN","BSDX08",1,0)
+BSDX08 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:35pm
+"RTN","BSDX08",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX08",3,0)
+    ; 
+"RTN","BSDX08",4,0)
+    ; Original by HMW. New Written by Sam Habiel. Licensed under LGPL.
+"RTN","BSDX08",5,0)
+    ; 
+"RTN","BSDX08",6,0)
+    ; Change History
+"RTN","BSDX08",7,0)
+    ; 3101022 UJO/SMH v1.42
+"RTN","BSDX08",8,0)
+    ;  - Transaction now restartable. Thanks to 
+"RTN","BSDX08",9,0)
+    ;   --> Zach Gonzalez and Rick Marshall for fix.
+"RTN","BSDX08",10,0)
+    ;  - Extra TROLLBACK in Lock Statement when lock fails.
+"RTN","BSDX08",11,0)
+    ;   --> Removed--Rollback is already in ERR tag.
+"RTN","BSDX08",12,0)
+    ;  - Added new statements to old SD code in AVUPDT to obviate
+"RTN","BSDX08",13,0)
+    ;   --> need to restore variables in transaction
+"RTN","BSDX08",14,0)
+    ;  - Refactored this chunk of code. Don't really know whether it 
+"RTN","BSDX08",15,0)
+    ;   --> worked in the first place. Waiting for bug report to know.
+"RTN","BSDX08",16,0)
+    ;  - Refactored all of APPDEL.
+"RTN","BSDX08",17,0)
+    ; 
+"RTN","BSDX08",18,0)
+    ; Error Reference:
+"RTN","BSDX08",19,0)
+    ;  -1~BSDX08: Appt record is locked. Please contact technical support.
+"RTN","BSDX08",20,0)
+    ;  -2~BSDX08: Invalid Appointment ID
+"RTN","BSDX08",21,0)
+ ;  -3~BSDX08: Invalid Appointment ID
+"RTN","BSDX08",22,0)
+    ;  -4~BSDX08: Cancelled appointment does not have a Resouce ID  
+"RTN","BSDX08",23,0)
+    ;  -5~BSDX08: Resouce ID does not exist in BSDX RESOURCE
+"RTN","BSDX08",24,0)
+    ;  -6~BSDX08: Invalid Hosp Location stored in Database
+"RTN","BSDX08",25,0)
+    ;  -7~BSDX08: Patient does not have an appointment in PIMS Clinic
+"RTN","BSDX08",26,0)
+    ;  -8^BSDX08: Unable to find associated PIMS appointment for this patient
+"RTN","BSDX08",27,0)
+    ;  -9^BSDX08: BSDXAPI returned an error: (error)
+"RTN","BSDX08",28,0)
+    ;  -100~BSDX08 Error: (Mumps Error)
+"RTN","BSDX08",29,0)
+ ;
+"RTN","BSDX08",30,0)
+APPDELD(BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT) ;EP
+"RTN","BSDX08",31,0)
+ ;Entry point for debugging
+"RTN","BSDX08",32,0)
+ D DEBUG^%Serenji("APPDEL^BSDX08(.BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT)")
+"RTN","BSDX08",33,0)
+ Q
+"RTN","BSDX08",34,0)
+ ;
+"RTN","BSDX08",35,0)
+UT ; Unit Tests
+"RTN","BSDX08",36,0)
+    ; Test 1: Make normal appointment and cancel it. See if every thing works
+"RTN","BSDX08",37,0)
+    N ZZZ
+"RTN","BSDX08",38,0)
+    D APPADD^BSDX07(.ZZZ,3110123.2,3110123.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",39,0)
+    S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",40,0)
+    D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Sam's Cancel Note")
+"RTN","BSDX08",41,0)
+    I $P(^BSDXAPPT(APPID,0),U,12)'>0 W "Error in Cancellation-1"
+"RTN","BSDX08",42,0)
+    I $O(^SC(2,"S",3110123.2,1,0))]"" W "Error in Cancellation-2"
+"RTN","BSDX08",43,0)
+    I $P(^DPT(4,"S",3110123.2,0),U,2)'="PC" W "Error in Cancellation-3"
+"RTN","BSDX08",44,0)
+    I ^DPT(4,"S",3110123.2,"R")'="Sam's Cancel Note" W "Error in Cancellation-4"
+"RTN","BSDX08",45,0)
+    ;
+"RTN","BSDX08",46,0)
+    ; Test 2: Check for -1
+"RTN","BSDX08",47,0)
+    ; Make appt
+"RTN","BSDX08",48,0)
+    D APPADD^BSDX07(.ZZZ,3110125.2,3110125.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",49,0)
+    ; Lock the node in another job
+"RTN","BSDX08",50,0)
+    S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",51,0)
+    ; W "Lock ^BSDXAPPT("_APPID_") in another session. You have 10 seconds." H 10
+"RTN","BSDX08",52,0)
+    D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Sam's Cancel Note")
+"RTN","BSDX08",53,0)
+    ;
+"RTN","BSDX08",54,0)
+    ; Test 3: Check for -100
+"RTN","BSDX08",55,0)
+    S bsdxdie=1
+"RTN","BSDX08",56,0)
+    D APPADD^BSDX07(.ZZZ,3110126.2,3110126.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",57,0)
+    S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",58,0)
+    D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Reasons")
+"RTN","BSDX08",59,0)
+    I $P(^BSDXTMP($J,1),"~")'=-100 W "Error in -100",!
+"RTN","BSDX08",60,0)
+    K bsdxdie
+"RTN","BSDX08",61,0)
+    ;
+"RTN","BSDX08",62,0)
+    ; Test 4: Restartable transaction
+"RTN","BSDX08",63,0)
+    S bsdxrestart=1
+"RTN","BSDX08",64,0)
+    D APPADD^BSDX07(.ZZZ,3110128.2,3110128.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",65,0)
+    S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",66,0)
+    D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Reasons")
+"RTN","BSDX08",67,0)
+    I $P(^DPT(4,"S",3110128.2,0),U,2)'="PC" W "Error in Restartable Transaction",!
+"RTN","BSDX08",68,0)
+    ;
+"RTN","BSDX08",69,0)
+    ; Test 5: for invalid Appointment ID (-2 and -3)
+"RTN","BSDX08",70,0)
+    D APPDEL^BSDX08(.ZZZ,0,"PC",1,"Reasons")
+"RTN","BSDX08",71,0)
+    I $P(^BSDXTMP($J,1),"~")'=-2 W "Error in -2",!
+"RTN","BSDX08",72,0)
+    D APPDEL^BSDX08(.ZZZ,999999,"PC",1,"Reasons")
+"RTN","BSDX08",73,0)
+    I $P(^BSDXTMP($J,1),"~")'=-3 W "Error in -3",!
+"RTN","BSDX08",74,0)
+    QUIT
+"RTN","BSDX08",75,0)
+    ; Lock the node in another job for testing.
+"RTN","BSDX08",76,0)
+UTL(APPID) L +^BSDXAPPT(APPID) HANG 10 QUIT
+"RTN","BSDX08",77,0)
+    ;
+"RTN","BSDX08",78,0)
+APPDEL(BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT)        ;EP
+"RTN","BSDX08",79,0)
+ ;Called by RPC: BSDX CANCEL APPOINTMENT
+"RTN","BSDX08",80,0)
+ ;Cancels existing appointment in BSDX APPOINTMENT and 44/2 subfiles
+"RTN","BSDX08",81,0)
+    ;Input Parameters:
+"RTN","BSDX08",82,0)
+ ; - BSDXAPTID is entry number in BSDX APPOINTMENT file
+"RTN","BSDX08",83,0)
+ ; - BSDXTYP is C for clinic-cancelled and PC for patient cancelled
+"RTN","BSDX08",84,0)
+ ; - BSDXCR is pointer to CANCELLATION REASON File (409.2)
+"RTN","BSDX08",85,0)
+ ; - BSDXNOT is user note
+"RTN","BSDX08",86,0)
+ ;
+"RTN","BSDX08",87,0)
+    ; Returns error code in recordset field ERRORID. Zero is success.
+"RTN","BSDX08",88,0)
+    ; Returns Global Array. Must use this type in RPC.
+"RTN","BSDX08",89,0)
+ ;
+"RTN","BSDX08",90,0)
+    ; Return Array: set Return and clear array
+"RTN","BSDX08",91,0)
+ S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX08",92,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX08",93,0)
+ ;
+"RTN","BSDX08",94,0)
+    ; Set min DUZ vars if they don't exist
+"RTN","BSDX08",95,0)
+    D ^XBKVAR
+"RTN","BSDX08",96,0)
+    ;
+"RTN","BSDX08",97,0)
+    ; $ET
+"RTN","BSDX08",98,0)
+    N $ET S $ET="G ETRAP^BSDX08"
+"RTN","BSDX08",99,0)
+ ;
+"RTN","BSDX08",100,0)
+    ; Counter
+"RTN","BSDX08",101,0)
+ N BSDXI S BSDXI=0
+"RTN","BSDX08",102,0)
+    ; Header Node
+"RTN","BSDX08",103,0)
+ S ^BSDXTMP($J,BSDXI)="T00100ERRORID"_$C(30)
+"RTN","BSDX08",104,0)
+ ;
+"RTN","BSDX08",105,0)
+    ; Lock BSDX node, only to synchronize access to the globals.
+"RTN","BSDX08",106,0)
+    ; It's not expected that the error will ever happen as no filing
+"RTN","BSDX08",107,0)
+    ; is supposed to take 5 seconds.
+"RTN","BSDX08",108,0)
+    L +^BSDXAPPT(BSDXAPTID):5 I '$T D ERR(BSDXI,"-1~BSDX08: Appt record is locked. Please contact technical support.") Q
+"RTN","BSDX08",109,0)
+ ;
+"RTN","BSDX08",110,0)
+    ;Restartable Transaction; restore paramters when starting.
+"RTN","BSDX08",111,0)
+    ; (Params restored are what's passed here + BSDXI)
+"RTN","BSDX08",112,0)
+    TSTART (BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT,BSDXI):T="BSDX CANCEL APPOINTEMENT^BSDX08"
+"RTN","BSDX08",113,0)
+ ;
+"RTN","BSDX08",114,0)
+    ; Turn off SDAM APPT PROTOCOL BSDX Entries
+"RTN","BSDX08",115,0)
+ N BSDXNOEV
+"RTN","BSDX08",116,0)
+ S BSDXNOEV=1 ;Don't execute BSDX CANCEL APPOINTMENT protocol
+"RTN","BSDX08",117,0)
+ ;
+"RTN","BSDX08",118,0)
+    ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX08",119,0)
+    I $G(bsdxdie) S X=1/0
+"RTN","BSDX08",120,0)
+    ;;;test
+"RTN","BSDX08",121,0)
+    ;;;test for TRESTART
+"RTN","BSDX08",122,0)
+    I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX08",123,0)
+    ;;;test
+"RTN","BSDX08",124,0)
+    ;
+"RTN","BSDX08",125,0)
+    ; Check appointment ID and whether it exists
+"RTN","BSDX08",126,0)
+    I '+BSDXAPTID D ERR(BSDXI,"-2~BSDX08: Invalid Appointment ID") Q
+"RTN","BSDX08",127,0)
+ I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(BSDXI,"-3~BSDX08: Invalid Appointment ID") Q
+"RTN","BSDX08",128,0)
+ ;
+"RTN","BSDX08",129,0)
+ ; Start Processing:
+"RTN","BSDX08",130,0)
+    ; First, add cancellation date to appt entry in BSDX APPOINTMENT
+"RTN","BSDX08",131,0)
+ N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPTID,0) ; BSDX Appt Node
+"RTN","BSDX08",132,0)
+ N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) ; Patient ID
+"RTN","BSDX08",133,0)
+ N BSDXSTART S BSDXSTART=$P(BSDXNOD,U) ; Start Time
+"RTN","BSDX08",134,0)
+ D BSDXCAN(BSDXAPTID)  ; Add a cancellation date in BSDX APPOINTMENT
+"RTN","BSDX08",135,0)
+ ;
+"RTN","BSDX08",136,0)
+    ; Second, cancel appt in "S" nodes in file 2 and 44, then update Legacy PIMS Availability
+"RTN","BSDX08",137,0)
+ N BSDXSC1 S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID
+"RTN","BSDX08",138,0)
+    ; If the resouce id doesn't exist...
+"RTN","BSDX08",139,0)
+ I BSDXSC1="" D ERR(BSDXI,"-4~BSDX08: Cancelled appointment does not have a Resouce ID") QUIT
+"RTN","BSDX08",140,0)
+    I '$D(^BSDXRES(BSDXSC1,0)) D ERR(BSDXI,"-5~BSDX08: Resouce ID does not exist in BSDX RESOURCE") QUIT
+"RTN","BSDX08",141,0)
+ ; Get zero node of resouce
+"RTN","BSDX08",142,0)
+    S BSDXNOD=^BSDXRES(BSDXSC1,0)
+"RTN","BSDX08",143,0)
+    ; Get Hosp location
+"RTN","BSDX08",144,0)
+ N BSDXLOC S BSDXLOC=$P(BSDXNOD,U,4)
+"RTN","BSDX08",145,0)
+    ; Error indicator for Hosp Location filing for getting out of routine
+"RTN","BSDX08",146,0)
+    N BSDXERR S BSDXERR=0
+"RTN","BSDX08",147,0)
+    ; Only file in 2/44 if there is an associated hospital location
+"RTN","BSDX08",148,0)
+    I BSDXLOC D  QUIT:BSDXERR  
+"RTN","BSDX08",149,0)
+ . I '$D(^SC(BSDXLOC,0)) S BSDXERR=1 D ERR(BSDXI,"-6~BSDX08: Invalid Hosp Location stored in Database") QUIT
+"RTN","BSDX08",150,0)
+    . ; Get the IEN of the appointment in the "S" node of ^SC
+"RTN","BSDX08",151,0)
+    . N BSDXSCIEN
+"RTN","BSDX08",152,0)
+ . S BSDXSCIEN=$$SCIEN^BSDXAPI(BSDXPATID,BSDXLOC,BSDXSTART)
+"RTN","BSDX08",153,0)
+    . I BSDXSCIEN="" S BSDXERR=1 D ERR(BSDXI,"-7~BSDX08: Patient does not have an appointment in PIMS Clinic") QUIT
+"RTN","BSDX08",154,0)
+ . ; Get the appointment node
+"RTN","BSDX08",155,0)
+    . S BSDXNOD=$G(^SC(BSDXLOC,"S",BSDXSTART,1,BSDXSCIEN,0))
+"RTN","BSDX08",156,0)
+ . I BSDXNOD="" S BSDXERR=1 D ERR(BSDXI,"-8^BSDX08: Unable to find associated PIMS appointment for this patient") QUIT
+"RTN","BSDX08",157,0)
+ . N BSDXLEN S BSDXLEN=$P(BSDXNOD,U,2)
+"RTN","BSDX08",158,0)
+ . ; Cancel through BSDXAPI
+"RTN","BSDX08",159,0)
+    . N BSDXZ
+"RTN","BSDX08",160,0)
+    . D APCAN(.BSDXZ,BSDXLOC,BSDXPATID,BSDXSTART)
+"RTN","BSDX08",161,0)
+    . I +BSDXZ>0 S BSDXERR=1 D ERR(BSDXI,"-9^BSDX08: BSDXAPI returned an error: "_$P(BSDXZ,U,2)) QUIT
+"RTN","BSDX08",162,0)
+ . ; Update Legacy PIMS clinic Availability
+"RTN","BSDX08",163,0)
+ . D AVUPDT(BSDXLOC,BSDXSTART,BSDXLEN)
+"RTN","BSDX08",164,0)
+ ;
+"RTN","BSDX08",165,0)
+ TCOMMIT
+"RTN","BSDX08",166,0)
+ L -^BSDXAPPT(BSDXAPTID)
+"RTN","BSDX08",167,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",168,0)
+ S ^BSDXTMP($J,BSDXI)=""_$C(30)
+"RTN","BSDX08",169,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",170,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX08",171,0)
+ Q
+"RTN","BSDX08",172,0)
+ ;
+"RTN","BSDX08",173,0)
+AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN) ;Update Legacy PIMS Clinic availability
+"RTN","BSDX08",174,0)
+ ;See SDCNP0
+"RTN","BSDX08",175,0)
+ N SD,S  ; Start Date
+"RTN","BSDX08",176,0)
+    S (SD,S)=BSDXSTART 
+"RTN","BSDX08",177,0)
+    N I ; Clinic IEN in 44
+"RTN","BSDX08",178,0)
+ S I=BSDXSCD
+"RTN","BSDX08",179,0)
+    ; if day has no schedule in legacy PIMS, forget about this update.
+"RTN","BSDX08",180,0)
+ Q:'$D(^SC(I,"ST",SD\1,1))
+"RTN","BSDX08",181,0)
+    N SL ; Clinic characteristics node (length of appt, when appts start etc)
+"RTN","BSDX08",182,0)
+ S SL=^SC(I,"SL")
+"RTN","BSDX08",183,0)
+    N X ; Hour Clinic Display Begins
+"RTN","BSDX08",184,0)
+    S X=$P(SL,U,3)
+"RTN","BSDX08",185,0)
+    N STARTDAY ; When does the day start?
+"RTN","BSDX08",186,0)
+    S STARTDAY=$S($L(X):X,1:8) ; If defined, use it; otherwise, 8am
+"RTN","BSDX08",187,0)
+    N SB ; ?? Who knows? Day Start - 1 divided by 100.
+"RTN","BSDX08",188,0)
+    S SB=STARTDAY-1/100
+"RTN","BSDX08",189,0)
+    S X=$P(SL,U,6) ; Now X is Display increments per hour
+"RTN","BSDX08",190,0)
+    N HSI ; Slots per hour, try 1
+"RTN","BSDX08",191,0)
+    S HSI=$S(X:X,1:4) ; if defined, use it; otherwise, 4
+"RTN","BSDX08",192,0)
+    N SI ; Slots per hour, try 2
+"RTN","BSDX08",193,0)
+    S SI=$S(X="":4,X<3:4,X:X,1:4) ; If slots "", or less than 3, then 4
+"RTN","BSDX08",194,0)
+    N STR ; ??
+"RTN","BSDX08",195,0)
+    S STR="#@!$* XXWVUTSRQPONMLKJIHGFEDCBA0123456789jklmnopqrstuvwxyz"
+"RTN","BSDX08",196,0)
+    N SDDIF ; Slots per hour diff??
+"RTN","BSDX08",197,0)
+    S SDDIF=$S(HSI<3:8/HSI,1:2)
+"RTN","BSDX08",198,0)
+ S SL=BSDXLEN ; Dammit, reusing variable; SL now Appt Length from GUI
+"RTN","BSDX08",199,0)
+ S S=^SC(I,"ST",SD\1,1) ; reusing var again; S now Day Pattern from PIMS
+"RTN","BSDX08",200,0)
+    N Y ; Hours since start of Date
+"RTN","BSDX08",201,0)
+    S Y=SD#1-SB*100 ;SD#1=FM Time portion; -SB minus start of day; conv to hrs
+"RTN","BSDX08",202,0)
+    N ST  ; ??
+"RTN","BSDX08",203,0)
+    ; Y#1 -> Minutes; *SI -> * Slots per hour; \.6 trunc min to hour
+"RTN","BSDX08",204,0)
+    ; Y\1 -> Hours since start of day; * SI: * slots
+"RTN","BSDX08",205,0)
+    S ST=Y#1*SI\.6+(Y\1*SI) 
+"RTN","BSDX08",206,0)
+    N SS ; how many slots are supposed to be taken by appointment
+"RTN","BSDX08",207,0)
+    S SS=SL*HSI/60 ; (nb: try SL: 30 min; HSI: 4 slots)
+"RTN","BSDX08",208,0)
+ N I
+"RTN","BSDX08",209,0)
+    I Y'<1 D  ; If Hours since start of Date is greater than 1
+"RTN","BSDX08",210,0)
+    . ; loop through pattern. Tired of documenting.
+"RTN","BSDX08",211,0)
+    . F I=ST+ST:SDDIF D  Q:Y=""  Q:SS'>0
+"RTN","BSDX08",212,0)
+    . . S Y=$E(STR,$F(STR,$E(S,I+1))) Q:Y=""  
+"RTN","BSDX08",213,0)
+    . . S S=$E(S,1,I)_Y_$E(S,I+2,999)
+"RTN","BSDX08",214,0)
+    . . S SS=SS-1 
+"RTN","BSDX08",215,0)
+    . . Q:SS'>0
+"RTN","BSDX08",216,0)
+ S ^SC(BSDXSCD,"ST",SD\1,1)=S  ; new pattern; global set
+"RTN","BSDX08",217,0)
+ Q
+"RTN","BSDX08",218,0)
+ ;
+"RTN","BSDX08",219,0)
+APCAN(BSDXZ,BSDXLOC,BSDXDFN,BSDXSD)         ;
+"RTN","BSDX08",220,0)
+ ;Cancel appointment for patient BSDXDFN in clinic BSDXSC1
+"RTN","BSDX08",221,0)
+ ;at time BSDXSD
+"RTN","BSDX08",222,0)
+ N BSDXC,%H
+"RTN","BSDX08",223,0)
+ S BSDXC("PAT")=BSDXPATID
+"RTN","BSDX08",224,0)
+ S BSDXC("CLN")=BSDXLOC
+"RTN","BSDX08",225,0)
+ S BSDXC("TYP")=BSDXTYP
+"RTN","BSDX08",226,0)
+ S BSDXC("ADT")=BSDXSD
+"RTN","BSDX08",227,0)
+ S %H=$H D YMD^%DTC
+"RTN","BSDX08",228,0)
+ S BSDXC("CDT")=X+%
+"RTN","BSDX08",229,0)
+ S BSDXC("NOT")=BSDXNOT
+"RTN","BSDX08",230,0)
+ S:'+$G(BSDXCR) BSDXCR=11 ;Other
+"RTN","BSDX08",231,0)
+ S BSDXC("CR")=BSDXCR
+"RTN","BSDX08",232,0)
+ S BSDXC("USR")=DUZ
+"RTN","BSDX08",233,0)
+ ;
+"RTN","BSDX08",234,0)
+ S BSDXZ=$$CANCEL^BSDXAPI(.BSDXC)
+"RTN","BSDX08",235,0)
+ Q
+"RTN","BSDX08",236,0)
+ ;
+"RTN","BSDX08",237,0)
+BSDXCAN(BSDXAPTID) ;
+"RTN","BSDX08",238,0)
+ ;Cancel BSDX APPOINTMENT entry
+"RTN","BSDX08",239,0)
+ N %DT,X,BSDXDATE,Y,BSDXIENS,BSDXFDA,BSDXMSG
+"RTN","BSDX08",240,0)
+ S %DT="XT",X="NOW" D ^%DT ; X ^DD("DD")
+"RTN","BSDX08",241,0)
+ S BSDXDATE=Y
+"RTN","BSDX08",242,0)
+ S BSDXIENS=BSDXAPTID_","
+"RTN","BSDX08",243,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.12)=BSDXDATE
+"RTN","BSDX08",244,0)
+ K BSDXMSG
+"RTN","BSDX08",245,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX08",246,0)
+ Q
+"RTN","BSDX08",247,0)
+ ;
+"RTN","BSDX08",248,0)
+CANEVT(BSDXPAT,BSDXSTART,BSDXSC) ;EP Called by BSDX CANCEL APPOINTMENT event
+"RTN","BSDX08",249,0)
+ ;when appointments cancelled via PIMS interface.
+"RTN","BSDX08",250,0)
+ ;Propagates cancellation to BSDXAPPT and raises refresh event to running GUI clients
+"RTN","BSDX08",251,0)
+ N BSDXFOUND,BSDXRES
+"RTN","BSDX08",252,0)
+ Q:+$G(BSDXNOEV)
+"RTN","BSDX08",253,0)
+ Q:'+$G(BSDXSC)
+"RTN","BSDX08",254,0)
+ S BSDXFOUND=0
+"RTN","BSDX08",255,0)
+ I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$CANEVT1(BSDXRES,BSDXSTART,BSDXPAT)
+"RTN","BSDX08",256,0)
+ I BSDXFOUND D CANEVT3(BSDXRES) Q
+"RTN","BSDX08",257,0)
+ I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$CANEVT1(BSDXRES,BSDXSTART,BSDXPAT)
+"RTN","BSDX08",258,0)
+ I BSDXFOUND D CANEVT3(BSDXRES)
+"RTN","BSDX08",259,0)
+ Q
+"RTN","BSDX08",260,0)
+ ;
+"RTN","BSDX08",261,0)
+CANEVT1(BSDXRES,BSDXSTART,BSDXPAT) ;
+"RTN","BSDX08",262,0)
+ ;Get appointment id in BSDXAPT
+"RTN","BSDX08",263,0)
+ ;If found, call BSDXCAN(BSDXAPPT) and return 1
+"RTN","BSDX08",264,0)
+ ;else return 0
+"RTN","BSDX08",265,0)
+ N BSDXFOUND,BSDXAPPT
+"RTN","BSDX08",266,0)
+ S BSDXFOUND=0
+"RTN","BSDX08",267,0)
+ Q:'+BSDXRES BSDXFOUND
+"RTN","BSDX08",268,0)
+ Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND
+"RTN","BSDX08",269,0)
+ S BSDXAPPT=0 F  S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT  D  Q:BSDXFOUND
+"RTN","BSDX08",270,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""
+"RTN","BSDX08",271,0)
+ . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q
+"RTN","BSDX08",272,0)
+ I BSDXFOUND,+$G(BSDXAPPT) D BSDXCAN(BSDXAPPT)
+"RTN","BSDX08",273,0)
+ Q BSDXFOUND
+"RTN","BSDX08",274,0)
+ ;
+"RTN","BSDX08",275,0)
+CANEVT3(BSDXRES) ;
+"RTN","BSDX08",276,0)
+ ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX08",277,0)
+ ;
+"RTN","BSDX08",278,0)
+ N BSDXRESN
+"RTN","BSDX08",279,0)
+ S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX08",280,0)
+ Q:BSDXRESN=""
+"RTN","BSDX08",281,0)
+ S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX08",282,0)
+ ;D EVENT^BSDX23("SCHEDULE-"_BSDXRESN,"","","")
+"RTN","BSDX08",283,0)
+ D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX08",284,0)
+ Q
+"RTN","BSDX08",285,0)
+ ;
+"RTN","BSDX08",286,0)
+ERR(BSDXI,BSDXERR) ;Error processing
+"RTN","BSDX08",287,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",288,0)
+ S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX08",289,0)
+ I $TL>0 TROLLBACK
+"RTN","BSDX08",290,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX08",291,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",292,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX08",293,0)
+ L -^BSDXAPPT(BSDXAPTID)
+"RTN","BSDX08",294,0)
+ QUIT
+"RTN","BSDX08",295,0)
+ ;
+"RTN","BSDX08",296,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX08",297,0)
+ N $ET S $ET="D ^%ZTER HALT"  ; Emergency Error Trap
+"RTN","BSDX08",298,0)
+    ; Rollback, otherwise ^XTER will be empty from future rollback
+"RTN","BSDX08",299,0)
+    I $TL>0 TROLLBACK 
+"RTN","BSDX08",300,0)
+    D ^%ZTER
+"RTN","BSDX08",301,0)
+    S $EC=""  ; Clear Error
+"RTN","BSDX08",302,0)
+ ; Log error message and send to client
+"RTN","BSDX08",303,0)
+    I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX08",304,0)
+ D ERR(BSDXI,"-100~BSDX08 Error: "_$G(%ZTERZE))
+"RTN","BSDX08",305,0)
+ QUIT
+"RTN","BSDX08",306,0)
+    ;
+"RTN","BSDX08",307,0)
+    ;;;NB: This is code that is unused in both original and port.
+"RTN","BSDX08",308,0)
+    ; ; If not appt in the "S" node is found in ^SC then check associated RPMS Clinic Multiple
+"RTN","BSDX08",309,0)
+    ; I BSDXSCIEN="" D  I 'BSDXZ Q  ;Q:BSDXZ
+"RTN","BSDX08",310,0)
+ ; . S BSDXERR="BSDX08: Unable to find associated RPMS appointment for this patient. "
+"RTN","BSDX08",311,0)
+ ; . S BSDXZ=1
+"RTN","BSDX08",312,0)
+    ; . ; Check if there are associated RPMS clinics. (not currently used) Does the multiple exist? No, then quit
+"RTN","BSDX08",313,0)
+ ; . I '$D(^BSDXRES(BSDXSC1,20)) S BSDXZ=0 QUIT
+"RTN","BSDX08",314,0)
+    ; . ; Loop through the multiple. Get Location and then the ^SC "S" node IEN.
+"RTN","BSDX08",315,0)
+ ; . N BSDX1 S BSDX1=0
+"RTN","BSDX08",316,0)
+ ; . F  S BSDX1=$O(^BSDXRES(BSDXSC1,20,BSDX1)) Q:'+BSDX1  Q:BSDXZ=0  D
+"RTN","BSDX08",317,0)
+ ; . . Q:'$D(^BSDXRES(BSDXSC1,20,BSDX1,0))
+"RTN","BSDX08",318,0)
+ ; . . S BSDXLOC=$P(^BSDXRES(BSDXSC1,20,BSDX1,0),U)
+"RTN","BSDX08",319,0)
+ . ; . . S BSDXSCIEN=$$SCIEN^BSDXAPI(BSDXPATID,BSDXLOC,BSDXSTART) I +BSDXSCIEN S BSDXZ=0 Q
+"RTN","BSDX09")
+0^9^B35707298
+"RTN","BSDX09",1,0)
+BSDX09 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;  ; 10/20/10 4:16pm
+"RTN","BSDX09",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX09",3,0)
+ ;
+"RTN","BSDX09",4,0)
+ ; Change Log:
+"RTN","BSDX09",5,0)
+ ; UJO/TH - v 1.3 on 3100714 - Extra Demographics:
+"RTN","BSDX09",6,0)
+ ; - Email
+"RTN","BSDX09",7,0)
+ ; - Cell Phone
+"RTN","BSDX09",8,0)
+ ; - Country
+"RTN","BSDX09",9,0)
+ ; - + refactoring of routine
+"RTN","BSDX09",10,0)
+ ; 
+"RTN","BSDX09",11,0)
+ ; UJO/TH - v 1.3 on 3100715 - Change SSN to PID and get PID field instead
+"RTN","BSDX09",12,0)
+ ;
+"RTN","BSDX09",13,0)
+    ; UJO/TH - v 1.42 on 3101020 - Add Sex field.
+"RTN","BSDX09",14,0)
+    ;
+"RTN","BSDX09",15,0)
+GETREGA(BSDXRET,BSDXPAT)        ;EP
+"RTN","BSDX09",16,0)
+ ;
+"RTN","BSDX09",17,0)
+    ; See below for the returned fields
+"RTN","BSDX09",18,0)
+ ;
+"RTN","BSDX09",19,0)
+ ;For patient with ien BSDXPAT
+"RTN","BSDX09",20,0)
+ ;K ^BSDXTMP($J)
+"RTN","BSDX09",21,0)
+ S BSDXERR=""
+"RTN","BSDX09",22,0)
+ S BSDXRET="^BSDXTMP("_$J_")"
+"RTN","BSDX09",23,0)
+ ;
+"RTN","BSDX09",24,0)
+ N OUT S OUT=$NA(^BSDXTMP($J,0))
+"RTN","BSDX09",25,0)
+ S $P(@OUT,U,1)="T00030IEN"
+"RTN","BSDX09",26,0)
+ S $P(@OUT,U,2)="T00030STREET"
+"RTN","BSDX09",27,0)
+ S $P(@OUT,U,3)="T00030CITY"
+"RTN","BSDX09",28,0)
+ S $P(@OUT,U,4)="T00030STATE"
+"RTN","BSDX09",29,0)
+ S $P(@OUT,U,5)="T00030ZIP"
+"RTN","BSDX09",30,0)
+ S $P(@OUT,U,6)="T00030NAME"
+"RTN","BSDX09",31,0)
+ S $P(@OUT,U,7)="D00030DOB"
+"RTN","BSDX09",32,0)
+ S $P(@OUT,U,8)="T00030PID"
+"RTN","BSDX09",33,0)
+ S $P(@OUT,U,9)="T00030HRN"
+"RTN","BSDX09",34,0)
+ S $P(@OUT,U,10)="T00030HOMEPHONE"
+"RTN","BSDX09",35,0)
+ S $P(@OUT,U,11)="T00030OFCPHONE"
+"RTN","BSDX09",36,0)
+ S $P(@OUT,U,12)="T00030MSGPHONE"
+"RTN","BSDX09",37,0)
+ S $P(@OUT,U,13)="T00030NOK NAME"
+"RTN","BSDX09",38,0)
+ S $P(@OUT,U,14)="T00030RELATIONSHIP"
+"RTN","BSDX09",39,0)
+ S $P(@OUT,U,15)="T00030PHONE"
+"RTN","BSDX09",40,0)
+ S $P(@OUT,U,16)="T00030STREET"
+"RTN","BSDX09",41,0)
+ S $P(@OUT,U,17)="T00030CITY"
+"RTN","BSDX09",42,0)
+ S $P(@OUT,U,18)="T00030STATE"
+"RTN","BSDX09",43,0)
+ S $P(@OUT,U,19)="T00030ZIP"
+"RTN","BSDX09",44,0)
+ S $P(@OUT,U,20)="D00030DATAREVIEWED"
+"RTN","BSDX09",45,0)
+ S $P(@OUT,U,21)="T00030RegistrationComments"
+"RTN","BSDX09",46,0)
+ S $P(@OUT,U,22)="T00050EMAIL ADDRESS"
+"RTN","BSDX09",47,0)
+ S $P(@OUT,U,23)="T00020PHONE NUMBER [CELLULAR]"
+"RTN","BSDX09",48,0)
+ S $P(@OUT,U,24)="T00030COUNTRY"
+"RTN","BSDX09",49,0)
+ S $P(@OUT,U,25)="T00030SEX"
+"RTN","BSDX09",50,0)
+ S $E(@OUT,$L(@OUT)+1)=$C(30)
+"RTN","BSDX09",51,0)
+ ;
+"RTN","BSDX09",52,0)
+ ;
+"RTN","BSDX09",53,0)
+ N BSDXNOD,BSDXNAM,Y,U
+"RTN","BSDX09",54,0)
+ S U="^"
+"RTN","BSDX09",55,0)
+ S BSDXY="ERROR"
+"RTN","BSDX09",56,0)
+ K NAME
+"RTN","BSDX09",57,0)
+ I '+BSDXPAT S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX09",58,0)
+ I '$D(^DPT(+BSDXPAT,0)) S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX09",59,0)
+ S BSDXY=""
+"RTN","BSDX09",60,0)
+ S $P(BSDXY,U)=BSDXPAT
+"RTN","BSDX09",61,0)
+ ;//smh S $P(BSDXY,U,23)=""
+"RTN","BSDX09",62,0)
+ S $P(BSDXY,U,21)=""
+"RTN","BSDX09",63,0)
+ S BSDXNOD=^DPT(+BSDXPAT,0)
+"RTN","BSDX09",64,0)
+ S $P(BSDXY,"^",6)=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX09",65,0)
+ S $P(BSDXY,"^",8)=$$GET1^DIQ(2,BSDXPAT,"PRIMARY LONG ID") ;PID
+"RTN","BSDX09",66,0)
+ S Y=$P(BSDXNOD,U,3) I Y]""  X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX09",67,0)
+ S $P(BSDXY,"^",7)=Y ;DOB
+"RTN","BSDX09",68,0)
+ S $P(BSDXY,"^",9)=""
+"RTN","BSDX09",69,0)
+ I $D(DUZ(2)) I DUZ(2)>0 S $P(BSDXY,"^",9)=$P($G(^AUPNPAT(BSDXPAT,41,DUZ(2),0)),U,2) ;HRN
+"RTN","BSDX09",70,0)
+ D MAIL
+"RTN","BSDX09",71,0)
+ D PHONE
+"RTN","BSDX09",72,0)
+ D NOK
+"RTN","BSDX09",73,0)
+ D DATAREV
+"RTN","BSDX09",74,0)
+ ;/smh D MEDICARE
+"RTN","BSDX09",75,0)
+ D REGCMT
+"RTN","BSDX09",76,0)
+ S $P(BSDXY,"^",22)=$$GET1^DIQ(2,BSDXPAT,"EMAIL ADDRESS")
+"RTN","BSDX09",77,0)
+ S $P(BSDXY,"^",23)=$$GET1^DIQ(2,BSDXPAT,"PHONE NUMBER [CELLULAR]")
+"RTN","BSDX09",78,0)
+ S $P(BSDXY,"^",24)=$$GET1^DIQ(2,BSDXPAT,"COUNTRY:DESCRIPTION")
+"RTN","BSDX09",79,0)
+ S $P(BSDXY,"^",25)=$$GET1^DIQ(2,BSDXPAT,"SEX")
+"RTN","BSDX09",80,0)
+ N BSDXBEG,BSDXEND,BSDXLEN,BSDXI
+"RTN","BSDX09",81,0)
+ S BSDXLEN=$L(BSDXY)
+"RTN","BSDX09",82,0)
+ S BSDXBEG=0,BSDXI=2
+"RTN","BSDX09",83,0)
+ F  D  Q:BSDXEND=BSDXLEN
+"RTN","BSDX09",84,0)
+ . S BSDXEND=BSDXBEG+100
+"RTN","BSDX09",85,0)
+ . S:BSDXEND>BSDXLEN BSDXEND=BSDXLEN
+"RTN","BSDX09",86,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX09",87,0)
+ . S ^BSDXTMP($J,BSDXI)=$E(BSDXY,BSDXBEG,BSDXEND)
+"RTN","BSDX09",88,0)
+ . S BSDXBEG=BSDXBEG+101
+"RTN","BSDX09",89,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(30)_$C(31)
+"RTN","BSDX09",90,0)
+ Q
+"RTN","BSDX09",91,0)
+ ;
+"RTN","BSDX09",92,0)
+MAIL N BSDXST
+"RTN","BSDX09",93,0)
+ Q:'$D(^DPT(+BSDXPAT,.11))
+"RTN","BSDX09",94,0)
+ S BSDXNOD=^DPT(+BSDXPAT,.11)
+"RTN","BSDX09",95,0)
+ Q:BSDXNOD=""
+"RTN","BSDX09",96,0)
+ S $P(BSDXY,"^",2)=$E($P(BSDXNOD,U),1,50) ;STREET
+"RTN","BSDX09",97,0)
+ S $P(BSDXY,"^",3)=$P(BSDXNOD,U,4) ;CITY
+"RTN","BSDX09",98,0)
+ S BSDXST=$P(BSDXNOD,U,5)
+"RTN","BSDX09",99,0)
+ I +BSDXST,$D(^DIC(5,+BSDXST,0)) S BSDXST=$P(^DIC(5,+BSDXST,0),U,2)
+"RTN","BSDX09",100,0)
+ S $P(BSDXY,"^",4)=BSDXST ;STATE
+"RTN","BSDX09",101,0)
+ S $P(BSDXY,"^",5)=$P(BSDXNOD,U,6) ;ZIP
+"RTN","BSDX09",102,0)
+ Q
+"RTN","BSDX09",103,0)
+ ;
+"RTN","BSDX09",104,0)
+PHONE ;PHONE 10,11,12 HOME,OFC,MSG
+"RTN","BSDX09",105,0)
+ I $D(^DPT(+BSDXPAT,.13)) D
+"RTN","BSDX09",106,0)
+ . S BSDXNOD=^DPT(+BSDXPAT,.13)
+"RTN","BSDX09",107,0)
+ . S $P(BSDXY,U,10)=$P(BSDXNOD,U,1)
+"RTN","BSDX09",108,0)
+ . S $P(BSDXY,U,11)=$P(BSDXNOD,U,2)
+"RTN","BSDX09",109,0)
+ I $D(^DPT(+BSDXPAT,.121)) D
+"RTN","BSDX09",110,0)
+ . S BSDXNOD=^DPT(+BSDXPAT,.121)
+"RTN","BSDX09",111,0)
+ . S $P(BSDXY,U,12)=$P(BSDXNOD,U,10)
+"RTN","BSDX09",112,0)
+ Q
+"RTN","BSDX09",113,0)
+ ;
+"RTN","BSDX09",114,0)
+NOK ;NOK
+"RTN","BSDX09",115,0)
+ ;   13 NOK NAME^RELATIONSHIP^PHONE^STREET^CITY^STATE^ZIP
+"RTN","BSDX09",116,0)
+ N Y,BSDXST
+"RTN","BSDX09",117,0)
+ I $D(^DPT(+BSDXPAT,.21)) D
+"RTN","BSDX09",118,0)
+ . S BSDXNOD=^DPT(+BSDXPAT,.21)
+"RTN","BSDX09",119,0)
+ . S $P(BSDXY,U,13)=$P(BSDXNOD,U,1)
+"RTN","BSDX09",120,0)
+ . S $P(BSDXY,U,14)=$$VAL^XBDIQ1(9000001,BSDXPAT,2802)
+"RTN","BSDX09",121,0)
+ . S $P(BSDXY,U,15)=$P(BSDXNOD,U,9)
+"RTN","BSDX09",122,0)
+ . S $P(BSDXY,U,16)=$P(BSDXNOD,U,3)
+"RTN","BSDX09",123,0)
+ . S $P(BSDXY,U,17)=$P(BSDXNOD,U,6)
+"RTN","BSDX09",124,0)
+ . S BSDXST=$P(BSDXNOD,U,7)
+"RTN","BSDX09",125,0)
+ . I +BSDXST D
+"RTN","BSDX09",126,0)
+ . . I $D(^DIC(5,+BSDXST,0)) S BSDXST=$P(^DIC(5,+BSDXST,0),U,2),$P(BSDXY,U,18)=BSDXST
+"RTN","BSDX09",127,0)
+ . S $P(BSDXY,U,19)=$P(BSDXNOD,U,8)
+"RTN","BSDX09",128,0)
+ Q
+"RTN","BSDX09",129,0)
+ ;
+"RTN","BSDX09",130,0)
+DATAREV S $P(BSDXY,U,20)=$P($$VAL^XBDIQ1(9000001,BSDXPAT,16651),"@")
+"RTN","BSDX09",131,0)
+ Q
+"RTN","BSDX09",132,0)
+ ;
+"RTN","BSDX09",133,0)
+REGCMT N BSDXI,BSDXM,BSDXR
+"RTN","BSDX09",134,0)
+ S BSDXR=""
+"RTN","BSDX09",135,0)
+ D ENP^XBDIQ1(9000001,BSDXPAT,1301,"BSDXM(")
+"RTN","BSDX09",136,0)
+ S BSDXI=0 F  S BSDXI=$O(BSDXM(1301,BSDXI)) Q:'+BSDXI  D
+"RTN","BSDX09",137,0)
+ . S BSDXR=BSDXR_" "_BSDXM(1301,BSDXI)
+"RTN","BSDX09",138,0)
+ ; S $P(BSDXY,U,23)=$TR($E(BSDXR,1,1024),U," ") ; MJL 1/17/2007 //smh
+"RTN","BSDX09",139,0)
+ S $P(BSDXY,U,21)=$TR($E(BSDXR,1,1024),U," ") ;
+"RTN","BSDX09",140,0)
+ Q
+"RTN","BSDX09",141,0)
+ ;
+"RTN","BSDX09",142,0)
+GETMCAID(BSDXY,BSDXPAT) ; not in wv
+"RTN","BSDX09",143,0)
+ ;Returns PATIENTIEN^ENTRY#^MEDICAID#^SUBENTRY#^ELIG.BEGIN^ELIG.END |
+"RTN","BSDX09",144,0)
+ ;File is not dinum
+"RTN","BSDX09",145,0)
+ N C,N,ASDGX,BSDXM,BSDXBLD,BSDXCNT
+"RTN","BSDX09",146,0)
+ N BSDXIEN
+"RTN","BSDX09",147,0)
+ S BSDXBLD=""
+"RTN","BSDX09",148,0)
+ S BSDXIEN=0
+"RTN","BSDX09",149,0)
+ S BSDXCNT=1
+"RTN","BSDX09",150,0)
+ F  S BSDXIEN=$O(^AUPNMCD("B",BSDXPAT,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX09",151,0)
+ . S BSDXNUM=$$VAL^XBDIQ1(9000004,BSDXIEN,.03) ;MCAID#
+"RTN","BSDX09",152,0)
+ . D ENPM^XBDIQ1(9000004.11,BSDXIEN_",0",".01:.02","ASDGX(")
+"RTN","BSDX09",153,0)
+ . S C=1,N=0,BSDXM=""
+"RTN","BSDX09",154,0)
+ . F  S N=$O(ASDGX(N)) Q:'N  D
+"RTN","BSDX09",155,0)
+ . . S $P(BSDXY,"|",C)=BSDXPAT_U_BSDXIEN_U_BSDXNUM_U_N_U_ASDGX(N,.01)_U_ASDGX(N,.02)
+"RTN","BSDX09",156,0)
+ . . S C=C+1
+"RTN","BSDX09",157,0)
+ . . Q
+"RTN","BSDX09",158,0)
+ . Q
+"RTN","BSDX09",159,0)
+ Q
+"RTN","BSDX09",160,0)
+ ;
+"RTN","BSDX09",161,0)
+MEDICARE ; not in WV
+"RTN","BSDX09",162,0)
+ S $P(BSDXY,U,21)=$$VAL^XBDIQ1(9000003,BSDXPAT,.03)
+"RTN","BSDX09",163,0)
+ S $P(BSDXY,U,22)=$$VAL^XBDIQ1(9000003,BSDXPAT,.04)
+"RTN","BSDX09",164,0)
+ Q
+"RTN","BSDX09",165,0)
+ ;
+"RTN","BSDX09",166,0)
+GETMCARE(BSDXY,BSDXPAT)      ;
+"RTN","BSDX09",167,0)
+ ;Returns IEN^MEDICARE#^SUFFIX^SUBENTRY#^TYPE^ELIG.BEGIN^ELIG.END |
+"RTN","BSDX09",168,0)
+ ;File is dinum
+"RTN","BSDX09",169,0)
+ ;
+"RTN","BSDX09",170,0)
+ N ASDGX,C,N,BSDXNUM,BSDXSUF,BSDXBLD
+"RTN","BSDX09",171,0)
+ S BSDXNUM=$$VAL^XBDIQ1(9000003,BSDXPAT,.03)
+"RTN","BSDX09",172,0)
+ S BSDXSUF=$$VAL^XBDIQ1(9000003,BSDXPAT,.04)
+"RTN","BSDX09",173,0)
+ D ENPM^XBDIQ1(9000003.11,BSDXPAT_",0",".01:.03","ASDGX(")
+"RTN","BSDX09",174,0)
+ S C=1,N=0,BSDXBLD=""
+"RTN","BSDX09",175,0)
+ F  S N=$O(ASDGX(N)) Q:'N  D
+"RTN","BSDX09",176,0)
+ . S $P(BSDXY,"|",C)=BSDXPAT_U_BSDXNUM_U_BSDXSUF_U_N_U_ASDGX(N,.03)_U_ASDGX(N,.01)_U_ASDGX(N,.02)
+"RTN","BSDX09",177,0)
+ . S C=C+1
+"RTN","BSDX09",178,0)
+ . Q
+"RTN","BSDX09",179,0)
+ Q
+"RTN","BSDX09",180,0)
+ ;
+"RTN","BSDX09",181,0)
+GETPVTIN(BSDXY,BSDXPAT) ;
+"RTN","BSDX09",182,0)
+ ;Returns IEN^SUBENTRY^INSURER^POLICYNUMBER^ELIG.BEGIN^ELIG.END|...
+"RTN","BSDX09",183,0)
+ ;File is dinum
+"RTN","BSDX09",184,0)
+ ;
+"RTN","BSDX09",185,0)
+ N ASDGX,C,N
+"RTN","BSDX09",186,0)
+ D ENPM^XBDIQ1(9000006.11,BSDXPAT_",0",".01;.02;.06;.07","ASDGX(")
+"RTN","BSDX09",187,0)
+ S C=1,N=0
+"RTN","BSDX09",188,0)
+ F  S N=$O(ASDGX(N)) Q:'N  D
+"RTN","BSDX09",189,0)
+ . S $P(BSDXY,"|",C)=BSDXPAT_U_N_U_ASDGX(N,.01)_U_ASDGX(N,.02)_U_ASDGX(N,.06)_U_ASDGX(N,.07)
+"RTN","BSDX09",190,0)
+ . S C=C+1
+"RTN","BSDX09",191,0)
+ . Q
+"RTN","BSDX09",192,0)
+ Q
+"RTN","BSDX09",193,0)
+ ;
+"RTN","BSDX09",194,0)
+DFN(FILE,BSDXPAT) ; -- returns ien for file
+"RTN","BSDX09",195,0)
+ I FILE'[9000004 Q BSDXPAT
+"RTN","BSDX09",196,0)
+ Q +$O(^AUPNMCD("B",BSDXPAT,0))
+"RTN","BSDX11")
+0^34^B6358791
+"RTN","BSDX11",1,0)
+BSDX11 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX11",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX11",3,0)
+ ;
+"RTN","BSDX11",4,0)
+ENV0100 ;EP Version 1.0 Environment check
+"RTN","BSDX11",5,0)
+ I '$G(IOM) D HOME^%ZIS
+"RTN","BSDX11",6,0)
+ I '$G(DUZ) W !,"DUZ UNDEFINED OR 0." D SORRY(2) Q
+"RTN","BSDX11",7,0)
+ I '$L($G(DUZ(0))) W !,"DUZ(0) UNDEFINED OR NULL." D SORRY(2) Q
+"RTN","BSDX11",8,0)
+ I '(DUZ(0)["@") W:'$D(ZTQUEUED) !,"DUZ(0) DOES NOT CONTAIN AN '@'." D SORRY(2) Q
+"RTN","BSDX11",9,0)
+ S X=$$GET1^DIQ(200,DUZ,.01)
+"RTN","BSDX11",10,0)
+ W !!,$$CJ^XLFSTR("Hello, "_$P(X,",",2)_" "_$P(X,","),IOM)
+"RTN","BSDX11",11,0)
+ W !!,$$CJ^XLFSTR("Checking Environment...",IOM)
+"RTN","BSDX11",12,0)
+ ;
+"RTN","BSDX11",13,0)
+ ;is the PIMS requirement present?
+"RTN","BSDX11",14,0)
+ I '$$INSTALLD("PIMS*5.3*1003") D
+"RTN","BSDX11",15,0)
+ .D BMES^XPDUTL("Version 1.0 of the BSDX Package")
+"RTN","BSDX11",16,0)
+ . D BMES^XPDUTL("Cannot Be Installed Unless")
+"RTN","BSDX11",17,0)
+ . D BMES^XPDUTL("Patch 1003 of version 5.3 of the PIMS Package has been installed.")
+"RTN","BSDX11",18,0)
+ . D SORRY(2)
+"RTN","BSDX11",19,0)
+ . Q
+"RTN","BSDX11",20,0)
+ ;is the BMX requirement present?
+"RTN","BSDX11",21,0)
+ I '$$INSTALLD("BMX 1.0") D
+"RTN","BSDX11",22,0)
+ .D BMES^XPDUTL("Version 1.0 of the BSDX Package")
+"RTN","BSDX11",23,0)
+ . D BMES^XPDUTL("Cannot Be Installed Unless")
+"RTN","BSDX11",24,0)
+ . D BMES^XPDUTL("version 1.0 of the BMX Package has been installed.")
+"RTN","BSDX11",25,0)
+ . D SORRY(2)
+"RTN","BSDX11",26,0)
+ . Q
+"RTN","BSDX11",27,0)
+ Q
+"RTN","BSDX11",28,0)
+ ;End Environment check
+"RTN","BSDX11",29,0)
+ ;
+"RTN","BSDX11",30,0)
+V0100 ;EP Version 1.0 PostInit
+"RTN","BSDX11",31,0)
+ ;Add Protocol items to BSDAM APPOINTMENT EVENTS protocol
+"RTN","BSDX11",32,0)
+ ;
+"RTN","BSDX11",33,0)
+ N BSDXDA,BSDXFDA,BSDXDA1,BSDXSEQ,BSDXDAT,BSDXNOD,BSDXIEN,BSDXMSG
+"RTN","BSDX11",34,0)
+ S BSDXDA=$O(^ORD(101,"B","BSDAM APPOINTMENT EVENTS",0))
+"RTN","BSDX11",35,0)
+ Q:'+BSDXDA
+"RTN","BSDX11",36,0)
+ S BSDXDAT="BSDX ADD APPOINTMENT;10.2^BSDX CANCEL APPOINTMENT;10.4^BSDX CHECKIN APPOINTMENT;10.6^BSDX NOSHOW APPOINTMENT;10.8"
+"RTN","BSDX11",37,0)
+ F J=1:1:$L(BSDXDAT,U) D
+"RTN","BSDX11",38,0)
+ . K BSDXIEN,BSDXMSG,BSDXFDA
+"RTN","BSDX11",39,0)
+ . S BSDXNOD=$P(BSDXDAT,U,J)
+"RTN","BSDX11",40,0)
+ . S BSDXDA1=$P(BSDXNOD,";")
+"RTN","BSDX11",41,0)
+ . S BSDXSEQ=$P(BSDXNOD,";",2)
+"RTN","BSDX11",42,0)
+ . S BSDXDA1=$O(^ORD(101,"B",BSDXDA1,0))
+"RTN","BSDX11",43,0)
+ . Q:'+BSDXDA1
+"RTN","BSDX11",44,0)
+ . Q:$D(^ORD(101,BSDXDA,10,"B",BSDXDA1))
+"RTN","BSDX11",45,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",",".01")=BSDXDA1
+"RTN","BSDX11",46,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",","3")=BSDXSEQ
+"RTN","BSDX11",47,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX11",48,0)
+ . Q
+"RTN","BSDX11",49,0)
+ Q
+"RTN","BSDX11",50,0)
+ ;
+"RTN","BSDX11",51,0)
+SORRY(X) ;
+"RTN","BSDX11",52,0)
+ KILL DIFQ
+"RTN","BSDX11",53,0)
+ S XPDQUIT=X
+"RTN","BSDX11",54,0)
+ W *7,!,$$CJ^XLFSTR("Sorry....Please fix it.",IOM)
+"RTN","BSDX11",55,0)
+ Q
+"RTN","BSDX11",56,0)
+ ;
+"RTN","BSDX11",57,0)
+INSTALLD(BMXPKG) ;
+"RTN","BSDX11",58,0)
+ ;Determine if BMXPKG is present.
+"RTN","BSDX11",59,0)
+ Q 1
+"RTN","BSDX11",60,0)
+ ;S BSDXFIN=$O(^XPD(9.7,"B","PIMS*5.3*1003",""))
+"RTN","BSDX11",61,0)
+ S BSDXFIN=$O(^XPD(9.7,"B",BMXPKG,""))
+"RTN","BSDX11",62,0)
+ I $G(BSDXFIN)="" Q 0
+"RTN","BSDX11",63,0)
+ S BSDXSTAT=$P($G(^XPD(9.7,BSDXFIN,0)),U,9)
+"RTN","BSDX11",64,0)
+ ;'0' Loaded from Distribution
+"RTN","BSDX11",65,0)
+ ;'1' Queued for Install 
+"RTN","BSDX11",66,0)
+ ;'2' Start of Install 
+"RTN","BSDX11",67,0)
+ ;'3' Install Completed 
+"RTN","BSDX11",68,0)
+ ;'4' FOR De-Installed; 
+"RTN","BSDX11",69,0)
+ ;
+"RTN","BSDX11",70,0)
+ I BSDXSTAT'=3 Q 0
+"RTN","BSDX11",71,0)
+ Q 1
+"RTN","BSDX12")
+0^10^B7203579
+"RTN","BSDX12",1,0)
+BSDX12 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/18/10 2:14pm
+"RTN","BSDX12",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX12",3,0)
+    ; 
+"RTN","BSDX12",4,0)
+    ; Change Log:
+"RTN","BSDX12",5,0)
+    ; v 1.3 - i18n support - 3100718
+"RTN","BSDX12",6,0)
+    ; BSDXSTART and BSDXEND passed in FM Dates, not US dates
+"RTN","BSDX12",7,0)
+ ;
+"RTN","BSDX12",8,0)
+ ;
+"RTN","BSDX12",9,0)
+AVADD(BSDXY,BSDXSTART,BSDXEND,BSDXTYPID,BSDXRES,BSDXSLOTS,BSDXNOTE)  ;EP
+"RTN","BSDX12",10,0)
+ ;Called by BSDX ADD NEW AVAILABILITY
+"RTN","BSDX12",11,0)
+ ;Create entry in BSDX ACCESS BLOCK
+"RTN","BSDX12",12,0)
+ ;
+"RTN","BSDX12",13,0)
+ ;BSDXRES is Resource Name
+"RTN","BSDX12",14,0)
+ ;Returns recordset having fields 
+"RTN","BSDX12",15,0)
+ ; AvailabilityID and ErrorNumber
+"RTN","BSDX12",16,0)
+ ;
+"RTN","BSDX12",17,0)
+ ;Test lines:
+"RTN","BSDX12",18,0)
+ ;D AVADD^BSDX12(.RES,"3091227.09","3091227.0930","1","WHITT",2,"SCRATCH AV NOTE") ZW RES
+"RTN","BSDX12",19,0)
+ ;BSDX ADD NEW AVAILABILITY^3091227.09^3091227.0930^1^WHITT^2^SCRATCH AVAILABILITY NOTE
+"RTN","BSDX12",20,0)
+ ;
+"RTN","BSDX12",21,0)
+ N BSDXERR,BSDXIEN,BSDXDEP,BSDXI,BSDXAVID,BSDXI,BSDXERR,BSDXFDA,BSDXMSG,BSDXRESD
+"RTN","BSDX12",22,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX12",23,0)
+ S BSDXERR=0
+"RTN","BSDX12",24,0)
+ S BSDXI=0
+"RTN","BSDX12",25,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX12",26,0)
+ S ^BSDXTMP($J,0)="I00020AVAILABILITYID^I00020ERRORID"_$C(30)
+"RTN","BSDX12",27,0)
+ ;Check input data for errors
+"RTN","BSDX12",28,0)
+    ; i18n - FM Dates passed in
+"RTN","BSDX12",29,0)
+ ; S:BSDXSTART["@0000" BSDXSTART=$P(BSDXSTART,"@")
+"RTN","BSDX12",30,0)
+ ; S:BSDXEND["@0000" BSDXEND=$P(BSDXEND,"@")
+"RTN","BSDX12",31,0)
+ ; S %DT="T",X=BSDXSTART D ^%DT S BSDXSTART=Y
+"RTN","BSDX12",32,0)
+ ; I BSDXSTART=-1 D ERR(70) Q
+"RTN","BSDX12",33,0)
+ ; S %DT="T",X=BSDXEND D ^%DT S BSDXEND=Y
+"RTN","BSDX12",34,0)
+ ; I BSDXEND=-1 D ERR(70) Q
+"RTN","BSDX12",35,0)
+    ; Make sure dates are canonical and don't contain extra zeros
+"RTN","BSDX12",36,0)
+    S BSDXSTART=+BSDXSTART,BSDXEND=+BSDXEND
+"RTN","BSDX12",37,0)
+    ;
+"RTN","BSDX12",38,0)
+ I $L(BSDXEND,".")=1 D ERR(70) Q
+"RTN","BSDX12",39,0)
+ I BSDXSTART>BSDXEND S BSDXTMP=BSDXEND,BSDXEND=BSDXSTART,BSDXSTART=BSDXTMP
+"RTN","BSDX12",40,0)
+ ;Validate Access Type
+"RTN","BSDX12",41,0)
+ I '+BSDXTYPID,'$D(^BSDXTYPE(BSDXTYPID,0)) D ERR(70) Q
+"RTN","BSDX12",42,0)
+ ;Validate Resource
+"RTN","BSDX12",43,0)
+ I '$D(^BSDXRES("B",BSDXRES)) S BSDXERR=70 D ERR(BSDXERR) Q
+"RTN","BSDX12",44,0)
+ S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0)) I '+BSDXRESD S BSDXERR=70 D ERR(BSDXERR) Q
+"RTN","BSDX12",45,0)
+ ;
+"RTN","BSDX12",46,0)
+ ;Create entry in BSDX ACCESS BLOCK
+"RTN","BSDX12",47,0)
+ S BSDXFDA(9002018.3,"+1,",.01)=BSDXRESD
+"RTN","BSDX12",48,0)
+ S BSDXFDA(9002018.3,"+1,",.02)=BSDXSTART
+"RTN","BSDX12",49,0)
+ S BSDXFDA(9002018.3,"+1,",.03)=BSDXEND
+"RTN","BSDX12",50,0)
+ S BSDXFDA(9002018.3,"+1,",.04)=BSDXSLOTS
+"RTN","BSDX12",51,0)
+ S BSDXFDA(9002018.3,"+1,",.05)=BSDXTYPID
+"RTN","BSDX12",52,0)
+ K BSDXIEN,BSDXMSG
+"RTN","BSDX12",53,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX12",54,0)
+ S BSDXAVID=+$G(BSDXIEN(1))
+"RTN","BSDX12",55,0)
+ I 'BSDXAVID D ERR(70) Q
+"RTN","BSDX12",56,0)
+ ;
+"RTN","BSDX12",57,0)
+ ;Add WP field
+"RTN","BSDX12",58,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX12",59,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX12",60,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX12",61,0)
+ . D WP^DIE(9002018.3,BSDXAVID_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX12",62,0)
+ ;
+"RTN","BSDX12",63,0)
+ ;Return Recordset
+"RTN","BSDX12",64,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",65,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXAVID_"^-1"_$C(30)
+"RTN","BSDX12",66,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",67,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX12",68,0)
+ Q
+"RTN","BSDX12",69,0)
+ ;
+"RTN","BSDX12",70,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX12",71,0)
+ S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX12",72,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",73,0)
+ S ^BSDXTMP($J,BSDXI)="0^"_BSDXERR_$C(30)
+"RTN","BSDX12",74,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",75,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX12",76,0)
+ Q
+"RTN","BSDX13")
+0^11^B9772451
+"RTN","BSDX13",1,0)
+BSDX13 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 6:05pm
+"RTN","BSDX13",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX13",3,0)
+    ;
+"RTN","BSDX13",4,0)
+    ; Change Log:
+"RTN","BSDX13",5,0)
+    ; V 1.3 - i18n support - Dates passed to Routine as FM Date - WV/SMH
+"RTN","BSDX13",6,0)
+ Q
+"RTN","BSDX13",7,0)
+AVDELDTD(BSDXY,BSDXRESD,BSDXSTART,BSDXEND) ;EP
+"RTN","BSDX13",8,0)
+ ;Entry point for debugging
+"RTN","BSDX13",9,0)
+ ;
+"RTN","BSDX13",10,0)
+ ;D DEBUG^%Serenji("AVDELDT^BSDX13(.BSDXY,BSDXRESD,BSDXSTART,BSDXEND)")
+"RTN","BSDX13",11,0)
+ Q
+"RTN","BSDX13",12,0)
+ ;
+"RTN","BSDX13",13,0)
+AVDELDT(BSDXY,BSDXRESD,BSDXSTART,BSDXEND) ;EP
+"RTN","BSDX13",14,0)
+ ;Cancel availability in a date range
+"RTN","BSDX13",15,0)
+ ;Called by BSDX CANCEL AV BY DATE
+"RTN","BSDX13",16,0)
+ ;
+"RTN","BSDX13",17,0)
+ ;BSDXRESD is BSDX RESOURCE ien
+"RTN","BSDX13",18,0)
+ ;BSDXSTART and BSDXEND are FM dates (change in v 1.3)
+"RTN","BSDX13",19,0)
+ ;
+"RTN","BSDX13",20,0)
+ S X="ERROR^BSDX13",@^%ZOSF("TRAP")
+"RTN","BSDX13",21,0)
+ N BMXIEN,BSDXI
+"RTN","BSDX13",22,0)
+ S BSDXI=0
+"RTN","BSDX13",23,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX13",24,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX13",25,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX13",26,0)
+ ; S X=BSDXSTART ; commented out *v1.3
+"RTN","BSDX13",27,0)
+ ; S %DT="X" D ^%DT
+"RTN","BSDX13",28,0)
+ ; I Y=-1 D ERR(0,"AVDELDT-BSDX13: Invalid Start Date") Q
+"RTN","BSDX13",29,0)
+ ; S BSDXSTART=$P(Y,".")
+"RTN","BSDX13",30,0)
+ ; S X=BSDXEND
+"RTN","BSDX13",31,0)
+ ; S %DT="X" D ^%DT
+"RTN","BSDX13",32,0)
+ ; I Y=-1 D ERR(0,"AVDELDT-BSDX13: Invalid End Date") Q
+"RTN","BSDX13",33,0)
+ S BSDXEND=$P(BSDXEND,".")_".99999"
+"RTN","BSDX13",34,0)
+ I '+BSDXRESD D ERR(0,"AVDELDT-BSDX13: Invalid Resource ID") Q
+"RTN","BSDX13",35,0)
+ ;
+"RTN","BSDX13",36,0)
+ F  S BSDXSTART=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXSTART)) Q:'+BSDXSTART  Q:BSDXSTART>BSDXEND  D
+"RTN","BSDX13",37,0)
+ . S BMXIEN=0
+"RTN","BSDX13",38,0)
+ . F  S BMXIEN=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXSTART,BMXIEN)) Q:'+BMXIEN  D
+"RTN","BSDX13",39,0)
+ . . D CALLDIK(BMXIEN)
+"RTN","BSDX13",40,0)
+ ;
+"RTN","BSDX13",41,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",42,0)
+ S ^BSDXTMP($J,BSDXI)="-1^"_$C(30)_$C(31)
+"RTN","BSDX13",43,0)
+ Q
+"RTN","BSDX13",44,0)
+ERROR ;
+"RTN","BSDX13",45,0)
+ D ^%ZTER
+"RTN","BSDX13",46,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX13",47,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",48,0)
+ D ERR(0,"BSDX13 M Error: <"_$G(%ZTERZE)_">")
+"RTN","BSDX13",49,0)
+ Q
+"RTN","BSDX13",50,0)
+ ;
+"RTN","BSDX13",51,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX13",52,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX13",53,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",54,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX13",55,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",56,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX13",57,0)
+ Q
+"RTN","BSDX13",58,0)
+ ;
+"RTN","BSDX13",59,0)
+AVDEL(BSDXY,BSDXAVID) ;EP
+"RTN","BSDX13",60,0)
+ ;Called by BSDX CANCEL AVAILABILITY
+"RTN","BSDX13",61,0)
+ ;Deletes Access block
+"RTN","BSDX13",62,0)
+ ;BSDXAVID is entry number in BSDX AVAILABILITY file
+"RTN","BSDX13",63,0)
+ ;Returns error code in recordset field ERRORID
+"RTN","BSDX13",64,0)
+ ;
+"RTN","BSDX13",65,0)
+ S X="ERROR^BSDX13",@^%ZOSF("TRAP")
+"RTN","BSDX13",66,0)
+ N BSDXNOD,BSDXSTART,DIK,DA,BSDXID,BSDXI,BSDXEND,BSDXRSID
+"RTN","BSDX13",67,0)
+ ;
+"RTN","BSDX13",68,0)
+ S BSDXI=0
+"RTN","BSDX13",69,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX13",70,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX13",71,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX13",72,0)
+ I '+BSDXAVID D ERR(70) Q
+"RTN","BSDX13",73,0)
+ I '$D(^BSDXAB(BSDXAVID,0)) D ERR(70) Q
+"RTN","BSDX13",74,0)
+ ;
+"RTN","BSDX13",75,0)
+ ;
+"RTN","BSDX13",76,0)
+ ;TODO: Test for existing appointments in availability block
+"RTN","BSDX13",77,0)
+ ; (corresponds to old qryAppointmentBlocksOverlapC
+"RTN","BSDX13",78,0)
+ ;  and AVBlockHasAppointments)
+"RTN","BSDX13",79,0)
+ ;
+"RTN","BSDX13",80,0)
+ ;I $$APTINBLK(BSDXAVID) D ERR(20) Q
+"RTN","BSDX13",81,0)
+ ;
+"RTN","BSDX13",82,0)
+ ;Delete AVAILABILITY entries
+"RTN","BSDX13",83,0)
+ D CALLDIK(BSDXAVID)
+"RTN","BSDX13",84,0)
+ ;
+"RTN","BSDX13",85,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",86,0)
+ S ^BSDXTMP($J,BSDXI)="-1^"_$C(30)_$C(31)
+"RTN","BSDX13",87,0)
+ Q
+"RTN","BSDX13",88,0)
+ ;
+"RTN","BSDX13",89,0)
+CALLDIK(BSDXAVID) ;
+"RTN","BSDX13",90,0)
+ ;Delete AVAILABILITY entries
+"RTN","BSDX13",91,0)
+ ;
+"RTN","BSDX13",92,0)
+ S DIK="^BSDXAB("
+"RTN","BSDX13",93,0)
+ S DA=BSDXAVID
+"RTN","BSDX13",94,0)
+ D ^DIK
+"RTN","BSDX13",95,0)
+ ;
+"RTN","BSDX13",96,0)
+ Q
+"RTN","BSDX13",97,0)
+ ;
+"RTN","BSDX13",98,0)
+APTINBLK(BSDXAVID) ;
+"RTN","BSDX13",99,0)
+ ;
+"RTN","BSDX13",100,0)
+ ;NOTE: This Subroutine Not called in current version.  Keep code for later use.
+"RTN","BSDX13",101,0)
+ ;
+"RTN","BSDX13",102,0)
+ ;N BSDXS,BSDXID,BSDXHIT,BSDXNOD,BSDXE,BSDXSTART,BSDXEND,BSDXRSID
+"RTN","BSDX13",103,0)
+ ;S BSDXNOD=^BSDXAB(BSDXAVID,0)
+"RTN","BSDX13",104,0)
+ ;S BSDXSTART=$P(BSDXNOD,U,3)
+"RTN","BSDX13",105,0)
+ ;S BSDXEND=$P(BSDXNOD,U,4)
+"RTN","BSDX13",106,0)
+ ;S BSDXRSID=$P(BSDXNOD,U,1)
+"RTN","BSDX13",107,0)
+ ;I '$D(^BSDXDAPRS("ARSRC",BSDXRSID)) Q 0
+"RTN","BSDX13",108,0)
+ ;;If any appointments start at the AV block start time:
+"RTN","BSDX13",109,0)
+ ;I $D(^BSDXDAPRS("ARSRC",BSDXRSID,BSDXSTART)) Q 1
+"RTN","BSDX13",110,0)
+ ;;Find the first appt time BSDXS on the same day as the av block
+"RTN","BSDX13",111,0)
+ ;S BSDXS=$O(^BSDXDAPRS("ARSRC",BSDXRSID,$P(BSDXSTART,".")))
+"RTN","BSDX13",112,0)
+ ;I BSDXS>BSDXEND Q 0
+"RTN","BSDX13",113,0)
+ ;;For all the appts that day with start times less
+"RTN","BSDX13",114,0)
+ ;;than the av block's end time, find any whose end time is
+"RTN","BSDX13",115,0)
+ ;;greater than the av block's start time
+"RTN","BSDX13",116,0)
+ ;S BSDXHIT=0
+"RTN","BSDX13",117,0)
+ ;S BSDXS=BSDXS-.0001
+"RTN","BSDX13",118,0)
+ ;F  S BSDXS=$O(^BSDXDAPRS("ARSRC",BSDXRSID,BSDXS)) Q:'+BSDXS  Q:BSDXS'<BSDXEND  D  Q:BSDXHIT
+"RTN","BSDX13",119,0)
+ ;. S BSDXID=0 F  S BSDXID=$O(^BSDXDAPRS("ARSRC",BSDXRSID,BSDXS,BSDXID)) Q:'+BSDXID  D  Q:BSDXHIT
+"RTN","BSDX13",120,0)
+ ;. . Q:'$D(^BSDXDAPT(BSDXID,0))
+"RTN","BSDX13",121,0)
+ ;. . S BSDXNOD=^BSDXDAPT(BSDXID,0)
+"RTN","BSDX13",122,0)
+ ;. . S BSDXE=$P(BSDXNOD,U,2)
+"RTN","BSDX13",123,0)
+ ;. . I BSDXE>BSDXSTART S BSDXHIT=1 Q
+"RTN","BSDX13",124,0)
+ ;;
+"RTN","BSDX13",125,0)
+ ;I BSDXHIT Q 1
+"RTN","BSDX13",126,0)
+ Q 0
+"RTN","BSDX13",127,0)
+ ;
+"RTN","BSDX13",128,0)
+ ;ERR(ERRNO) ;Error processing
+"RTN","BSDX13",129,0)
+ ;N BSDXERR
+"RTN","BSDX13",130,0)
+ ;S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX13",131,0)
+ ;S BSDXI=BSDXI+1
+"RTN","BSDX13",132,0)
+ ;S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX13",133,0)
+ ;S BSDXI=BSDXI+1
+"RTN","BSDX13",134,0)
+ ;S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX13",135,0)
+ ;Q
+"RTN","BSDX14")
+0^12^B6450810
+"RTN","BSDX14",1,0)
+BSDX14 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX14",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX14",3,0)
+ ;
+"RTN","BSDX14",4,0)
+ ;
+"RTN","BSDX14",5,0)
+ACCTYPD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX14",6,0)
+ ;Entry point for debugging
+"RTN","BSDX14",7,0)
+ ;
+"RTN","BSDX14",8,0)
+ ;D DEBUG^%Serenji("ACCTYP^BSDX14(.BSDXY,BSDXVAL)")
+"RTN","BSDX14",9,0)
+ Q
+"RTN","BSDX14",10,0)
+ ;
+"RTN","BSDX14",11,0)
+ACCTYP(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX14",12,0)
+ ;Called by BSDX ADD/EDIT ACCESS TYPE
+"RTN","BSDX14",13,0)
+ ;Add/Edit ACCESS TYPE entry
+"RTN","BSDX14",14,0)
+ ;BSDXVAL is IEN|NAME|INACTIVE|COLOR|RED|GREEN|BLUE
+"RTN","BSDX14",15,0)
+ ;If IEN=0 Then this is a new ACCTYPE
+"RTN","BSDX14",16,0)
+ ;Test Line:
+"RTN","BSDX14",17,0)
+ ;D ACCTYP^BSDX14(.RES,"0|ORAL HYGIENE|false|Red")
+"RTN","BSDX14",18,0)
+ ;
+"RTN","BSDX14",19,0)
+ S X="ERROR^BSDX14",@^%ZOSF("TRAP")
+"RTN","BSDX14",20,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXNAM
+"RTN","BSDX14",21,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX14",22,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSTYPEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX14",23,0)
+ I BSDXVAL="" D ERR(0,"BSDX14: Invalid null input Parameter") Q
+"RTN","BSDX14",24,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX14",25,0)
+ I +BSDXIEN D
+"RTN","BSDX14",26,0)
+ . S BSDX="EDIT"
+"RTN","BSDX14",27,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX14",28,0)
+ E  D
+"RTN","BSDX14",29,0)
+ . S BSDX="ADD"
+"RTN","BSDX14",30,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX14",31,0)
+ ;
+"RTN","BSDX14",32,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX14",33,0)
+ I BSDXNAM="" D ERR(0,"BSDX14: Invalid null Access Type name.") Q
+"RTN","BSDX14",34,0)
+ ;
+"RTN","BSDX14",35,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX14",36,0)
+ I $D(^BSDXTYPE("B",BSDXNAM)),$O(^BSDXTYPE("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX14",37,0)
+ . D ERR(0,"BSDX14: Cannot have two Access Types with the same name.")
+"RTN","BSDX14",38,0)
+ . Q
+"RTN","BSDX14",39,0)
+ ;
+"RTN","BSDX14",40,0)
+ S BSDXINA=$P(BSDXVAL,"|",3)
+"RTN","BSDX14",41,0)
+ S BSDXINA=$S(BSDXINA="YES":1,1:0)
+"RTN","BSDX14",42,0)
+ ;
+"RTN","BSDX14",43,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.01)=$P(BSDXVAL,"|",2) ;NAME
+"RTN","BSDX14",44,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.02)=BSDXINA ;INACTIVE
+"RTN","BSDX14",45,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.04)=$P(BSDXVAL,"|",4) ;COLOR
+"RTN","BSDX14",46,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.05)=$P(BSDXVAL,"|",5) ;RED
+"RTN","BSDX14",47,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.06)=$P(BSDXVAL,"|",6) ;GREEN
+"RTN","BSDX14",48,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.07)=$P(BSDXVAL,"|",7) ;BLUE
+"RTN","BSDX14",49,0)
+ K BSDXMSG
+"RTN","BSDX14",50,0)
+ I BSDX="ADD" D
+"RTN","BSDX14",51,0)
+ . K BSDXIEN
+"RTN","BSDX14",52,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX14",53,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX14",54,0)
+ E  D
+"RTN","BSDX14",55,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX14",56,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^-1"_$C(30)_$C(31)
+"RTN","BSDX14",57,0)
+ Q
+"RTN","BSDX14",58,0)
+ ;
+"RTN","BSDX14",59,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX14",60,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX14",61,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX14",62,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX14",63,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX14",64,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX14",65,0)
+ Q
+"RTN","BSDX14",66,0)
+ ;
+"RTN","BSDX14",67,0)
+ERROR ;
+"RTN","BSDX14",68,0)
+ D ^%ZTER
+"RTN","BSDX14",69,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX14",70,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX14",71,0)
+ D ERR(0,"BSDX14 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX14",72,0)
+ Q
+"RTN","BSDX15")
+0^13^B5327807
+"RTN","BSDX15",1,0)
+BSDX15 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX15",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX15",3,0)
+ ;
+"RTN","BSDX15",4,0)
+ ;
+"RTN","BSDX15",5,0)
+GRPTYP(BSDXY) ;EP
+"RTN","BSDX15",6,0)
+ ;Called by BSDX GET ACCESS GROUP TYPES
+"RTN","BSDX15",7,0)
+ ;Returns ADO recordset containing ACTIVE Access types ordered alphabetically
+"RTN","BSDX15",8,0)
+ ;by Access Group
+"RTN","BSDX15",9,0)
+ ;AccessGroupID, AccessGroup, AccessTypeID, AccessType
+"RTN","BSDX15",10,0)
+ ;
+"RTN","BSDX15",11,0)
+ ;Test Code:
+"RTN","BSDX15",12,0)
+ ;D GRPTYP^BSDX15(.RES) ZW RES
+"RTN","BSDX15",13,0)
+ ;
+"RTN","BSDX15",14,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX15",15,0)
+ N BSDX1
+"RTN","BSDX15",16,0)
+ S BSDXI=0
+"RTN","BSDX15",17,0)
+ S X="ETRAP^BSDX15",@^%ZOSF("TRAP")
+"RTN","BSDX15",18,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ACCESS_GROUP_TYPEID^I00020ACCESS_GROUP_ID^T00030ACCESS_GROUP^I00020ACCESS_TYPE_ID^T00030ACCESS_TYPE"_$C(30)
+"RTN","BSDX15",19,0)
+ ;
+"RTN","BSDX15",20,0)
+ ;N BSDX0,BSDX1,BSDXNOD,BSDXGPN,BSDXTN
+"RTN","BSDX15",21,0)
+ ;$O Through "B" x-ref of BSDX ACCESS GROUP file
+"RTN","BSDX15",22,0)
+ ;S BSDXGPN=0 F  S BSDXGPN=$O(^BSDXAGP("B",BSDXGPN)) Q:BSDXGPN=""  D
+"RTN","BSDX15",23,0)
+ ;. S BSDX0=$O(^BSDXAGP("B",BSDXGPN,0))
+"RTN","BSDX15",24,0)
+ ;. Q:'+BSDX0
+"RTN","BSDX15",25,0)
+ ;. Q:'$D(^BSDXAGP(BSDX0,0))  ;INDEX VALIDITY CHECK
+"RTN","BSDX15",26,0)
+ ;. Q:'$D(^BSDXAGTP("B",BSDX0))
+"RTN","BSDX15",27,0)
+ ;. ;$O through "B" x-ref of BSDX ACCESS GROUP TYPE
+"RTN","BSDX15",28,0)
+ ;. S BSDX1=0 F  S BSDX1=$O(^BSDXAGTP("B",BSDX0,BSDX1)) Q:'+BSDX1  D
+"RTN","BSDX15",29,0)
+ ;. . Q:'$D(^BSDXAGTP(BSDX1,0))
+"RTN","BSDX15",30,0)
+ ;. . S BSDX2=$P(^BSDXAGTP(BSDX1,0),U,2)
+"RTN","BSDX15",31,0)
+ ;. . Q:'+BSDX2
+"RTN","BSDX15",32,0)
+ ;. . Q:'$D(^BSDXTYPE(BSDX2,0))
+"RTN","BSDX15",33,0)
+ ;. . S BSDXNOD=^BSDXTYPE(BSDX2,0)
+"RTN","BSDX15",34,0)
+ ;. . Q:$P(BSDXNOD,U,2)=1  ;INACTIVE
+"RTN","BSDX15",35,0)
+ ;. . S BSDXTN=$P(BSDXNOD,U)
+"RTN","BSDX15",36,0)
+ ;. . S BSDXI=BSDXI+1
+"RTN","BSDX15",37,0)
+ ;. . S ^BSDXTMP($J,BSDXI)=BSDX1_U_BSDX0_U_BSDXGPN_U_BSDX2_U_BSDXTN_$C(30)
+"RTN","BSDX15",38,0)
+ ;. . Q
+"RTN","BSDX15",39,0)
+ ;. Q
+"RTN","BSDX15",40,0)
+ ;
+"RTN","BSDX15",41,0)
+ ;$O Through "AC" x-ref of BSDX ACCESS GROUP TYPE file
+"RTN","BSDX15",42,0)
+ N BSDXAGID,BSDXAGN,BSDXATID,BSDXATN,BSDXAGTID
+"RTN","BSDX15",43,0)
+ S BSDXAGID=0
+"RTN","BSDX15",44,0)
+ F  S BSDXAGID=$O(^BSDXAGTP("AC",BSDXAGID)) Q:'+BSDXAGID  D
+"RTN","BSDX15",45,0)
+ . I '$D(^BSDXAGP(BSDXAGID,0)) Q
+"RTN","BSDX15",46,0)
+ . S BSDXAGN=$P(^BSDXAGP(BSDXAGID,0),U)
+"RTN","BSDX15",47,0)
+ . S BSDXATID=0 F  S BSDXATID=$O(^BSDXAGTP("AC",BSDXAGID,BSDXATID)) Q:'+BSDXATID  D
+"RTN","BSDX15",48,0)
+ . . S BSDXNOD=$G(^BSDXTYPE(BSDXATID,0))
+"RTN","BSDX15",49,0)
+ . . I BSDXNOD="" Q
+"RTN","BSDX15",50,0)
+ . . I $P(BSDXNOD,U,2)=1 Q  ;Inactive
+"RTN","BSDX15",51,0)
+ . . S BSDXATN=$P(BSDXNOD,U)
+"RTN","BSDX15",52,0)
+ . . S BSDXAGTID=$O(^BSDXAGTP("AC",BSDXAGID,BSDXATID,0))
+"RTN","BSDX15",53,0)
+ . . I '+BSDXAGTID Q
+"RTN","BSDX15",54,0)
+ . . I '$D(^BSDXAGTP(BSDXAGTID,0)) Q
+"RTN","BSDX15",55,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX15",56,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXAGTID_U_BSDXAGID_U_BSDXAGN_U_BSDXATID_U_BSDXATN_$C(30)
+"RTN","BSDX15",57,0)
+ . . Q
+"RTN","BSDX15",58,0)
+ . Q
+"RTN","BSDX15",59,0)
+ ;
+"RTN","BSDX15",60,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",61,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX15",62,0)
+ Q
+"RTN","BSDX15",63,0)
+ ;
+"RTN","BSDX15",64,0)
+ERR(BSDXI,BSDXID,BSDXERR) ;Error processing
+"RTN","BSDX15",65,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",66,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_"^^^^"_$C(30)
+"RTN","BSDX15",67,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",68,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX15",69,0)
+ Q
+"RTN","BSDX15",70,0)
+ ;
+"RTN","BSDX15",71,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX15",72,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX15",73,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",74,0)
+ D ERR(BSDXI,99,70)
+"RTN","BSDX15",75,0)
+ Q
+"RTN","BSDX16")
+0^14^B11948965
+"RTN","BSDX16",1,0)
+BSDX16 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 
+"RTN","BSDX16",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX16",3,0)
+ ;
+"RTN","BSDX16",4,0)
+ ;
+"RTN","BSDX16",5,0)
+RSRCD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX16",6,0)
+ ;Entry point for debugging
+"RTN","BSDX16",7,0)
+ ;
+"RTN","BSDX16",8,0)
+ ;D DEBUG^%Serenji("RSRC^BSDX16(.BSDXY,BSDXVAL)")
+"RTN","BSDX16",9,0)
+ Q
+"RTN","BSDX16",10,0)
+ ;
+"RTN","BSDX16",11,0)
+RSRC(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX16",12,0)
+ ;
+"RTN","BSDX16",13,0)
+ ;Called by BSDX ADD/EDIT RESOURCE
+"RTN","BSDX16",14,0)
+ ;Add/Edit BSDX RESOURCE entry
+"RTN","BSDX16",15,0)
+ ;BSDXVAL is sResourceID|sResourceName|sInactive|sHospLocID|TIME_SCALE|LETTER_TEXT|NO_SHOW_LETTER|CANCELLATION_LETTER
+"RTN","BSDX16",16,0)
+ ;If IEN=0 Then this is a new Resource
+"RTN","BSDX16",17,0)
+ ;Test Line:
+"RTN","BSDX16",18,0)
+ ;D RSRC^BSDX16(.RES,"sResourceID|sResourceName|sInactive|sHospLocID")
+"RTN","BSDX16",19,0)
+ ;
+"RTN","BSDX16",20,0)
+ S X="ERROR^BSDX16",@^%ZOSF("TRAP")
+"RTN","BSDX16",21,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXINA,BSDXNOTE,BSDXNAM
+"RTN","BSDX16",22,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX16",23,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX16",24,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX16",25,0)
+ ; Changed following from a $G = "" to $D check: $G didn't work since BSDXVAL is an array. MJL 10/18/2006
+"RTN","BSDX16",26,0)
+ I BSDXVAL="",$D(BSDXVAL)<2 D ERR(0,"BSDX16: Invalid null input Parameter") Q
+"RTN","BSDX16",27,0)
+ ;Unpack array at @XWBARY
+"RTN","BSDX16",28,0)
+ I BSDXVAL="" D
+"RTN","BSDX16",29,0)
+ . N BSDXC S BSDXC=0 F  S BSDXC=$O(BSDXVAL(BSDXC)) Q:'BSDXC  D
+"RTN","BSDX16",30,0)
+ . . S BSDXVAL=BSDXVAL_BSDXVAL(BSDXC)
+"RTN","BSDX16",31,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX16",32,0)
+ I +BSDXIEN D
+"RTN","BSDX16",33,0)
+ . S BSDX="EDIT"
+"RTN","BSDX16",34,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX16",35,0)
+ E  D
+"RTN","BSDX16",36,0)
+ . S BSDX="ADD"
+"RTN","BSDX16",37,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX16",38,0)
+ ;
+"RTN","BSDX16",39,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX16",40,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX16",41,0)
+ I $D(^BSDXRES("B",BSDXNAM)),$O(^BSDXRES("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX16",42,0)
+ . D ERR(0,"BSDX16: Cannot have two Resources with the same name.")
+"RTN","BSDX16",43,0)
+ . Q
+"RTN","BSDX16",44,0)
+ ;
+"RTN","BSDX16",45,0)
+ S BSDXINA=$P(BSDXVAL,"|",3)
+"RTN","BSDX16",46,0)
+ S BSDXINA=$S(BSDXINA="YES":1,1:0)
+"RTN","BSDX16",47,0)
+ ;
+"RTN","BSDX16",48,0)
+ S BSDXFDA(9002018.1,BSDXIENS,.01)=$P(BSDXVAL,"|",2) ;NAME
+"RTN","BSDX16",49,0)
+ S BSDXFDA(9002018.1,BSDXIENS,.02)=BSDXINA ;INACTIVE
+"RTN","BSDX16",50,0)
+ I +$P(BSDXVAL,"|",5) S BSDXFDA(9002018.1,BSDXIENS,.03)=+$P(BSDXVAL,"|",5) ;TIME SCALE
+"RTN","BSDX16",51,0)
+ I +$P(BSDXVAL,"|",4) S BSDXFDA(9002018.1,BSDXIENS,.04)=$P(BSDXVAL,"|",4) ;HOSPITAL LOCATION
+"RTN","BSDX16",52,0)
+ K BSDXMSG
+"RTN","BSDX16",53,0)
+ I BSDX="ADD" D  ;TODO: Check for error
+"RTN","BSDX16",54,0)
+ . K BSDXIEN
+"RTN","BSDX16",55,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX16",56,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX16",57,0)
+ E  D
+"RTN","BSDX16",58,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX16",59,0)
+ ;
+"RTN","BSDX16",60,0)
+ ;LETTER TEXT wp field
+"RTN","BSDX16",61,0)
+ S BSDXNOTE=$P(BSDXVAL,"|",6)
+"RTN","BSDX16",62,0)
+ ;
+"RTN","BSDX16",63,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX16",64,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX16",65,0)
+ ;
+"RTN","BSDX16",66,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX16",67,0)
+ . D WP^DIE(9002018.1,BSDXIEN_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX16",68,0)
+ ;
+"RTN","BSDX16",69,0)
+ ;NO SHOW LETTER wp fields
+"RTN","BSDX16",70,0)
+ K BSDXNOTE
+"RTN","BSDX16",71,0)
+ S BSDXNOTE=$P(BSDXVAL,"|",7)
+"RTN","BSDX16",72,0)
+ ;
+"RTN","BSDX16",73,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX16",74,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX16",75,0)
+ ;
+"RTN","BSDX16",76,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX16",77,0)
+ . D WP^DIE(9002018.1,BSDXIEN_",",1201,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX16",78,0)
+ ;
+"RTN","BSDX16",79,0)
+ ;CANCELLATION LETTER wp field
+"RTN","BSDX16",80,0)
+ K BSDXNOTE
+"RTN","BSDX16",81,0)
+ S BSDXNOTE=$P(BSDXVAL,"|",8)
+"RTN","BSDX16",82,0)
+ ;
+"RTN","BSDX16",83,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX16",84,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX16",85,0)
+ ;
+"RTN","BSDX16",86,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX16",87,0)
+ . D WP^DIE(9002018.1,BSDXIEN_",",1301,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX16",88,0)
+ ;
+"RTN","BSDX16",89,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^"_$C(30)_$C(31)
+"RTN","BSDX16",90,0)
+ Q
+"RTN","BSDX16",91,0)
+ ;
+"RTN","BSDX16",92,0)
+ERROR ;
+"RTN","BSDX16",93,0)
+ D ^%ZTER
+"RTN","BSDX16",94,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX16",95,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX16",96,0)
+ D ERR(0,"BSDX16 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX16",97,0)
+ Q
+"RTN","BSDX16",98,0)
+ ;
+"RTN","BSDX16",99,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX16",100,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX16",101,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX16",102,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX16",103,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX16",104,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX16",105,0)
+ Q
+"RTN","BSDX17")
+0^15^B2072173
+"RTN","BSDX17",1,0)
+BSDX17 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX17",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX17",3,0)
+ ;
+"RTN","BSDX17",4,0)
+ ;
+"RTN","BSDX17",5,0)
+SCHUSRD(BSDXY) ;EP
+"RTN","BSDX17",6,0)
+ ;Entry point for debugging
+"RTN","BSDX17",7,0)
+ ;
+"RTN","BSDX17",8,0)
+ ;D DEBUG^%Serenji("SCHUSR^BSDX17(.BSDXY)")
+"RTN","BSDX17",9,0)
+ Q
+"RTN","BSDX17",10,0)
+ ;
+"RTN","BSDX17",11,0)
+SCHUSR(BSDXY) ;EP
+"RTN","BSDX17",12,0)
+ ;Return recordset of all users in NEW PERSON having BSDXZMENU key
+"RTN","BSDX17",13,0)
+ ;Called by BSDX SCHEDULE USER
+"RTN","BSDX17",14,0)
+ ;Test Line:
+"RTN","BSDX17",15,0)
+ ;D SCHUSR^BSDX17(.RES)
+"RTN","BSDX17",16,0)
+ ;
+"RTN","BSDX17",17,0)
+ N BSDXDUZ,BSDXKEY,BSDXI,BSDXNAM,BSDXKEYN
+"RTN","BSDX17",18,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX17",19,0)
+ K ^TEMP($J,"BSDX17")
+"RTN","BSDX17",20,0)
+ S BSDXI=0
+"RTN","BSDX17",21,0)
+ S ^BSDXTMP($J,0)="I00020USERID^T00030USERNAME"_$C(30)
+"RTN","BSDX17",22,0)
+ ;$O Through ^VA(200,"AB",
+"RTN","BSDX17",23,0)
+ F BSDXKEYN="BSDXZMENU","BSDXZMGR","XUPROGMODE" S BSDXKEY=+$O(^DIC(19.1,"B",BSDXKEYN,0)) D
+"RTN","BSDX17",24,0)
+ . Q:'+BSDXKEY  S BSDXDUZ=0 F  S BSDXDUZ=$O(^VA(200,"AB",BSDXKEY,BSDXDUZ)) Q:'+BSDXDUZ  D
+"RTN","BSDX17",25,0)
+ . . Q:BSDXDUZ<1  ;IHS/HMW **1**
+"RTN","BSDX17",26,0)
+ . . Q:'$D(^VA(200,BSDXDUZ,0))
+"RTN","BSDX17",27,0)
+ . . Q:$D(^TEMP($J,"BSDX17",BSDXDUZ))
+"RTN","BSDX17",28,0)
+ . . S BSDXNAM=$P(^VA(200,BSDXDUZ,0),U)
+"RTN","BSDX17",29,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX17",30,0)
+ . . S ^TEMP($J,"BSDX17",BSDXDUZ)=""
+"RTN","BSDX17",31,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXDUZ_"^"_BSDXNAM_$C(30)
+"RTN","BSDX17",32,0)
+ . . Q
+"RTN","BSDX17",33,0)
+ . Q
+"RTN","BSDX17",34,0)
+ ;
+"RTN","BSDX17",35,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX17",36,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX17",37,0)
+ Q
+"RTN","BSDX18")
+0^16^B87953431
+"RTN","BSDX18",1,0)
+BSDX18 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX18",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX18",3,0)
+ ;
+"RTN","BSDX18",4,0)
+ ;
+"RTN","BSDX18",5,0)
+DELRUD(BSDXY,BSDXIEN) ;EP
+"RTN","BSDX18",6,0)
+ ;Entry point for debugging
+"RTN","BSDX18",7,0)
+ ;
+"RTN","BSDX18",8,0)
+ ;D DEBUG^%Serenji("DELRU^BSDX18(.BSDXY,BSDXIEN)")
+"RTN","BSDX18",9,0)
+ Q
+"RTN","BSDX18",10,0)
+ ;
+"RTN","BSDX18",11,0)
+DELRU(BSDXY,BSDXIEN) ;EP
+"RTN","BSDX18",12,0)
+ ;Deletes entry BSDXIEN from RESOURCE USERS file
+"RTN","BSDX18",13,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX18",14,0)
+ ;Called by BSDX DELETE RESOURCEUSER
+"RTN","BSDX18",15,0)
+ ;Test Line:
+"RTN","BSDX18",16,0)
+ ;D DELRU^BSDX18(.RES,99)
+"RTN","BSDX18",17,0)
+ ;
+"RTN","BSDX18",18,0)
+ N BSDXI,DIK,DA
+"RTN","BSDX18",19,0)
+ S BSDXI=0
+"RTN","BSDX18",20,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX18",21,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEUSERID^I00020ERRORID"_$C(30)
+"RTN","BSDX18",22,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",23,0)
+ I '$D(^BSDXRSU(BSDXIEN,0)) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",24,0)
+ ;Delete entry BSDXIEN
+"RTN","BSDX18",25,0)
+ S DIK="^BSDXRSU("
+"RTN","BSDX18",26,0)
+ S DA=BSDXIEN
+"RTN","BSDX18",27,0)
+ D ^DIK
+"RTN","BSDX18",28,0)
+ ;
+"RTN","BSDX18",29,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX18",30,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX18",31,0)
+ Q
+"RTN","BSDX18",32,0)
+ ;
+"RTN","BSDX18",33,0)
+ADDRUD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX18",34,0)
+ ;Entry point for debugging
+"RTN","BSDX18",35,0)
+ ;
+"RTN","BSDX18",36,0)
+ ;D DEBUG^%Serenji("ADDRU^BSDX18(.BSDXY,BSDXVAL)")
+"RTN","BSDX18",37,0)
+ Q
+"RTN","BSDX18",38,0)
+ ;
+"RTN","BSDX18",39,0)
+ADDRU(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX18",40,0)
+ ;
+"RTN","BSDX18",41,0)
+ ;Called by BSDX ADD/EDIT RESOURCEUSER
+"RTN","BSDX18",42,0)
+ ;Add/Edit BSDX RESOURCEUSER entry
+"RTN","BSDX18",43,0)
+ ;BSDXVAL is sResourceUserID|sOverbook|sModifySchedule|ResourceID|UserID|sModifyAppointments
+"RTN","BSDX18",44,0)
+ ;If IEN=0 Then this is a new ResourceUser entry
+"RTN","BSDX18",45,0)
+ ;Test Line:
+"RTN","BSDX18",46,0)
+ ;D ADDRU^BSDX18(.RES,"sResourceUserID|sOverbook|sModifySchedule|sResourceID|sUserID|sModifyAppointments")
+"RTN","BSDX18",47,0)
+ ;
+"RTN","BSDX18",48,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXOVB,BSDXMOD,BSDXI,BSDXUID,BSDXRID
+"RTN","BSDX18",49,0)
+ N BSDXRES,BSDXRSU,BSDXF,BSDXAPPT
+"RTN","BSDX18",50,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX18",51,0)
+ S BSDXI=0
+"RTN","BSDX18",52,0)
+ S ^BSDXTMP($J,BSDXI)="I00020RESOURCEID^I00020ERRORID"_$C(30)
+"RTN","BSDX18",53,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX18",54,0)
+ I +BSDXIEN D
+"RTN","BSDX18",55,0)
+ . S BSDX="EDIT"
+"RTN","BSDX18",56,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",57,0)
+ E  D
+"RTN","BSDX18",58,0)
+ . S BSDX="ADD"
+"RTN","BSDX18",59,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX18",60,0)
+ ;
+"RTN","BSDX18",61,0)
+ I '+$P(BSDXVAL,"|",4) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",62,0)
+ I '+$P(BSDXVAL,"|",5) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",63,0)
+ ;
+"RTN","BSDX18",64,0)
+ S BSDXRID=$P(BSDXVAL,"|",4) ;ResourceID
+"RTN","BSDX18",65,0)
+ S BSDXUID=$P(BSDXVAL,"|",5) ;UserID
+"RTN","BSDX18",66,0)
+ S BSDXRSU=0 ;ResourceUserID
+"RTN","BSDX18",67,0)
+ S BSDXF=0 ;flag
+"RTN","BSDX18",68,0)
+ ;If this is an add, check if the user is already assigned to the resource.
+"RTN","BSDX18",69,0)
+ ;If so, then change to an edit
+"RTN","BSDX18",70,0)
+ I BSDX="ADD" F  S BSDXRSU=$O(^BSDXRSU("AC",BSDXUID,BSDXRSU)) Q:'+BSDXRSU  D  Q:BSDXF
+"RTN","BSDX18",71,0)
+ . S BSDXRES=$G(^BSDXRSU(BSDXRSU,0))
+"RTN","BSDX18",72,0)
+ . S BSDXRES=$P(BSDXRES,U) ;ResourceID
+"RTN","BSDX18",73,0)
+ . S:BSDXRES=BSDXRID BSDXF=1
+"RTN","BSDX18",74,0)
+ I BSDXF S BSDX="EDIT",BSDXIEN=BSDXRSU,BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",75,0)
+ ;
+"RTN","BSDX18",76,0)
+ S BSDXOVB=$P(BSDXVAL,"|",2)
+"RTN","BSDX18",77,0)
+ S BSDXOVB=$S(BSDXOVB="YES":1,1:0)
+"RTN","BSDX18",78,0)
+ S BSDXMOD=$P(BSDXVAL,"|",3)
+"RTN","BSDX18",79,0)
+ S BSDXMOD=$S(BSDXMOD="YES":1,1:0)
+"RTN","BSDX18",80,0)
+ S BSDXAPPT=$P(BSDXVAL,"|",6)
+"RTN","BSDX18",81,0)
+ S BSDXAPPT=$S(BSDXAPPT="YES":1,1:0)
+"RTN","BSDX18",82,0)
+ ;
+"RTN","BSDX18",83,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.01)=$P(BSDXVAL,"|",4) ;RESOURCE ID
+"RTN","BSDX18",84,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.02)=$P(BSDXVAL,"|",5) ;USERID
+"RTN","BSDX18",85,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.03)=BSDXOVB ;OVERBOOK
+"RTN","BSDX18",86,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.04)=BSDXMOD ;MODIFY SCHEDULE
+"RTN","BSDX18",87,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.05)=BSDXAPPT ;ADD, EDIT, DELETE APPOINMENTS
+"RTN","BSDX18",88,0)
+ K BSDXMSG
+"RTN","BSDX18",89,0)
+ I BSDX="ADD" D
+"RTN","BSDX18",90,0)
+ . K BSDXIEN
+"RTN","BSDX18",91,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX18",92,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX18",93,0)
+ E  D
+"RTN","BSDX18",94,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX18",95,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^-1"_$C(31)
+"RTN","BSDX18",96,0)
+ Q
+"RTN","BSDX18",97,0)
+ ;
+"RTN","BSDX18",98,0)
+ERR(BSDXI,BSDXID,BSDXERR) ;Error processing
+"RTN","BSDX18",99,0)
+ S BSDXERR=BSDXERR+134234112 ;vbObjectError
+"RTN","BSDX18",100,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX18",101,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXID_"^"_BSDXERR_$C(30)
+"RTN","BSDX18",102,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX18",103,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX18",104,0)
+ Q
+"RTN","BSDX18",105,0)
+ ;
+"RTN","BSDX18",106,0)
+MADERR(BSDXMSG) ;
+"RTN","BSDX18",107,0)
+ W !,BSDXMSG
+"RTN","BSDX18",108,0)
+ Q
+"RTN","BSDX18",109,0)
+ ;
+"RTN","BSDX18",110,0)
+MADSCR(BSDXDUZ,BSDXZMGR,BSDXZMENU,BSDXZPROG) ;EP - File 200 screening code for MADDRU
+"RTN","BSDX18",111,0)
+ ;Called from DIR to screen for scheduling users
+"RTN","BSDX18",112,0)
+ I $D(^VA(200,BSDXDUZ,51,"B",BSDXZMENU)) Q 1
+"RTN","BSDX18",113,0)
+ I $D(^VA(200,BSDXDUZ,51,"B",BSDXZMGR)) Q 1
+"RTN","BSDX18",114,0)
+ I $D(^VA(200,BSDXDUZ,51,"B",BSDXZPROG)) Q 1
+"RTN","BSDX18",115,0)
+ Q 0
+"RTN","BSDX18",116,0)
+ ;
+"RTN","BSDX18",117,0)
+MADDRU ;EP -Command line utility to bulk-add users and set access rights IHS/HMW 20060420 **1**
+"RTN","BSDX18",118,0)
+ ;Main entry point
+"RTN","BSDX18",119,0)
+ ;
+"RTN","BSDX18",120,0)
+ N BSDX,BSDXZMENU,BSDXZMGR,BSDXZPROG,DIR
+"RTN","BSDX18",121,0)
+ ;
+"RTN","BSDX18",122,0)
+ ;INIT
+"RTN","BSDX18",123,0)
+ K ^TMP($J)
+"RTN","BSDX18",124,0)
+ S BSDXZMENU=$O(^DIC(19.1,"B","BSDXZMENU",0)) I '+BSDXZMENU D MADERR("Error: BSDXZMENU KEY NOT FOUND.") Q
+"RTN","BSDX18",125,0)
+ S BSDXZMGR=$O(^DIC(19.1,"B","BSDXZMGR",0)) I '+BSDXZMGR D MADERR("Error: BSDXZMGR KEY NOT FOUND.") Q
+"RTN","BSDX18",126,0)
+ S BSDXZPROG=$O(^DIC(19.1,"B","XUPROGMODE",0)) I '+BSDXZPROG D MADERR("Error: XUPROGMODE KEY NOT FOUND.") Q
+"RTN","BSDX18",127,0)
+ ;
+"RTN","BSDX18",128,0)
+ D MADUSR
+"RTN","BSDX18",129,0)
+ I '$D(^TMP($J,"BSDX MADDRU","USER")) D MADERR("Cancelled:  No Users selected.") Q
+"RTN","BSDX18",130,0)
+ D MADRES
+"RTN","BSDX18",131,0)
+ I '$D(^TMP($J,"BSDX MADDRU","RESOURCE")) D MADERR("Cancelled:  No Resources selected.") Q
+"RTN","BSDX18",132,0)
+ I '$$MADACC(.BSDX) ;D MADERR("Selected users will have no access to the selected clinics.")
+"RTN","BSDX18",133,0)
+ I '$$MADCONF(.BSDX) W ! D MADERR("--Cancelled") Q
+"RTN","BSDX18",134,0)
+ D MADASS(.BSDX)
+"RTN","BSDX18",135,0)
+ W ! D MADERR("--Done")
+"RTN","BSDX18",136,0)
+ ;
+"RTN","BSDX18",137,0)
+ Q
+"RTN","BSDX18",138,0)
+ ;
+"RTN","BSDX18",139,0)
+MADUSR ;Prompt for users from file 200 who have BSDXUSER key
+"RTN","BSDX18",140,0)
+ ;Store results in ^TMP($J,"BSDX MADDRU","USER",DUZ) array
+"RTN","BSDX18",141,0)
+ N DIRUT,Y,DIR
+"RTN","BSDX18",142,0)
+ S DIR(0)="PO^200:EMZ",DIR("S")="I $$MADSCR^BSDX18(Y,BSDXZMGR,BSDXZMENU,BSDXZPROG)"
+"RTN","BSDX18",143,0)
+ S Y=0
+"RTN","BSDX18",144,0)
+ K ^TMP($J,"BSDX MADDRU","USER")
+"RTN","BSDX18",145,0)
+ W !!,"-------Select Users-------"
+"RTN","BSDX18",146,0)
+ F  D ^DIR Q:$G(DIRUT)  Q:'Y  D
+"RTN","BSDX18",147,0)
+ . S ^TMP($J,"BSDX MADDRU","USER",+Y)=""
+"RTN","BSDX18",148,0)
+ Q
+"RTN","BSDX18",149,0)
+ ;
+"RTN","BSDX18",150,0)
+MADRES ;Prompt for Resources
+"RTN","BSDX18",151,0)
+ ;Store results in ^TMP($J,"BSDX MADDRU","RESOURCE",ResourceID) array
+"RTN","BSDX18",152,0)
+ N DIRUT,Y,DIR
+"RTN","BSDX18",153,0)
+ S DIR(0)="PO^9002018.1:EMZ"
+"RTN","BSDX18",154,0)
+ S Y=0
+"RTN","BSDX18",155,0)
+ K ^TMP($J,"BSDX MADDRU","RESOURCE")
+"RTN","BSDX18",156,0)
+ W !!,"-------Select Resources-------"
+"RTN","BSDX18",157,0)
+ F  D ^DIR Q:$G(DIRUT)  Q:'Y  D
+"RTN","BSDX18",158,0)
+ . S ^TMP($J,"BSDX MADDRU","RESOURCE",+Y)=""
+"RTN","BSDX18",159,0)
+ Q
+"RTN","BSDX18",160,0)
+ ;
+"RTN","BSDX18",161,0)
+MADACC(BSDX) ;Prompt for access level.
+"RTN","BSDX18",162,0)
+ ;Start with Overbook and go to read-only access.
+"RTN","BSDX18",163,0)
+ ;Store results in variables for:
+"RTN","BSDX18",164,0)
+ ;sOverbook, sModifySchedule, sModifyAppointments
+"RTN","BSDX18",165,0)
+ ;
+"RTN","BSDX18",166,0)
+ N DIRUT,Y,DIR,J
+"RTN","BSDX18",167,0)
+ W !!,"-------Select Access Level-------"
+"RTN","BSDX18",168,0)
+ S Y=0
+"RTN","BSDX18",169,0)
+ F J="MODIFY","OVERBOOK","WRITE","READ" S BSDX(J)=1
+"RTN","BSDX18",170,0)
+ S DIR(0)="Y"
+"RTN","BSDX18",171,0)
+ ;
+"RTN","BSDX18",172,0)
+ S DIR("A")="Allow users to Modify Clinic Availability"
+"RTN","BSDX18",173,0)
+ D ^DIR
+"RTN","BSDX18",174,0)
+ Q:$G(DIRUT) 0
+"RTN","BSDX18",175,0)
+ Q:Y 1
+"RTN","BSDX18",176,0)
+ S BSDX("MODIFY")=0
+"RTN","BSDX18",177,0)
+ ;
+"RTN","BSDX18",178,0)
+ S DIR("A")="Allow users to Overbook the selected clinics"
+"RTN","BSDX18",179,0)
+ D ^DIR
+"RTN","BSDX18",180,0)
+ Q:$G(DIRUT) 0
+"RTN","BSDX18",181,0)
+ Q:Y 1
+"RTN","BSDX18",182,0)
+ S BSDX("OVERBOOK")=0
+"RTN","BSDX18",183,0)
+ ;
+"RTN","BSDX18",184,0)
+ S DIR("A")="Allow users to Add, Edit and Delete appointments in the selected resources"
+"RTN","BSDX18",185,0)
+ D ^DIR
+"RTN","BSDX18",186,0)
+ Q:$G(DIRUT)
+"RTN","BSDX18",187,0)
+ Q:Y 1
+"RTN","BSDX18",188,0)
+ S BSDX("WRITE")=0
+"RTN","BSDX18",189,0)
+ ;
+"RTN","BSDX18",190,0)
+ S DIR("A")="Allow users to View appointments in the selected resources"
+"RTN","BSDX18",191,0)
+ D ^DIR
+"RTN","BSDX18",192,0)
+ Q:$G(DIRUT)
+"RTN","BSDX18",193,0)
+ Q:Y 1
+"RTN","BSDX18",194,0)
+ S BSDX("READ")=0
+"RTN","BSDX18",195,0)
+ ;
+"RTN","BSDX18",196,0)
+ Q 0
+"RTN","BSDX18",197,0)
+ ;
+"RTN","BSDX18",198,0)
+MADCONF(BSDX) ;Confirm selections
+"RTN","BSDX18",199,0)
+ N DIR,DIRUT,Y
+"RTN","BSDX18",200,0)
+ S DIR(0)="Y"
+"RTN","BSDX18",201,0)
+ W !!,"-------Confirm Selections-------"
+"RTN","BSDX18",202,0)
+ I BSDX("READ")=0 D
+"RTN","BSDX18",203,0)
+ . S DIR("A")="Are you sure you want to remove all access to these clinics for these users"
+"RTN","BSDX18",204,0)
+ E  D
+"RTN","BSDX18",205,0)
+ . W !,"Selected users will be assigned the following access:"
+"RTN","BSDX18",206,0)
+ . W !,"Modify clinic availability:  ",?50,BSDX("MODIFY")
+"RTN","BSDX18",207,0)
+ . W !,"Overbook Appointments:  ",?50,BSDX("OVERBOOK")
+"RTN","BSDX18",208,0)
+ . W !,"Add, Edit and Delete Appointments:  ",?50,BSDX("WRITE")
+"RTN","BSDX18",209,0)
+ . W !,"View Clinic Appointments:  ",?50,BSDX("READ")
+"RTN","BSDX18",210,0)
+ . S DIR("A")="Are you sure you want to assign these access rights to the selected users"
+"RTN","BSDX18",211,0)
+ D ^DIR
+"RTN","BSDX18",212,0)
+ Q:$G(DIRUT) 0
+"RTN","BSDX18",213,0)
+ Q:$G(Y) 1
+"RTN","BSDX18",214,0)
+ Q 0
+"RTN","BSDX18",215,0)
+ ;
+"RTN","BSDX18",216,0)
+MADASS(BSDX) ;
+"RTN","BSDX18",217,0)
+ ;Assign access level to selected users and resources
+"RTN","BSDX18",218,0)
+ ;Loop through selected users
+"RTN","BSDX18",219,0)
+ ;. Loop through selected resources
+"RTN","BSDX18",220,0)
+ ; . . If an entry in ^BSDXRSU for this user/resource combination exists, then
+"RTN","BSDX18",221,0)
+ ; . . . S sResourceUserID = to it
+"RTN","BSDX18",222,0)
+ ; . . Else
+"RTN","BSDX18",223,0)
+ ; . . . S sResourceUserID = 0
+"RTN","BSDX18",224,0)
+ ; . . Call MADFILE
+"RTN","BSDX18",225,0)
+ N BSDXU,BSDXR,BSDXRUID,BSDXVAL
+"RTN","BSDX18",226,0)
+ S BSDXU=0
+"RTN","BSDX18",227,0)
+ F  S BSDXU=$O(^TMP($J,"BSDX MADDRU","USER",BSDXU)) Q:'+BSDXU  D
+"RTN","BSDX18",228,0)
+ . S BSDXR=0 F  S BSDXR=$O(^TMP($J,"BSDX MADDRU","RESOURCE",BSDXR)) Q:'+BSDXR  D
+"RTN","BSDX18",229,0)
+ . . S BSDXRUID=$$MADEXST(BSDXU,BSDXR)
+"RTN","BSDX18",230,0)
+ . . S BSDXVAL=BSDXRUID_"|"_BSDX("OVERBOOK")_"|"_BSDX("MODIFY")_"|"_BSDXR_"|"_BSDXU_"|"_BSDX("WRITE")
+"RTN","BSDX18",231,0)
+ . . I +BSDXRUID,BSDX("READ")=0 D MADDEL(BSDXRUID)
+"RTN","BSDX18",232,0)
+ . . Q:BSDX("READ")=0
+"RTN","BSDX18",233,0)
+ . . D MADFILE(BSDXVAL)
+"RTN","BSDX18",234,0)
+ . . Q
+"RTN","BSDX18",235,0)
+ . Q
+"RTN","BSDX18",236,0)
+ Q
+"RTN","BSDX18",237,0)
+ ;
+"RTN","BSDX18",238,0)
+MADDEL(BSDXRUID) ;
+"RTN","BSDX18",239,0)
+ ;Delete entry BSDXRUID from BSDX RESOURCE USER file
+"RTN","BSDX18",240,0)
+ N DIK,DA
+"RTN","BSDX18",241,0)
+ Q:'+BSDXRUID
+"RTN","BSDX18",242,0)
+ Q:'$D(^BSDXRSU(BSDXRUID))
+"RTN","BSDX18",243,0)
+ S DIK="^BSDXRSU("
+"RTN","BSDX18",244,0)
+ S DA=BSDXRUID
+"RTN","BSDX18",245,0)
+ D ^DIK
+"RTN","BSDX18",246,0)
+ Q
+"RTN","BSDX18",247,0)
+ ;
+"RTN","BSDX18",248,0)
+MADFILE(BSDXVAL) ;
+"RTN","BSDX18",249,0)
+ ;
+"RTN","BSDX18",250,0)
+ ;Add/Edit BSDX RESOURCEUSER entry
+"RTN","BSDX18",251,0)
+ ;BSDXVAL is sResourceUserID|sOverbook|sModifySchedule|ResourceID|UserID|sModifyAppointments
+"RTN","BSDX18",252,0)
+ ;If sResourceUserID=0 Then this is a new ResourceUser entry
+"RTN","BSDX18",253,0)
+ ;
+"RTN","BSDX18",254,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXOVB,BSDXMOD,BSDXI,BSDXUID,BSDXRID
+"RTN","BSDX18",255,0)
+ N BSDXRES,BSDXRSU,BSDXF,BSDXAPPT
+"RTN","BSDX18",256,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX18",257,0)
+ I +BSDXIEN D
+"RTN","BSDX18",258,0)
+ . S BSDX="EDIT"
+"RTN","BSDX18",259,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",260,0)
+ E  D
+"RTN","BSDX18",261,0)
+ . S BSDX="ADD"
+"RTN","BSDX18",262,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX18",263,0)
+ ;
+"RTN","BSDX18",264,0)
+ I '+$P(BSDXVAL,"|",4) D MADERR("Error in MADFILE^BSDX18: No Resource ID") Q
+"RTN","BSDX18",265,0)
+ I '+$P(BSDXVAL,"|",5) D MADERR("Error in MADFILE^BSDX18: No User ID") Q
+"RTN","BSDX18",266,0)
+ ;
+"RTN","BSDX18",267,0)
+ S BSDXRID=$P(BSDXVAL,"|",4) ;ResourceID
+"RTN","BSDX18",268,0)
+ S BSDXUID=$P(BSDXVAL,"|",5) ;UserID
+"RTN","BSDX18",269,0)
+ S BSDXRSU=0 ;ResourceUserID
+"RTN","BSDX18",270,0)
+ S BSDXF=0 ;flag
+"RTN","BSDX18",271,0)
+ ;If this is an add, check if the user is already assigned to the resource.
+"RTN","BSDX18",272,0)
+ ;If so, then change to an edit
+"RTN","BSDX18",273,0)
+ I BSDX="ADD" F  S BSDXRSU=$O(^BSDXRSU("AC",BSDXUID,BSDXRSU)) Q:'+BSDXRSU  D  Q:BSDXF
+"RTN","BSDX18",274,0)
+ . S BSDXRES=$G(^BSDXRSU(BSDXRSU,0))
+"RTN","BSDX18",275,0)
+ . S BSDXRES=$P(BSDXRES,U) ;ResourceID
+"RTN","BSDX18",276,0)
+ . S:BSDXRES=BSDXRID BSDXF=1
+"RTN","BSDX18",277,0)
+ I BSDXF S BSDX="EDIT",BSDXIEN=BSDXRSU,BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",278,0)
+ ;
+"RTN","BSDX18",279,0)
+ S BSDXOVB=$P(BSDXVAL,"|",2)
+"RTN","BSDX18",280,0)
+ S BSDXMOD=$P(BSDXVAL,"|",3)
+"RTN","BSDX18",281,0)
+ S BSDXAPPT=$P(BSDXVAL,"|",6)
+"RTN","BSDX18",282,0)
+ ;
+"RTN","BSDX18",283,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.01)=$P(BSDXVAL,"|",4) ;RESOURCE ID
+"RTN","BSDX18",284,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.02)=$P(BSDXVAL,"|",5) ;USERID
+"RTN","BSDX18",285,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.03)=BSDXOVB ;OVERBOOK
+"RTN","BSDX18",286,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.04)=BSDXMOD ;MODIFY SCHEDULE
+"RTN","BSDX18",287,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.05)=BSDXAPPT ;ADD, EDIT, DELETE APPOINMENTS
+"RTN","BSDX18",288,0)
+ K BSDXMSG
+"RTN","BSDX18",289,0)
+ I BSDX="ADD" D
+"RTN","BSDX18",290,0)
+ . K BSDXIEN
+"RTN","BSDX18",291,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX18",292,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX18",293,0)
+ E  D
+"RTN","BSDX18",294,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX18",295,0)
+ Q
+"RTN","BSDX18",296,0)
+ ;
+"RTN","BSDX18",297,0)
+MADEXST(BSDXU,BSDXR) ;
+"RTN","BSDX18",298,0)
+ ;Returns BSDX RESOURCE USER ID
+"RTN","BSDX18",299,0)
+ ;if there is a BSDX RESOURCE USER entry for
+"RTN","BSDX18",300,0)
+ ;user BSDXU and resource BSDXR
+"RTN","BSDX18",301,0)
+ ;Otherwise, returns 0
+"RTN","BSDX18",302,0)
+ ;
+"RTN","BSDX18",303,0)
+ N BSDXID,BSDXFOUND,BSDXNOD
+"RTN","BSDX18",304,0)
+ I '$D(^BSDXRSU("AC",BSDXU)) Q 0
+"RTN","BSDX18",305,0)
+ S BSDXID=0,BSDXFOUND=0
+"RTN","BSDX18",306,0)
+ F  S BSDXID=$O(^BSDXRSU("AC",BSDXU,BSDXID)) Q:'+BSDXID  D  Q:BSDXFOUND
+"RTN","BSDX18",307,0)
+ . S BSDXNOD=$G(^BSDXRSU(BSDXID,0))
+"RTN","BSDX18",308,0)
+ . I +BSDXNOD=BSDXR S BSDXFOUND=BSDXID
+"RTN","BSDX18",309,0)
+ . Q
+"RTN","BSDX18",310,0)
+ Q BSDXFOUND
+"RTN","BSDX19")
+0^17^B7890401
+"RTN","BSDX19",1,0)
+BSDX19 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX19",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX19",3,0)
+ ;
+"RTN","BSDX19",4,0)
+ ;
+"RTN","BSDX19",5,0)
+ADDRGD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX19",6,0)
+ ;Entry point for debugging
+"RTN","BSDX19",7,0)
+ ;
+"RTN","BSDX19",8,0)
+ ;D DEBUG^%Serenji("ADDRG^BSDX19(.BSDXY,BSDXVAL)")
+"RTN","BSDX19",9,0)
+ Q
+"RTN","BSDX19",10,0)
+ ;
+"RTN","BSDX19",11,0)
+ADDRG(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX19",12,0)
+ ;Called by BSDX ADD/EDIT RESOURCE GROUP
+"RTN","BSDX19",13,0)
+ ;Add a new BSDX RESOURCE GROUP entry
+"RTN","BSDX19",14,0)
+ ;BSDXVAL is IEN|NAME of the entry
+"RTN","BSDX19",15,0)
+ ;Returns IEN of added/edited entry or 0 if error
+"RTN","BSDX19",16,0)
+ ;
+"RTN","BSDX19",17,0)
+ S X="ERROR^BSDX19",@^%ZOSF("TRAP")
+"RTN","BSDX19",18,0)
+ N BSDXIENS,BSDXFDA,BSDXMSG,BSDXIEN,BSDX,BSDXNAM
+"RTN","BSDX19",19,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX19",20,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX19",21,0)
+ I BSDXVAL="" D ERR(0,"BSDX16: Invalid null input Parameter") Q
+"RTN","BSDX19",22,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX19",23,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX19",24,0)
+ I +BSDXIEN D
+"RTN","BSDX19",25,0)
+ . S BSDX="EDIT"
+"RTN","BSDX19",26,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX19",27,0)
+ E  D
+"RTN","BSDX19",28,0)
+ . S BSDX="ADD"
+"RTN","BSDX19",29,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX19",30,0)
+ ;
+"RTN","BSDX19",31,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX19",32,0)
+ I $D(^BSDXDEPT("B",BSDXNAM)),$O(^BSDXDEPT("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX19",33,0)
+ . D ERR(0,"BSDX19: Cannot have two Resource Groups with the same name.")
+"RTN","BSDX19",34,0)
+ . Q
+"RTN","BSDX19",35,0)
+ ;
+"RTN","BSDX19",36,0)
+ S BSDXFDA(9002018.2,BSDXIENS,.01)=BSDXNAM ;NAME
+"RTN","BSDX19",37,0)
+ I BSDX="ADD" D
+"RTN","BSDX19",38,0)
+ . K BSDXIEN
+"RTN","BSDX19",39,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX19",40,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX19",41,0)
+ E  D
+"RTN","BSDX19",42,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX19",43,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^"_$C(30)_$C(31)
+"RTN","BSDX19",44,0)
+ Q
+"RTN","BSDX19",45,0)
+ ;
+"RTN","BSDX19",46,0)
+DELRGD(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX19",47,0)
+ ;Entry point for debugging
+"RTN","BSDX19",48,0)
+ ;
+"RTN","BSDX19",49,0)
+ ;D DEBUG^%Serenji("DELRG^BSDX19(.BSDXY,BSDXGRP)")
+"RTN","BSDX19",50,0)
+ Q
+"RTN","BSDX19",51,0)
+ ;
+"RTN","BSDX19",52,0)
+DELRG(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX19",53,0)
+ ;Deletes entry name BSDXGRP from BSDX RESOURCE GROUP file
+"RTN","BSDX19",54,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX19",55,0)
+ ;Called by BSDX DELETE RESOURCE GROUP
+"RTN","BSDX19",56,0)
+ ;Test Line:
+"RTN","BSDX19",57,0)
+ ;D DELRU^BSDX18(.RES,99)
+"RTN","BSDX19",58,0)
+ ;
+"RTN","BSDX19",59,0)
+ N BSDXI,DIK,DA,BSDXIEN
+"RTN","BSDX19",60,0)
+ S BSDXI=0
+"RTN","BSDX19",61,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX19",62,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX19",63,0)
+ I BSDXGRP="" D ERR(0,"DELRG~BSDX19: Invalid null Resource Group Name") Q
+"RTN","BSDX19",64,0)
+ S BSDXIEN=$O(^BSDXDEPT("B",BSDXGRP,0))
+"RTN","BSDX19",65,0)
+ I '+BSDXIEN D ERR(0,"DELRG~BSDX19: Invalid Resource Group Name") Q
+"RTN","BSDX19",66,0)
+ I '$D(^BSDXDEPT(BSDXIEN,0)) D ERR(0,"DELRG~BSDX19: Invalid Resource Group IEN") Q
+"RTN","BSDX19",67,0)
+ ;Delete entry BSDXIEN
+"RTN","BSDX19",68,0)
+ S DIK="^BSDXDEPT("
+"RTN","BSDX19",69,0)
+ S DA=BSDXIEN
+"RTN","BSDX19",70,0)
+ D ^DIK
+"RTN","BSDX19",71,0)
+ ;
+"RTN","BSDX19",72,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",73,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_$C(30)_$C(31)
+"RTN","BSDX19",74,0)
+ Q
+"RTN","BSDX19",75,0)
+ ;
+"RTN","BSDX19",76,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX19",77,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX19",78,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",79,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX19",80,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",81,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX19",82,0)
+ Q
+"RTN","BSDX19",83,0)
+ ;
+"RTN","BSDX19",84,0)
+ERROR ;
+"RTN","BSDX19",85,0)
+ D ^%ZTER
+"RTN","BSDX19",86,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX19",87,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",88,0)
+ D ERR(0,"BSDX19 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX19",89,0)
+ Q
+"RTN","BSDX20")
+0^18^B5911607
+"RTN","BSDX20",1,0)
+BSDX20 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX20",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX20",3,0)
+ ;
+"RTN","BSDX20",4,0)
+ ;
+"RTN","BSDX20",5,0)
+DELRGID(BSDXY,BSDXIEN) ;EP
+"RTN","BSDX20",6,0)
+ ;Entry point for debugging
+"RTN","BSDX20",7,0)
+ ;
+"RTN","BSDX20",8,0)
+ ;D DEBUG^%Serenji("DELRGI^BSDX20(.BSDXY,BSDXIEN)")
+"RTN","BSDX20",9,0)
+ Q
+"RTN","BSDX20",10,0)
+ ;
+"RTN","BSDX20",11,0)
+DELRGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX20",12,0)
+ ;Deletes entry BSDXIEN1 from entry BSDXIEN in the RESOURCE GROUP file
+"RTN","BSDX20",13,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX20",14,0)
+ ;Called by BSDX DELETE RES GROUP ITEM
+"RTN","BSDX20",15,0)
+ ;Test Line:
+"RTN","BSDX20",16,0)
+ ;D DELRU^BSDX18(.RES,99)
+"RTN","BSDX20",17,0)
+ ;
+"RTN","BSDX20",18,0)
+ N BSDXI,DIK,DA
+"RTN","BSDX20",19,0)
+ S BSDXI=0
+"RTN","BSDX20",20,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX20",21,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPID^I00020ERRORID"_$C(30)
+"RTN","BSDX20",22,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",23,0)
+ I '+BSDXIEN1 D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",24,0)
+ I '$D(^BSDXDEPT(BSDXIEN,1,BSDXIEN1,0)) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",25,0)
+ ;
+"RTN","BSDX20",26,0)
+ ;Delete entry BSDXIEN1
+"RTN","BSDX20",27,0)
+ S DIK="^BSDXDEPT("_BSDXIEN_",1,"
+"RTN","BSDX20",28,0)
+ S DA=BSDXIEN1,DA(1)=BSDXIEN
+"RTN","BSDX20",29,0)
+ D ^DIK
+"RTN","BSDX20",30,0)
+ ;
+"RTN","BSDX20",31,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",32,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX20",33,0)
+ Q
+"RTN","BSDX20",34,0)
+ ;
+"RTN","BSDX20",35,0)
+ADDRGID(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX20",36,0)
+ ;Entry point for debugging
+"RTN","BSDX20",37,0)
+ ;
+"RTN","BSDX20",38,0)
+ ;D DEBUG^%Serenji("ADDRGI^BSDX20(.BSDXY,BSDXIEN,BSDXIEN1)")
+"RTN","BSDX20",39,0)
+ Q
+"RTN","BSDX20",40,0)
+ ;
+"RTN","BSDX20",41,0)
+ADDRGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX20",42,0)
+ ;Adds RESOURCEID BSEDXIEN1 to RESOURCE GROUP entry BSDXIEN
+"RTN","BSDX20",43,0)
+ ;Return recordset containing added subentry number error message or "" if no error
+"RTN","BSDX20",44,0)
+ ;Called by BSDX ADD RES GROUP ITEM
+"RTN","BSDX20",45,0)
+ ;Test Line:
+"RTN","BSDX20",46,0)
+ ;D ADDRGI^BSDX20(.RES,1,1)
+"RTN","BSDX20",47,0)
+ ;
+"RTN","BSDX20",48,0)
+ N BSDXI,BSDXIENS,BSDXMSG,BSDXFDA
+"RTN","BSDX20",49,0)
+ S X="ETRAP^BSDX20",@^%ZOSF("TRAP")
+"RTN","BSDX20",50,0)
+ S BSDXI=0
+"RTN","BSDX20",51,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX20",52,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPITEMID^I00020ERRORID"_$C(30)
+"RTN","BSDX20",53,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",54,0)
+ I '+BSDXIEN1 D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",55,0)
+ I '$D(^BSDXDEPT(BSDXIEN,0)) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",56,0)
+ I '$D(^BSDXRES(BSDXIEN1,0)) D ERR(BSDXI,BSDXIEN1,70) Q
+"RTN","BSDX20",57,0)
+ I $D(^BSDXDEPT(BSDXIEN,1,"B",BSDXIEN1)) D ERR(BSDXI,0,0) Q
+"RTN","BSDX20",58,0)
+ ;^BSDXDEPT(3,1,"B",3,1)=
+"RTN","BSDX20",59,0)
+ ;
+"RTN","BSDX20",60,0)
+ S BSDXIENS="+1,"_BSDXIEN_","
+"RTN","BSDX20",61,0)
+ S BSDXFDA(9002018.21,BSDXIENS,.01)=BSDXIEN1 ;RESOURCEID
+"RTN","BSDX20",62,0)
+ K BSDXIEN
+"RTN","BSDX20",63,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX20",64,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",65,0)
+ S ^BSDXTMP($J,BSDXI)=+$G(BSDXIEN(1))_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX20",66,0)
+ Q
+"RTN","BSDX20",67,0)
+ ;
+"RTN","BSDX20",68,0)
+ERR(BSDXI,BSDXID,BSDXERR) ;Error processing
+"RTN","BSDX20",69,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",70,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXID_"^"_BSDXERR_$C(30)
+"RTN","BSDX20",71,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",72,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX20",73,0)
+ Q
+"RTN","BSDX20",74,0)
+ ;
+"RTN","BSDX20",75,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX20",76,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX20",77,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",78,0)
+ D ERR(BSDXI,99,70)
+"RTN","BSDX20",79,0)
+ Q
+"RTN","BSDX21")
+0^19^B8672065
+"RTN","BSDX21",1,0)
+BSDX21 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 5/21/10 9:42pm
+"RTN","BSDX21",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX21",3,0)
+ ;
+"RTN","BSDX21",4,0)
+ ;
+"RTN","BSDX21",5,0)
+ADDAGD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX21",6,0)
+ ;Entry point for debugging
+"RTN","BSDX21",7,0)
+ ;
+"RTN","BSDX21",8,0)
+ ;D DEBUG^%Serenji("ADDAG^BSDX21(.BSDXY,BSDXVAL)")
+"RTN","BSDX21",9,0)
+ Q
+"RTN","BSDX21",10,0)
+ ;
+"RTN","BSDX21",11,0)
+ADDAG(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX21",12,0)
+ ;Called by BSDX ADD/EDIT ACCESS GROUP
+"RTN","BSDX21",13,0)
+ ;Add a new BSDX ACCESS GROUP entry
+"RTN","BSDX21",14,0)
+ ;BSDXVAL is NAME of the entry
+"RTN","BSDX21",15,0)
+ ;
+"RTN","BSDX21",16,0)
+ S X="ERROR^BSDX21",@^%ZOSF("TRAP")
+"RTN","BSDX21",17,0)
+ N BSDXIENS,BSDXFDA,BSDXMSG,BSDXIEN,BSDX,BSDXNAM
+"RTN","BSDX21",18,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX21",19,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX21",20,0)
+ I BSDXVAL="" D ERR(0,"BSDX21: Invalid null input Parameter") Q
+"RTN","BSDX21",21,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX21",22,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX21",23,0)
+ I +BSDXIEN D
+"RTN","BSDX21",24,0)
+ . S BSDX="EDIT"
+"RTN","BSDX21",25,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX21",26,0)
+ E  D
+"RTN","BSDX21",27,0)
+ . S BSDX="ADD"
+"RTN","BSDX21",28,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX21",29,0)
+ ;
+"RTN","BSDX21",30,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX21",31,0)
+ I BSDXNAM="" D ERR(0,"BSDX14: Invalid null Access Type name.") Q
+"RTN","BSDX21",32,0)
+ ;
+"RTN","BSDX21",33,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX21",34,0)
+ I $D(^BSDXAGP("B",BSDXNAM)),$O(^BSDXAGP("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX21",35,0)
+ . D ERR(0,"BSDX21: Cannot have two Access Groups with the same name.")
+"RTN","BSDX21",36,0)
+ . Q
+"RTN","BSDX21",37,0)
+ ;
+"RTN","BSDX21",38,0)
+ S BSDXFDA(9002018.38,BSDXIENS,.01)=BSDXNAM ;NAME
+"RTN","BSDX21",39,0)
+ I BSDX="ADD" D
+"RTN","BSDX21",40,0)
+ . K BSDXIEN
+"RTN","BSDX21",41,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX21",42,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX21",43,0)
+ E  D
+"RTN","BSDX21",44,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX21",45,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^"_$C(30)_$C(31)
+"RTN","BSDX21",46,0)
+ Q
+"RTN","BSDX21",47,0)
+ ;
+"RTN","BSDX21",48,0)
+DELAGD(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX21",49,0)
+ ;Entry point for debugging
+"RTN","BSDX21",50,0)
+ ;
+"RTN","BSDX21",51,0)
+ ;D DEBUG^%Serenji("DELAG^BSDX21(.BSDXY,BSDXGRP)")
+"RTN","BSDX21",52,0)
+ Q
+"RTN","BSDX21",53,0)
+ ;
+"RTN","BSDX21",54,0)
+DELAG(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX21",55,0)
+ ;Deletes entry having IEN BSDXGRP from BSDX ACCESS GROUP file
+"RTN","BSDX21",56,0)
+ ;Also deletes all entries in BSDX ACCESS GROUP TYPE that point to this group
+"RTN","BSDX21",57,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX21",58,0)
+ ;Called by BSDX DELETE ACCESS GROUP
+"RTN","BSDX21",59,0)
+ ;Test Line:
+"RTN","BSDX21",60,0)
+ ;D DELAG^BSDX21(.RES,99)
+"RTN","BSDX21",61,0)
+ ;
+"RTN","BSDX21",62,0)
+ S X="ERROR^BSDX21",@^%ZOSF("TRAP")
+"RTN","BSDX21",63,0)
+ N BSDXI,DIK,DA,BSDXIEN,BSDXIEN1
+"RTN","BSDX21",64,0)
+ S BSDXI=0
+"RTN","BSDX21",65,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX21",66,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX21",67,0)
+ S BSDXIEN=BSDXGRP
+"RTN","BSDX21",68,0)
+ ;I '$D(^BSDXAGP("B",BSDXGRP)) D ERR(BSDXI,0,0) Q
+"RTN","BSDX21",69,0)
+ ;S BSDXIEN=$O(^BSDXAGP("B",BSDXGRP,0))
+"RTN","BSDX21",70,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN) Q
+"RTN","BSDX21",71,0)
+ I '$D(^BSDXAGP(BSDXIEN,0)) D ERR(0,"BSDX14: Invalid Access Group ID name.") Q
+"RTN","BSDX21",72,0)
+ ;
+"RTN","BSDX21",73,0)
+ ;Delete BSDXACCESS GROUP TYPE entries
+"RTN","BSDX21",74,0)
+ ;
+"RTN","BSDX21",75,0)
+ S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXAGTP("B",BSDXIEN,BSDXIEN1)) Q:'BSDXIEN1  D
+"RTN","BSDX21",76,0)
+ . S DIK="^BSDXAGTP("
+"RTN","BSDX21",77,0)
+ . S DA=BSDXIEN1
+"RTN","BSDX21",78,0)
+ . D ^DIK
+"RTN","BSDX21",79,0)
+ . Q
+"RTN","BSDX21",80,0)
+ ;
+"RTN","BSDX21",81,0)
+ ;Delete entry BSDXIEN in BSDX ACCESS GROUP
+"RTN","BSDX21",82,0)
+ S DIK="^BSDXAGP("
+"RTN","BSDX21",83,0)
+ S DA=BSDXIEN
+"RTN","BSDX21",84,0)
+ D ^DIK
+"RTN","BSDX21",85,0)
+ ;
+"RTN","BSDX21",86,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",87,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_""_$C(30)_$C(31)
+"RTN","BSDX21",88,0)
+ Q
+"RTN","BSDX21",89,0)
+ ;
+"RTN","BSDX21",90,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX21",91,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX21",92,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",93,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX21",94,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",95,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX21",96,0)
+ Q
+"RTN","BSDX21",97,0)
+ ;
+"RTN","BSDX21",98,0)
+ERROR ;
+"RTN","BSDX21",99,0)
+ D ^%ZTER
+"RTN","BSDX21",100,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX21",101,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",102,0)
+ D ERR(0,"BSDX21 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX21",103,0)
+ Q
+"RTN","BSDX22")
+0^20^B9479861
+"RTN","BSDX22",1,0)
+BSDX22 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX22",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX22",3,0)
+ ;
+"RTN","BSDX22",4,0)
+ ;
+"RTN","BSDX22",5,0)
+DELAGID(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",6,0)
+ ;Entry point for debugging
+"RTN","BSDX22",7,0)
+ ;
+"RTN","BSDX22",8,0)
+ ;D DEBUG^%Serenji("DELAGI^BSDX22(.BSDXY,BSDXIEN,BSDXIEN1)")
+"RTN","BSDX22",9,0)
+ Q
+"RTN","BSDX22",10,0)
+ ;
+"RTN","BSDX22",11,0)
+DELAGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",12,0)
+ ;Deletes entry having Access Group BSDXIEN and Access Type BSDXIEN1 the ACCESS GROUP TYPE file
+"RTN","BSDX22",13,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX22",14,0)
+ ;Called by BSDX DELETE ACCESS GROUP ITEM
+"RTN","BSDX22",15,0)
+ ;Test Line:
+"RTN","BSDX22",16,0)
+ ;D DELAGI^BSDX22(.RES,99)
+"RTN","BSDX22",17,0)
+ ;
+"RTN","BSDX22",18,0)
+ S X="ERROR^BSDX22",@^%ZOSF("TRAP")
+"RTN","BSDX22",19,0)
+ N BSDXI,DIK,DA,BSDXIEN2
+"RTN","BSDX22",20,0)
+ S BSDXI=0
+"RTN","BSDX22",21,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX22",22,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPTYPEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX22",23,0)
+ I '+BSDXIEN D ERR(0,"BSDX22: Invalid null Access Group ID") Q
+"RTN","BSDX22",24,0)
+ I '+BSDXIEN1 D ERR(0,"BSDX22: Invalid null Access Type ID") Q
+"RTN","BSDX22",25,0)
+ I '$D(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1)) D  Q
+"RTN","BSDX22",26,0)
+ . D ERR(0,"BSDX22: Invalid null Access Group Type ID")
+"RTN","BSDX22",27,0)
+ . Q
+"RTN","BSDX22",28,0)
+ S BSDXIEN2=$O(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1,0))
+"RTN","BSDX22",29,0)
+ I '+BSDXIEN2 D ERR(0,"BSDX22: Invalid null Access Group Type ID") Q
+"RTN","BSDX22",30,0)
+ ;
+"RTN","BSDX22",31,0)
+ ;Delete entry
+"RTN","BSDX22",32,0)
+ S DIK="^BSDXAGTP("
+"RTN","BSDX22",33,0)
+ S DA=BSDXIEN2
+"RTN","BSDX22",34,0)
+ D ^DIK
+"RTN","BSDX22",35,0)
+ ;
+"RTN","BSDX22",36,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",37,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN2_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX22",38,0)
+ Q
+"RTN","BSDX22",39,0)
+ ;
+"RTN","BSDX22",40,0)
+ADDAGID(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",41,0)
+ ;Entry point for debugging
+"RTN","BSDX22",42,0)
+ ;
+"RTN","BSDX22",43,0)
+ ;D DEBUG^%Serenji("ADDAGI^BSDX22(.BSDXY,BSDXIEN,BSDXIEN1)")
+"RTN","BSDX22",44,0)
+ Q
+"RTN","BSDX22",45,0)
+ ;
+"RTN","BSDX22",46,0)
+ADDAGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",47,0)
+ ;Adds ACCESS GROUP TYPE file entry having access group BSDXIEN and access type BSDXIEN1
+"RTN","BSDX22",48,0)
+ ;Return recordset containing added entry number error message or "" if no error
+"RTN","BSDX22",49,0)
+ ;Called by BSDX ADD ACCESS GROUP ITEM
+"RTN","BSDX22",50,0)
+ ;Test Line:
+"RTN","BSDX22",51,0)
+ ;D ADDAGI^BSDX22(.RES,1,1)
+"RTN","BSDX22",52,0)
+ ;
+"RTN","BSDX22",53,0)
+ S X="ERROR^BSDX22",@^%ZOSF("TRAP")
+"RTN","BSDX22",54,0)
+ N BSDXI,BSDXIENS,BSDXMSG,BSDXFDA
+"RTN","BSDX22",55,0)
+ S BSDXI=0
+"RTN","BSDX22",56,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX22",57,0)
+ ;S ^BSDXTMP($J,0)="I00020ACCESSGROUPTYPEID^I00020ERRORID"_$C(30)
+"RTN","BSDX22",58,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPTYPEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX22",59,0)
+ I '+BSDXIEN D ERR(0,"BSDX22: Invalid null Access Group ID") Q
+"RTN","BSDX22",60,0)
+ I '+BSDXIEN1 D ERR(0,"BSDX22: Invalid null Access Type ID") Q
+"RTN","BSDX22",61,0)
+ I '$D(^BSDXAGP(BSDXIEN,0)) D ERR(0,"BSDX22: Invalid Access Group ID") Q
+"RTN","BSDX22",62,0)
+ I '$D(^BSDXTYPE(BSDXIEN1,0)) D ERR(0,"BSDX22: Invalid Access Type ID") Q
+"RTN","BSDX22",63,0)
+ I $D(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1)) D  Q
+"RTN","BSDX22",64,0)
+ . S BSDXIENS=$O(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1,0))
+"RTN","BSDX22",65,0)
+ . S ^BSDXTMP($J,BSDXI+1)=+BSDXIENS_"^"_$C(30)_$C(31)
+"RTN","BSDX22",66,0)
+ . Q
+"RTN","BSDX22",67,0)
+ ;
+"RTN","BSDX22",68,0)
+ S BSDXIENS="+1,"
+"RTN","BSDX22",69,0)
+ S BSDXFDA(9002018.39,BSDXIENS,.01)=BSDXIEN ;ACCESS GROUP ID
+"RTN","BSDX22",70,0)
+ S BSDXFDA(9002018.39,BSDXIENS,.02)=BSDXIEN1 ;ACCESS TYPE ID
+"RTN","BSDX22",71,0)
+ K BSDXIEN
+"RTN","BSDX22",72,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX22",73,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",74,0)
+ S ^BSDXTMP($J,BSDXI)=+$G(BSDXIEN(1))_"^"_$C(30)_$C(31)
+"RTN","BSDX22",75,0)
+ Q
+"RTN","BSDX22",76,0)
+ ;
+"RTN","BSDX22",77,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX22",78,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX22",79,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",80,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX22",81,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",82,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX22",83,0)
+ Q
+"RTN","BSDX22",84,0)
+ ;
+"RTN","BSDX22",85,0)
+ERROR ;
+"RTN","BSDX22",86,0)
+ D ^%ZTER
+"RTN","BSDX22",87,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX22",88,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",89,0)
+ D ERR(0,"BSDX22 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX22",90,0)
+ Q
+"RTN","BSDX23")
+0^21^B8488013
+"RTN","BSDX23",1,0)
+BSDX23 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX23",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX23",3,0)
+ ;
+"RTN","BSDX23",4,0)
+ ;
+"RTN","BSDX23",5,0)
+EVENT(BSDXEVENT,BSDXPARAM,BSDXSIP,BSDXSPT) ;EP
+"RTN","BSDX23",6,0)
+ ;Raise event to interested clients
+"RTN","BSDX23",7,0)
+ ;Clients are listed in ^BSDXTMP("EVENT",EVENT_NAME,IP,PORT)
+"RTN","BSDX23",8,0)
+ ;BSDXSIP and BSDXSPT represent the sender's IP and PORT.  
+"RTN","BSDX23",9,0)
+ ;The event will not be raised back to the sender if these are non-null
+"RTN","BSDX23",10,0)
+ ;
+"RTN","BSDX23",11,0)
+ Q:'$D(^BSDXTMP("EVENT",BSDXEVENT))
+"RTN","BSDX23",12,0)
+ S BSDXIP=0 F  S BSDXIP=$O(^BSDXTMP("EVENT",BSDXEVENT,BSDXIP)) Q:BSDXIP=""  D
+"RTN","BSDX23",13,0)
+ . S BSDXPORT=0 F  S BSDXPORT=$O(^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)) Q:'+BSDXPORT  D
+"RTN","BSDX23",14,0)
+ . . I BSDXIP=BSDXSIP Q  ;,BSDXPORT=BSDXSPT Q
+"RTN","BSDX23",15,0)
+ . . D CALL^%ZISTCP(BSDXIP,BSDXPORT,5)
+"RTN","BSDX23",16,0)
+ . . I POP K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT) Q
+"RTN","BSDX23",17,0)
+ . . ;U IO R X#3:5
+"RTN","BSDX23",18,0)
+ . . I X'="ACK" K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT) Q
+"RTN","BSDX23",19,0)
+ . . S BSDXPARAM=$S(BSDXPARAM="":"",1:U_BSDXPARAM)
+"RTN","BSDX23",20,0)
+ . . U IO W BSDXEVENT,BSDXPARAM,!
+"RTN","BSDX23",21,0)
+ . . D ^%ZISC
+"RTN","BSDX23",22,0)
+ . . Q
+"RTN","BSDX23",23,0)
+ . Q
+"RTN","BSDX23",24,0)
+ Q
+"RTN","BSDX23",25,0)
+ ;
+"RTN","BSDX23",26,0)
+EVERR(BSDXEVENT,BSDXIP,BSDXPORT) ;
+"RTN","BSDX23",27,0)
+ ;
+"RTN","BSDX23",28,0)
+ Q:$G(BSDXEVENT)=""
+"RTN","BSDX23",29,0)
+ Q:$G(BSDXIP)=""
+"RTN","BSDX23",30,0)
+ Q:$G(BSDXIP)=""
+"RTN","BSDX23",31,0)
+ K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)
+"RTN","BSDX23",32,0)
+ Q
+"RTN","BSDX23",33,0)
+ ;
+"RTN","BSDX23",34,0)
+REGET ;EP
+"RTN","BSDX23",35,0)
+ ;Error trap from REGEVNT
+"RTN","BSDX23",36,0)
+ ;
+"RTN","BSDX23",37,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX23",38,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",39,0)
+ D REGERR(BSDXI,99)
+"RTN","BSDX23",40,0)
+ Q
+"RTN","BSDX23",41,0)
+ ;
+"RTN","BSDX23",42,0)
+REGERR(BSDXI,BSDXERID) ;Error processing
+"RTN","BSDX23",43,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",44,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_$C(30)
+"RTN","BSDX23",45,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",46,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX23",47,0)
+ Q
+"RTN","BSDX23",48,0)
+ ;
+"RTN","BSDX23",49,0)
+ ;
+"RTN","BSDX23",50,0)
+REGEVNT(BSDXY,BSDXEVENT,BSDXIP,BSDXPORT) ;EP
+"RTN","BSDX23",51,0)
+ ;RPC Called by client to inform RPMS server of client's interest in BSDXEVENT
+"RTN","BSDX23",52,0)
+ ;Returns RECORDSET with field ERRORID.
+"RTN","BSDX23",53,0)
+ ;If everything ok then ERRORID = 0;
+"RTN","BSDX23",54,0)
+ ;
+"RTN","BSDX23",55,0)
+ N BSDXI
+"RTN","BSDX23",56,0)
+ S BSDXI=0
+"RTN","BSDX23",57,0)
+ S X="REGET^BSDX23",@^%ZOSF("TRAP")
+"RTN","BSDX23",58,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX23",59,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID"_$C(30)
+"RTN","BSDX23",60,0)
+ I '+BSDXPORT D REGERR(BSDXI,1) Q
+"RTN","BSDX23",61,0)
+ I BSDXIP="" D REGERR(BSDXI,2) Q
+"RTN","BSDX23",62,0)
+ S ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)=""
+"RTN","BSDX23",63,0)
+ ;
+"RTN","BSDX23",64,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",65,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)_$C(31)
+"RTN","BSDX23",66,0)
+ Q
+"RTN","BSDX23",67,0)
+ ;
+"RTN","BSDX23",68,0)
+UNREG(BSDXY,BSDXEVENT,BSDXIP,BSDXPORT) ;EP
+"RTN","BSDX23",69,0)
+ ;RPC Called by client to Unregister client's interest in BSDXEVENT
+"RTN","BSDX23",70,0)
+ ;Returns RECORDSET with field ERRORID.
+"RTN","BSDX23",71,0)
+ ;If everything ok then ERRORID = 0;
+"RTN","BSDX23",72,0)
+ ;
+"RTN","BSDX23",73,0)
+ N BSDXI
+"RTN","BSDX23",74,0)
+ S BSDXI=0
+"RTN","BSDX23",75,0)
+ S X="REGET^BSDX23",@^%ZOSF("TRAP")
+"RTN","BSDX23",76,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX23",77,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID"_$C(30)
+"RTN","BSDX23",78,0)
+ I '+BSDXPORT D REGERR(BSDXI,1) Q
+"RTN","BSDX23",79,0)
+ I BSDXIP="" D REGERR(BSDXI,2) Q
+"RTN","BSDX23",80,0)
+ K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)
+"RTN","BSDX23",81,0)
+ ;
+"RTN","BSDX23",82,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",83,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)_$C(31)
+"RTN","BSDX23",84,0)
+ Q
+"RTN","BSDX23",85,0)
+ ;
+"RTN","BSDX23",86,0)
+RAISEVNT(BSDXY,BSDXEVENT,BSDXPARAM,BSDXSIP,BSDXSPT) ;EP
+"RTN","BSDX23",87,0)
+ ;RPC Called to raise event BSDXEVENT with parameter BSDXPARAM
+"RTN","BSDX23",88,0)
+ ;BSDXSIP and BSDXSPT represent the sender's IP and PORT.
+"RTN","BSDX23",89,0)
+ ;If not null, these will prevent the event from being raised back
+"RTN","BSDX23",90,0)
+ ;to the sender.
+"RTN","BSDX23",91,0)
+ ;Returns a RECORDSET wit the field ERRORID.
+"RTN","BSDX23",92,0)
+ ;If everything ok then ERRORID = 0;
+"RTN","BSDX23",93,0)
+ ;
+"RTN","BSDX23",94,0)
+ N BSDXI
+"RTN","BSDX23",95,0)
+ S BSDXI=0
+"RTN","BSDX23",96,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX23",97,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID"_$C(30)
+"RTN","BSDX23",98,0)
+ S X="REGET^BSDX23",@^%ZOSF("TRAP")
+"RTN","BSDX23",99,0)
+ ;
+"RTN","BSDX23",100,0)
+ D EVENT(BSDXEVENT,BSDXPARAM,BSDXSIP,BSDXSPT)
+"RTN","BSDX23",101,0)
+ ;
+"RTN","BSDX23",102,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",103,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)_$C(31)
+"RTN","BSDX23",104,0)
+ Q
+"RTN","BSDX24")
+0^22^B13455014
+"RTN","BSDX24",1,0)
+BSDX24 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX24",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX24",3,0)
+ ;
+"RTN","BSDX24",4,0)
+ ;
+"RTN","BSDX24",5,0)
+ Q
+"RTN","BSDX24",6,0)
+CRCONTXT(RESULT,OPTION) ;EP
+"RTN","BSDX24",7,0)
+ ;Entry point for debugging XWBSEC
+"RTN","BSDX24",8,0)
+ ;
+"RTN","BSDX24",9,0)
+ ;D DEBUG^%Serenji("CRCONTXT^XWBSEC(.RESULT,OPTION)")
+"RTN","BSDX24",10,0)
+ ;;H .5
+"RTN","BSDX24",11,0)
+ ;;D CRCONTXT^XWBSEC(.RESULT,OPTION)
+"RTN","BSDX24",12,0)
+ ;;S BSDX="^BSDXTMP($J,"
+"RTN","BSDX24",13,0)
+ ;;S ^BSDXTMP($J,0)=RESULT
+"RTN","BSDX24",14,0)
+ ;;S RESULT=1
+"RTN","BSDX24",15,0)
+ Q
+"RTN","BSDX24",16,0)
+TEST0(BSDX) ;EP Delete user from 200
+"RTN","BSDX24",17,0)
+ S DIK="^VA(200,"
+"RTN","BSDX24",18,0)
+ S DA=BSDX
+"RTN","BSDX24",19,0)
+ D ^DIK
+"RTN","BSDX24",20,0)
+ ;
+"RTN","BSDX24",21,0)
+ Q
+"RTN","BSDX24",22,0)
+KILLM ;EP Delete BMXMENU entry
+"RTN","BSDX24",23,0)
+ S DIK="^DIC(19,"
+"RTN","BSDX24",24,0)
+ S DA=$O(^DIC(19,"B","BMXMENU",0))
+"RTN","BSDX24",25,0)
+ Q:'+DA
+"RTN","BSDX24",26,0)
+ D ^DIK
+"RTN","BSDX24",27,0)
+ Q
+"RTN","BSDX24",28,0)
+ ;
+"RTN","BSDX24",29,0)
+TEST1 ;EP Adding an entry to 200
+"RTN","BSDX24",30,0)
+ ;
+"RTN","BSDX24",31,0)
+ S BSDXFDA(200,"+1,",.01)="BMXNET,APPLICATION"
+"RTN","BSDX24",32,0)
+ K BSDXIEN,BSDXMSG
+"RTN","BSDX24",33,0)
+ S DIC(0)=""
+"RTN","BSDX24",34,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX24",35,0)
+ ;
+"RTN","BSDX24",36,0)
+ Q
+"RTN","BSDX24",37,0)
+TEST2 ;EP
+"RTN","BSDX24",38,0)
+ ;How to change the ACCESS CODE, VERIFY CODE, DATE VERIFY CODE LAST CHANGED field
+"RTN","BSDX24",39,0)
+ ;ACCESS CODE BSDXXX1^1_(a>yr}:3x3ja9\8vbH
+"RTN","BSDX24",40,0)
+ ;VERIFY CODE BSDXXX2^$;HOSs|:3w25lLD}Be=
+"RTN","BSDX24",41,0)
+ N BSDXFDA
+"RTN","BSDX24",42,0)
+ S BSDXFDA(200,"36,",2)="1_(a>yr}:3x3ja9\8vbH"
+"RTN","BSDX24",43,0)
+ S BSDXFDA(200,"36,",11)="$;HOSs|:3w25lLD}Be="
+"RTN","BSDX24",44,0)
+ S BSDXFDA(200,"36,",11.2)="88888,88888"
+"RTN","BSDX24",45,0)
+ S BSDXFDA(200,"36,",201)="BMXRPC"
+"RTN","BSDX24",46,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX24",47,0)
+ Q
+"RTN","BSDX24",48,0)
+ ;
+"RTN","BSDX24",49,0)
+ ;
+"RTN","BSDX24",50,0)
+SEARCHD(BSDXY,BSDXRES,BSDXSTRT,BSDXEND,BSDXTYPES,BSDXAMPM,BSDXWKDY) ;EP
+"RTN","BSDX24",51,0)
+ ;Entry point for debugging
+"RTN","BSDX24",52,0)
+ ;
+"RTN","BSDX24",53,0)
+ ;D DEBUG^%Serenji("SEARCH^BSDX24(.RES,""ROGERS,BUCK|FUNAKOSHI,GICHIN"","""","""","""","""","""")")
+"RTN","BSDX24",54,0)
+ ;D DEBUG^%Serenji("SEARCH^BSDX24(.BSDXY,BSDXRES,BSDXSTRT,BSDXEND,BSDXTYPES,BSDXAMPM,BSDXWKDY)")
+"RTN","BSDX24",55,0)
+ Q
+"RTN","BSDX24",56,0)
+ ;
+"RTN","BSDX24",57,0)
+SEARCH(BSDXY,BSDXRES,BSDXSTRT,BSDXEND,BSDXTYPES,BSDXAMPM,BSDXWKDY) ;EP
+"RTN","BSDX24",58,0)
+ ;Searches availability database for availability blocks between
+"RTN","BSDX24",59,0)
+ ;BSDXSTRT and BSDXEND for each of the resources in BSDXRES.
+"RTN","BSDX24",60,0)
+ ;The av blocks must be one of the types in BSDXTYPES, must be
+"RTN","BSDX24",61,0)
+ ;AM or PM depending on value in BSDXAMPM and
+"RTN","BSDX24",62,0)
+ ;must be on one of the weekdays listed in BSDXWKDY.
+"RTN","BSDX24",63,0)
+ ;
+"RTN","BSDX24",64,0)
+ ;Return recordset containing the start times of availability blocks
+"RTN","BSDX24",65,0)
+ ;meeting the search criteria.
+"RTN","BSDX24",66,0)
+ ;
+"RTN","BSDX24",67,0)
+ ;Variables:
+"RTN","BSDX24",68,0)
+ ;BSDXRES |-Delimited list of resource names
+"RTN","BSDX24",69,0)
+ ;BSDXSTRT FM-formatted beginning date of search
+"RTN","BSDX24",70,0)
+ ;BSDXEND FM-Formatted ending date of search
+"RTN","BSDX24",71,0)
+ ;BSDXTYPES |-Delimited list of access type IENs
+"RTN","BSDX24",72,0)
+ ;BSDXAMPM "AM" for am-only, "PM" for pm-only, "BOTH" for both
+"RTN","BSDX24",73,0)
+ ;BSDXWKDY "" if any weekday, else |-delimited list of weekdays
+"RTN","BSDX24",74,0)
+ ;
+"RTN","BSDX24",75,0)
+ ;NOTE: If BSDXEND="" Then:
+"RTN","BSDX24",76,0)
+ ; either ONE record is returned matching the first available block
+"RTN","BSDX24",77,0)
+ ; -or- NO record is returned indicating no available block exists
+"RTN","BSDX24",78,0)
+ ;
+"RTN","BSDX24",79,0)
+ ;Called by BSDX SEARCH AVAILABILITY
+"RTN","BSDX24",80,0)
+ ;Test Line:
+"RTN","BSDX24",81,0)
+ ;D SEARCH^BSDX24(.RES,"ROGERS,BUCK|FUNAKOSHI,GICHIN","","","","","") ZW RES
+"RTN","BSDX24",82,0)
+ ;
+"RTN","BSDX24",83,0)
+ ;
+"RTN","BSDX24",84,0)
+ S X=BSDXSTRT,%DT="X" D ^%DT S BSDXSTRT=$P(Y,".")
+"RTN","BSDX24",85,0)
+ S:+BSDXSTRT<0 BSDXSTRT=DT
+"RTN","BSDX24",86,0)
+ S X=BSDXEND,%DT="X" D ^%DT S BSDXEND=$P(Y,".")
+"RTN","BSDX24",87,0)
+ S:+BSDXEND<0 BSDXEND=9990101
+"RTN","BSDX24",88,0)
+ S BSDXEND=BSDXEND_".99"
+"RTN","BSDX24",89,0)
+ N BSDXRESN,BSDXRESD,BSDXDATE,BSDXI,BSDXABD,BSDXNOD,BSDXATD,BSDXATN
+"RTN","BSDX24",90,0)
+ N BSDXTYPE
+"RTN","BSDX24",91,0)
+ ;
+"RTN","BSDX24",92,0)
+ ;Set up access types array
+"RTN","BSDX24",93,0)
+ F BSDX=1:1:$L(BSDXTYPES,"|") D
+"RTN","BSDX24",94,0)
+ . S BSDXATD=$P(BSDXTYPES,"|",BSDX)
+"RTN","BSDX24",95,0)
+ . S:+BSDXATD BSDXTYPE(BSDXTYPD)=""
+"RTN","BSDX24",96,0)
+ ;
+"RTN","BSDX24",97,0)
+ S BSDXI=0
+"RTN","BSDX24",98,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX24",99,0)
+ S ^BSDXTMP($J,0)="T00030RESOURCENAME^D00030DATE^T00030ACCESSTYPE^T00030COMMENT"_$C(30)
+"RTN","BSDX24",100,0)
+ F BSDX=1:1:$L(BSDXRES,"|") S BSDXRESN=$P(BSDXRES,"|",BSDX) D
+"RTN","BSDX24",101,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX24",102,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX24",103,0)
+ . Q:'+BSDXRESD
+"RTN","BSDX24",104,0)
+ . Q:'$D(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX24",105,0)
+ . Q:'$D(^BSDXAB("ARSCT",BSDXRESD))
+"RTN","BSDX24",106,0)
+ . S BSDXDATE=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXSTRT))
+"RTN","BSDX24",107,0)
+ . Q:BSDXDATE=""
+"RTN","BSDX24",108,0)
+ . Q:BSDXDATE>BSDXEND
+"RTN","BSDX24",109,0)
+ . ;TODO: Screen for AMPM
+"RTN","BSDX24",110,0)
+ . ;TODO: Screen for Weekday
+"RTN","BSDX24",111,0)
+ . ;
+"RTN","BSDX24",112,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX24",113,0)
+ . S BSDXABD=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXDATE,0))
+"RTN","BSDX24",114,0)
+ . S BSDXNOD=$G(^BSDXAB(BSDXABD,0))
+"RTN","BSDX24",115,0)
+ . Q:BSDXNOD=""
+"RTN","BSDX24",116,0)
+ . S Y=$P(BSDXDATE,".")
+"RTN","BSDX24",117,0)
+ . D DD^%DT
+"RTN","BSDX24",118,0)
+ . S BSDXATD=$P(BSDXNOD,U,5) ;ACCESS TYPE POINTER
+"RTN","BSDX24",119,0)
+ . S BSDXATD=$G(^BSDXTYPE(+BSDXATD,0))
+"RTN","BSDX24",120,0)
+ . S BSDXATN=$P(BSDXATD,U)
+"RTN","BSDX24",121,0)
+ . I +BSDXATD,BSDXTYPES]"" Q:'$D(BSDXTYPES(BSDXATD))
+"RTN","BSDX24",122,0)
+ . ;TODO: Screen for TYPE ----DONE!
+"RTN","BSDX24",123,0)
+ . ;TODO: Comment
+"RTN","BSDX24",124,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXRESN_U_Y_U_BSDXATN_U_$C(30)
+"RTN","BSDX24",125,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX24",126,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX24",127,0)
+ Q
+"RTN","BSDX25")
+0^23^B16070744
+"RTN","BSDX25",1,0)
+BSDX25 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX25",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX25",3,0)
+ ;
+"RTN","BSDX25",4,0)
+ ;
+"RTN","BSDX25",5,0)
+CHECKIND(BSDXY,BSDXAPTID,BSDXCDT,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG) ;EP
+"RTN","BSDX25",6,0)
+ ;Entry point for debugging
+"RTN","BSDX25",7,0)
+ ;
+"RTN","BSDX25",8,0)
+ ;I +$G(^BSDXDBUG("BREAK","CHECKIN")),+$G(^BSDXDBUG("BREAK"))=DUZ D DEBUG^%Serenji("CHECKIN^BSDX25(.BSDXY,BSDXAPTID,BSDXCDT,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG)",$P(^BSDXDBUG("BREAK"),U,2))
+"RTN","BSDX25",9,0)
+ ;E  G ENDBG
+"RTN","BSDX25",10,0)
+ Q
+"RTN","BSDX25",11,0)
+ ;
+"RTN","BSDX25",12,0)
+CHECKIN(BSDXY,BSDXAPTID,BSDXCDT,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG) ;EP Check in appointment
+"RTN","BSDX25",13,0)
+ ;
+"RTN","BSDX25",14,0)
+ENDBG ;
+"RTN","BSDX25",15,0)
+ N BSDXNOD,BSDXPATID,BSDXSTART,DIK,DA,BSDXID,BSDXI,BSDXZ,BSDXIENS,BSDXVEN
+"RTN","BSDX25",16,0)
+ N BSDXNOEV
+"RTN","BSDX25",17,0)
+ S BSDXNOEV=1 ;Don't execute protocol
+"RTN","BSDX25",18,0)
+ ;
+"RTN","BSDX25",19,0)
+ D ^XBKVAR S X="ERROR^BSDX25",@^%ZOSF("TRAP")
+"RTN","BSDX25",20,0)
+ S BSDXI=0
+"RTN","BSDX25",21,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX25",22,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX25",23,0)
+ S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30)
+"RTN","BSDX25",24,0)
+ I '+BSDXAPTID D ERR("BSDX25: Invalid Appointment ID") Q
+"RTN","BSDX25",25,0)
+ I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR("BSDX08: Invalid Appointment ID") Q
+"RTN","BSDX25",26,0)
+ ;
+"RTN","BSDX25",27,0)
+ S:BSDXCDT["@0000" BSDXCDT=$P(BSDXCDT,"@")
+"RTN","BSDX25",28,0)
+ S %DT="T",X=BSDXCDT D ^%DT S BSDXCDT=Y
+"RTN","BSDX25",29,0)
+ I BSDXCDT=-1 D ERR(70) Q
+"RTN","BSDX25",30,0)
+ I BSDXCDT>$$NOW^XLFDT S BSDXCDT=$$NOW^XLFDT
+"RTN","BSDX25",31,0)
+ ;Checkin BSDX APPOINTMENT entry
+"RTN","BSDX25",32,0)
+ D BSDXCHK(BSDXAPTID,BSDXCDT)
+"RTN","BSDX25",33,0)
+ S BSDXNOD=^BSDXAPPT(BSDXAPTID,0)
+"RTN","BSDX25",34,0)
+ S BSDXPATID=$P(BSDXNOD,U,5)
+"RTN","BSDX25",35,0)
+ S BSDXSTART=$P(BSDXNOD,U)
+"RTN","BSDX25",36,0)
+ ;
+"RTN","BSDX25",37,0)
+ S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID
+"RTN","BSDX25",38,0)
+ I BSDXSC1]"",$D(^BSDXRES(BSDXSC1,0)) D  I +$G(BSDXZ) D ERR($P(BSDXZ,U,2)) Q
+"RTN","BSDX25",39,0)
+ . S BSDXNOD=^BSDXRES(BSDXSC1,0)
+"RTN","BSDX25",40,0)
+ . S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION
+"RTN","BSDX25",41,0)
+ . I BSDXSC1]"",$D(^SC(BSDXSC1,0)) D APCHK(.BSDXZ,BSDXSC1,BSDXPATID,BSDXCDT,BSDXSTART)
+"RTN","BSDX25",42,0)
+ ;
+"RTN","BSDX25",43,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",44,0)
+ ;S ^BSDXTMP($J,BSDXI)="-1"_$C(30)
+"RTN","BSDX25",45,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)
+"RTN","BSDX25",46,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",47,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX25",48,0)
+ Q
+"RTN","BSDX25",49,0)
+ ;
+"RTN","BSDX25",50,0)
+BSDXCHK(BSDXAPTID,BSDXCDT) ;
+"RTN","BSDX25",51,0)
+ ;
+"RTN","BSDX25",52,0)
+ S BSDXIENS=BSDXAPTID_","
+"RTN","BSDX25",53,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.03)=BSDXCDT
+"RTN","BSDX25",54,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX25",55,0)
+ Q
+"RTN","BSDX25",56,0)
+ ;
+"RTN","BSDX25",57,0)
+APCHK(BSDXZ,BSDXSC1,BSDXDFN,BSDXCDT,BSDXSTART)         ;
+"RTN","BSDX25",58,0)
+ ;Checkin appointment for patient BSDXDFN in clinic BSDXSC1
+"RTN","BSDX25",59,0)
+ ;at time BSDXSTART
+"RTN","BSDX25",60,0)
+ S BSDXZ=$$CHECKIN1^BSDXAPI(BSDXDFN,BSDXSC1,BSDXSTART)
+"RTN","BSDX25",61,0)
+ Q
+"RTN","BSDX25",62,0)
+ ;
+"RTN","BSDX25",63,0)
+CHKEVT(BSDXPAT,BSDXSTART,BSDXSC) ;EP Called by BSDX CHECKIN APPOINTMENT event
+"RTN","BSDX25",64,0)
+ ;when appointments CHECKIN via PIMS interface.
+"RTN","BSDX25",65,0)
+ ;Propagates CHECKIN to BSDXAPPT and raises refresh event to running GUI clients
+"RTN","BSDX25",66,0)
+ ;
+"RTN","BSDX25",67,0)
+ Q:+$G(BSDXNOEV)
+"RTN","BSDX25",68,0)
+ Q:'+$G(BSDXSC)
+"RTN","BSDX25",69,0)
+ N BSDXSTAT,BSDXFOUND,BSDXRES
+"RTN","BSDX25",70,0)
+ S BSDXSTAT=""
+"RTN","BSDX25",71,0)
+ S:$G(SDATA("AFTER","STATUS"))["CHECKED IN" BSDXSTAT=$P(SDATA("AFTER","STATUS"),"^",4)
+"RTN","BSDX25",72,0)
+ S BSDXFOUND=0
+"RTN","BSDX25",73,0)
+ I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$CHKEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX25",74,0)
+ I BSDXFOUND D CHKEVT3(BSDXRES) Q
+"RTN","BSDX25",75,0)
+ I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$CHKEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX25",76,0)
+ I BSDXFOUND D CHKEVT3(BSDXRES)
+"RTN","BSDX25",77,0)
+ Q
+"RTN","BSDX25",78,0)
+ ;
+"RTN","BSDX25",79,0)
+CHKEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT) ;
+"RTN","BSDX25",80,0)
+ ;Get appointment id in BSDXAPT
+"RTN","BSDX25",81,0)
+ ;If found, call BSDXNOS(BSDXAPPT) and return 1
+"RTN","BSDX25",82,0)
+ ;else return 0
+"RTN","BSDX25",83,0)
+ N BSDXFOUND,BSDXAPPT
+"RTN","BSDX25",84,0)
+ S BSDXFOUND=0
+"RTN","BSDX25",85,0)
+ Q:'+$G(BSDXRES) BSDXFOUND
+"RTN","BSDX25",86,0)
+ Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND
+"RTN","BSDX25",87,0)
+ S BSDXAPPT=0 F  S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT  D  Q:BSDXFOUND
+"RTN","BSDX25",88,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""
+"RTN","BSDX25",89,0)
+ . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q
+"RTN","BSDX25",90,0)
+ I BSDXFOUND,+$G(BSDXAPPT) D BSDXCHK(BSDXAPPT,BSDXSTAT)
+"RTN","BSDX25",91,0)
+ Q BSDXFOUND
+"RTN","BSDX25",92,0)
+ ;
+"RTN","BSDX25",93,0)
+CHKEVT3(BSDXRES) ;
+"RTN","BSDX25",94,0)
+ ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX25",95,0)
+ ;
+"RTN","BSDX25",96,0)
+ N BSDXRESN
+"RTN","BSDX25",97,0)
+ S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX25",98,0)
+ Q:BSDXRESN=""
+"RTN","BSDX25",99,0)
+ S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX25",100,0)
+ ;D EVENT^BSDX23("SCHEDULE-"_BSDXRESN,"","","")
+"RTN","BSDX25",101,0)
+ D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX25",102,0)
+ Q
+"RTN","BSDX25",103,0)
+ ;
+"RTN","BSDX25",104,0)
+ERROR ;
+"RTN","BSDX25",105,0)
+ D ERR("RPMS Error")
+"RTN","BSDX25",106,0)
+ Q
+"RTN","BSDX25",107,0)
+ ;
+"RTN","BSDX25",108,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX25",109,0)
+ I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX25",110,0)
+ E  S BSDXERR=ERRNO
+"RTN","BSDX25",111,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",112,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX25",113,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",114,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX25",115,0)
+ Q
+"RTN","BSDX26")
+0^24^B30714245
+"RTN","BSDX26",1,0)
+BSDX26  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:38pm
+"RTN","BSDX26",2,0)
+    ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX26",3,0)
+    ; Change History:
+"RTN","BSDX26",4,0)
+    ; 3101023 - UJO/SMH - Addition of restartable transaction; relocation of tx.
+"RTN","BSDX26",5,0)
+    ; --> Thanks to Zach Gonzalez and Rick Marshall
+"RTN","BSDX26",6,0)
+    ; 3101205 - UJO/SMH - Extensive refactoring.
+"RTN","BSDX26",7,0)
+    ;
+"RTN","BSDX26",8,0)
+    ; Error Reference:
+"RTN","BSDX26",9,0)
+    ; -1: Appt ID is not a number
+"RTN","BSDX26",10,0)
+    ; -2: Appt IEN is not in ^BSDXAPPT
+"RTN","BSDX26",11,0)
+    ; -3: FM Failure to file WP field in ^BSDXAPPT
+"RTN","BSDX26",12,0)
+    ;
+"RTN","BSDX26",13,0)
+EDITAPTD(BSDXY,BSDXAPTID,BSDXNOTE)  ;EP
+"RTN","BSDX26",14,0)
+    ;Entry point for debugging
+"RTN","BSDX26",15,0)
+    ;
+"RTN","BSDX26",16,0)
+    D DEBUG^%Serenji("EDITAPT^BSDX26(.BSDXY,BSDXAPTID,BSDXNOTE)")
+"RTN","BSDX26",17,0)
+    Q
+"RTN","BSDX26",18,0)
+UT ; Unit Tests
+"RTN","BSDX26",19,0)
+    ; Test 1: Make sure this damn thing works
+"RTN","BSDX26",20,0)
+    N ZZZ
+"RTN","BSDX26",21,0)
+    N %H S %H=$H
+"RTN","BSDX26",22,0)
+    N NOTE S NOTE="New Note "_%H
+"RTN","BSDX26",23,0)
+    D EDITAPT(.ZZZ,188,NOTE)
+"RTN","BSDX26",24,0)
+    I ^BSDXAPPT(188,1,1,0)'=NOTE W "ERROR",! B
+"RTN","BSDX26",25,0)
+    ; Test 2: Test Errors -1 and -2
+"RTN","BSDX26",26,0)
+    N ZZZ
+"RTN","BSDX26",27,0)
+    N NOTE S NOTE="Nothing important"
+"RTN","BSDX26",28,0)
+    D EDITAPT(.ZZZ,"BLAHBLAH",NOTE)
+"RTN","BSDX26",29,0)
+    I +^BSDXTMP($J,1)'=-1 W "ERROR IN -1",! B
+"RTN","BSDX26",30,0)
+    D EDITAPT(.ZZZ,298734322,NOTE)
+"RTN","BSDX26",31,0)
+    I +^BSDXTMP($J,1)'=-2 W "ERROR IN -2",! B
+"RTN","BSDX26",32,0)
+    ; Test 4: M Error
+"RTN","BSDX26",33,0)
+    N bsdxdie S bsdxdie=1
+"RTN","BSDX26",34,0)
+    D EDITAPT(.ZZZ,188,NOTE)
+"RTN","BSDX26",35,0)
+    I +^BSDXTMP($J,1)'=-100 W "ERROR IN -100",! B
+"RTN","BSDX26",36,0)
+    k bsdxdie
+"RTN","BSDX26",37,0)
+    ; Test 5: Trestart
+"RTN","BSDX26",38,0)
+    N bsdxrestart S bsdxrestart=1
+"RTN","BSDX26",39,0)
+    N %H S %H=$H
+"RTN","BSDX26",40,0)
+    N NOTE S NOTE="New Note "_%H
+"RTN","BSDX26",41,0)
+    D EDITAPT(.ZZZ,188,NOTE)
+"RTN","BSDX26",42,0)
+    I ^BSDXAPPT(188,1,1,0)'=NOTE W "ERROR in TRESTART",! B
+"RTN","BSDX26",43,0)
+    ; Test 6: for Hosp Location Update
+"RTN","BSDX26",44,0)
+    N DATE S DATE=$$NOW^XLFDT()
+"RTN","BSDX26",45,0)
+    S DATE=$E(DATE,1,12) ; Just get minutes b/c of HL file input transform
+"RTN","BSDX26",46,0)
+    D APPADD^BSDX07(.ZZZ,DATE,DATE+.001,3,"Dr Office",30,"Old Note",1)
+"RTN","BSDX26",47,0)
+    N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX26",48,0)
+    D EDITAPT(.ZZZ,APPID,"New Note")
+"RTN","BSDX26",49,0)
+    I ^BSDXAPPT(APTID,1,1,0)'="New Note" W "Error in HL Section",! B
+"RTN","BSDX26",50,0)
+    I $P(^SC(2,"S",DATE,1,1,0),U,4)'="New Note" W "Error in HL Section",! B
+"RTN","BSDX26",51,0)
+    QUIT
+"RTN","BSDX26",52,0)
+    ;
+"RTN","BSDX26",53,0)
+EDITAPT(BSDXY,BSDXAPTID,BSDXNOTE)   ;EP Edit appointment (only note text can be edited)
+"RTN","BSDX26",54,0)
+    ; Called by RPC: BSDX EDIT APPOINTMENT
+"RTN","BSDX26",55,0)
+    ;
+"RTN","BSDX26",56,0)
+    ; Edits Appointment Text in BSDX APPOINTMENT file & Hosp Location (44) file
+"RTN","BSDX26",57,0)
+    ;
+"RTN","BSDX26",58,0)
+    ; Parameters:
+"RTN","BSDX26",59,0)
+    ; - BSDXY: Global Return (RPC must be set to Global Array)
+"RTN","BSDX26",60,0)
+    ; - BSDXAPTID: Appointment IEN in BSDX APPOINTMENT
+"RTN","BSDX26",61,0)
+    ; - BSDXNOTE: New note
+"RTN","BSDX26",62,0)
+    ;
+"RTN","BSDX26",63,0)
+    ; Return:
+"RTN","BSDX26",64,0)
+    ; ADO.net Recordset having 1 field: ERRORID
+"RTN","BSDX26",65,0)
+    ; If Okay: -1; otherwise, positive integer with message
+"RTN","BSDX26",66,0)
+    ;
+"RTN","BSDX26",67,0)
+    ; Return Array; set Return and clear array
+"RTN","BSDX26",68,0)
+    S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX26",69,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX26",70,0)
+    ; ET
+"RTN","BSDX26",71,0)
+    N $ET S $ET="G ETRAP^BSDX26"
+"RTN","BSDX26",72,0)
+    ; Set up basic DUZ variables
+"RTN","BSDX26",73,0)
+    D ^XBKVAR
+"RTN","BSDX26",74,0)
+    ; Counter
+"RTN","BSDX26",75,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX26",76,0)
+    ; Header Node
+"RTN","BSDX26",77,0)
+    S ^BSDXTMP($J,BSDXI)="T00100ERRORID"_$C(30)
+"RTN","BSDX26",78,0)
+    ; Restartable txn for GT.M. Restored vars are Params + BSDXI.
+"RTN","BSDX26",79,0)
+    TSTART (BSDXY,BSDXAPTID,BSDXNOTE,BSDXI):T="BSDX EDIT APPOINTMENT^BSDX26"
+"RTN","BSDX26",80,0)
+    ;
+"RTN","BSDX26",81,0)
+    ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX26",82,0)
+    I $G(bsdxdie) S X=1/0
+"RTN","BSDX26",83,0)
+    ;;;test
+"RTN","BSDX26",84,0)
+    ;;;test for TRESTART
+"RTN","BSDX26",85,0)
+    I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX26",86,0)
+    ;;;test
+"RTN","BSDX26",87,0)
+    ;
+"RTN","BSDX26",88,0)
+    ; Validate Appointment ID
+"RTN","BSDX26",89,0)
+    I '+BSDXAPTID D ERR(BSDXI,"-1~BSDX26: Invalid Appointment ID") QUIT
+"RTN","BSDX26",90,0)
+    I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(BSDXI,"-2~BSDX26: Invalid Appointment ID") QUIT
+"RTN","BSDX26",91,0)
+    ; Put the WP in decendant fields from the root to file as a WP field
+"RTN","BSDX26",92,0)
+    S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX26",93,0)
+    I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX26",94,0)
+    N BSDXMSG ; Message in case of error in filing.
+"RTN","BSDX26",95,0)
+    I $D(BSDXNOTE(.5)) D
+"RTN","BSDX26",96,0)
+    . D WP^DIE(9002018.4,BSDXAPTID_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX26",97,0)
+    I $D(BSDXMSG) D ERR(BSDXI,"-3~BSDX26: Fileman failure to file data into 9002018.4") QUIT
+"RTN","BSDX26",98,0)
+    ;
+"RTN","BSDX26",99,0)
+    ; Now file in file 44:
+"RTN","BSDX26",100,0)
+    N PTIEN S PTIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".05","I") ; Patient IEN
+"RTN","BSDX26",101,0)
+    N HLIEN S HLIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".07:.04","I") ; HL Location IEN pointed to by Resource ID
+"RTN","BSDX26",102,0)
+    N DATE S DATE=+^BSDXAPPT(BSDXAPTID,0) ; Date of APPT
+"RTN","BSDX26",103,0)
+    N BSDXRES S BSDXRES=0 ; Result
+"RTN","BSDX26",104,0)
+    ; Update Note only if we have a linked hospital location.
+"RTN","BSDX26",105,0)
+    I HLIEN S BSDXRES=$$UPDATENOTE^BSDXAPI(PTIEN,HLIEN,DATE,BSDXNOTE(.5))
+"RTN","BSDX26",106,0)
+    ; If we get an error (denoted by -1 in BSDXRES), return error to client
+"RTN","BSDX26",107,0)
+    I BSDXRES<0 D ERR(BSDXI,"-4~BSDX26: BSDXAPI reports an error: "_BSDXRES) QUIT
+"RTN","BSDX26",108,0)
+    ;Return Recordset
+"RTN","BSDX26",109,0)
+    TCOMMIT
+"RTN","BSDX26",110,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",111,0)
+    S ^BSDXTMP($J,BSDXI)="-1"_$C(30)
+"RTN","BSDX26",112,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",113,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX26",114,0)
+    QUIT
+"RTN","BSDX26",115,0)
+    ;
+"RTN","BSDX26",116,0)
+ERR(BSDXI,BSDXERR)  ;Error processing
+"RTN","BSDX26",117,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",118,0)
+    S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX26",119,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX26",120,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX26",121,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",122,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX26",123,0)
+    QUIT
+"RTN","BSDX26",124,0)
+    ;
+"RTN","BSDX26",125,0)
+ETRAP   ;EP Error trap entry
+"RTN","BSDX26",126,0)
+    N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+"RTN","BSDX26",127,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX26",128,0)
+    D ^%ZTER
+"RTN","BSDX26",129,0)
+    S $EC=""
+"RTN","BSDX26",130,0)
+    I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX26",131,0)
+    D ERR(BSDXI,"-100~BSDX26 Error: "_$G(%ZTERZE))
+"RTN","BSDX26",132,0)
+    Q
+"RTN","BSDX27")
+0^25^B133007616
+"RTN","BSDX27",1,0)
+BSDX27  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 4:52pm
+"RTN","BSDX27",2,0)
+    ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX27",3,0)
+    ; 
+"RTN","BSDX27",4,0)
+    ; Change Log: July 15, 2010
+"RTN","BSDX27",5,0)
+    ; UJO/SMH - i18n: FM Dates passed into routine for Clinic Letters - CLDISP ta
+"RTN","BSDX27",6,0)
+    ; v 1.42 - 3101208 - SMH
+"RTN","BSDX27",7,0)
+    ; - Added check to skip cancelled appointments. Check was forgotten
+"RTN","BSDX27",8,0)
+    ;   in original code.
+"RTN","BSDX27",9,0)
+    ;   . N BSDXFLAGS S BSDXFLAGS=$P(BSDXNOD,U,2)  ; No show and Cancel Flags
+"RTN","BSDX27",10,0)
+    ;   . Q:BSDXFLAGS["C"  ; if appt is cancelled, quit
+"RTN","BSDX27",11,0)
+    ;
+"RTN","BSDX27",12,0)
+    Q
+"RTN","BSDX27",13,0)
+    ;
+"RTN","BSDX27",14,0)
+PADISPD(BSDXY,BSDXPAT)  ;EP
+"RTN","BSDX27",15,0)
+    ;Entry point for debugging
+"RTN","BSDX27",16,0)
+    ;
+"RTN","BSDX27",17,0)
+    ;D DEBUG^%Serenji("PADISP^BSDX27(.BSDXY,BSDXPAT)")
+"RTN","BSDX27",18,0)
+    Q
+"RTN","BSDX27",19,0)
+    ;
+"RTN","BSDX27",20,0)
+PADISP(BSDXY,BSDXPAT)   ;EP
+"RTN","BSDX27",21,0)
+    ;Return recordset of patient appointments used in listing
+"RTN","BSDX27",22,0)
+    ;a patient's appointments and generating patient letters.
+"RTN","BSDX27",23,0)
+    ;Called by rpc BSDX PATIENT APPT DISPLAY
+"RTN","BSDX27",24,0)
+    ;
+"RTN","BSDX27",25,0)
+    ; Sam's Notes:
+"RTN","BSDX27",26,0)
+    ; Relatively complex algorithm.
+"RTN","BSDX27",27,0)
+    ; 1. First, loop through ^DPT(DA,"S", and get all appointments. 
+"RTN","BSDX27",28,0)
+    ;   Exclude cancelled appts. Store in BSDXDPT array.
+"RTN","BSDX27",29,0)
+    ; 2. Go through ^BSDXAPPT("CPAT", (patient index) . 
+"RTN","BSDX27",30,0)
+    ;   Get the info from there and compar with BSDXDPT array. If 
+"RTN","BSDX27",31,0)
+    ;   they are the same, get all info, and rm entry from BSDXDPT array.
+"RTN","BSDX27",32,0)
+    ; 3. If there are any remaining entries in BSDXDPT (PIMS leftovers),
+"RTN","BSDX27",33,0)
+    ;   Get the data from file 2 and 44.
+"RTN","BSDX27",34,0)
+    ;
+"RTN","BSDX27",35,0)
+    N BSDXI,BSDXIEN,BSDXNOD,BSDXNAM,BSDXDOB,BSDXHRN,BSDXSEX,BSDXCNID,BSDXCNOD,BSDXMADE,BSDXCLRK,BSDXNOT,BSDXQ
+"RTN","BSDX27",36,0)
+    N BSDXSTRT
+"RTN","BSDX27",37,0)
+    N BSDXSTRE,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX27",38,0)
+    S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX27",39,0)
+    S BSDXI=0
+"RTN","BSDX27",40,0)
+    S ^BSDXTMP($J,BSDXI)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030ApptDate^T00030Clinic^T00030TypeStatus"
+"RTN","BSDX27",41,0)
+    S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE"_$C(30)
+"RTN","BSDX27",42,0)
+    S X="ERROR^BSDX27",@^%ZOSF("TRAP")
+"RTN","BSDX27",43,0)
+    ;Get patient info
+"RTN","BSDX27",44,0)
+    ;
+"RTN","BSDX27",45,0)
+    I '+BSDXPAT S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX27",46,0)
+    I '$D(^DPT(+BSDXPAT,0)) S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX27",47,0)
+    S BSDXNOD=$$PATINFO(BSDXPAT)
+"RTN","BSDX27",48,0)
+    S BSDXNAM=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX27",49,0)
+    S BSDXSEX=$P(BSDXNOD,U,2) ;SEX
+"RTN","BSDX27",50,0)
+    S BSDXDOB=$P(BSDXNOD,U,3) ;DOB
+"RTN","BSDX27",51,0)
+    S BSDXHRN=$P(BSDXNOD,U,4) ;Health Record Number for location DUZ(2)
+"RTN","BSDX27",52,0)
+    S BSDXSTRE=$P(BSDXNOD,U,5) ;Street
+"RTN","BSDX27",53,0)
+    S BSDXCITY=$P(BSDXNOD,U,6) ;City
+"RTN","BSDX27",54,0)
+    S BSDXST=$P(BSDXNOD,U,7) ;State
+"RTN","BSDX27",55,0)
+    S BSDXZIP=$P(BSDXNOD,U,8) ;zip
+"RTN","BSDX27",56,0)
+    S BSDXPHON=$P(BSDXNOD,U,9) ;homephone
+"RTN","BSDX27",57,0)
+    ;
+"RTN","BSDX27",58,0)
+    ;Organize ^DPT(BSDXPAT,"S," nodes
+"RTN","BSDX27",59,0)
+    ; into BSDXDPT(CLINIC,DATE)
+"RTN","BSDX27",60,0)
+    ;
+"RTN","BSDX27",61,0)
+    I $D(^DPT(BSDXPAT,"S")) S BSDXDT=0 F  S BSDXDT=$O(^DPT(BSDXPAT,"S",BSDXDT)) Q:'+BSDXDT  D
+"RTN","BSDX27",62,0)
+    . S BSDXNOD=$G(^DPT(BSDXPAT,"S",BSDXDT,0))
+"RTN","BSDX27",63,0)
+    . S BSDXCID=$P(BSDXNOD,U)
+"RTN","BSDX27",64,0)
+    . Q:'+BSDXCID
+"RTN","BSDX27",65,0)
+    . Q:'$D(^SC(BSDXCID,0))
+"RTN","BSDX27",66,0)
+    . N BSDXFLAGS S BSDXFLAGS=$P(BSDXNOD,U,2)  ; No show and Cancel Flags
+"RTN","BSDX27",67,0)
+    . Q:BSDXFLAGS["C"  ; if appt is cancelled, quit
+"RTN","BSDX27",68,0)
+    . S BSDXDPT(BSDXCID,BSDXDT)=BSDXNOD
+"RTN","BSDX27",69,0)
+    ;
+"RTN","BSDX27",70,0)
+    ;$O Through ^BSDX("CPAT",
+"RTN","BSDX27",71,0)
+    S BSDXIEN=0
+"RTN","BSDX27",72,0)
+    I $D(^BSDXAPPT("CPAT",BSDXPAT)) F  S BSDXIEN=$O(^BSDXAPPT("CPAT",BSDXPAT,BSDXIEN)) Q:'BSDXIEN  D
+"RTN","BSDX27",73,0)
+    . N BSDXNOD,BSDXAPT,BSDXCID,BSDXCNOD,BSDXCLN,BSDX44,BSDXDNOD,BSDXSTAT,BSDX,BSDXTYPE,BSDXLIN
+"RTN","BSDX27",74,0)
+    . S BSDXNOD=$G(^BSDXAPPT(BSDXIEN,0))
+"RTN","BSDX27",75,0)
+    . Q:BSDXNOD=""
+"RTN","BSDX27",76,0)
+    . Q:$P(BSDXNOD,U,12)]""  ;CANCELLED
+"RTN","BSDX27",77,0)
+    . S Y=$P(BSDXNOD,U)
+"RTN","BSDX27",78,0)
+    . Q:'+Y
+"RTN","BSDX27",79,0)
+    . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",80,0)
+    . S BSDXAPT=Y ;Appointment date time
+"RTN","BSDX27",81,0)
+    . S BSDXCLRK=$P(BSDXNOD,U,8) ;Appointment made by
+"RTN","BSDX27",82,0)
+    . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX27",83,0)
+    . S Y=$P(BSDXNOD,U,9) ;Date Appointment Made
+"RTN","BSDX27",84,0)
+    . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",85,0)
+    . S BSDXMADE=Y
+"RTN","BSDX27",86,0)
+    . ;NOTE
+"RTN","BSDX27",87,0)
+    . S BSDXNOT=""
+"RTN","BSDX27",88,0)
+    . I $D(^BSDXAPPT(BSDXIEN,1,0)) S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXIEN,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX27",89,0)
+    . . S BSDXLIN=$G(^BSDXAPPT(BSDXIEN,1,BSDXQ,0))
+"RTN","BSDX27",90,0)
+    . . S:(BSDXLIN'="")&($E(BSDXLIN,$L(BSDXLIN)-1,$L(BSDXLIN))'=" ") BSDXLIN=BSDXLIN_" "
+"RTN","BSDX27",91,0)
+    . . S BSDXNOT=BSDXNOT_BSDXLIN
+"RTN","BSDX27",92,0)
+    . ;Resource
+"RTN","BSDX27",93,0)
+    . S BSDXCID=$P(BSDXNOD,U,7) ;IEN of BSDX RESOURCE
+"RTN","BSDX27",94,0)
+    . Q:'+BSDXCID
+"RTN","BSDX27",95,0)
+    . Q:'$D(^BSDXRES(BSDXCID,0))
+"RTN","BSDX27",96,0)
+    . S BSDXCNOD=$G(^BSDXRES(BSDXCID,0)) ;BSDX RESOURCE node
+"RTN","BSDX27",97,0)
+    . Q:BSDXCNOD=""
+"RTN","BSDX27",98,0)
+    . S BSDXCLN=$P(BSDXCNOD,U) ;Text name of BSDX Resource
+"RTN","BSDX27",99,0)
+    . S BSDX44=$P(BSDXCNOD,U,4) ;File 44 pointer
+"RTN","BSDX27",100,0)
+    . ;If appt entry in ^DPT(PAT,"S" exists for this clinic, get the TYPE/STATUS info from
+"RTN","BSDX27",101,0)
+    . ;the BSDXDPT array and delete the BSDXDPT node
+"RTN","BSDX27",102,0)
+    . S BSDXTYPE=""
+"RTN","BSDX27",103,0)
+    . I +BSDX44,$D(BSDXDPT(BSDX44,$P(BSDXNOD,U))) D  ;BSDXNOD is the BSDX APPOINTMENT node
+"RTN","BSDX27",104,0)
+    . . S BSDXDNOD=BSDXDPT(BSDX44,$P(BSDXNOD,U)) ;BSDXDNOD is a copy of the ^DPT(PAT,"S" node
+"RTN","BSDX27",105,0)
+    . . S BSDXTYPE=$$STATUS(BSDXPAT,$P(BSDXNOD,U),BSDXDNOD) ;IHS/OIT/HMW 20050208 Added
+"RTN","BSDX27",106,0)
+    . . K BSDXDPT(BSDX44,$P(BSDXNOD,U))
+"RTN","BSDX27",107,0)
+    . S BSDXI=BSDXI+1
+"RTN","BSDX27",108,0)
+    . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXAPT_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_BSDXCID_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_$C(30)
+"RTN","BSDX27",109,0)
+    . Q
+"RTN","BSDX27",110,0)
+    ;
+"RTN","BSDX27",111,0)
+    ;Go through remaining BSDXDPT( entries
+"RTN","BSDX27",112,0)
+    I $D(BSDXDPT) S BSDX44=0 D
+"RTN","BSDX27",113,0)
+    . F  S BSDX44=$O(BSDXDPT(BSDX44)) Q:'+BSDX44  S BSDXDT=0 D
+"RTN","BSDX27",114,0)
+    . . F  S BSDXDT=$O(BSDXDPT(BSDX44,BSDXDT)) Q:'+BSDXDT  D
+"RTN","BSDX27",115,0)
+    . . . S BSDXDNOD=BSDXDPT(BSDX44,BSDXDT)
+"RTN","BSDX27",116,0)
+    . . . S Y=BSDXDT
+"RTN","BSDX27",117,0)
+    . . . Q:'+Y
+"RTN","BSDX27",118,0)
+    . . . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",119,0)
+    . . . S BSDXAPT=Y
+"RTN","BSDX27",120,0)
+    . . . S BSDXTYPE=$$STATUS(BSDXPAT,BSDXDT,BSDXDNOD) ;IHS/OIT/HMW 20050208 Added
+"RTN","BSDX27",121,0)
+    . . . S BSDXCLN=$P($G(^SC(BSDX44,0)),U)
+"RTN","BSDX27",122,0)
+    . . . S BSDXCLRK=$P(BSDXDNOD,U,18)
+"RTN","BSDX27",123,0)
+    . . . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX27",124,0)
+    . . . S Y=$P(BSDXDNOD,U,19)
+"RTN","BSDX27",125,0)
+    . . . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",126,0)
+    . . . S BSDXMADE=Y
+"RTN","BSDX27",127,0)
+    . . . S BSDXNOT=""
+"RTN","BSDX27",128,0)
+    . . . S BSDXI=BSDXI+1
+"RTN","BSDX27",129,0)
+    . . . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXAPT_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_$C(30)
+"RTN","BSDX27",130,0)
+    . . . K BSDXDPT(BSDX44,BSDXDT)
+"RTN","BSDX27",131,0)
+    ;
+"RTN","BSDX27",132,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",133,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX27",134,0)
+    Q
+"RTN","BSDX27",135,0)
+    ;
+"RTN","BSDX27",136,0)
+STATUS(PAT,DATE,NODE)   ; returns appt status
+"RTN","BSDX27",137,0)
+    ;IHS/OIT/HMW 20050208 Added from BSDDPA
+"RTN","BSDX27",138,0)
+    NEW TYP
+"RTN","BSDX27",139,0)
+    S TYP=$$APPTYP^BSDXAPI(PAT,DATE)    ;sched vs. walkin
+"RTN","BSDX27",140,0)
+    I $P(NODE,U,2)["C" Q TYP_" - CANCELLED"
+"RTN","BSDX27",141,0)
+    I $P(NODE,U,2)'="NT",$P(NODE,U,2)["N" Q TYP_" - NO SHOW"
+"RTN","BSDX27",142,0)
+    I $$CO^BSDXAPI(PAT,+NODE,DATE) Q TYP_" - CHECKED OUT"
+"RTN","BSDX27",143,0)
+    I $$CI^BSDXAPI(PAT,+NODE,DATE) Q TYP_" - CHECKED IN"
+"RTN","BSDX27",144,0)
+    Q TYP
+"RTN","BSDX27",145,0)
+    ;
+"RTN","BSDX27",146,0)
+ERROR   ;
+"RTN","BSDX27",147,0)
+    D ERR(BSDXI,"RPMS Error")
+"RTN","BSDX27",148,0)
+    Q
+"RTN","BSDX27",149,0)
+    ;
+"RTN","BSDX27",150,0)
+ERR(BSDXI,ERRNO,MSG)    ;Error processing
+"RTN","BSDX27",151,0)
+    S:'$D(BSDXI) BSDXI=999
+"RTN","BSDX27",152,0)
+    I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX27",153,0)
+    E  S BSDXERR=ERRNO
+"RTN","BSDX27",154,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",155,0)
+    S ^BSDXTMP($J,BSDXI)=MSG_"^^^^^^^^^^^^^^^"_$C(30)
+"RTN","BSDX27",156,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",157,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX27",158,0)
+    Q
+"RTN","BSDX27",159,0)
+PATINFO(BSDXPAT)    ;EP
+"RTN","BSDX27",160,0)
+    ;Intrisic Function returns NAME^SEX^DOB^HRN^STREET^CITY^STATE^ZIP^PHONE for patient ien BSDXPAT
+"RTN","BSDX27",161,0)
+    ;DOB is in external format
+"RTN","BSDX27",162,0)
+    ;HRN depends on existence of DUZ(2)
+"RTN","BSDX27",163,0)
+    ;
+"RTN","BSDX27",164,0)
+    N BSDXNOD,BSDXNAM,BSDXSEX,BSDXDOB,BSDXHRN,BSDXSTRT,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX27",165,0)
+    S BSDXNOD=^DPT(+BSDXPAT,0)
+"RTN","BSDX27",166,0)
+    S BSDXNAM=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX27",167,0)
+    S BSDXSEX=$P(BSDXNOD,U,2)
+"RTN","BSDX27",168,0)
+    S BSDXSEX=$S(BSDXSEX="F":"FEMALE",BSDXSEX="M":"MALE",1:"")
+"RTN","BSDX27",169,0)
+    S Y=$P(BSDXNOD,U,3) I Y]""  X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",170,0)
+    S BSDXDOB=Y ;DOB
+"RTN","BSDX27",171,0)
+    S BSDXHRN=""
+"RTN","BSDX27",172,0)
+    I $D(DUZ(2)) I DUZ(2)>0 S BSDXHRN=$P($G(^AUPNPAT(BSDXPAT,41,DUZ(2),0)),U,2) ;HRN
+"RTN","BSDX27",173,0)
+    ;
+"RTN","BSDX27",174,0)
+    S BSDXNOD=$G(^DPT(+BSDXPAT,.11))
+"RTN","BSDX27",175,0)
+    S (BSDXSTRT,BSDXCITY,BSDXST,BSDXZIP)=""
+"RTN","BSDX27",176,0)
+    I BSDXNOD]"" D
+"RTN","BSDX27",177,0)
+    . S BSDXSTRT=$E($P(BSDXNOD,U),1,50) ;STREET
+"RTN","BSDX27",178,0)
+    . S BSDXCITY=$P(BSDXNOD,U,4) ;CITY
+"RTN","BSDX27",179,0)
+    . S BSDXST=$P(BSDXNOD,U,5) ;STATE
+"RTN","BSDX27",180,0)
+    . I +BSDXST,$D(^DIC(5,+BSDXST,0)) S BSDXST=$P(^DIC(5,+BSDXST,0),U,2)
+"RTN","BSDX27",181,0)
+    . S BSDXZIP=$P(BSDXNOD,U,6) ;ZIP
+"RTN","BSDX27",182,0)
+    ;
+"RTN","BSDX27",183,0)
+    S BSDXNOD=$G(^DPT(+BSDXPAT,.13)) ;PHONE
+"RTN","BSDX27",184,0)
+    S BSDXPHON=$P(BSDXNOD,U)
+"RTN","BSDX27",185,0)
+    ;
+"RTN","BSDX27",186,0)
+    Q BSDXNAM_U_BSDXSEX_U_BSDXDOB_U_BSDXHRN_U_BSDXSTRT_U_BSDXCITY_U_BSDXST_U_BSDXZIP_U_BSDXPHON
+"RTN","BSDX27",187,0)
+    ;
+"RTN","BSDX27",188,0)
+CLDISPD(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX27",189,0)
+    ;Entry point for debugging
+"RTN","BSDX27",190,0)
+    ;
+"RTN","BSDX27",191,0)
+    ;D DEBUG^%Serenji("CLDISP^BSDX27(.BSDXY,BSDXCLST,BSDXBEG,BSDXEND)")
+"RTN","BSDX27",192,0)
+    Q
+"RTN","BSDX27",193,0)
+    ;
+"RTN","BSDX27",194,0)
+CLDISP(BSDXY,BSDXCLST,BSDXBEG,BSDXEND)  ;EP
+"RTN","BSDX27",195,0)
+    ;
+"RTN","BSDX27",196,0)
+    ;Return recordset of patient appointments
+"RTN","BSDX27",197,0)
+    ;between dates BSDXBEG and BSDXEND for each clinic in BSDXCLST.
+"RTN","BSDX27",198,0)
+    ;Used in listing a patient's appointments and generating patient letters.
+"RTN","BSDX27",199,0)
+    ;BSDXCLST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX27",200,0)
+    ;BSDXBEG and BSDXEND are in external date form.
+"RTN","BSDX27",201,0)
+    ;Called by BSDX CLINIC LETTERS
+"RTN","BSDX27",202,0)
+    ;
+"RTN","BSDX27",203,0)
+       ; July 10, 2010 -- to support i18n, we pass dates from client in
+"RTN","BSDX27",204,0)
+       ; locale-neutral Fileman format. No need to convert it.
+"RTN","BSDX27",205,0)
+    N BSDXI,BSDXNOD,BSDXNAM,BSDXDOB,BSDXHRN,BSDXSEX,BSDXCID,BSDXCNOD,BSDXDT
+"RTN","BSDX27",206,0)
+    N BSDXJ,BSDXAID,BSDXPAT,BSDXPNOD,BSDXCLN,BSDXCLRK,BSDXMADE,BSDXNOT,BSDXLIN
+"RTN","BSDX27",207,0)
+    N BSDXSTRT
+"RTN","BSDX27",208,0)
+    N BSDXSTRE,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX27",209,0)
+    S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX27",210,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX27",211,0)
+    S BSDXI=0
+"RTN","BSDX27",212,0)
+    S ^BSDXTMP($J,BSDXI)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030ApptDate^T00030Clinic^T00030TypeStatus"
+"RTN","BSDX27",213,0)
+    S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE"_$C(30)
+"RTN","BSDX27",214,0)
+    S X="ERROR^BSDX27",@^%ZOSF("TRAP")
+"RTN","BSDX27",215,0)
+    ;
+"RTN","BSDX27",216,0)
+    ;Convert beginning and ending dates
+"RTN","BSDX27",217,0)
+    ;
+"RTN","BSDX27",218,0)
+    S BSDXBEG=BSDXBEG-1,BSDXBEG=BSDXBEG_".9999"
+"RTN","BSDX27",219,0)
+    S BSDXEND=BSDXEND_".9999"
+"RTN","BSDX27",220,0)
+    I BSDXCLST="" D ERR(BSDXI,0,"Routine: BSDX27, Error: Null clinic list") Q
+"RTN","BSDX27",221,0)
+    ;
+"RTN","BSDX27",222,0)
+    ;For each clinic in BSDXCLST $O through ^BSDXAPPT("ARSRC",ResourceIEN,FMDate,ApptIEN)
+"RTN","BSDX27",223,0)
+    ;
+"RTN","BSDX27",224,0)
+    F BSDXJ=1:1:$L(BSDXCLST,"|")-1 S BSDXCID=$P(BSDXCLST,"|",BSDXJ) D
+"RTN","BSDX27",225,0)
+    . S BSDXCLN=$G(^BSDXRES(BSDXCID,0)) S BSDXCLN=$P(BSDXCLN,U) Q:BSDXCLN=""
+"RTN","BSDX27",226,0)
+    . S BSDXSTRT=BSDXBEG F  S BSDXSTRT=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT)) Q:'+BSDXSTRT  Q:BSDXSTRT>BSDXEND  D
+"RTN","BSDX27",227,0)
+    . . S BSDXAID=0 F  S BSDXAID=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT,BSDXAID)) Q:'+BSDXAID  D
+"RTN","BSDX27",228,0)
+    . . . S BSDXNOD=$G(^BSDXAPPT(BSDXAID,0))
+"RTN","BSDX27",229,0)
+    . . . Q:BSDXNOD=""
+"RTN","BSDX27",230,0)
+    . . . Q:$P(BSDXNOD,U,12)]""  ;CANCELLED
+"RTN","BSDX27",231,0)
+    . . . Q:$P(BSDXNOD,U,13)="y"  ;WALKIN
+"RTN","BSDX27",232,0)
+    . . . S Y=$P(BSDXNOD,U)
+"RTN","BSDX27",233,0)
+    . . . Q:'+Y
+"RTN","BSDX27",234,0)
+    . . . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",235,0)
+    . . . S BSDXAPT=Y ;Appointment date time
+"RTN","BSDX27",236,0)
+    . . . ;
+"RTN","BSDX27",237,0)
+    . . . ;NOTE
+"RTN","BSDX27",238,0)
+    . . . S BSDXNOT=""
+"RTN","BSDX27",239,0)
+    . . . I $D(^BSDXAPPT(BSDXAID,1,0)) S BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXAID,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX27",240,0)
+    . . . . S BSDXLIN=$G(^BSDXAPPT(BSDXAID,1,BSDXQ,0))
+"RTN","BSDX27",241,0)
+    . . . . S:(BSDXLIN'="")&($E(BSDXLIN,$L(BSDXLIN)-1,$L(BSDXLIN))'=" ") BSDXLIN=BSDXLIN_" "
+"RTN","BSDX27",242,0)
+    . . . . S BSDXNOT=BSDXNOT_BSDXLIN
+"RTN","BSDX27",243,0)
+    . . . ;
+"RTN","BSDX27",244,0)
+    . . . S BSDXPAT=$P(BSDXNOD,U,5)
+"RTN","BSDX27",245,0)
+    . . . S BSDXPNOD=$$PATINFO(BSDXPAT)
+"RTN","BSDX27",246,0)
+    . . . S BSDXNAM=$P(BSDXPNOD,U) ;NAME
+"RTN","BSDX27",247,0)
+    . . . S BSDXSEX=$P(BSDXPNOD,U,2) ;SEX
+"RTN","BSDX27",248,0)
+    . . . S BSDXDOB=$P(BSDXPNOD,U,3) ;DOB
+"RTN","BSDX27",249,0)
+    . . . S BSDXHRN=$P(BSDXPNOD,U,4) ;Health Record Number for location DUZ(2)
+"RTN","BSDX27",250,0)
+    . . . S BSDXSTRE=$P(BSDXPNOD,U,5) ;Street
+"RTN","BSDX27",251,0)
+    . . . S BSDXCITY=$P(BSDXPNOD,U,6) ;City
+"RTN","BSDX27",252,0)
+    . . . S BSDXST=$P(BSDXPNOD,U,7) ;State
+"RTN","BSDX27",253,0)
+    . . . S BSDXZIP=$P(BSDXPNOD,U,8) ;zip
+"RTN","BSDX27",254,0)
+    . . . S BSDXPHON=$P(BSDXPNOD,U,9) ;homephone
+"RTN","BSDX27",255,0)
+    . . . S BSDXTYPE="" ;Type/status doesn't exist for BSDX APPT clinics and it's not needed for clinic letters
+"RTN","BSDX27",256,0)
+    . . . S BSDXCLRK=$P(BSDXNOD,U,8)
+"RTN","BSDX27",257,0)
+    . . . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX27",258,0)
+    . . . S Y=$P(BSDXNOD,U,9)
+"RTN","BSDX27",259,0)
+    . . . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",260,0)
+    . . . S BSDXMADE=Y
+"RTN","BSDX27",261,0)
+    . . . S BSDXI=BSDXI+1
+"RTN","BSDX27",262,0)
+    . . . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXAPT_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_BSDXCID_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_$C(30)
+"RTN","BSDX27",263,0)
+    ;
+"RTN","BSDX27",264,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",265,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX27",266,0)
+    Q
+"RTN","BSDX28")
+0^26^B32389827
+"RTN","BSDX28",1,0)
+BSDX28 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/18/10 2:30pm
+"RTN","BSDX28",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX28",3,0)
+ ; 
+"RTN","BSDX28",4,0)
+    ; Change Log:
+"RTN","BSDX28",5,0)
+ ; HMW 3050721 Added test for inactivated record
+"RTN","BSDX28",6,0)
+    ; V1.3 WV/SMH 3100714 
+"RTN","BSDX28",7,0)
+    ; - add PID search
+"RTN","BSDX28",8,0)
+    ; - return PID instead of SSN (change header and logic)
+"RTN","BSDX28",9,0)
+    ; - Change Error trap to new style.
+"RTN","BSDX28",10,0)
+ ;
+"RTN","BSDX28",11,0)
+PTLOOKRS(BSDXY,BSDXP,BSDXC)  ;EP Patient Lookup
+"RTN","BSDX28",12,0)
+ ;
+"RTN","BSDX28",13,0)
+ ;Find up to BSDXC patients matching BSDXP*
+"RTN","BSDX28",14,0)
+ ;Supports DOB Lookup, Primary Long ID lookup
+"RTN","BSDX28",15,0)
+ ;
+"RTN","BSDX28",16,0)
+ N $ET S $ET="G ERROR^BSDX28"
+"RTN","BSDX28",17,0)
+    ; rm ctrl chars
+"RTN","BSDX28",18,0)
+ S BSDXP=$TR(BSDXP,$C(13),"")
+"RTN","BSDX28",19,0)
+ S BSDXP=$TR(BSDXP,$C(10),"")
+"RTN","BSDX28",20,0)
+ S BSDXP=$TR(BSDXP,$C(9),"")
+"RTN","BSDX28",21,0)
+    ; num of pts to find
+"RTN","BSDX28",22,0)
+ S:BSDXC="" BSDXC=10
+"RTN","BSDX28",23,0)
+ N BSDXHRN,BSDXZ,BSDXDLIM,BSDXRET,BSDXDPT,BSDXRET,BSDXIEN,BSDXFILE
+"RTN","BSDX28",24,0)
+ N BSDXIENS,BSDXFIELDS,BSDXFLAGS,BSDXVALUE,BSDXNUMBER,BSDXINDEXES,BSDXSCREEN
+"RTN","BSDX28",25,0)
+ N BSDXTARG,BSDXMSG,BSDXRSLT
+"RTN","BSDX28",26,0)
+ S BSDXDLIM="^"
+"RTN","BSDX28",27,0)
+ S BSDXRET="T00030NAME^T00030HRN^T00030PID^D00030DOB^T00030IEN"_$C(30)
+"RTN","BSDX28",28,0)
+ I '+$G(DUZ) S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",29,0)
+ I '$D(DUZ(2)) S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",30,0)
+ 
+"RTN","BSDX28",31,0)
+PID ;PID Lookup
+"RTN","BSDX28",32,0)
+    ; If this ID exists, go get it. If "UJOPID" index doesn't exist,
+"RTN","BSDX28",33,0)
+    ; won't work anyways.
+"RTN","BSDX28",34,0)
+    I $D(^DPT("UJOPID",BSDXP)) DO  SET BSDXY=BSDXRET_$C(31) QUIT
+"RTN","BSDX28",35,0)
+    . S BSDXIEN=$O(^DPT("UJOPID",BSDXP,""))
+"RTN","BSDX28",36,0)
+    . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",37,0)
+    . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",38,0)
+    . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",39,0)
+    . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",40,0)
+    . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",41,0)
+    . ; Inactivated Chart get an *
+"RTN","BSDX28",42,0)
+    . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q
+"RTN","BSDX28",43,0)
+    . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",44,0)
+    . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",45,0)
+    . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",46,0)
+    . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",47,0)
+    . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",48,0)
+    . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",49,0)
+ ;
+"RTN","BSDX28",50,0)
+DOB ;DOB Lookup
+"RTN","BSDX28",51,0)
+ I +DUZ(2),((BSDXP?1.2N1"/"1.2N1"/"1.4N)!(BSDXP?1.2N1" "1.2N1" "1.4N)!(BSDXP?1.2N1"-"1.2N1"-"1.4N)) D  S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",52,0)
+ . S X=BSDXP S %DT="P" D ^%DT S BSDXP=Y Q:'+Y
+"RTN","BSDX28",53,0)
+ . Q:'$D(^DPT("ADOB",BSDXP))
+"RTN","BSDX28",54,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^DPT("ADOB",BSDXP,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX28",55,0)
+ . . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",56,0)
+ . . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",57,0)
+ . . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",58,0)
+ . . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",59,0)
+ . . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",60,0)
+ . . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",61,0)
+ . . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",62,0)
+    . . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",63,0)
+ . . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",64,0)
+ . . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",65,0)
+ . . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",66,0)
+ . . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",67,0)
+ . . Q
+"RTN","BSDX28",68,0)
+ . Q
+"RTN","BSDX28",69,0)
+ ;
+"RTN","BSDX28",70,0)
+CHART 
+"RTN","BSDX28",71,0)
+    ;Chart# Lookup
+"RTN","BSDX28",72,0)
+ I +DUZ(2),BSDXP]"",$D(^AUPNPAT("D",BSDXP)) D  S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",73,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^AUPNPAT("D",BSDXP,BSDXIEN)) Q:'+BSDXIEN  I $D(^AUPNPAT("D",BSDXP,BSDXIEN,DUZ(2))) D  Q
+"RTN","BSDX28",74,0)
+ . . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",75,0)
+ . . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",76,0)
+ . . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",77,0)
+ . . S BSDXHRN=BSDXP ;CHART
+"RTN","BSDX28",78,0)
+ . . I $D(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),$P(^(0),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",79,0)
+ . . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",80,0)
+    . . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",81,0)
+ . . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",82,0)
+ . . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",83,0)
+ . . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",84,0)
+ . . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",85,0)
+ . . Q
+"RTN","BSDX28",86,0)
+ . Q
+"RTN","BSDX28",87,0)
+    ;
+"RTN","BSDX28",88,0)
+SSN ;SSN Lookup
+"RTN","BSDX28",89,0)
+ I (BSDXP?9N)!(BSDXP?3N1"-"2N1"-"4N),$D(^DPT("SSN",BSDXP)) D  S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",90,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^DPT("SSN",BSDXP,BSDXIEN)) Q:'+BSDXIEN  D  Q
+"RTN","BSDX28",91,0)
+ . . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",92,0)
+ . . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",93,0)
+ . . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",94,0)
+ . . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",95,0)
+ . . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",96,0)
+ . . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",97,0)
+ . . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",98,0)
+    . . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",99,0)
+ . . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",100,0)
+ . . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",101,0)
+ . . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",102,0)
+ . . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",103,0)
+ . . Q
+"RTN","BSDX28",104,0)
+ . Q
+"RTN","BSDX28",105,0)
+ ;
+"RTN","BSDX28",106,0)
+ S BSDXFILE=9000001
+"RTN","BSDX28",107,0)
+ S BSDXIENS=""
+"RTN","BSDX28",108,0)
+ S BSDXFIELDS=".01"
+"RTN","BSDX28",109,0)
+ S BSDXFLAGS="M"
+"RTN","BSDX28",110,0)
+ S BSDXVALUE=BSDXP
+"RTN","BSDX28",111,0)
+ S BSDXNUMBER=BSDXC
+"RTN","BSDX28",112,0)
+ S BSDXINDEXES=""
+"RTN","BSDX28",113,0)
+ S BSDXSCREEN=$S(+DUZ(2):"I $D(^AUPNPAT(Y,41,DUZ(2),0))",1:"")
+"RTN","BSDX28",114,0)
+ S BSDXIDEN=""
+"RTN","BSDX28",115,0)
+ S BSDXTARG="BSDXRSLT"
+"RTN","BSDX28",116,0)
+ S BSDXMSG=""
+"RTN","BSDX28",117,0)
+ D FIND^DIC(BSDXFILE,BSDXIENS,BSDXFIELDS,BSDXFLAGS,BSDXVALUE,BSDXNUMBER,BSDXINDEXES,BSDXSCREEN,BSDXIDEN,BSDXTARG,BSDXMSG)
+"RTN","BSDX28",118,0)
+ I '+$G(BSDXRSLT("DILIST",0)) S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",119,0)
+ N BSDXCNT S BSDXCNT=2
+"RTN","BSDX28",120,0)
+ F BSDXX=1:1:$P(BSDXRSLT("DILIST",0),U) D
+"RTN","BSDX28",121,0)
+ . S BSDXIEN=BSDXRSLT("DILIST",2,BSDXX)
+"RTN","BSDX28",122,0)
+ . S BSDXZ=BSDXRSLT("DILIST","ID",BSDXX,.01) ;NAME
+"RTN","BSDX28",123,0)
+ . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",124,0)
+ . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",125,0)
+ . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",126,0)
+ . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",127,0)
+ . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",128,0)
+    . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",129,0)
+ . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",130,0)
+ . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",131,0)
+ . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",132,0)
+ . S $P(BSDXRET,$C(30),BSDXCNT)=BSDXZ
+"RTN","BSDX28",133,0)
+ . S BSDXCNT=BSDXCNT+1
+"RTN","BSDX28",134,0)
+ . Q
+"RTN","BSDX28",135,0)
+ S BSDXY=BSDXRET_$C(30)_$C(31)
+"RTN","BSDX28",136,0)
+ Q
+"RTN","BSDX28",137,0)
+ ;
+"RTN","BSDX28",138,0)
+ERROR ;
+"RTN","BSDX28",139,0)
+ D ERR("RPMS Error")
+"RTN","BSDX28",140,0)
+ Q
+"RTN","BSDX28",141,0)
+ ;
+"RTN","BSDX28",142,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX28",143,0)
+ S BSDXRET="T00030NAME^T00030HRN^T00030SSN^D00030DOB^T00030IEN"_$C(30)_"^^^^"_$C(30)_$C(31)
+"RTN","BSDX28",144,0)
+ Q
+"RTN","BSDX29")
+0^27^B51424449
+"RTN","BSDX29",1,0)
+BSDX29 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:39pm
+"RTN","BSDX29",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX29",3,0)
+ ; 
+"RTN","BSDX29",4,0)
+ ; Change Log:
+"RTN","BSDX29",5,0)
+ ; v1.3 by WV/SMH on 3100713
+"RTN","BSDX29",6,0)
+ ; - Beginning and Ending dates passed as FM Dates
+"RTN","BSDX29",7,0)
+    ; v1.42 by WV/SMH on 3101023
+"RTN","BSDX29",8,0)
+    ; - Transaction moved; now restartable too.
+"RTN","BSDX29",9,0)
+    ; --> Thanks to Zach Gonzalez and Rick Marshall.
+"RTN","BSDX29",10,0)
+    ; - Refactoring of major portions of routine
+"RTN","BSDX29",11,0)
+ ;
+"RTN","BSDX29",12,0)
+BSDXCPD(BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX29",13,0)
+ ;Entry point for debugging
+"RTN","BSDX29",14,0)
+ ;
+"RTN","BSDX29",15,0)
+ D DEBUG^%Serenji("BSDXCP^BSDX29(.BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND)")
+"RTN","BSDX29",16,0)
+ Q
+"RTN","BSDX29",17,0)
+ ;
+"RTN","BSDX29",18,0)
+BSDXCP(BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX29",19,0)
+ ;Copy appointments from HOSPITAL LOCATION entry BSDX44 to BSDX RESOURCE entry BSDXRES
+"RTN","BSDX29",20,0)
+ ;Beginning with appointments on day BSDXBEG and ending on BSDXEND, inclusive
+"RTN","BSDX29",21,0)
+    ;Called by RPC: BSDX COPY APPOINTMENTS
+"RTN","BSDX29",22,0)
+ ;
+"RTN","BSDX29",23,0)
+    ; Parameters:
+"RTN","BSDX29",24,0)
+    ; - BSDXY: Global Return
+"RTN","BSDX29",25,0)
+    ; - BSDXRES: BSDX RESOURCE to copy appointments to
+"RTN","BSDX29",26,0)
+    ; - BSDX44: Hospital Location IEN to copy appointments from
+"RTN","BSDX29",27,0)
+    ; - BSDXBEG: Beginning Date in FM Format
+"RTN","BSDX29",28,0)
+    ; - BSDXEND: End Date in FM Format
+"RTN","BSDX29",29,0)
+    ;
+"RTN","BSDX29",30,0)
+ ;Returns ADO Recordset containing TASK_NUMBER and ERRORID
+"RTN","BSDX29",31,0)
+ ;
+"RTN","BSDX29",32,0)
+    ; Return Array
+"RTN","BSDX29",33,0)
+ S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX29",34,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX29",35,0)
+    ; $ET
+"RTN","BSDX29",36,0)
+    N $ET S $ET="G ETRAP^BSDX29"
+"RTN","BSDX29",37,0)
+ ; Counter
+"RTN","BSDX29",38,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX29",39,0)
+    ; Header Node
+"RTN","BSDX29",40,0)
+ S ^BSDXTMP($J,0)="T00010TASK_NUMBER^T00100ERRORID"_$C(30)
+"RTN","BSDX29",41,0)
+ ;
+"RTN","BSDX29",42,0)
+    ; Make dates inclusive; add 1 to FM dates
+"RTN","BSDX29",43,0)
+    S BSDXBEG=BSDXBEG-1
+"RTN","BSDX29",44,0)
+ S BSDXEND=BSDXEND+1
+"RTN","BSDX29",45,0)
+ ;
+"RTN","BSDX29",46,0)
+    ; Taskman variables
+"RTN","BSDX29",47,0)
+    N ZTSK,ZTRTN,ZTDTH,ZTDESC,ZTSAVE 
+"RTN","BSDX29",48,0)
+ ; Task Load
+"RTN","BSDX29",49,0)
+ S ZTRTN="ZTM^BSDX29",ZTDTH=$H,ZTDESC="COPY PATIENT APPTS"
+"RTN","BSDX29",50,0)
+ S ZTSAVE("BSDXBEG")="",ZTSAVE("BSDXEND")="",ZTSAVE("BSDX44")="",ZTSAVE("BSDXRES")=""
+"RTN","BSDX29",51,0)
+ D ^%ZTLOAD
+"RTN","BSDX29",52,0)
+ ; Set up return ADO.net dataset
+"RTN","BSDX29",53,0)
+ N BSDXST S BSDXST=$S($G(ZTSK)>0:"OK",1:"Unable to create task.")
+"RTN","BSDX29",54,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",55,0)
+ S ^BSDXTMP($J,BSDXI)=$G(ZTSK)_"^"_BSDXST_$C(30)_$C(31)
+"RTN","BSDX29",56,0)
+ QUIT
+"RTN","BSDX29",57,0)
+ ;
+"RTN","BSDX29",58,0)
+ZTMD ;EP - Debug entry point
+"RTN","BSDX29",59,0)
+ ;D DEBUG^%Serenji("ZTM^BSDX29")
+"RTN","BSDX29",60,0)
+ Q
+"RTN","BSDX29",61,0)
+ ;
+"RTN","BSDX29",62,0)
+ZTM ;EP - Taskman entry point
+"RTN","BSDX29",63,0)
+    ; Variables set up in ZTSAVE above
+"RTN","BSDX29",64,0)
+    ;
+"RTN","BSDX29",65,0)
+ Q:'$D(ZTSK)
+"RTN","BSDX29",66,0)
+    ; $ET
+"RTN","BSDX29",67,0)
+    N $ET S $ET="G ZTMERR^BSDX29"
+"RTN","BSDX29",68,0)
+ ; Txn
+"RTN","BSDX29",69,0)
+    TSTART (BSDXBEG,BSDXEND,BSDX44,BSDXRES):T="BSDX COPY APPOINTMENT^BSDX29"
+"RTN","BSDX29",70,0)
+ ;$O through ^SC(BSDX44,"S",
+"RTN","BSDX29",71,0)
+ N BSDXCNT S BSDXCNT=0  ; Count of Copied Appointments
+"RTN","BSDX29",72,0)
+    N BSDXQUIT S BSDXQUIT=0  ; Quit Flag to be retrieved from an external proc
+"RTN","BSDX29",73,0)
+ ; Set Count
+"RTN","BSDX29",74,0)
+    S ^BSDXTMP("BSDXCOPY",ZTSK)=BSDXCNT
+"RTN","BSDX29",75,0)
+ ; Loop through dates here.
+"RTN","BSDX29",76,0)
+    F  S BSDXBEG=$O(^SC(BSDX44,"S",BSDXBEG)) Q:'+BSDXBEG  Q:BSDXBEG>BSDXEND  Q:BSDXQUIT  D
+"RTN","BSDX29",77,0)
+    . ; Loop through Entries in each date in the subsubfile.
+"RTN","BSDX29",78,0)
+    . ; Quit if we are at the end or if a remote process requests a quit.
+"RTN","BSDX29",79,0)
+    . N BSDXIEN S BSDXIEN=0
+"RTN","BSDX29",80,0)
+ . F  S BSDXIEN=$O(^SC(BSDX44,"S",BSDXBEG,1,BSDXIEN)) Q:'+BSDXIEN  Q:BSDXQUIT  D
+"RTN","BSDX29",81,0)
+ . . N BSDXNOD S BSDXNOD=$G(^SC(BSDX44,"S",BSDXBEG,1,BSDXIEN,0)) ; Node
+"RTN","BSDX29",82,0)
+ . . Q:'+BSDXNOD  ; Quit if no node
+"RTN","BSDX29",83,0)
+ . . N BSDXCAN S BSDXCAN=$P(BSDXNOD,U,9) ; Cancel flag
+"RTN","BSDX29",84,0)
+ . . Q:BSDXCAN="C"  ; Quit if appt cancelled
+"RTN","BSDX29",85,0)
+    . . N BSDXPAT S BSDXPAT=$P(BSDXNOD,U) ; Patient
+"RTN","BSDX29",86,0)
+    . . N BSDXLEN S BSDXLEN=$P(BSDXNOD,U,2) ;duration in minutes
+"RTN","BSDX29",87,0)
+ . . N BSDXCLRK S BSDXCLRK=$P(BSDXNOD,U,6) ;appt made by (clerk)
+"RTN","BSDX29",88,0)
+ . . N BSDXMADE S BSDXMADE=$P(BSDXNOD,U,7) ;date appt made
+"RTN","BSDX29",89,0)
+ . . N BSDXNOTE S BSDXNOTE=$P(BSDXNOD,U,4) ;'OTHER' field contains note
+"RTN","BSDX29",90,0)
+ . . S BSDXCNT=BSDXCNT+$$XFER(BSDXRES,BSDXBEG,BSDXPAT,BSDXLEN,BSDXCLRK,BSDXMADE,BSDXNOTE)
+"RTN","BSDX29",91,0)
+ . . I +BSDXCNT,BSDXCNT#10=0 S ^BSDXTMP("BSDXCOPY",ZTSK)=BSDXCNT_" records copied." ;every 10th record
+"RTN","BSDX29",92,0)
+ . . I $D(^BSDXTMP("BSDXCOPY",ZTSK,"CANCEL")) S BSDXQUIT=1 ;Check for cancel flag
+"RTN","BSDX29",93,0)
+ . . Q
+"RTN","BSDX29",94,0)
+ . Q
+"RTN","BSDX29",95,0)
+ I 'BSDXQUIT TCOMMIT
+"RTN","BSDX29",96,0)
+ E  TROLLBACK
+"RTN","BSDX29",97,0)
+ S ^BSDXTMP("BSDXCOPY",ZTSK)=$S(BSDXQUIT:"Cancelled.  No records copied.",1:"Finished.  "_BSDXCNT_" records copied.")
+"RTN","BSDX29",98,0)
+ Q
+"RTN","BSDX29",99,0)
+ ;
+"RTN","BSDX29",100,0)
+ZTMERR ; For now, error from TM is only in trap; not returned to client.
+"RTN","BSDX29",101,0)
+ N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+"RTN","BSDX29",102,0)
+    ; Rollback before logging the error
+"RTN","BSDX29",103,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX29",104,0)
+ D ^%ZTER
+"RTN","BSDX29",105,0)
+    S $EC="" ; Clear Error
+"RTN","BSDX29",106,0)
+ QUIT
+"RTN","BSDX29",107,0)
+ ;
+"RTN","BSDX29",108,0)
+XFER(BSDXRES,BSDXBEG,BSDXPAT,BSDXLEN,BSDXCLRK,BSDXMADE,BSDXNOTE) ;EP
+"RTN","BSDX29",109,0)
+ ;
+"RTN","BSDX29",110,0)
+ ;Copy record to BSDX APPOINTMENT file
+"RTN","BSDX29",111,0)
+ ;Return 1 if record copied, otherwise 0
+"RTN","BSDX29",112,0)
+ ;
+"RTN","BSDX29",113,0)
+ ;$O Thru ^BSDXAPPT to determine if this appt already added
+"RTN","BSDX29",114,0)
+ N BSDXEND,BSDXIEN,BSDXFND,BSDXPAT2
+"RTN","BSDX29",115,0)
+ S BSDXIEN=0,BSDXFND=0
+"RTN","BSDX29",116,0)
+ F  S BSDXIEN=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXBEG,BSDXIEN)) Q:'+BSDXIEN  D  Q:BSDXFND
+"RTN","BSDX29",117,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXIEN,0))
+"RTN","BSDX29",118,0)
+ . Q:'+BSDXNOD
+"RTN","BSDX29",119,0)
+ . S BSDXPAT2=$P(BSDXNOD,U,5)
+"RTN","BSDX29",120,0)
+ . S BSDXFND=0
+"RTN","BSDX29",121,0)
+ . I BSDXPAT2=BSDXPAT S BSDXFND=1
+"RTN","BSDX29",122,0)
+ . Q
+"RTN","BSDX29",123,0)
+ Q:BSDXFND 0
+"RTN","BSDX29",124,0)
+ ;
+"RTN","BSDX29",125,0)
+ ;Add to BSDX APPOINTMENT
+"RTN","BSDX29",126,0)
+ S BSDXEND=BSDXBEG
+"RTN","BSDX29",127,0)
+ ;Calculate ending time from beginning time and duration.
+"RTN","BSDX29",128,0)
+ S BSDXEND=$$ADDMIN(BSDXBEG,BSDXLEN)
+"RTN","BSDX29",129,0)
+ S BSDXIENS="+1,"
+"RTN","BSDX29",130,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.01)=BSDXBEG
+"RTN","BSDX29",131,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.02)=BSDXEND
+"RTN","BSDX29",132,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.05)=BSDXPAT
+"RTN","BSDX29",133,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.07)=BSDXRES
+"RTN","BSDX29",134,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.08)=BSDXCLRK
+"RTN","BSDX29",135,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.09)=BSDXMADE
+"RTN","BSDX29",136,0)
+ ;
+"RTN","BSDX29",137,0)
+ K BSDXIEN
+"RTN","BSDX29",138,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX29",139,0)
+ S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX29",140,0)
+ I '+BSDXIEN Q 0
+"RTN","BSDX29",141,0)
+ ;
+"RTN","BSDX29",142,0)
+ ;Add WP field
+"RTN","BSDX29",143,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE="" D
+"RTN","BSDX29",144,0)
+ . D WP^DIE(9002018.4,BSDXIEN_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX29",145,0)
+ ;
+"RTN","BSDX29",146,0)
+ Q 1
+"RTN","BSDX29",147,0)
+ ;
+"RTN","BSDX29",148,0)
+ERR(BSDXI,BSDXCNT,BSDXERR) ;Error processing
+"RTN","BSDX29",149,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",150,0)
+    S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX29",151,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_BSDXERR_$C(30)
+"RTN","BSDX29",152,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",153,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX29",154,0)
+ Q
+"RTN","BSDX29",155,0)
+ ;
+"RTN","BSDX29",156,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX29",157,0)
+ ; No Txn here. So don't rollback anything
+"RTN","BSDX29",158,0)
+    N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+"RTN","BSDX29",159,0)
+    D ^%ZTER
+"RTN","BSDX29",160,0)
+    S $EC="" ; Clear error
+"RTN","BSDX29",161,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX29",162,0)
+ D ERR(BSDXI,$G(BSDXCNT),"~100~BSDX29, Error: "_$G(%ZTERZE))
+"RTN","BSDX29",163,0)
+ Q
+"RTN","BSDX29",164,0)
+ ;
+"RTN","BSDX29",165,0)
+CPSTAT(BSDXY,BSDXTSK) ;EP - Note: As of Dec 6 2010: Inactive Code
+"RTN","BSDX29",166,0)
+ ;Return status (copied record count) of tasked job having ZTSK=BSDXTSK
+"RTN","BSDX29",167,0)
+ ;
+"RTN","BSDX29",168,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX29",169,0)
+ N BSDXI,BSDXCNT
+"RTN","BSDX29",170,0)
+ S BSDXI=0
+"RTN","BSDX29",171,0)
+ S X="ETRAP^BSDX29",@^%ZOSF("TRAP")
+"RTN","BSDX29",172,0)
+ S ^BSDXTMP($J,0)="T00020RECORD_COUNT^T00020ERRORID"_$C(30)
+"RTN","BSDX29",173,0)
+ S BSDXCNT=$G(^BSDXTMP("BSDXCOPY",BSDXTSK))
+"RTN","BSDX29",174,0)
+ I BSDXCNT["Finished" K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",175,0)
+ I BSDXCNT["Cancelled" K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",176,0)
+ ;I $D(^BSDXTMP("BSDXCOPY",BSDXTSK,"CANCEL")) K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",177,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",178,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_"OK"_$C(30)_$C(31)
+"RTN","BSDX29",179,0)
+ Q
+"RTN","BSDX29",180,0)
+ ;
+"RTN","BSDX29",181,0)
+CPCANC(BSDXY,BSDXTSK) ;EP Note: As of Dec 6 2010: Inactive code.
+"RTN","BSDX29",182,0)
+ ;Signal tasked job having ZTSK=BSDXTSK to cancel
+"RTN","BSDX29",183,0)
+ ;Returns current record count of copy process
+"RTN","BSDX29",184,0)
+ ;
+"RTN","BSDX29",185,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX29",186,0)
+ N BSDXI,BSDXCNT
+"RTN","BSDX29",187,0)
+ S BSDXI=0
+"RTN","BSDX29",188,0)
+ S X="ETRAP^BSDX29",@^%ZOSF("TRAP")
+"RTN","BSDX29",189,0)
+ S ^BSDXTMP($J,0)="T00020RECORD_COUNT^T00020ERRORID"_$C(30)
+"RTN","BSDX29",190,0)
+ S BSDXCNT=$G(^BSDXTMP("BSDXCOPY",BSDXTSK))
+"RTN","BSDX29",191,0)
+ I BSDXCNT["FINISHED" K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",192,0)
+ E  S ^BSDXTMP("BSDXCOPY",BSDXTSK,"CANCEL")=""
+"RTN","BSDX29",193,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",194,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_"OK"_$C(30)_$C(31)
+"RTN","BSDX29",195,0)
+ Q
+"RTN","BSDX29",196,0)
+ ;
+"RTN","BSDX29",197,0)
+ADDMIN(BSDXSTRT,BSDXLEN) ;
+"RTN","BSDX29",198,0)
+ ;
+"RTN","BSDX29",199,0)
+ ;Add BSDXLEN minutes to time BSDXSTRT and return end time
+"RTN","BSDX29",200,0)
+ N BSDXEND,BSDXH,BSDXM,BSDXSTIM,BSDXETIM
+"RTN","BSDX29",201,0)
+ S BSDXEND=$P(BSDXSTRT,".")
+"RTN","BSDX29",202,0)
+ ;
+"RTN","BSDX29",203,0)
+ ;Convert start time to minutes past midnight
+"RTN","BSDX29",204,0)
+ S BSDXSTIM=$P(BSDXSTRT,".",2)
+"RTN","BSDX29",205,0)
+ S BSDXSTIM=BSDXSTIM_"0000"
+"RTN","BSDX29",206,0)
+ S BSDXSTIM=$E(BSDXSTIM,1,4)
+"RTN","BSDX29",207,0)
+ S BSDXH=$E(BSDXSTIM,1,2)
+"RTN","BSDX29",208,0)
+ S BSDXH=BSDXH*60
+"RTN","BSDX29",209,0)
+ S BSDXH=BSDXH+$E(BSDXSTIM,3,4)
+"RTN","BSDX29",210,0)
+ ;
+"RTN","BSDX29",211,0)
+ ;Add duration to find minutes past midnight of end time
+"RTN","BSDX29",212,0)
+ S BSDXETIM=BSDXH+BSDXLEN
+"RTN","BSDX29",213,0)
+ ;
+"RTN","BSDX29",214,0)
+ ;Convert back to a time
+"RTN","BSDX29",215,0)
+ S BSDXH=BSDXETIM\60
+"RTN","BSDX29",216,0)
+ S BSDXH="00"_BSDXH
+"RTN","BSDX29",217,0)
+ S BSDXH=$E(BSDXH,$L(BSDXH)-1,$L(BSDXH))
+"RTN","BSDX29",218,0)
+ S BSDXM=BSDXETIM#60
+"RTN","BSDX29",219,0)
+ S BSDXM="00"_BSDXM
+"RTN","BSDX29",220,0)
+ S BSDXM=$E(BSDXM,$L(BSDXM)-1,$L(BSDXM))
+"RTN","BSDX29",221,0)
+ S BSDXETIM=BSDXH_BSDXM
+"RTN","BSDX29",222,0)
+ I BSDXETIM>2400 S BSDXETIM=2400
+"RTN","BSDX29",223,0)
+ S $P(BSDXEND,".",2)=BSDXETIM
+"RTN","BSDX29",224,0)
+ Q BSDXEND
+"RTN","BSDX2E")
+0^^B27292304
+"RTN","BSDX2E",1,0)
+BSDX2E ;IHS/OIT/MJL - ENVIRONMENT CHECK FOR WINDOWS SCHEDULING [7/18/10 4:30pm]
+"RTN","BSDX2E",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX2E",3,0)
+ ;
+"RTN","BSDX2E",4,0)
+ S LINE="",$P(LINE,"*",81)=""
+"RTN","BSDX2E",5,0)
+ S XPDNOQUE="NO QUE"  ;NO QUEUING ALLOWED
+"RTN","BSDX2E",6,0)
+ S XPDABORT=0
+"RTN","BSDX2E",7,0)
+ I '$G(DUZ) D SORRY("DUZ UNDEFINED OR 0") Q
+"RTN","BSDX2E",8,0)
+ ;
+"RTN","BSDX2E",9,0)
+ I '$L($G(DUZ(0))) D SORRY("DUZ(0) UNDEFINED OR NULL") Q
+"RTN","BSDX2E",10,0)
+ ;
+"RTN","BSDX2E",11,0)
+ D HOME^%ZIS,DT^DICRW
+"RTN","BSDX2E",12,0)
+ S X=$P($G(^VA(200,DUZ,0)),U)
+"RTN","BSDX2E",13,0)
+ I $G(X)="" W !,$$C^XBFUNC("Who are you????") D SORRY("Unknown User") Q
+"RTN","BSDX2E",14,0)
+ ;
+"RTN","BSDX2E",15,0)
+VERSION ;
+"RTN","BSDX2E",16,0)
+ W !,$$C^XBFUNC("Hello, "_$P(X,",",2)_" "_$P(X,","))
+"RTN","BSDX2E",17,0)
+ W !!,$$C^XBFUNC("Checking Environment for Install of Version "_$P($T(+2),";",3)_" of "_$P($T(+2),";",4)_".")
+"RTN","BSDX2E",18,0)
+ ;
+"RTN","BSDX2E",19,0)
+ Q:'$$VERCHK("VA FILEMAN",22)
+"RTN","BSDX2E",20,0)
+ Q:'$$VERCHK("KERNEL",8)
+"RTN","BSDX2E",21,0)
+ Q:'$$VERCHK("XB",3)
+"RTN","BSDX2E",22,0)
+ ;Is the PIMS requirement present?
+"RTN","BSDX2E",23,0)
+ Q:'$$VERCHK("SD",5.3)
+"RTN","BSDX2E",24,0)
+ ; Q:'$$PATCHCK("PIMS*5.3*1003") D
+"RTN","BSDX2E",25,0)
+ Q:'$$VERCHK("BMX",2)
+"RTN","BSDX2E",26,0)
+ ;
+"RTN","BSDX2E",27,0)
+OTHER ;
+"RTN","BSDX2E",28,0)
+ ;Other checks
+"RTN","BSDX2E",29,0)
+ ;
+"RTN","BSDX2E",30,0)
+ENVOK ; If this is just an environ check, end here.
+"RTN","BSDX2E",31,0)
+ W !!,$$C^XBFUNC("ENVIRONMENT OK.")
+"RTN","BSDX2E",32,0)
+ ;
+"RTN","BSDX2E",33,0)
+ ; The following line prevents the "Disable Options..." and "Move
+"RTN","BSDX2E",34,0)
+ ; Routines..." questions from being asked during the install.
+"RTN","BSDX2E",35,0)
+ I $G(XPDENV)=1 S (XPDDIQ("XPZ1"),XPDDIQ("XPZ2"))=0
+"RTN","BSDX2E",36,0)
+ ;
+"RTN","BSDX2E",37,0)
+ ;
+"RTN","BSDX2E",38,0)
+ ;VERIFY BACKUPS HAVE BEEN DONE
+"RTN","BSDX2E",39,0)
+ ;W !!
+"RTN","BSDX2E",40,0)
+ ;S DIR(0)="Y"
+"RTN","BSDX2E",41,0)
+ ;S DIR("B")="NO"
+"RTN","BSDX2E",42,0)
+ ;S DIR("A")="Has a SUCCESSFUL system backup been performed??"
+"RTN","BSDX2E",43,0)
+ ;D ^DIR
+"RTN","BSDX2E",44,0)
+ ;I $D(DIRUT)!($G(Y)=0) S XPDABORT=1 S XPX="BACKUP" D SORRY Q
+"RTN","BSDX2E",45,0)
+ ;S ^TMP("BPCPRE",$J,"BACKUPS CONFIRMED BY "_DUZ)=$H
+"RTN","BSDX2E",46,0)
+ ;
+"RTN","BSDX2E",47,0)
+ Q
+"RTN","BSDX2E",48,0)
+ ;
+"RTN","BSDX2E",49,0)
+VERCHK(XPXPKG,XVRMIN) ;
+"RTN","BSDX2E",50,0)
+ S X=$$VERSION^XPDUTL(XPXPKG)
+"RTN","BSDX2E",51,0)
+ W !!,$$C^XBFUNC("Need at least "_XPXPKG_" "_XVRMIN_"....."_XPXPKG_" "_$S(X'="":X,1:"Is Not")_" Present")
+"RTN","BSDX2E",52,0)
+ I X<XVRMIN  D SORRY(XPXPKG_" "_XVRMIN_" Is Not Installed") Q 0
+"RTN","BSDX2E",53,0)
+ Q 1
+"RTN","BSDX2E",54,0)
+ ;
+"RTN","BSDX2E",55,0)
+PATCHCK(XPXPCH) ;
+"RTN","BSDX2E",56,0)
+ S X=$$PATCH^XPDUTL(XPXPCH)
+"RTN","BSDX2E",57,0)
+ W !!,$$C^XBFUNC("Need "_XPXPCH_"....."_XPXPCH_" "_$S(X:"Is",1:"Is Not")_" Present")
+"RTN","BSDX2E",58,0)
+ Q X
+"RTN","BSDX2E",59,0)
+ ;
+"RTN","BSDX2E",60,0)
+V0200 ;EP Version 1.3 PostInit
+"RTN","BSDX2E",61,0)
+ ;Add Protocol items to SDAM APPOINTMENT EVENTS protocol
+"RTN","BSDX2E",62,0)
+    ;Remove protocols known to cause problems from SDAM APPOINTMENT EVENTS
+"RTN","BSDX2E",63,0)
+ ;
+"RTN","BSDX2E",64,0)
+ N BSDXDA,BSDXFDA,BSDXDA1,BSDXSEQ,BSDXDAT,BSDXNOD,BSDXIEN,BSDXMSG
+"RTN","BSDX2E",65,0)
+    ;
+"RTN","BSDX2E",66,0)
+    ; 1st, add the BSDX event protocols
+"RTN","BSDX2E",67,0)
+    ; Get SDAM APPOINTMENT EVENTS IEN in 101
+"RTN","BSDX2E",68,0)
+ S BSDXDA=$O(^ORD(101,"B","SDAM APPOINTMENT EVENTS",0))
+"RTN","BSDX2E",69,0)
+ Q:'+BSDXDA
+"RTN","BSDX2E",70,0)
+    ; Add each of those protocols unless they already exist.
+"RTN","BSDX2E",71,0)
+ S BSDXDAT="BSDX ADD APPOINTMENT;10.2^BSDX CANCEL APPOINTMENT;10.4^BSDX CHECKIN APPOINTMENT;10.6^BSDX NOSHOW APPOINTMENT;10.8"
+"RTN","BSDX2E",72,0)
+    ; For each
+"RTN","BSDX2E",73,0)
+    F J=1:1:$L(BSDXDAT,U) D
+"RTN","BSDX2E",74,0)
+ . K BSDXIEN,BSDXMSG,BSDXFDA
+"RTN","BSDX2E",75,0)
+    . ; Get Item
+"RTN","BSDX2E",76,0)
+ . S BSDXNOD=$P(BSDXDAT,U,J)
+"RTN","BSDX2E",77,0)
+ . ; Get Item Name (BSDX ADD APPOINTMENT)
+"RTN","BSDX2E",78,0)
+    . S BSDXDA1=$P(BSDXNOD,";")
+"RTN","BSDX2E",79,0)
+    . ; Get Item Sequence (10.2)
+"RTN","BSDX2E",80,0)
+ . S BSDXSEQ=$P(BSDXNOD,";",2)
+"RTN","BSDX2E",81,0)
+    . ; Get Item Reference (Item is already in the protocol file)
+"RTN","BSDX2E",82,0)
+ . S BSDXDA1=$O(^ORD(101,"B",BSDXDA1,0))
+"RTN","BSDX2E",83,0)
+    . ; Quit if not found
+"RTN","BSDX2E",84,0)
+ . Q:'+BSDXDA1
+"RTN","BSDX2E",85,0)
+    . ; Quit if already exists in the SDAM protocol
+"RTN","BSDX2E",86,0)
+ . Q:$D(^ORD(101,BSDXDA,10,"B",BSDXDA1))
+"RTN","BSDX2E",87,0)
+    . ; Go ahead and save it.
+"RTN","BSDX2E",88,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",",".01")=BSDXDA1
+"RTN","BSDX2E",89,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",","3")=BSDXSEQ
+"RTN","BSDX2E",90,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX2E",91,0)
+    . ; Error message
+"RTN","BSDX2E",92,0)
+    . I $D(BSDXMSG) W $C(7),"Error: ",BSDXMSG("DIERR",1,"TEXT",1)
+"RTN","BSDX2E",93,0)
+    ;
+"RTN","BSDX2E",94,0)
+    ; Remove nassssty protocols ORU PATIENT MOVMT and DVBA C&P SCHD EVENT
+"RTN","BSDX2E",95,0)
+    ; SDAM APPOINTMENT EVENTS IENS for use in FIND1^DIC
+"RTN","BSDX2E",96,0)
+    N SDEVTIENS S SDEVTIENS=","_BSDXDA_","
+"RTN","BSDX2E",97,0)
+    ; Subfile entry for ORU...
+"RTN","BSDX2E",98,0)
+    N ORUIEN S ORUIEN=$$FIND1^DIC(101.01,SDEVTIENS,"","ORU PATIENT MOVMT")
+"RTN","BSDX2E",99,0)
+    ; Subfile entry for DVBA...
+"RTN","BSDX2E",100,0)
+    N DVBAIEN S DVBAIEN=$$FIND1^DIC(101.01,SDEVTIENS,"","DVBA C&P SCHD EVENT")
+"RTN","BSDX2E",101,0)
+    ; Deletion code
+"RTN","BSDX2E",102,0)
+    N BSDXFDA,BSDXMSG
+"RTN","BSDX2E",103,0)
+    S:ORUIEN>0 BSDXFDA(101.01,ORUIEN_SDEVTIENS,.01)="@"
+"RTN","BSDX2E",104,0)
+    S:DVBAIEN>0 BSDXFDA(101.01,DVBAIEN_SDEVTIENS,.01)="@"
+"RTN","BSDX2E",105,0)
+    D:$D(BSDXFDA) FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX2E",106,0)
+    ; If error
+"RTN","BSDX2E",107,0)
+    I $D(BSDXMSG) W $C(7),"Error: ",BSDXMSG("DIERR",1,"TEXT",1)
+"RTN","BSDX2E",108,0)
+ QUIT
+"RTN","BSDX2E",109,0)
+ ;
+"RTN","BSDX2E",110,0)
+SORRY(XPX) ;
+"RTN","BSDX2E",111,0)
+ K DIFQ
+"RTN","BSDX2E",112,0)
+ S XPDABORT=1
+"RTN","BSDX2E",113,0)
+ W !,$$C^XBFUNC($P($T(+2),";",3)_" of "_$P($T(+2),";",4)_" Cannot Be Installed!")
+"RTN","BSDX2E",114,0)
+ W !,$$C^XBFUNC("Reason: "_XPX_".")
+"RTN","BSDX2E",115,0)
+ W *7,!!!,$$C^XBFUNC("Sorry....something is wrong with your environment")
+"RTN","BSDX2E",116,0)
+ W !,$$C^XBFUNC("Aborting "_XPDNM_" install!")
+"RTN","BSDX2E",117,0)
+ W !,$$C^XBFUNC("Correct error and reinstall otherwise")
+"RTN","BSDX2E",118,0)
+ W !,$$C^XBFUNC("please print/capture this screen and notify")
+"RTN","BSDX2E",119,0)
+ W !,$$C^XBFUNC("technical support")
+"RTN","BSDX2E",120,0)
+ W !!,LINE
+"RTN","BSDX2E",121,0)
+ D BMES^XPDUTL("Sorry....something is wrong with your environment")
+"RTN","BSDX2E",122,0)
+ D BMES^XPDUTL("Enviroment ERROR "_$G(XPX))
+"RTN","BSDX2E",123,0)
+ D BMES^XPDUTL("Aborting "_XPDNM_" install!")
+"RTN","BSDX2E",124,0)
+ D BMES^XPDUTL("Correct error and reinstall otherwise")
+"RTN","BSDX2E",125,0)
+ D BMES^XPDUTL("please print/capture this screen and notify")
+"RTN","BSDX2E",126,0)
+ D BMES^XPDUTL("technical support")
+"RTN","BSDX2E",127,0)
+ Q
+"RTN","BSDX2E",128,0)
+ ;
+"RTN","BSDX30")
+0^28^B6616255
+"RTN","BSDX30",1,0)
+BSDX30 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; [ 09/12/2007  1:54 PM ]
+"RTN","BSDX30",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX30",3,0)
+ ;
+"RTN","BSDX30",4,0)
+ ;
+"RTN","BSDX30",5,0)
+SPACED(BSDXY,BSDXDIC,BSDXVAL) ;EP
+"RTN","BSDX30",6,0)
+ ;Entry point for debugging
+"RTN","BSDX30",7,0)
+ ;
+"RTN","BSDX30",8,0)
+ D DEBUG^%Serenji("SPACE^BSDX30(.BSDXY,BSDXDIC,BSDXVAL)")
+"RTN","BSDX30",9,0)
+ Q
+"RTN","BSDX30",10,0)
+ ;
+"RTN","BSDX30",11,0)
+SPACE(BSDXY,BSDXDIC,BSDXVAL) ;EP
+"RTN","BSDX30",12,0)
+ ;Update ^DISV with most recent lookup value BSDXVAL from file BSDXDIC
+"RTN","BSDX30",13,0)
+ ;BSDXDIC is the data global in the form GLOBAL(
+"RTN","BSDX30",14,0)
+ ;BSDXVAL is the entry number (IEN) in the file
+"RTN","BSDX30",15,0)
+ ;
+"RTN","BSDX30",16,0)
+ ;Return Status = 1 if success, 0 if fail
+"RTN","BSDX30",17,0)
+ ;
+"RTN","BSDX30",18,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX30",19,0)
+ N BSDX1,BSDXRES
+"RTN","BSDX30",20,0)
+ S BSDXI=0
+"RTN","BSDX30",21,0)
+ S X="ETRAP^BSDX30",@^%ZOSF("TRAP")
+"RTN","BSDX30",22,0)
+ I (BSDXDIC="")!('+$G(BSDXVAL)) D ERR(BSDXI+1,99) Q
+"RTN","BSDX30",23,0)
+ S BSDXDIC="^"_BSDXDIC
+"RTN","BSDX30",24,0)
+ S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30)
+"RTN","BSDX30",25,0)
+ ;Note:  Naked reference below is immediately preceded
+"RTN","BSDX30",26,0)
+ ;by the full global reference per SAC 2.2.2.8
+"RTN","BSDX30",27,0)
+ I $D(@(BSDXDIC_"BSDXVAL,0)")),'$D(^(-9)) D
+"RTN","BSDX30",28,0)
+ . S ^DISV(DUZ,BSDXDIC)=BSDXVAL
+"RTN","BSDX30",29,0)
+ . S BSDXRES=1
+"RTN","BSDX30",30,0)
+ E  S BSDXRES=0
+"RTN","BSDX30",31,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",32,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXRES_$C(30)_$C(31)
+"RTN","BSDX30",33,0)
+ Q
+"RTN","BSDX30",34,0)
+ ;
+"RTN","BSDX30",35,0)
+ERR(BSDXI,BSDXERR) ;Error processing
+"RTN","BSDX30",36,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",37,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX30",38,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",39,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX30",40,0)
+ Q
+"RTN","BSDX30",41,0)
+ ;
+"RTN","BSDX30",42,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX30",43,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX30",44,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",45,0)
+ D ERR(99,0)
+"RTN","BSDX30",46,0)
+ Q
+"RTN","BSDX30",47,0)
+ ;
+"RTN","BSDX30",48,0)
+EHRPTD(BSDXY,BSDXWID,BSDXDFN) ;
+"RTN","BSDX30",49,0)
+ ;
+"RTN","BSDX30",50,0)
+ D DEBUG^%Serenji("EHRPT^BSDX30(.BSDXY,BSDXWID,BSDXDFN)")
+"RTN","BSDX30",51,0)
+ Q
+"RTN","BSDX30",52,0)
+ ;
+"RTN","BSDX30",53,0)
+EHRPT(BSDXY,BSDXWID,BSDXDFN) ;
+"RTN","BSDX30",54,0)
+ ;
+"RTN","BSDX30",55,0)
+ ;Return Status = 1 if success, 0 if error
+"RTN","BSDX30",56,0)
+ ;
+"RTN","BSDX30",57,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX30",58,0)
+ N BSDX1,BSDXRES
+"RTN","BSDX30",59,0)
+ S BSDXI=0,BSDXRES=1
+"RTN","BSDX30",60,0)
+ S X="ETRAP^BSDX30",@^%ZOSF("TRAP")
+"RTN","BSDX30",61,0)
+ S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30)
+"RTN","BSDX30",62,0)
+ I '+BSDXDFN D ERR(BSDXI+1,0) Q
+"RTN","BSDX30",63,0)
+ ;
+"RTN","BSDX30",64,0)
+ D PEVENT(BSDXWID,BSDXDFN) ;Raise patient selected event
+"RTN","BSDX30",65,0)
+ ;
+"RTN","BSDX30",66,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",67,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXRES_$C(30)_$C(31)
+"RTN","BSDX30",68,0)
+ Q
+"RTN","BSDX30",69,0)
+ ;
+"RTN","BSDX30",70,0)
+PEVENT(BSDXWID,DFN) ;EP - Raise patient selection event to EHR
+"RTN","BSDX30",71,0)
+ ;
+"RTN","BSDX30",72,0)
+ ;Change patient context to patient DFN
+"RTN","BSDX30",73,0)
+ ;on all EHR client sessions associated with user DUZ
+"RTN","BSDX30",74,0)
+ ;and workstation BSDXWID.
+"RTN","BSDX30",75,0)
+ ;
+"RTN","BSDX30",76,0)
+ ;If BSDXWID is "", the context change is sent to
+"RTN","BSDX30",77,0)
+ ;all EHR client sessions belonging to user DUZ.
+"RTN","BSDX30",78,0)
+ ;
+"RTN","BSDX30",79,0)
+ Q:'$G(DUZ)
+"RTN","BSDX30",80,0)
+ ;N X
+"RTN","BSDX30",81,0)
+ ;S X="CIANBUTL" X ^%ZOSF("TEST") Q:'$T
+"RTN","BSDX30",82,0)
+ ;S X="CIANBEVT" X ^%ZOSF("TEST") Q:'$T
+"RTN","BSDX30",83,0)
+ N UID,BRET
+"RTN","BSDX30",84,0)
+ S BRET=0,UID=0
+"RTN","BSDX30",85,0)
+ F  S BRET=$$NXTUID^CIANBUTL(.UID,1) Q:'UID  D
+"RTN","BSDX30",86,0)
+ . Q:DUZ'=$$GETVAR^CIANBUTL("DUZ",,,UID)
+"RTN","BSDX30",87,0)
+ . I BSDXWID'="" Q:BSDXWID'=$TR($$GETVAR^CIANBUTL("WID",,,UID),"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
+"RTN","BSDX30",88,0)
+ . D QUEUE^CIANBEVT("CONTEXT.PATIENT",+DFN,UID)
+"RTN","BSDX30",89,0)
+ Q
+"RTN","BSDX31")
+0^29^B67823338
+"RTN","BSDX31",1,0)
+BSDX31  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:39pm
+"RTN","BSDX31",2,0)
+    ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX31",3,0)
+    ; Change Log:
+"RTN","BSDX31",4,0)
+    ; v1.42 Oct 23 2010 WV/SMH
+"RTN","BSDX31",5,0)
+    ; - Change transaction to restartable. Thanks to Zach Gonzalez
+"RTN","BSDX31",6,0)
+    ; --> and Rick Marshall for their help.
+"RTN","BSDX31",7,0)
+    ; v1.42 Dec 6 2010: Extensive refactoring
+"RTN","BSDX31",8,0)
+    ; 
+"RTN","BSDX31",9,0)
+    ; Error Reference:
+"RTN","BSDX31",10,0)
+    ; -1: zero or null Appt ID
+"RTN","BSDX31",11,0)
+    ; -2: Invalid APPT ID (doesn't exist in ^BSDXAPPT)
+"RTN","BSDX31",12,0)
+    ; -3: No-show flag is invalid
+"RTN","BSDX31",13,0)
+    ; -4: Filing of No-show in ^BSDXAPPT failed
+"RTN","BSDX31",14,0)
+    ; -5: Filing of No-show in ^DPT failed (BSDXAPI error)
+"RTN","BSDX31",15,0)
+    ; -100: M Error
+"RTN","BSDX31",16,0)
+    ;
+"RTN","BSDX31",17,0)
+    ;
+"RTN","BSDX31",18,0)
+NOSHOWD(BSDXY,BSDXAPTID,BSDXNS) ;EP
+"RTN","BSDX31",19,0)
+    ;Entry point for debugging
+"RTN","BSDX31",20,0)
+    ;
+"RTN","BSDX31",21,0)
+    D DEBUG^%Serenji("NOSHOW^BSDX31(.BSDXY,BSDXAPTID,BSDXNS)")
+"RTN","BSDX31",22,0)
+    Q
+"RTN","BSDX31",23,0)
+    ;
+"RTN","BSDX31",24,0)
+UT ; Unit Tests
+"RTN","BSDX31",25,0)
+    ; Test 1: Sanity Check
+"RTN","BSDX31",26,0)
+    N ZZZ ; Garbage return variable
+"RTN","BSDX31",27,0)
+    N DATE S DATE=$$NOW^XLFDT()
+"RTN","BSDX31",28,0)
+    S DATE=$E(DATE,1,12) ; Just get minutes b/c of HL file input transform
+"RTN","BSDX31",29,0)
+    D APPADD^BSDX07(.ZZZ,DATE,DATE+.0001,3,"Dr Office",30,"Old Note",1)
+"RTN","BSDX31",30,0)
+    N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX31",31,0)
+    D NOSHOW(.ZZZ,APPID,1)
+"RTN","BSDX31",32,0)
+    I $P(^BSDXAPPT(APPID,0),U,10)'=1 W "ERROR T1",! B
+"RTN","BSDX31",33,0)
+    I $P(^DPT(3,"S",DATE,0),U,2)'="N" W "ERROR T1",! B
+"RTN","BSDX31",34,0)
+    ; Test 2: Undo noshow
+"RTN","BSDX31",35,0)
+    D NOSHOW(.ZZZ,APPID,0)
+"RTN","BSDX31",36,0)
+    I $P(^BSDXAPPT(APPID,0),U,10)'="0" W "ERROR T2",! B
+"RTN","BSDX31",37,0)
+    I $P(^DPT(3,"S",DATE,0),U,2)'="" W "ERROR T2",! B
+"RTN","BSDX31",38,0)
+    ; Test 3: -1
+"RTN","BSDX31",39,0)
+    D NOSHOW(.ZZZ,"",0)
+"RTN","BSDX31",40,0)
+    I $P(^BSDXTMP($J,1),U)'=-1 W "ERROR T3",! B
+"RTN","BSDX31",41,0)
+    ; Test 4: -2
+"RTN","BSDX31",42,0)
+    D NOSHOW(.ZZZ,2938748233,0)
+"RTN","BSDX31",43,0)
+    I $P(^BSDXTMP($J,1),U)'=-2 W "ERROR T4",! B
+"RTN","BSDX31",44,0)
+    ; Test 5: -3
+"RTN","BSDX31",45,0)
+    D NOSHOW(.ZZZ,APPID,3)
+"RTN","BSDX31",46,0)
+    I $P(^BSDXTMP($J,1),U)'=-3 W "ERROR T5",! B
+"RTN","BSDX31",47,0)
+    ; Test 6: Mumps error (-100)
+"RTN","BSDX31",48,0)
+    s bsdxdie=1
+"RTN","BSDX31",49,0)
+    D NOSHOW(.ZZZ,APPID,1)
+"RTN","BSDX31",50,0)
+    I $P(^BSDXTMP($J,1),U)'=-100 W "ERROR T6",! B
+"RTN","BSDX31",51,0)
+    k bsdxdie
+"RTN","BSDX31",52,0)
+    ; Test 7: Restartable transaction
+"RTN","BSDX31",53,0)
+    s bsdxrestart=1
+"RTN","BSDX31",54,0)
+    D NOSHOW(.ZZZ,APPID,1)
+"RTN","BSDX31",55,0)
+    I $P(^BSDXAPPT(APPID,0),U,10)'=1 W "ERROR T7",! B
+"RTN","BSDX31",56,0)
+    QUIT
+"RTN","BSDX31",57,0)
+NOSHOW(BSDXY,BSDXAPTID,BSDXNS)         ;EP - No show a patient
+"RTN","BSDX31",58,0)
+    ; Called by RPC: BSDX NOSHOW
+"RTN","BSDX31",59,0)
+    ; Sets appointment noshow flag in BSDX APPOINTMENT file and "S" node in File 2
+"RTN","BSDX31",60,0)
+    ;
+"RTN","BSDX31",61,0)
+    ; Parameters:
+"RTN","BSDX31",62,0)
+    ; BSDXY: Global Return
+"RTN","BSDX31",63,0)
+    ; BSDXAPTID is entry number in BSDX APPOINTMENT file
+"RTN","BSDX31",64,0)
+    ; BSDXNS = 1: NOSHOW, 0: CANCEL NOSHO
+"RTN","BSDX31",65,0)
+    ; 
+"RTN","BSDX31",66,0)
+    ; Returns ADO.net record set with fields
+"RTN","BSDX31",67,0)
+    ; - ERRORID; ERRORTEXT
+"RTN","BSDX31",68,0)
+    ; ERRORID of 1 is okay
+"RTN","BSDX31",69,0)
+    ; Anything else is an error.
+"RTN","BSDX31",70,0)
+    ;
+"RTN","BSDX31",71,0)
+    ; Return Array; set and clear
+"RTN","BSDX31",72,0)
+    S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX31",73,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX31",74,0)
+    ; $ET
+"RTN","BSDX31",75,0)
+    N $ET S $ET="G ETRAP^BSDX31"
+"RTN","BSDX31",76,0)
+    ; Basline vars
+"RTN","BSDX31",77,0)
+    D ^XBKVAR  ; Set up baseline variables (DUZ, DUZ(2)) if they don't exist
+"RTN","BSDX31",78,0)
+    ; Counter
+"RTN","BSDX31",79,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX31",80,0)
+    ; Header Node
+"RTN","BSDX31",81,0)
+    S ^BSDXTMP($J,BSDXI)="I00100ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX31",82,0)
+    ; Begin transaction
+"RTN","BSDX31",83,0)
+    TSTART (BSDXI,BSDXY,BSDXAPTID,BSDXNS):T="BSDX NOSHOW CANCEL^BSDX29"
+"RTN","BSDX31",84,0)
+    ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX31",85,0)
+    I $G(bsdxdie) S X=1/0
+"RTN","BSDX31",86,0)
+    ;;;TEST
+"RTN","BSDX31",87,0)
+    ;;;test for TRESTART
+"RTN","BSDX31",88,0)
+    I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX31",89,0)
+    ;;;test
+"RTN","BSDX31",90,0)
+    ; Turn off SDAM APPT PROTOCOL BSDX Entries
+"RTN","BSDX31",91,0)
+    N BSDXNOEV S BSDXNOEV=1 ;Don't execute protocol
+"RTN","BSDX31",92,0)
+    ; Appointment ID check
+"RTN","BSDX31",93,0)
+    I '+BSDXAPTID D ERR(-1,"BSDX31: Invalid Appointment ID") Q
+"RTN","BSDX31",94,0)
+    I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(-2,"BSDX31: Invalid Appointment ID") Q
+"RTN","BSDX31",95,0)
+    ; Noshow value check - Must be 1 or 0
+"RTN","BSDX31",96,0)
+    S BSDXNS=+BSDXNS
+"RTN","BSDX31",97,0)
+    I BSDXNS'=1&(BSDXNS'=0) D ERR(-3,"BSDX31: Invalid No Show value") Q
+"RTN","BSDX31",98,0)
+    ; Get Some data
+"RTN","BSDX31",99,0)
+    N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPTID,0) ; Node
+"RTN","BSDX31",100,0)
+    N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) ; DFN
+"RTN","BSDX31",101,0)
+    N BSDXSTART S BSDXSTART=$P(BSDXNOD,U)  ; Start Date/Time
+"RTN","BSDX31",102,0)
+    ; Edit BSDX APPOINTMENT entry
+"RTN","BSDX31",103,0)
+    N BSDXMSG  ; 
+"RTN","BSDX31",104,0)
+    D BSDXNOS(BSDXAPTID,BSDXNS,.BSDXMSG)  ;Edit BSDX APPOINTMENT entry NOSHOW field 
+"RTN","BSDX31",105,0)
+    I $D(BSDXMSG("DIERR")) S BSDXMSG=$G(BSDXMSG("DIERR",1,"TEXT",1)) D ERR(-4,"BSDX31: "_BSDXMSG) Q
+"RTN","BSDX31",106,0)
+    ; Edit File 2 "S" node entry
+"RTN","BSDX31",107,0)
+    N BSDXZ,BSDXERR ; Error variables to control looping
+"RTN","BSDX31",108,0)
+    S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID
+"RTN","BSDX31",109,0)
+    ; If Resource ID exists, and HL exists (means that Resource is linked), No show in File 2
+"RTN","BSDX31",110,0)
+    I BSDXSC1]"",$D(^BSDXRES(BSDXSC1,0)) D  I $G(BSDXZ)]"" S BSDXERR="BSDX31: APNOSHO Returned: "_BSDXZ D ERR(-5,BSDXERR) Q
+"RTN","BSDX31",111,0)
+    . S BSDXNOD=^BSDXRES(BSDXSC1,0)
+"RTN","BSDX31",112,0)
+    . S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION
+"RTN","BSDX31",113,0)
+    . I BSDXSC1]"",$D(^SC(BSDXSC1,0)) D APNOSHO(.BSDXZ,BSDXSC1,BSDXPATID,BSDXSTART,BSDXNS)
+"RTN","BSDX31",114,0)
+    ;
+"RTN","BSDX31",115,0)
+    TCOMMIT
+"RTN","BSDX31",116,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",117,0)
+    S ^BSDXTMP($J,BSDXI)="1^"_$C(30) ; 1 means everything okay
+"RTN","BSDX31",118,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",119,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX31",120,0)
+    QUIT
+"RTN","BSDX31",121,0)
+    ;
+"RTN","BSDX31",122,0)
+APNOSHO(BSDXZ,BSDXSC1,BSDXDFN,BSDXSD,BSDXNS)            ;
+"RTN","BSDX31",123,0)
+    ; update file 2 info
+"RTN","BSDX31",124,0)
+    ;Set noshow for patient BSDXDFN in clinic BSDXSC1
+"RTN","BSDX31",125,0)
+    ;at time BSDXSD
+"RTN","BSDX31",126,0)
+    N BSDXC,%H,BSDXCDT,BSDXIEN
+"RTN","BSDX31",127,0)
+    N BSDXIENS,BSDXFDA,BSDXMSG
+"RTN","BSDX31",128,0)
+    S %H=$H D YMD^%DTC
+"RTN","BSDX31",129,0)
+    S BSDXCDT=X+%
+"RTN","BSDX31",130,0)
+    ;
+"RTN","BSDX31",131,0)
+    S BSDXIENS=BSDXSD_","_BSDXDFN_","
+"RTN","BSDX31",132,0)
+    I +BSDXNS D
+"RTN","BSDX31",133,0)
+    . S BSDXFDA(2.98,BSDXIENS,3)="N"
+"RTN","BSDX31",134,0)
+    . S BSDXFDA(2.98,BSDXIENS,14)=DUZ
+"RTN","BSDX31",135,0)
+    . S BSDXFDA(2.98,BSDXIENS,15)=BSDXCDT
+"RTN","BSDX31",136,0)
+    E  D
+"RTN","BSDX31",137,0)
+    . S BSDXFDA(2.98,BSDXIENS,3)=""
+"RTN","BSDX31",138,0)
+    . S BSDXFDA(2.98,BSDXIENS,14)=""
+"RTN","BSDX31",139,0)
+    . S BSDXFDA(2.98,BSDXIENS,15)=""
+"RTN","BSDX31",140,0)
+    K BSDXIEN
+"RTN","BSDX31",141,0)
+    D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX31",142,0)
+    S BSDXZ=$G(BSDXMSG("DIERR",1,"TEXT",1))
+"RTN","BSDX31",143,0)
+    Q
+"RTN","BSDX31",144,0)
+    ;
+"RTN","BSDX31",145,0)
+BSDXNOS(BSDXAPTID,BSDXNS,BSDXMSG)   ;
+"RTN","BSDX31",146,0)
+    ;
+"RTN","BSDX31",147,0)
+    N BSDXFDA,BSDXIENS
+"RTN","BSDX31",148,0)
+    S BSDXIENS=BSDXAPTID_","
+"RTN","BSDX31",149,0)
+    S BSDXFDA(9002018.4,BSDXIENS,.1)=BSDXNS ;NOSHOW
+"RTN","BSDX31",150,0)
+    D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX31",151,0)
+    QUIT
+"RTN","BSDX31",152,0)
+    ;
+"RTN","BSDX31",153,0)
+NOSEVT(BSDXPAT,BSDXSTART,BSDXSC)    ;EP Called by BSDX NOSHOW APPOINTMENT event
+"RTN","BSDX31",154,0)
+    ;when appointments NOSHOW via PIMS interface.
+"RTN","BSDX31",155,0)
+    ;Propagates NOSHOW to BSDXAPPT and raises refresh event to running GUI clients
+"RTN","BSDX31",156,0)
+    ;
+"RTN","BSDX31",157,0)
+    Q:+$G(BSDXNOEV)
+"RTN","BSDX31",158,0)
+    Q:'+$G(BSDXSC)
+"RTN","BSDX31",159,0)
+    Q:$G(SDATA("AFTER","STATUS"))["AUTO RE-BOOK"
+"RTN","BSDX31",160,0)
+    N BSDXSTAT,BSDXFOUND,BSDXRES
+"RTN","BSDX31",161,0)
+    S BSDXSTAT=1
+"RTN","BSDX31",162,0)
+    S:$G(SDATA("BEFORE","STATUS"))["NO-SHOW" BSDXSTAT=0
+"RTN","BSDX31",163,0)
+    S BSDXFOUND=0
+"RTN","BSDX31",164,0)
+    I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX31",165,0)
+    I BSDXFOUND D NOSEVT3(BSDXRES) Q
+"RTN","BSDX31",166,0)
+    I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX31",167,0)
+    I BSDXFOUND D NOSEVT3(BSDXRES)
+"RTN","BSDX31",168,0)
+    Q
+"RTN","BSDX31",169,0)
+    ;
+"RTN","BSDX31",170,0)
+NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT) ;
+"RTN","BSDX31",171,0)
+    ;Get appointment id in BSDXAPT
+"RTN","BSDX31",172,0)
+    ;If found, call BSDXNOS(BSDXAPPT) and return 1
+"RTN","BSDX31",173,0)
+    ;else return 0
+"RTN","BSDX31",174,0)
+    N BSDXFOUND,BSDXAPPT
+"RTN","BSDX31",175,0)
+    S BSDXFOUND=0
+"RTN","BSDX31",176,0)
+    Q:'+$G(BSDXRES) BSDXFOUND
+"RTN","BSDX31",177,0)
+    Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND
+"RTN","BSDX31",178,0)
+    S BSDXAPPT=0 F  S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT  D  Q:BSDXFOUND
+"RTN","BSDX31",179,0)
+    . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""
+"RTN","BSDX31",180,0)
+    . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q
+"RTN","BSDX31",181,0)
+    I BSDXFOUND,+$G(BSDXAPPT) D BSDXNOS(BSDXAPPT,BSDXSTAT)
+"RTN","BSDX31",182,0)
+    Q BSDXFOUND
+"RTN","BSDX31",183,0)
+    ;
+"RTN","BSDX31",184,0)
+NOSEVT3(BSDXRES)    ;
+"RTN","BSDX31",185,0)
+    ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX31",186,0)
+    ;
+"RTN","BSDX31",187,0)
+    N BSDXRESN
+"RTN","BSDX31",188,0)
+    S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX31",189,0)
+    Q:BSDXRESN=""
+"RTN","BSDX31",190,0)
+    S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX31",191,0)
+    D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX31",192,0)
+    Q
+"RTN","BSDX31",193,0)
+    ;
+"RTN","BSDX31",194,0)
+    ;
+"RTN","BSDX31",195,0)
+ERR(BSDXERID,ERRTXT)    ;Error processing
+"RTN","BSDX31",196,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",197,0)
+    S ERRTXT=$TR(ERRTXT,"^","~")
+"RTN","BSDX31",198,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX31",199,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX31",200,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",201,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX31",202,0)
+    QUIT
+"RTN","BSDX31",203,0)
+    ;
+"RTN","BSDX31",204,0)
+ETRAP   ;EP Error trap entry
+"RTN","BSDX31",205,0)
+    N $ET S $ET="D ^%ZTER HALT"  ; Emergency Error Trap
+"RTN","BSDX31",206,0)
+    ; Rollback, otherwise ^XTER will be empty from future rollback
+"RTN","BSDX31",207,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX31",208,0)
+    D ^%ZTER
+"RTN","BSDX31",209,0)
+    S $EC="" ; Clear Error
+"RTN","BSDX31",210,0)
+    ; Send to client
+"RTN","BSDX31",211,0)
+    I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX31",212,0)
+    D ERR(-100,"BSDX31 Error: "_$G(%ZTERZE))
+"RTN","BSDX31",213,0)
+    QUIT
+"RTN","BSDX31",214,0)
+    ;
+"RTN","BSDX31",215,0)
+IMHERE(BSDXRES) ;EP
+"RTN","BSDX31",216,0)
+    ;Entry point for BSDX IM HERE remote procedure
+"RTN","BSDX31",217,0)
+    S BSDXRES=1
+"RTN","BSDX31",218,0)
+    Q
+"RTN","BSDX31",219,0)
+    ;
+"RTN","BSDX32")
+0^30^B17196738
+"RTN","BSDX32",1,0)
+BSDX32 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 9/29/10 10:21am
+"RTN","BSDX32",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX32",3,0)
+ ;
+"RTN","BSDX32",4,0)
+ ;
+"RTN","BSDX32",5,0)
+ERROR ;
+"RTN","BSDX32",6,0)
+ D ERR("RPMS Error")
+"RTN","BSDX32",7,0)
+ Q
+"RTN","BSDX32",8,0)
+ ;
+"RTN","BSDX32",9,0)
+ERR(BSDXERR) ;Error processing
+"RTN","BSDX32",10,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX32",11,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX32",12,0)
+ Q
+"RTN","BSDX32",13,0)
+ ;
+"RTN","BSDX32",14,0)
+HOSPLOCD(BSDXY) ;EP Debugging entry point
+"RTN","BSDX32",15,0)
+ ;
+"RTN","BSDX32",16,0)
+ ;D DEBUG^%Serenji("HOSPLOC^BSDX32(.BSDXY)")
+"RTN","BSDX32",17,0)
+ ;
+"RTN","BSDX32",18,0)
+ Q
+"RTN","BSDX32",19,0)
+ ;
+"RTN","BSDX32",20,0)
+HOSPLOC(BSDXY) ;EP
+"RTN","BSDX32",21,0)
+ ;Called by BSDX HOSPITAL LOCATION
+"RTN","BSDX32",22,0)
+    ;Returns all hospital locations that are active 
+"RTN","BSDX32",23,0)
+ ;
+"RTN","BSDX32",24,0)
+ N BSDXI,BSDXIEN,BSDXNOD,BSDXNAM,BSDXINA,BSDXREA,BSDXSCOD
+"RTN","BSDX32",25,0)
+ D ^XBKVAR S X="ERROR^BSDX32",@^%ZOSF("TRAP")
+"RTN","BSDX32",26,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX32",27,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX32",28,0)
+ S BSDXI=0
+"RTN","BSDX32",29,0)
+ ;"SELECT BSDXIEN 'HOSPITAL_LOCATION_ID', NAME 'HOSPITAL_LOCATION', DEFAULT_PROVIDER, STOP_CODE_NUMBER, INACTIVATE_DATE, REACTIVATE_DATE FROM HOSPITAL_LOCATION";
+"RTN","BSDX32",30,0)
+ S ^BSDXTMP($J,BSDXI)="I00020HOSPITAL_LOCATION_ID^T00040HOSPITAL_LOCATION^T00030DEFAULT_PROVIDER^T00030STOP_CODE_NUMBER^D00020INACTIVATE_DATE^D00020REACTIVATE_DATE"_$C(30)
+"RTN","BSDX32",31,0)
+ ;
+"RTN","BSDX32",32,0)
+ S BSDXNAM="" F  S BSDXNAM=$O(^SC("B",BSDXNAM)) Q:BSDXNAM=""  D
+"RTN","BSDX32",33,0)
+ . S BSDXIEN=$O(^SC("B",BSDXNAM,0))
+"RTN","BSDX32",34,0)
+ . Q:'+BSDXIEN>0
+"RTN","BSDX32",35,0)
+ . Q:'$D(^SC(+BSDXIEN,0))
+"RTN","BSDX32",36,0)
+    . ;Q:'$$INDIV^BSDX01(+BSDXIEN)  ; if not in the same division, quit
+"RTN","BSDX32",37,0)
+ . S BSDXINA=$$GET1^DIQ(44,BSDXIEN_",",2505) ;INACTIVATE
+"RTN","BSDX32",38,0)
+ . S BSDXREA=$$GET1^DIQ(44,BSDXIEN_",",2506) ;REACTIVATE
+"RTN","BSDX32",39,0)
+ . I BSDXINA]""&(BSDXREA="") Q  ;Clinic is inactivated and has no reactivate date
+"RTN","BSDX32",40,0)
+ . S BSDXNOD=^SC(BSDXIEN,0)
+"RTN","BSDX32",41,0)
+ . S BSDXNAM=$P(BSDXNOD,U)
+"RTN","BSDX32",42,0)
+ . S BSDXSCOD=$$GET1^DIQ(44,BSDXIEN_",",8) ;STOP CODE
+"RTN","BSDX32",43,0)
+ . ;Calculate default provider
+"RTN","BSDX32",44,0)
+ . S BSDXPRV=""
+"RTN","BSDX32",45,0)
+ . I $D(^SC(BSDXIEN,"PR")) D
+"RTN","BSDX32",46,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^SC(BSDXIEN,"PR",BSDXIEN1)) Q:'+BSDXIEN1  Q:BSDXPRV]""  D
+"RTN","BSDX32",47,0)
+ . . . S BSDXNOD1=$G(^SC(BSDXIEN,"PR",BSDXIEN1,0))
+"RTN","BSDX32",48,0)
+ . . . S:$P(BSDXNOD1,U,2)="1" BSDXPRV=$$GET1^DIQ(200,$P(BSDXNOD1,U),.01)
+"RTN","BSDX32",49,0)
+ . . . Q
+"RTN","BSDX32",50,0)
+ . . Q
+"RTN","BSDX32",51,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX32",52,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXNAM_U_BSDXPRV_U_BSDXSCOD_U_BSDXINA_U_BSDXREA_$C(30)
+"RTN","BSDX32",53,0)
+ . Q
+"RTN","BSDX32",54,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX32",55,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX32",56,0)
+ Q
+"RTN","BSDX32",57,0)
+ ;
+"RTN","BSDX32",58,0)
+CLNSETD(BSDXY) ;EP Debugging entry point
+"RTN","BSDX32",59,0)
+ ;
+"RTN","BSDX32",60,0)
+ ;D DEBUG^%Serenji("CLNSET^BSDX32(.BSDXY)")
+"RTN","BSDX32",61,0)
+ ;
+"RTN","BSDX32",62,0)
+ Q
+"RTN","BSDX32",63,0)
+ ;
+"RTN","BSDX32",64,0)
+CLNSET(BSDXY) ;EP
+"RTN","BSDX32",65,0)
+ ;Called by BSDX CLINIC SETUP
+"RTN","BSDX32",66,0)
+ ;Returns CLINIC SETUP file entries for clinics which
+"RTN","BSDX32",67,0)
+ ;are active in ^SC
+"RTN","BSDX32",68,0)
+ N BSDXI,BSDXIEN,BSDXNOD,BSDXNAM,BSDXINA,BSDXREA
+"RTN","BSDX32",69,0)
+ N BSDXCRV,BSDXVSC,BSDXMULT,BSDXREQ,BSDXPCC
+"RTN","BSDX32",70,0)
+ D ^XBKVAR S X="ERROR^BSDX32",@^%ZOSF("TRAP")
+"RTN","BSDX32",71,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX32",72,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX32",73,0)
+ S BSDXI=0
+"RTN","BSDX32",74,0)
+ ;SELECT BMXIEN 'HOSPITAL_LOCATION_ID', CLINIC_NAME 'HOSPITAL_LOCATION', CREATE_VISIT_AT_CHECK-IN? 'CREATE_VISIT', VISIT_SERVICE_CATEGORY,  MULTIPLE_CLINIC_CODES_USED?, VISIT_PROVIDER_REQUIRED,
+"RTN","BSDX32",75,0)
+ ;GENERATE_PCCPLUS_FORMS? FROM CLINIC_SETUP_PARAMETERS
+"RTN","BSDX32",76,0)
+ S ^BSDXTMP($J,BSDXI)="I00020HOSPITAL_LOCATION_ID^T00040HOSPITAL_LOCATION^T00030CREATE_VISIT^T00030VISIT_SERVICE_CATEGORY^T00030MULTIPLE_CLINIC_CODES_USED?^T00030VISIT_PROVIDER_REQUIRED^T00030GENERATE_PCCPLUS_FORMS?"_$C(30)
+"RTN","BSDX32",77,0)
+ ;
+"RTN","BSDX32",78,0)
+ S BSDXIEN=0 F  S BSDXIEN=$O(^BSDSC(BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX32",79,0)
+ . Q:'$D(^SC(+BSDXIEN,0))
+"RTN","BSDX32",80,0)
+ . Q:'$D(^BSDSC(+BSDXIEN,0))
+"RTN","BSDX32",81,0)
+ . S BSDXINA=$$GET1^DIQ(44,BSDXIEN_",",2505) ;INACTIVATE
+"RTN","BSDX32",82,0)
+ . S BSDXREA=$$GET1^DIQ(44,BSDXIEN_",",2506) ;REACTIVATE
+"RTN","BSDX32",83,0)
+ . I BSDXINA]""&(BSDXREA="") Q  ;Clinic is inactivated and has no reactivate date
+"RTN","BSDX32",84,0)
+ . S BSDXNOD=^BSDSC(BSDXIEN,0)
+"RTN","BSDX32",85,0)
+ . S BSDXNAM=$$GET1^DIQ(44,BSDXIEN_",",.01)
+"RTN","BSDX32",86,0)
+ . S BSDXCRV=$$GET1^DIQ(9009017.2,BSDXIEN_",",.09)
+"RTN","BSDX32",87,0)
+ . S BSDXVSC=$$GET1^DIQ(9009017.2,BSDXIEN_",",.12)
+"RTN","BSDX32",88,0)
+ . S BSDXMULT=$$GET1^DIQ(9009017.2,BSDXIEN_",",.13)
+"RTN","BSDX32",89,0)
+ . S BSDXREQ=$$GET1^DIQ(9009017.2,BSDXIEN_",",.14)
+"RTN","BSDX32",90,0)
+ . S BSDXPCC=$$GET1^DIQ(9009017.2,BSDXIEN_",",.15)
+"RTN","BSDX32",91,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX32",92,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXNAM_U_BSDXCRV_U_BSDXVSC_U_BSDXMULT_U_BSDXREQ_U_BSDXPCC_$C(30)
+"RTN","BSDX32",93,0)
+ . Q
+"RTN","BSDX32",94,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX32",95,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX32",96,0)
+ Q
+"RTN","BSDX33")
+0^31^B14923306
+"RTN","BSDX33",1,0)
+BSDX33 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 12:33pm
+"RTN","BSDX33",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX33",3,0)
+    ; Mods by WV/STAR
+"RTN","BSDX33",4,0)
+    ;
+"RTN","BSDX33",5,0)
+    ; Change Log:
+"RTN","BSDX33",6,0)
+    ; July 13, 2010
+"RTN","BSDX33",7,0)
+    ; v 1.3 adds fixes Rebooking behavior in application (see RBNEXT)
+"RTN","BSDX33",8,0)
+    ; also adds i18 support - Dates passed in FM format from application
+"RTN","BSDX33",9,0)
+    ; in tag SETRBK and RBNEXT
+"RTN","BSDX33",10,0)
+ ;
+"RTN","BSDX33",11,0)
+ ;
+"RTN","BSDX33",12,0)
+ Q
+"RTN","BSDX33",13,0)
+RBNEXTD(BSDXY,BSDXDATE,BSDXRES,BSDXTPID) ;EP
+"RTN","BSDX33",14,0)
+ ;Entry point for debugging
+"RTN","BSDX33",15,0)
+ ;
+"RTN","BSDX33",16,0)
+ ;D DEBUG^%Serenji("RBNEXT^BSDX33(.BSDXY,BSDXDATE,BSDXRES,BSDXTPID)")
+"RTN","BSDX33",17,0)
+ Q
+"RTN","BSDX33",18,0)
+ ;
+"RTN","BSDX33",19,0)
+RBNEXT(BSDXY,BSDXDATE,BSDXRES,BSDXTPID) ;EP
+"RTN","BSDX33",20,0)
+ ;Called by BSDX REBOOK NEXT BLOCK to find
+"RTN","BSDX33",21,0)
+ ;the next ACCESS BLOCK in resource BSDXRES after BSDXDATE
+"RTN","BSDX33",22,0)
+ ;Returns 1 in ERRORID and date in NEXTBLOCK if a block was found or NULL in NEXTBLOCK of no date found
+"RTN","BSDX33",23,0)
+ ;Otherwise, returns 0 and error message in ERRORTEXT
+"RTN","BSDX33",24,0)
+ ;If BSDXTPID = 0 then any access type match
+"RTN","BSDX33",25,0)
+ ;
+"RTN","BSDX33",26,0)
+ S X="ERROR2^BSDX33",@^%ZOSF("TRAP")
+"RTN","BSDX33",27,0)
+ N BSDXI,BSDXIENS,%DT,BSDXMSG,Y,BSDXRESD,BSDXFND,BSDXIEN,BSDXNOD,BSDXATID
+"RTN","BSDX33",28,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX33",29,0)
+ S BSDXI=0
+"RTN","BSDX33",30,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ERRORID^D00010NEXTBLOCK^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX33",31,0)
+ ;
+"RTN","BSDX33",32,0)
+ I BSDXRES="" D ERR2("BSDX REBOOK NEXT BLOCK: Invalid resource name") Q
+"RTN","BSDX33",33,0)
+ I '$D(^BSDXRES("B",BSDXRES)) D ERR2("BSDX REBOOK NEXT BLOCK: Invalid resource name") Q
+"RTN","BSDX33",34,0)
+ S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0))
+"RTN","BSDX33",35,0)
+ I '+BSDXRESD D ERR2("BSDX REBOOK NEXT BLOCK: Invalid resource name") Q
+"RTN","BSDX33",36,0)
+ ;
+"RTN","BSDX33",37,0)
+    ; i18n fix
+"RTN","BSDX33",38,0)
+    ; S X=BSDXDATE,%DT="XT" D ^%DT
+"RTN","BSDX33",39,0)
+ ; I Y=-1 D ERR2(1,"BSDX REBOOK NEXT BLOCK: Invalid datetime") Q
+"RTN","BSDX33",40,0)
+ ;
+"RTN","BSDX33",41,0)
+    ; S BSDXDATE=$P(Y,".")
+"RTN","BSDX33",42,0)
+ ;
+"RTN","BSDX33",43,0)
+ S BSDXFND=0
+"RTN","BSDX33",44,0)
+ F  S BSDXDATE=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXDATE)) Q:'+BSDXDATE  D  Q:BSDXFND
+"RTN","BSDX33",45,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXDATE,BSDXIEN)) Q:'+BSDXIEN  D  Q:BSDXFND
+"RTN","BSDX33",46,0)
+ . . Q:'$D(^BSDXAB(BSDXIEN,0))
+"RTN","BSDX33",47,0)
+ . . S BSDXNOD=^BSDXAB(BSDXIEN,0)
+"RTN","BSDX33",48,0)
+ . . Q:+$P(BSDXNOD,U,4)=0  ;Slots
+"RTN","BSDX33",49,0)
+ . . S BSDXATID=$P(BSDXNOD,U,5)
+"RTN","BSDX33",50,0)
+ . . I BSDXTPID=0!(BSDXATID=BSDXTPID) S BSDXFND=$P(BSDXNOD,U,2) Q
+"RTN","BSDX33",51,0)
+ ;
+"RTN","BSDX33",52,0)
+ I BSDXFND=0 S BSDXFND=""
+"RTN","BSDX33",53,0)
+ E  S Y=BSDXFND X ^DD("DD") S BSDXFND=Y
+"RTN","BSDX33",54,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",55,0)
+    ;//smh - bug (V 1.3): Need to replace @ in FM date for C# to recognize it
+"RTN","BSDX33",56,0)
+    S BSDXFND=$TR(BSDXFND,"@"," ")
+"RTN","BSDX33",57,0)
+    ;//smh end fix
+"RTN","BSDX33",58,0)
+ S ^BSDXTMP($J,BSDXI)="1^"_BSDXFND_"^"_$C(30)_$C(31)
+"RTN","BSDX33",59,0)
+ Q
+"RTN","BSDX33",60,0)
+SETRBKD(BSDXY,BSDXAPPT,BSDXDATE) ;EP
+"RTN","BSDX33",61,0)
+ ;Entry point for debugging
+"RTN","BSDX33",62,0)
+ ;
+"RTN","BSDX33",63,0)
+ ;D DEBUG^%Serenji("SETRBK^BSDX33(.BSDXY,BSDXAPPT,BSDXDATE)")
+"RTN","BSDX33",64,0)
+ Q
+"RTN","BSDX33",65,0)
+ ;
+"RTN","BSDX33",66,0)
+SETRBK(BSDXY,BSDXAPPT,BSDXDATE) ;EP
+"RTN","BSDX33",67,0)
+ ;
+"RTN","BSDX33",68,0)
+ ;Sets rebook date into appointment
+"RTN","BSDX33",69,0)
+ ;BSDXAPPT - Appointment ID
+"RTN","BSDX33",70,0)
+ ;BSDXDATE - Rebook Datetime in internal format
+"RTN","BSDX33",71,0)
+ ;Called by BSDX REBOOK SET
+"RTN","BSDX33",72,0)
+ ;
+"RTN","BSDX33",73,0)
+ ;ErrorID:
+"RTN","BSDX33",74,0)
+ ; 0 if a problem.  Message in ERRORTEXT
+"RTN","BSDX33",75,0)
+ ; 1 if OK
+"RTN","BSDX33",76,0)
+ ;
+"RTN","BSDX33",77,0)
+ S X="ERROR^BSDX33",@^%ZOSF("TRAP")
+"RTN","BSDX33",78,0)
+ N BSDXI,BSDXIENS,%DT,BSDXMSG,Y
+"RTN","BSDX33",79,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX33",80,0)
+ S BSDXI=0
+"RTN","BSDX33",81,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX33",82,0)
+ ;
+"RTN","BSDX33",83,0)
+ I '+BSDXAPPT
+"RTN","BSDX33",84,0)
+ I '$D(^BSDXAPPT(BSDXAPPT,0)) D ERR(1,"BSDX REBOOK SET: Invalid appointment ID") Q
+"RTN","BSDX33",85,0)
+ ; i18n (v 1.3)
+"RTN","BSDX33",86,0)
+    ;S X=BSDXDATE,%DT="XT" D ^%DT
+"RTN","BSDX33",87,0)
+ ;I Y=-1 D ERR(1,"BSDX REBOOK SET: Invalid rebook datetime") Q
+"RTN","BSDX33",88,0)
+ ;S BSDXDATE=Y
+"RTN","BSDX33",89,0)
+ S BSDXIENS=BSDXAPPT_","
+"RTN","BSDX33",90,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.11)=+BSDXDATE
+"RTN","BSDX33",91,0)
+ ;
+"RTN","BSDX33",92,0)
+ K BSDXMSG
+"RTN","BSDX33",93,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX33",94,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",95,0)
+ S ^BSDXTMP($J,BSDXI)="1^"_$C(31)
+"RTN","BSDX33",96,0)
+ ;
+"RTN","BSDX33",97,0)
+ Q
+"RTN","BSDX33",98,0)
+ ;
+"RTN","BSDX33",99,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX33",100,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX33",101,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",102,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX33",103,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",104,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX33",105,0)
+ Q
+"RTN","BSDX33",106,0)
+ ;
+"RTN","BSDX33",107,0)
+ERROR ;
+"RTN","BSDX33",108,0)
+ D ^%ZTER
+"RTN","BSDX33",109,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX33",110,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",111,0)
+ D ERR(0,"BSDX33 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX33",112,0)
+ Q
+"RTN","BSDX33",113,0)
+ ;
+"RTN","BSDX33",114,0)
+ERR2(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX33",115,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX33",116,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",117,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^^"_ERRTXT_$C(30)
+"RTN","BSDX33",118,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",119,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX33",120,0)
+ Q
+"RTN","BSDX33",121,0)
+ ;
+"RTN","BSDX33",122,0)
+ERROR2 ;
+"RTN","BSDX33",123,0)
+ D ^%ZTER
+"RTN","BSDX33",124,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX33",125,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",126,0)
+ D ERR2(0,"BSDX33 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX33",127,0)
+ Q
+"RTN","BSDX34")
+0^32^B43182525
+"RTN","BSDX34",1,0)
+BSDX34 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 12:37pm
+"RTN","BSDX34",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX34",3,0)
+    ;
+"RTN","BSDX34",4,0)
+    ; Change Log:
+"RTN","BSDX34",5,0)
+    ; July 10 2010: 
+"RTN","BSDX34",6,0)
+ ; CANCLIN AND RBCLIN: Dates passed in FM format for i18n
+"RTN","BSDX34",7,0)
+ ;
+"RTN","BSDX34",8,0)
+ Q
+"RTN","BSDX34",9,0)
+ ;
+"RTN","BSDX34",10,0)
+RBCLIND(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX34",11,0)
+ ;Entry point for debugging
+"RTN","BSDX34",12,0)
+ ;
+"RTN","BSDX34",13,0)
+ ;D DEBUG^%Serenji("RBCLIN^BSDX34(.BSDXY,BSDXCLST,BSDXBEG,BSDXEND)")
+"RTN","BSDX34",14,0)
+ Q
+"RTN","BSDX34",15,0)
+ ;
+"RTN","BSDX34",16,0)
+RBERR ;
+"RTN","BSDX34",17,0)
+ ;Called from RBCLIN on error to set up header
+"RTN","BSDX34",18,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX34",19,0)
+ S ^BSDXTMP($J,0)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030NewApptDate^T00030Clinic^T00030TypeStatus^I00010RESOURCEID"
+"RTN","BSDX34",20,0)
+ S ^BSDXTMP($J,0)=^(0)_"^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE^D00030OldApptDate"_$C(30)
+"RTN","BSDX34",21,0)
+ D ERR(999)
+"RTN","BSDX34",22,0)
+ Q
+"RTN","BSDX34",23,0)
+ ;
+"RTN","BSDX34",24,0)
+CANCLIN(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX34",25,0)
+ ;
+"RTN","BSDX34",26,0)
+ ;Return recordset of CANCELLED patient appointments
+"RTN","BSDX34",27,0)
+ ;between dates BSDXBEG and BSDXEND for each clinic in BSDXCLST.
+"RTN","BSDX34",28,0)
+ ;Used in generating cancellation letters for a clinic
+"RTN","BSDX34",29,0)
+ ;BSDXCLST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX34",30,0)
+    ;v 1.3 BSDXBEG and BSDXEND are in fm format
+"RTN","BSDX34",31,0)
+ ;Called by BSDX CANCEL CLINIC LIST
+"RTN","BSDX34",32,0)
+ N BSDXCAN
+"RTN","BSDX34",33,0)
+ S BSDXCAN=1
+"RTN","BSDX34",34,0)
+ D RBCLIN(.BSDXY,BSDXCLST,BSDXBEG,BSDXEND)
+"RTN","BSDX34",35,0)
+ ;
+"RTN","BSDX34",36,0)
+ Q
+"RTN","BSDX34",37,0)
+ ;
+"RTN","BSDX34",38,0)
+RBCLIN(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX34",39,0)
+ ;
+"RTN","BSDX34",40,0)
+ ;Return recordset of rebooked patient appointments
+"RTN","BSDX34",41,0)
+ ;between dates BSDXBEG and BSDXEND for each clinic in BSDXCLST.
+"RTN","BSDX34",42,0)
+ ;Used in generating rebook letters for a clinic
+"RTN","BSDX34",43,0)
+ ;BSDXCLST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX34",44,0)
+ ;Called by BSDX REBOOK CLINIC LIST and BSDX CANCEL CLINIC LIST via entry point CANCLIN above
+"RTN","BSDX34",45,0)
+ ;Jul 11 2010 (smh):
+"RTN","BSDX34",46,0)
+    ;for i18n, pass BSDXBEG and BSDXEND in FM format.
+"RTN","BSDX34",47,0)
+ ;
+"RTN","BSDX34",48,0)
+ S X="RBERR^BSDX34",@^%ZOSF("TRAP")
+"RTN","BSDX34",49,0)
+ ;
+"RTN","BSDX34",50,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX34",51,0)
+ N %DT,Y,BSDXJ,BSDXCID,BSDXCLN,BSDXSTRT,BSDXAID,BSDXNOD,BSDXLIST,BSDX,BSDY
+"RTN","BSDX34",52,0)
+ ;Convert beginning and ending dates
+"RTN","BSDX34",53,0)
+ ;TODO: Validation of date to make sure it's a right FM Date
+"RTN","BSDX34",54,0)
+    S BSDXBEG=$P(BSDXBEG,".")
+"RTN","BSDX34",55,0)
+    S BSDXEND=$P(BSDXEND,".")
+"RTN","BSDX34",56,0)
+ S BSDXBEG=BSDXBEG-1,BSDXBEG=BSDXBEG_".9999"
+"RTN","BSDX34",57,0)
+ S BSDXEND=BSDXEND_".9999"
+"RTN","BSDX34",58,0)
+    ;
+"RTN","BSDX34",59,0)
+ I BSDXCLST="" D RBERR Q
+"RTN","BSDX34",60,0)
+ ;
+"RTN","BSDX34",61,0)
+ ;
+"RTN","BSDX34",62,0)
+ ;If BSDXCLST is a list of resource NAMES, look up each name and convert to IEN
+"RTN","BSDX34",63,0)
+ F BSDXJ=1:1:$L(BSDXCLST,"|")-1 S BSDX=$P(BSDXCLST,"|",BSDXJ) D  S $P(BSDXCLST,"|",BSDXJ)=BSDY
+"RTN","BSDX34",64,0)
+ . S BSDY=""
+"RTN","BSDX34",65,0)
+ . I BSDX]"",$D(^BSDXRES(BSDX,0)) S BSDY=BSDX Q
+"RTN","BSDX34",66,0)
+ . I BSDX]"",$D(^BSDXRES("B",BSDX)) S BSDY=$O(^BSDXRES("B",BSDX,0)) Q
+"RTN","BSDX34",67,0)
+ . Q
+"RTN","BSDX34",68,0)
+ ;
+"RTN","BSDX34",69,0)
+ ;For each clinic in BSDXCLST $O through ^BSDXAPPT("ARSRC",ResourceIEN,FMDate,ApptIEN)
+"RTN","BSDX34",70,0)
+ ;
+"RTN","BSDX34",71,0)
+ S BSDXLIST=""
+"RTN","BSDX34",72,0)
+ F BSDXJ=1:1:$L(BSDXCLST,"|")-1 S BSDXCID=$P(BSDXCLST,"|",BSDXJ) D:+BSDXCID
+"RTN","BSDX34",73,0)
+ . S BSDXCLN=$G(^BSDXRES(BSDXCID,0)) S BSDXCLN=$P(BSDXCLN,U) Q:BSDXCLN=""
+"RTN","BSDX34",74,0)
+ . S BSDXSTRT=BSDXBEG F  S BSDXSTRT=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT)) Q:'+BSDXSTRT  Q:BSDXSTRT>BSDXEND  D
+"RTN","BSDX34",75,0)
+ . . S BSDXAID=0 F  S BSDXAID=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT,BSDXAID)) Q:'+BSDXAID  D
+"RTN","BSDX34",76,0)
+ . . . S BSDXNOD=$G(^BSDXAPPT(BSDXAID,0))
+"RTN","BSDX34",77,0)
+ . . . I $D(BSDXCAN) D  Q
+"RTN","BSDX34",78,0)
+ . . . . I $P(BSDXNOD,U,12) S BSDXLIST=BSDXLIST_BSDXAID_"|" ;Cancelled appt
+"RTN","BSDX34",79,0)
+ . . . I $P(BSDXNOD,U,11) S BSDXLIST=BSDXLIST_BSDXAID_"|" ;Rebooked appt
+"RTN","BSDX34",80,0)
+ D RBLETT(.BSDXY,BSDXLIST)
+"RTN","BSDX34",81,0)
+ Q
+"RTN","BSDX34",82,0)
+ ;
+"RTN","BSDX34",83,0)
+RBLETTD(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX34",84,0)
+ ;Entry point for debugging
+"RTN","BSDX34",85,0)
+ ;
+"RTN","BSDX34",86,0)
+ ;D DEBUG^%Serenji("RBLETT^BSDX34(.BSDXY,BSDXLIST)")
+"RTN","BSDX34",87,0)
+ Q
+"RTN","BSDX34",88,0)
+ ;
+"RTN","BSDX34",89,0)
+RBLETT(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX34",90,0)
+ ;Return recordset of patient appointments used in listing
+"RTN","BSDX34",91,0)
+ ;REBOOKED appointments for a list of appointmentIDs.
+"RTN","BSDX34",92,0)
+ ;Called by rpc BSDX REBOOK LIST
+"RTN","BSDX34",93,0)
+ ;BSDXLIST is a |-delimited list of BSDX APPOINTMENT iens (the last |-piece is null)
+"RTN","BSDX34",94,0)
+ ;
+"RTN","BSDX34",95,0)
+ N BSDXI,BSDXIEN,BSDXNOD,BSDXCNID,BSDXCNOD,BSDXMADE,BSDXCLRK,BSDXNOT,BSDXQ,BSDX
+"RTN","BSDX34",96,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX34",97,0)
+ S BSDXI=0
+"RTN","BSDX34",98,0)
+ S ^BSDXTMP($J,BSDXI)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030NewApptDate^T00030Clinic^T00030TypeStatus"
+"RTN","BSDX34",99,0)
+ S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE^D00030OldApptDate"_$C(30)
+"RTN","BSDX34",100,0)
+ S X="ERROR^BSDX34",@^%ZOSF("TRAP")
+"RTN","BSDX34",101,0)
+ ;
+"RTN","BSDX34",102,0)
+ ;Iterate through BSDXLIST
+"RTN","BSDX34",103,0)
+ S BSDXIEN=0
+"RTN","BSDX34",104,0)
+ F BSDX=1:1:$L(BSDXLIST,"|")-1 S BSDXIEN=$P(BSDXLIST,"|",BSDX) D
+"RTN","BSDX34",105,0)
+ . N BSDXNOD,BSDXAPT,BSDXCID,BSDXCNOD,BSDXCLN,BSDX44,BSDXDNOD,BSDXSTAT,BSDX,BSDXTYPE,BSDXLIN,BSDXPAT
+"RTN","BSDX34",106,0)
+ . N BSDXSTRE,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX34",107,0)
+ . N BSDXNAM,BSDXDOB,BSDXHRN,BSDXSEX
+"RTN","BSDX34",108,0)
+ . N BSDXREBK
+"RTN","BSDX34",109,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXIEN,0))
+"RTN","BSDX34",110,0)
+ . Q:BSDXNOD=""
+"RTN","BSDX34",111,0)
+ . S BSDXPAT=$P(BSDXNOD,U,5) ;PATIENT ien
+"RTN","BSDX34",112,0)
+ . Q:'+BSDXPAT
+"RTN","BSDX34",113,0)
+ . Q:'$D(^DPT(BSDXPAT))
+"RTN","BSDX34",114,0)
+ . D PINFO(BSDXPAT)
+"RTN","BSDX34",115,0)
+ . S Y=$P(BSDXNOD,U)
+"RTN","BSDX34",116,0)
+ . Q:'+Y
+"RTN","BSDX34",117,0)
+ . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX34",118,0)
+ . S BSDXAPT=Y ;Appointment date time
+"RTN","BSDX34",119,0)
+ . S BSDXREBK=""
+"RTN","BSDX34",120,0)
+ . S Y=$P(BSDXNOD,U,11)
+"RTN","BSDX34",121,0)
+ . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ") S BSDXREBK=Y ;Rebook date time
+"RTN","BSDX34",122,0)
+ . S BSDXCLRK=$P(BSDXNOD,U,8) ;Appointment made by
+"RTN","BSDX34",123,0)
+ . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX34",124,0)
+ . S Y=$P(BSDXNOD,U,9) ;Date Appointment Made
+"RTN","BSDX34",125,0)
+ . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX34",126,0)
+ . S BSDXMADE=Y
+"RTN","BSDX34",127,0)
+ . ;NOTE
+"RTN","BSDX34",128,0)
+ . S BSDXNOT=""
+"RTN","BSDX34",129,0)
+ . I $D(^BSDXAPPT(BSDXIEN,1,0)) S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXIEN,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX34",130,0)
+ . . S BSDXLIN=$G(^BSDXAPPT(BSDXIEN,1,BSDXQ,0))
+"RTN","BSDX34",131,0)
+ . . S:(BSDXLIN'="")&($E(BSDXLIN,$L(BSDXLIN)-1,$L(BSDXLIN))'=" ") BSDXLIN=BSDXLIN_" "
+"RTN","BSDX34",132,0)
+ . . S BSDXNOT=BSDXNOT_BSDXLIN
+"RTN","BSDX34",133,0)
+ . ;Resource
+"RTN","BSDX34",134,0)
+ . S BSDXCID=$P(BSDXNOD,U,7) ;IEN of BSDX RESOURCE
+"RTN","BSDX34",135,0)
+ . Q:'+BSDXCID
+"RTN","BSDX34",136,0)
+ . Q:'$D(^BSDXRES(BSDXCID,0))
+"RTN","BSDX34",137,0)
+ . S BSDXCNOD=$G(^BSDXRES(BSDXCID,0)) ;BSDX RESOURCE node
+"RTN","BSDX34",138,0)
+ . Q:BSDXCNOD=""
+"RTN","BSDX34",139,0)
+ . S BSDXCLN=$P(BSDXCNOD,U) ;Text name of BSDX Resource
+"RTN","BSDX34",140,0)
+ . S BSDXTYPE="" ;Unused in this recordset
+"RTN","BSDX34",141,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX34",142,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXREBK_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_BSDXCID_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_"^"_BSDXAPT_$C(30)
+"RTN","BSDX34",143,0)
+ . Q
+"RTN","BSDX34",144,0)
+ ;
+"RTN","BSDX34",145,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX34",146,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX34",147,0)
+ Q
+"RTN","BSDX34",148,0)
+ ;
+"RTN","BSDX34",149,0)
+PINFO(BSDXPAT) ;
+"RTN","BSDX34",150,0)
+ ;Get patient info
+"RTN","BSDX34",151,0)
+ N BSDXNOD
+"RTN","BSDX34",152,0)
+ S BSDXNOD=$$PATINFO^BSDX27(BSDXPAT)
+"RTN","BSDX34",153,0)
+ S BSDXNAM=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX34",154,0)
+ S BSDXSEX=$P(BSDXNOD,U,2) ;SEX
+"RTN","BSDX34",155,0)
+ S BSDXDOB=$P(BSDXNOD,U,3) ;DOB
+"RTN","BSDX34",156,0)
+ S BSDXHRN=$P(BSDXNOD,U,4) ;Health Record Number for location DUZ(2)
+"RTN","BSDX34",157,0)
+ S BSDXSTRE=$P(BSDXNOD,U,5) ;Street
+"RTN","BSDX34",158,0)
+ S BSDXCITY=$P(BSDXNOD,U,6) ;City
+"RTN","BSDX34",159,0)
+ S BSDXST=$P(BSDXNOD,U,7) ;State
+"RTN","BSDX34",160,0)
+ S BSDXZIP=$P(BSDXNOD,U,8) ;zip
+"RTN","BSDX34",161,0)
+ S BSDXPHON=$P(BSDXNOD,U,9) ;homephone
+"RTN","BSDX34",162,0)
+ Q
+"RTN","BSDX34",163,0)
+ ;
+"RTN","BSDX34",164,0)
+ERROR ;
+"RTN","BSDX34",165,0)
+ D ERR("RPMS Error")
+"RTN","BSDX34",166,0)
+ Q
+"RTN","BSDX34",167,0)
+ ;
+"RTN","BSDX34",168,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX34",169,0)
+ S:'$D(BSDXI) BSDXI=999
+"RTN","BSDX34",170,0)
+ I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX34",171,0)
+ E  S BSDXERR=ERRNO
+"RTN","BSDX34",172,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX34",173,0)
+ S ^BSDXTMP($J,BSDXI)="^^^^^^^^^^^^^^^^"_$C(30)
+"RTN","BSDX34",174,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX34",175,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX34",176,0)
+ Q
+"RTN","BSDX35")
+0^33^B8147998
+"RTN","BSDX35",1,0)
+BSDX35 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX35",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDX35",3,0)
+ ;
+"RTN","BSDX35",4,0)
+ ;
+"RTN","BSDX35",5,0)
+ Q
+"RTN","BSDX35",6,0)
+ ;
+"RTN","BSDX35",7,0)
+RSRCLTRD(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX35",8,0)
+ ;Entry point for debugging
+"RTN","BSDX35",9,0)
+ ;
+"RTN","BSDX35",10,0)
+ ;D DEBUG^%Serenji("RSRCLTR^BSDX35(.BSDXY,BSDXLIST)")
+"RTN","BSDX35",11,0)
+ Q
+"RTN","BSDX35",12,0)
+ ;
+"RTN","BSDX35",13,0)
+RSRCLTR(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX35",14,0)
+ ;
+"RTN","BSDX35",15,0)
+ ;Return recordset of RESOURCES and associated LETTERS
+"RTN","BSDX35",16,0)
+ ;Used in generating rebook letters for a clinic
+"RTN","BSDX35",17,0)
+ ;BSDXLIST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX35",18,0)
+ ;Called by BSDX RESOURCE LETTERS
+"RTN","BSDX35",19,0)
+ ;
+"RTN","BSDX35",20,0)
+ ;
+"RTN","BSDX35",21,0)
+ S X="ERROR^BSDX35",@^%ZOSF("TRAP")
+"RTN","BSDX35",22,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX35",23,0)
+ N BSDXIEN,BSDX,BSDXLTR,BSDXNOS,BSDXCAN,BSDXIEN1
+"RTN","BSDX35",24,0)
+ S BSDXI=0
+"RTN","BSDX35",25,0)
+ S ^BSDXTMP($J,BSDXI)="I00010RESOURCEID^T00030RESOURCE_NAME^T00030LETTER_TEXT^T00030NO_SHOW_LETTER^T00030CLINIC_CANCELLATION_LETTER"_$C(30)
+"RTN","BSDX35",26,0)
+ ;
+"RTN","BSDX35",27,0)
+ ;
+"RTN","BSDX35",28,0)
+ ;If BSDXLIST is a list of resource NAMES, look up each name and convert to IEN
+"RTN","BSDX35",29,0)
+ F BSDXJ=1:1:$L(BSDXLIST,"|")-1 S BSDX=$P(BSDXLIST,"|",BSDXJ) D  S $P(BSDXLIST,"|",BSDXJ)=BSDY
+"RTN","BSDX35",30,0)
+ . S BSDY=""
+"RTN","BSDX35",31,0)
+ . I BSDX]"",$D(^BSDXRES(BSDX,0)) S BSDY=BSDX Q
+"RTN","BSDX35",32,0)
+ . I BSDX]"",$D(^BSDXRES("B",BSDX)) S BSDY=$O(^BSDXRES("B",BSDX,0)) Q
+"RTN","BSDX35",33,0)
+ . Q
+"RTN","BSDX35",34,0)
+ ;
+"RTN","BSDX35",35,0)
+ ;Get letter text from wp fields
+"RTN","BSDX35",36,0)
+ S BSDXIEN=0
+"RTN","BSDX35",37,0)
+ F BSDX=1:1:$L(BSDXLIST,"|")-1 S BSDXIEN=$P(BSDXLIST,"|",BSDX) D
+"RTN","BSDX35",38,0)
+ . Q:'$D(^BSDXRES(BSDXIEN))
+"RTN","BSDX35",39,0)
+ . S BSDXNAM=$P(^BSDXRES(BSDXIEN,0),U)
+"RTN","BSDX35",40,0)
+ . S BSDXLTR=""
+"RTN","BSDX35",41,0)
+ . I $D(^BSDXRES(BSDXIEN,1)) D
+"RTN","BSDX35",42,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXRES(BSDXIEN,1,BSDXIEN1)) Q:'+BSDXIEN1  D
+"RTN","BSDX35",43,0)
+ . . . S BSDXLTR=BSDXLTR_$G(^BSDXRES(BSDXIEN,1,BSDXIEN1,0))
+"RTN","BSDX35",44,0)
+ . . . S BSDXLTR=BSDXLTR_$C(13)_$C(10)
+"RTN","BSDX35",45,0)
+ . S BSDXNOS=""
+"RTN","BSDX35",46,0)
+ . I $D(^BSDXRES(BSDXIEN,12)) D
+"RTN","BSDX35",47,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXRES(BSDXIEN,12,BSDXIEN1)) Q:'+BSDXIEN1  D
+"RTN","BSDX35",48,0)
+ . . . S BSDXNOS=BSDXNOS_$G(^BSDXRES(BSDXIEN,12,BSDXIEN1,0))
+"RTN","BSDX35",49,0)
+ . . . S BSDXNOS=BSDXNOS_$C(13)_$C(10)
+"RTN","BSDX35",50,0)
+ . S BSDXCAN=""
+"RTN","BSDX35",51,0)
+ . I $D(^BSDXRES(BSDXIEN,13)) D
+"RTN","BSDX35",52,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXRES(BSDXIEN,13,BSDXIEN1)) Q:'+BSDXIEN1  D
+"RTN","BSDX35",53,0)
+ . . . S BSDXCAN=BSDXCAN_$G(^BSDXRES(BSDXIEN,13,BSDXIEN1,0))
+"RTN","BSDX35",54,0)
+ . . . S BSDXCAN=BSDXCAN_$C(13)_$C(10)
+"RTN","BSDX35",55,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX35",56,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXNAM_U_BSDXLTR_U_BSDXNOS_U_BSDXCAN_$C(30)
+"RTN","BSDX35",57,0)
+ ;
+"RTN","BSDX35",58,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX35",59,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX35",60,0)
+ Q
+"RTN","BSDX35",61,0)
+ ;
+"RTN","BSDX35",62,0)
+ERROR ;
+"RTN","BSDX35",63,0)
+ D ERR("RPMS Error")
+"RTN","BSDX35",64,0)
+ Q
+"RTN","BSDX35",65,0)
+ ;
+"RTN","BSDX35",66,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX35",67,0)
+ S:'$D(BSDXI) BSDXI=999
+"RTN","BSDX35",68,0)
+ I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX35",69,0)
+ E  S BSDXERR=ERRNO
+"RTN","BSDX35",70,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX35",71,0)
+ S ^BSDXTMP($J,BSDXI)="^^^^"_$C(30)
+"RTN","BSDX35",72,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX35",73,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX35",74,0)
+ Q
+"RTN","BSDXAPI")
+0^35^B105784370
+"RTN","BSDXAPI",1,0)
+BSDXAPI ; IHS/ANMC/LJF - SCHEDULING APIs ; 12/6/10 5:50pm
+"RTN","BSDXAPI",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDXAPI",3,0)
+ ;Orignal routine is BSDAPI by IHS/LJF, HMW, and MAW
+"RTN","BSDXAPI",4,0)
+ ;local mods (many) by WV/SMH
+"RTN","BSDXAPI",5,0)
+ ;Move to BSDX namespace as BSDXAPI from BSDAPI by WV/SMH
+"RTN","BSDXAPI",6,0)
+ ; Change History:
+"RTN","BSDXAPI",7,0)
+    ; 2010-11-5:
+"RTN","BSDXAPI",8,0)
+ ; - Fixed errors having to do uncanceling patient appointments if it was a patient cancelled appointment.
+"RTN","BSDXAPI",9,0)
+ ; - Use new style Fileman API for storing appointments in file 44 in $$MAKE due to problems with legacy API.
+"RTN","BSDXAPI",10,0)
+    ; 2010-11-12:
+"RTN","BSDXAPI",11,0)
+    ; - Changed ="C" to ["C" in SCIEN. Cancelled appointments can be "PC" as well. 
+"RTN","BSDXAPI",12,0)
+    ; 2010-12-5
+"RTN","BSDXAPI",13,0)
+    ; Added an entry point to update the patient note in file 44.
+"RTN","BSDXAPI",14,0)
+    ; 2010-12-6
+"RTN","BSDXAPI",15,0)
+    ; MAKE1 incorrectly put info field in BSDR("INFO") rather than BSDR("OI")
+"RTN","BSDXAPI",16,0)
+    ; 2010-12-8
+"RTN","BSDXAPI",17,0)
+    ; Removed restriction on max appt length. Even though this restriction
+"RTN","BSDXAPI",18,0)
+    ; exists in fileman (120 minutes), PIMS ignores it. Therefore, I 
+"RTN","BSDXAPI",19,0)
+    ; will ignore it here too.
+"RTN","BSDXAPI",20,0)
+ ;
+"RTN","BSDXAPI",21,0)
+MAKE1(DFN,CLIN,TYP,DATE,LEN,INFO) ; Simplified PEP w/ parameters for $$MAKE - making appointment
+"RTN","BSDXAPI",22,0)
+ ; Call like this for DFN 23435 having an appointment at Hospital Location 33
+"RTN","BSDXAPI",23,0)
+ ; have 3 (scheduled) or 4 (walkin) appt at Dec 20, 2009 @ 10:11:59 for 30 minutes appt
+"RTN","BSDXAPI",24,0)
+ ; for Baby foxes hallucinations.
+"RTN","BSDXAPI",25,0)
+ ; S RESULT=$$MAKE1^BSDXAPI(23435,33,(3 or 4),3091220.221159,30,"I see Baby foxes")
+"RTN","BSDXAPI",26,0)
+ S BSDR("PAT")=DFN       ;DFN
+"RTN","BSDXAPI",27,0)
+ S BSDR("CLN")=CLIN      ;Hosp Loc IEN
+"RTN","BSDXAPI",28,0)
+ S BSDR("TYP")=TYP       ;3 sched or 4 walkin
+"RTN","BSDXAPI",29,0)
+ S BSDR("ADT")=DATE      ;Appointment date in FM format
+"RTN","BSDXAPI",30,0)
+ S BSDR("LEN")=LEN       ;Appt len upto 240 (min)
+"RTN","BSDXAPI",31,0)
+ S BSDR("OI")=INFO     ;Reason for appt - up to 150 char
+"RTN","BSDXAPI",32,0)
+ S BSDR("USR")=DUZ       ;Person who made appt - current user
+"RTN","BSDXAPI",33,0)
+ Q $$MAKE(.BSDR)
+"RTN","BSDXAPI",34,0)
+ ;
+"RTN","BSDXAPI",35,0)
+MAKE(BSDR) ;PEP; call to store appt made
+"RTN","BSDXAPI",36,0)
+ ;
+"RTN","BSDXAPI",37,0)
+ ; Make call using: S ERR=$$MAKE^BSDXAPI(.ARRAY)
+"RTN","BSDXAPI",38,0)
+ ;
+"RTN","BSDXAPI",39,0)
+ ; Input Array -
+"RTN","BSDXAPI",40,0)
+ ; BSDR("PAT") = ien of patient in file 2
+"RTN","BSDXAPI",41,0)
+ ; BSDR("CLN") = ien of clinic in file 44
+"RTN","BSDXAPI",42,0)
+ ; BSDR("TYP") = 3 for scheduled appts, 4 for walkins
+"RTN","BSDXAPI",43,0)
+ ; BSDR("ADT") = appointment date and time
+"RTN","BSDXAPI",44,0)
+ ; BSDR("LEN") = appointment length in minutes (5-120)
+"RTN","BSDXAPI",45,0)
+ ; BSDR("OI")  = reason for appt - up to 150 characters
+"RTN","BSDXAPI",46,0)
+ ; BSDR("USR") = user who made appt
+"RTN","BSDXAPI",47,0)
+ ;
+"RTN","BSDXAPI",48,0)
+ ;Output: error status and message
+"RTN","BSDXAPI",49,0)
+ ;   = 0 or null:  everything okay
+"RTN","BSDXAPI",50,0)
+ ;   = 1^message:  error and reason
+"RTN","BSDXAPI",51,0)
+ ;
+"RTN","BSDXAPI",52,0)
+ I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT"))
+"RTN","BSDXAPI",53,0)
+ I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN"))
+"RTN","BSDXAPI",54,0)
+ I ($G(BSDR("TYP"))<3)!($G(BSDR("TYP"))>4) Q 1_U_"Appt Type error: "_$G(BSDR("TYP"))
+"RTN","BSDXAPI",55,0)
+ I $G(BSDR("ADT")) S BSDR("ADT")=+$E(BSDR("ADT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",56,0)
+ I $G(BSDR("ADT"))'?7N1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",57,0)
+ ;
+"RTN","BSDXAPI",58,0)
+ ;I ($G(BSDR("LEN"))<5)!($G(BSDR("LEN"))>240) Q 1_U_"Appt Length error: "_$G(BSDR("LEN")) ; v 1.42 - no check on length is done anymore. see top comments for details.
+"RTN","BSDXAPI",59,0)
+ I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Made Appt Error: "_$G(BSDR("USR"))
+"RTN","BSDXAPI",60,0)
+ I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)'["C" Q 1_U_"Patient "_BSDR("PAT")_" already has appt at "_BSDR("ADT")
+"RTN","BSDXAPI",61,0)
+ ;
+"RTN","BSDXAPI",62,0)
+ NEW DIC,DA,Y,X,DD,DO,DLAYGO
+"RTN","BSDXAPI",63,0)
+ ;
+"RTN","BSDXAPI",64,0)
+ I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)["C" D
+"RTN","BSDXAPI",65,0)
+ . ; "un-cancel" existing appt in file 2
+"RTN","BSDXAPI",66,0)
+ . N BSDXFDA,BSDXIENS,BSDXMSG
+"RTN","BSDXAPI",67,0)
+ . S BSDXIENS=BSDR("ADT")_","_BSDR("PAT")_","
+"RTN","BSDXAPI",68,0)
+ . S BSDXFDA(2.98,BSDXIENS,".01")=BSDR("CLN")
+"RTN","BSDXAPI",69,0)
+ . S BSDXFDA(2.98,BSDXIENS,"3")=""
+"RTN","BSDXAPI",70,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9")=BSDR("TYP")
+"RTN","BSDXAPI",71,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9.5")=9
+"RTN","BSDXAPI",72,0)
+ . S BSDXFDA(2.98,BSDXIENS,"14")=""
+"RTN","BSDXAPI",73,0)
+ . S BSDXFDA(2.98,BSDXIENS,"15")=""
+"RTN","BSDXAPI",74,0)
+ . S BSDXFDA(2.98,BSDXIENS,"16")=""
+"RTN","BSDXAPI",75,0)
+ . S BSDXFDA(2.98,BSDXIENS,"19")=""
+"RTN","BSDXAPI",76,0)
+ . S BSDXFDA(2.98,BSDXIENS,"20")=$$NOW^XLFDT
+"RTN","BSDXAPI",77,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDXAPI",78,0)
+ . N BSDXTEMP S BSDXTEMP=$G(BSDXMSG)
+"RTN","BSDXAPI",79,0)
+ E  D  I $G(BSDXERR(1)) Q 1_U_"FileMan add to DPT error: Patient="_BSDR("PAT")_" Appt="_BSDR("ADT")  
+"RTN","BSDXAPI",80,0)
+ . N BSDXFDA,BSDXIENS,BSDXMSG
+"RTN","BSDXAPI",81,0)
+ . S BSDXIENS="?+2,"_BSDR("PAT")_","
+"RTN","BSDXAPI",82,0)
+ . S BSDXIENS(2)=BSDR("ADT")
+"RTN","BSDXAPI",83,0)
+ . S BSDXFDA(2.98,BSDXIENS,.01)=BSDR("CLN")
+"RTN","BSDXAPI",84,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9")=BSDR("TYP")
+"RTN","BSDXAPI",85,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9.5")=9
+"RTN","BSDXAPI",86,0)
+ . S BSDXFDA(2.98,BSDXIENS,"20")=$$NOW^XLFDT
+"RTN","BSDXAPI",87,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIENS","BSDXERR(1)")
+"RTN","BSDXAPI",88,0)
+ ; add appt to file 44
+"RTN","BSDXAPI",89,0)
+ K DIC,DA,X,Y,DLAYGO,DD,DO
+"RTN","BSDXAPI",90,0)
+ I '$D(^SC(BSDR("CLN"),"S",0)) S ^SC(BSDR("CLN"),"S",0)="^44.001DA^^"
+"RTN","BSDXAPI",91,0)
+ I '$D(^SC(BSDR("CLN"),"S",BSDR("ADT"),0)) D  I Y<1 Q 1_U_"Error adding date to file 44: Clinic="_BSDR("CLN")_" Date="_BSDR("ADT")
+"RTN","BSDXAPI",92,0)
+ . S DIC="^SC("_BSDR("CLN")_",""S"",",DA(1)=BSDR("CLN"),(X,DINUM)=BSDR("ADT")
+"RTN","BSDXAPI",93,0)
+ . S DIC("P")="44.001DA",DIC(0)="L",DLAYGO=44.001
+"RTN","BSDXAPI",94,0)
+ . S Y=1 I '$D(@(DIC_X_")")) D FILE^DICN
+"RTN","BSDXAPI",95,0)
+ ;
+"RTN","BSDXAPI",96,0)
+ ; Sep 28 2010: Changed old style API to new style API. Keep for reference //smh
+"RTN","BSDXAPI",97,0)
+ ;K DIC,DA,X,Y,DLAYGO,DD,DO,DINUM
+"RTN","BSDXAPI",98,0)
+ ;S DIC="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"
+"RTN","BSDXAPI",99,0)
+ ;S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),X=BSDR("PAT")
+"RTN","BSDXAPI",100,0)
+ ;S DIC("DR")="1///"_BSDR("LEN")_";3///"_$E($G(BSDR("OI")),1,150)_";7///`"_BSDR("USR")_";8///"_$P($$NOW^XLFDT,".")
+"RTN","BSDXAPI",101,0)
+ ;S DIC("P")="44.003PA",DIC(0)="L",DLAYGO=44.003
+"RTN","BSDXAPI",102,0)
+ ;D FILE^DICN
+"RTN","BSDXAPI",103,0)
+ ;
+"RTN","BSDXAPI",104,0)
+ N BSDXIENS S BSDXIENS="?+1,"_BSDR("ADT")_","_BSDR("CLN")_","
+"RTN","BSDXAPI",105,0)
+ N BSDXFDA
+"RTN","BSDXAPI",106,0)
+ S BSDXFDA(44.003,BSDXIENS,.01)=BSDR("PAT")
+"RTN","BSDXAPI",107,0)
+ S BSDXFDA(44.003,BSDXIENS,1)=BSDR("LEN")
+"RTN","BSDXAPI",108,0)
+ S BSDXFDA(44.003,BSDXIENS,3)=$E($G(BSDR("OI")),1,150)
+"RTN","BSDXAPI",109,0)
+ S BSDXFDA(44.003,BSDXIENS,7)=BSDR("USR")
+"RTN","BSDXAPI",110,0)
+ S BSDXFDA(44.003,BSDXIENS,8)=$P($$NOW^XLFDT,".")
+"RTN","BSDXAPI",111,0)
+ N BSDXERR
+"RTN","BSDXAPI",112,0)
+ D UPDATE^DIE("","BSDXFDA","","BSDXERR")
+"RTN","BSDXAPI",113,0)
+ ;
+"RTN","BSDXAPI",114,0)
+ I $D(BSDXERR) Q 1_U_"Error adding appt to file 44: Clinic="_BSDR("CLN")_" Date="_BSDR("ADT")_" Patient="_BSDR("PAT")_" Error: "_BSDXERR("DIERR",1,"TEXT",1)
+"RTN","BSDXAPI",115,0)
+ ;
+"RTN","BSDXAPI",116,0)
+ ; call event driver
+"RTN","BSDXAPI",117,0)
+ NEW DFN,SDT,SDCL,SDDA,SDMODE
+"RTN","BSDXAPI",118,0)
+ S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2
+"RTN","BSDXAPI",119,0)
+ S SDDA=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",120,0)
+ D MAKE^SDAMEVT(DFN,SDT,SDCL,SDDA,SDMODE)
+"RTN","BSDXAPI",121,0)
+ Q 0
+"RTN","BSDXAPI",122,0)
+ ;
+"RTN","BSDXAPI",123,0)
+CHECKIN1(DFN,CLIN,APDATE) ; Simplified PEP w/ parameters for $$CHECKIN - Checking in
+"RTN","BSDXAPI",124,0)
+ ; Call like this for DFN 23435 checking in now at Hospital Location 33
+"RTN","BSDXAPI",125,0)
+ ; for appt at Dec 20, 2009 @ 10:11:59 
+"RTN","BSDXAPI",126,0)
+ ; S RESULT=$$CHECKIN1^BSDXAPI(23435,33,3091220.221159)
+"RTN","BSDXAPI",127,0)
+ S BSDR("PAT")=DFN          ;DFN
+"RTN","BSDXAPI",128,0)
+ S BSDR("CLN")=CLIN         ;Hosp Loc IEN
+"RTN","BSDXAPI",129,0)
+ S BSDR("ADT")=APDATE       ;Appt Date
+"RTN","BSDXAPI",130,0)
+ S BSDR("CDT")=$$NOW^XLFDT  ;Check-in date defaults to now
+"RTN","BSDXAPI",131,0)
+ S BSDR("USR")=DUZ          ;Check-in user defaults to current
+"RTN","BSDXAPI",132,0)
+ Q $$CHECKIN(.BSDR)
+"RTN","BSDXAPI",133,0)
+ ;
+"RTN","BSDXAPI",134,0)
+CHECKIN(BSDR) ;EP; call to add checkin info to appt; IHS/ITSC/LJF 12/23/2004 PATCH 1002
+"RTN","BSDXAPI",135,0)
+ ;
+"RTN","BSDXAPI",136,0)
+ ; Make call by using:  S ERR=$$CHECKIN^BSDXAPI(.ARRAY)
+"RTN","BSDXAPI",137,0)
+ ;
+"RTN","BSDXAPI",138,0)
+ ; Input array -
+"RTN","BSDXAPI",139,0)
+ ;  BSDR("PAT") = ien of patient in file 2
+"RTN","BSDXAPI",140,0)
+ ;  BSDR("CLN") = ien of clinic in file 44
+"RTN","BSDXAPI",141,0)
+ ;  BSDR("ADT") = appt date/time
+"RTN","BSDXAPI",142,0)
+ ;  BSDR("CDT") = checkin date/time
+"RTN","BSDXAPI",143,0)
+ ;  BSDR("USR") = checkin user
+"RTN","BSDXAPI",144,0)
+ ;
+"RTN","BSDXAPI",145,0)
+ ; Output value -
+"RTN","BSDXAPI",146,0)
+ ;              = 0 means everything worked
+"RTN","BSDXAPI",147,0)
+ ;              = 1^message means error with reason message
+"RTN","BSDXAPI",148,0)
+ ;
+"RTN","BSDXAPI",149,0)
+ I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT"))
+"RTN","BSDXAPI",150,0)
+ I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN"))
+"RTN","BSDXAPI",151,0)
+ I $G(BSDR("ADT")) S BSDR("ADT")=+$E(BSDR("ADT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",152,0)
+ I $G(BSDR("ADT"))'?7N1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",153,0)
+ I $G(BSDR("CDT")) S BSDR("CDT")=+$E(BSDR("CDT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",154,0)
+ I $G(BSDR("CDT"))'?7N1".".4N Q 1_U_"Checkin Date/Time error: "_$G(BSDR("CDT"))
+"RTN","BSDXAPI",155,0)
+ I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Made Appt Error: "_$G(BSDR("USR"))
+"RTN","BSDXAPI",156,0)
+ ;
+"RTN","BSDXAPI",157,0)
+ ; find ien for appt in file 44
+"RTN","BSDXAPI",158,0)
+ NEW IEN,DIE,DA,DR
+"RTN","BSDXAPI",159,0)
+ S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",160,0)
+ I 'IEN Q 1_U_"Error trying to find appointment for checkin: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT")
+"RTN","BSDXAPI",161,0)
+ ;
+"RTN","BSDXAPI",162,0)
+ ; remember before status
+"RTN","BSDXAPI",163,0)
+ NEW SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL
+"RTN","BSDXAPI",164,0)
+ S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2,SDDA=IEN
+"RTN","BSDXAPI",165,0)
+ S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",166,0)
+ D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+"RTN","BSDXAPI",167,0)
+ ;
+"RTN","BSDXAPI",168,0)
+ ; set checkin
+"RTN","BSDXAPI",169,0)
+ S DIE="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"
+"RTN","BSDXAPI",170,0)
+ S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),DA=IEN
+"RTN","BSDXAPI",171,0)
+ S DR="309///"_BSDR("CDT")_";302///`"_BSDR("USR")_";305///"_$$NOW^XLFDT
+"RTN","BSDXAPI",172,0)
+ D ^DIE
+"RTN","BSDXAPI",173,0)
+ ;
+"RTN","BSDXAPI",174,0)
+ ; set after status
+"RTN","BSDXAPI",175,0)
+ S SDDA=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",176,0)
+ S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",177,0)
+ D AFTER^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+"RTN","BSDXAPI",178,0)
+ ;
+"RTN","BSDXAPI",179,0)
+ ; call event driver
+"RTN","BSDXAPI",180,0)
+ D EVT^SDAMEVT(.SDATA,4,SDMODE,SDCIHDL)
+"RTN","BSDXAPI",181,0)
+ Q 0
+"RTN","BSDXAPI",182,0)
+ ;
+"RTN","BSDXAPI",183,0)
+CANCEL1(DFN,CLIN,TYP,APDATE,REASON,INFO) ; PEP w/ parameters for $$CANCEL - cancelling appointment
+"RTN","BSDXAPI",184,0)
+ ; Call like this for DFN 23435 cancelling an appointment at Hospital Location 33,
+"RTN","BSDXAPI",185,0)
+ ; cancellation initiated by patient ("PC" rather than clinic "C"),
+"RTN","BSDXAPI",186,0)
+ ; cancelling appt at Dec 20, 2009 @ 10:11:59 because of reason 1 in file 409.2 IEN (weather)
+"RTN","BSDXAPI",187,0)
+ ; because foxes come out during bad weather.
+"RTN","BSDXAPI",188,0)
+ ; S RESULT=$$CANCEL1^BSDXAPI(23435,33,"PC",3091220.221159,1,"Afraid of foxes")
+"RTN","BSDXAPI",189,0)
+ S BSDR("PAT")=DFN
+"RTN","BSDXAPI",190,0)
+ S BSDR("CLN")=CLIN
+"RTN","BSDXAPI",191,0)
+ S BSDR("TYP")=TYP
+"RTN","BSDXAPI",192,0)
+ S BSDR("ADT")=APDATE
+"RTN","BSDXAPI",193,0)
+ S BSDR("CDT")=$$NOW^XLFDT
+"RTN","BSDXAPI",194,0)
+ S BSDR("USR")=DUZ
+"RTN","BSDXAPI",195,0)
+ S BSDR("CR")=REASON
+"RTN","BSDXAPI",196,0)
+ S BSDR("NOT")=INFO
+"RTN","BSDXAPI",197,0)
+ Q $$CANCEL(.BSDR)
+"RTN","BSDXAPI",198,0)
+ ;
+"RTN","BSDXAPI",199,0)
+CANCEL(BSDR) ;PEP; called to cancel appt
+"RTN","BSDXAPI",200,0)
+ ;
+"RTN","BSDXAPI",201,0)
+ ; Make call using: S ERR=$$CANCEL^BSDXAPI(.ARRAY)
+"RTN","BSDXAPI",202,0)
+ ;
+"RTN","BSDXAPI",203,0)
+ ; Input Array -
+"RTN","BSDXAPI",204,0)
+ ; BSDR("PAT") = ien of patient in file 2
+"RTN","BSDXAPI",205,0)
+ ; BSDR("CLN") = ien of clinic in file 44
+"RTN","BSDXAPI",206,0)
+ ; BSDR("TYP") = C for canceled by clinic; PC for patient canceled
+"RTN","BSDXAPI",207,0)
+ ; BSDR("ADT") = appointment date and time
+"RTN","BSDXAPI",208,0)
+ ; BSDR("CDT") = cancel date and time
+"RTN","BSDXAPI",209,0)
+ ; BSDR("USR") = user who canceled appt
+"RTN","BSDXAPI",210,0)
+ ; BSDR("CR")  = cancel reason - pointer to file 409.2
+"RTN","BSDXAPI",211,0)
+ ; BSDR("NOT") = cancel remarks - optional notes to 160 characters
+"RTN","BSDXAPI",212,0)
+ ;
+"RTN","BSDXAPI",213,0)
+ ;Output: error status and message
+"RTN","BSDXAPI",214,0)
+ ;   = 0 or null:  everything okay
+"RTN","BSDXAPI",215,0)
+ ;   = 1^message:  error and reason
+"RTN","BSDXAPI",216,0)
+ ;
+"RTN","BSDXAPI",217,0)
+ I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT"))
+"RTN","BSDXAPI",218,0)
+ I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN"))
+"RTN","BSDXAPI",219,0)
+ I ($G(BSDR("TYP"))'="C"),($G(BSDR("TYP"))'="PC") Q 1_U_"Cancel Status error: "_$G(BSDR("TYP"))
+"RTN","BSDXAPI",220,0)
+ I $G(BSDR("ADT")) S BSDR("ADT")=+$E(BSDR("ADT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",221,0)
+ I $G(BSDR("ADT"))'?7N1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",222,0)
+ I $G(BSDR("CDT")) S BSDR("CDT")=+$E(BSDR("CDT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",223,0)
+ I $G(BSDR("CDT"))'?7N1".".4N Q 1_U_"Cancel Date/Time error: "_$G(BSDR("CDT"))
+"RTN","BSDXAPI",224,0)
+ I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Canceled Appt Error: "_$G(BSDR("USR"))
+"RTN","BSDXAPI",225,0)
+ I '$D(^SD(409.2,+$G(BSDR("CR")))) Q 1_U_"Cancel Reason error: "_$G(BSDR("CR"))
+"RTN","BSDXAPI",226,0)
+ ;
+"RTN","BSDXAPI",227,0)
+ NEW IEN,DIE,DA,DR
+"RTN","BSDXAPI",228,0)
+ S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",229,0)
+ I 'IEN Q 1_U_"Error trying to find appointment for cancel: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT")
+"RTN","BSDXAPI",230,0)
+ ;
+"RTN","BSDXAPI",231,0)
+ I $$CI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"),IEN) Q 1_U_"Patient already checked in; cannot cancel until checkin deleted: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT")
+"RTN","BSDXAPI",232,0)
+ ;
+"RTN","BSDXAPI",233,0)
+ ; remember before status
+"RTN","BSDXAPI",234,0)
+ NEW SDATA,DFN,SDT,SDCL,SDDA,SDCPHDL
+"RTN","BSDXAPI",235,0)
+ S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2,SDDA=IEN
+"RTN","BSDXAPI",236,0)
+ S SDCPHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",237,0)
+ D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCPHDL)
+"RTN","BSDXAPI",238,0)
+ ;
+"RTN","BSDXAPI",239,0)
+ ; get user who made appt and date appt made from ^SC
+"RTN","BSDXAPI",240,0)
+ ;    because data in ^SC will be deleted
+"RTN","BSDXAPI",241,0)
+ NEW USER,DATE
+"RTN","BSDXAPI",242,0)
+ S USER=$P($G(^SC(SDCL,"S",SDT,1,IEN,0)),U,6)
+"RTN","BSDXAPI",243,0)
+ S DATE=$P($G(^SC(SDCL,"S",SDT,1,IEN,0)),U,7)
+"RTN","BSDXAPI",244,0)
+ ;
+"RTN","BSDXAPI",245,0)
+ ; update file 2 info
+"RTN","BSDXAPI",246,0)
+ NEW DIE,DA,DR
+"RTN","BSDXAPI",247,0)
+ S DIE="^DPT("_DFN_",""S"",",DA(1)=DFN,DA=SDT
+"RTN","BSDXAPI",248,0)
+ S DR="3///"_BSDR("TYP")_";14///`"_BSDR("USR")_";15///"_BSDR("CDT")_";16///`"_BSDR("CR")_";19///`"_USER_";20///"_DATE
+"RTN","BSDXAPI",249,0)
+ S:$G(BSDR("NOT"))]"" DR=DR_";17///"_$E(BSDR("NOT"),1,160)
+"RTN","BSDXAPI",250,0)
+ D ^DIE
+"RTN","BSDXAPI",251,0)
+ ;
+"RTN","BSDXAPI",252,0)
+ ; delete data in ^SC
+"RTN","BSDXAPI",253,0)
+ NEW DIK,DA
+"RTN","BSDXAPI",254,0)
+ S DIK="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"
+"RTN","BSDXAPI",255,0)
+ S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),DA=IEN
+"RTN","BSDXAPI",256,0)
+ D ^DIK
+"RTN","BSDXAPI",257,0)
+ ;
+"RTN","BSDXAPI",258,0)
+ ; call event driver
+"RTN","BSDXAPI",259,0)
+ D CANCEL^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDMODE,SDCPHDL)
+"RTN","BSDXAPI",260,0)
+ Q 0
+"RTN","BSDXAPI",261,0)
+ ;
+"RTN","BSDXAPI",262,0)
+CI(PAT,CLINIC,DATE,SDIEN) ;PEP; -- returns 1 if appt already checked-in
+"RTN","BSDXAPI",263,0)
+ NEW X
+"RTN","BSDXAPI",264,0)
+ S X=$G(SDIEN)   ;ien sent in call
+"RTN","BSDXAPI",265,0)
+ I 'X S X=$$SCIEN(PAT,CLINIC,DATE) I 'X Q 0
+"RTN","BSDXAPI",266,0)
+ S X=$P($G(^SC(CLINIC,"S",DATE,1,X,"C")),U)
+"RTN","BSDXAPI",267,0)
+ Q $S(X:1,1:0)
+"RTN","BSDXAPI",268,0)
+ ;
+"RTN","BSDXAPI",269,0)
+SCIEN(PAT,CLINIC,DATE) ;PEP; returns ien for appt in ^SC
+"RTN","BSDXAPI",270,0)
+ NEW X,IEN
+"RTN","BSDXAPI",271,0)
+ S X=0 F  S X=$O(^SC(CLINIC,"S",DATE,1,X)) Q:'X  Q:$G(IEN)  D
+"RTN","BSDXAPI",272,0)
+ . Q:$P($G(^SC(CLINIC,"S",DATE,1,X,0)),U,9)["C"  ;cancelled
+"RTN","BSDXAPI",273,0)
+  . I +$G(^SC(CLINIC,"S",DATE,1,X,0))=PAT S IEN=X
+"RTN","BSDXAPI",274,0)
+ Q $G(IEN)
+"RTN","BSDXAPI",275,0)
+ ;
+"RTN","BSDXAPI",276,0)
+APPTYP(PAT,DATE) ;PEP; -- returns type of appt (scheduled or walk-in)
+"RTN","BSDXAPI",277,0)
+ NEW X S X=$P($G(^DPT(PAT,"S",DATE,0)),U,7)
+"RTN","BSDXAPI",278,0)
+ Q $S(X=3:"SCHED",X=4:"WALK-IN",1:"??")
+"RTN","BSDXAPI",279,0)
+ ;
+"RTN","BSDXAPI",280,0)
+CO(PAT,CLINIC,DATE,SDIEN) ;PEP; -- returns 1 if appt already checked-out
+"RTN","BSDXAPI",281,0)
+ NEW X
+"RTN","BSDXAPI",282,0)
+ S X=$G(SDIEN)   ;ien sent in call
+"RTN","BSDXAPI",283,0)
+ I 'X S X=$$SCIEN(PAT,CLINIC,DATE) I 'X Q 0
+"RTN","BSDXAPI",284,0)
+ S X=$P($G(^SC(CLINIC,"S",DATE,1,X,"C")),U,3)
+"RTN","BSDXAPI",285,0)
+ Q $S(X:1,1:0)
+"RTN","BSDXAPI",286,0)
+ ;
+"RTN","BSDXAPI",287,0)
+UPDATENOTE(PAT,CLINIC,DATE,NOTE) ; PEP; Update Note in ^SC for patient's appointment @ DATE
+"RTN","BSDXAPI",288,0)
+    ; PAT = DFN
+"RTN","BSDXAPI",289,0)
+    ; CLINIC = SC IEN
+"RTN","BSDXAPI",290,0)
+    ; DATE = FM Date/Time of Appointment
+"RTN","BSDXAPI",291,0)
+    ;
+"RTN","BSDXAPI",292,0)
+    ; Returns:
+"RTN","BSDXAPI",293,0)
+    ; 0 if okay
+"RTN","BSDXAPI",294,0)
+    ; -1 if failure
+"RTN","BSDXAPI",295,0)
+    N SCIEN S SCIEN=$$SCIEN(PAT,CLINIC,DATE) ; ien of appt in ^SC
+"RTN","BSDXAPI",296,0)
+    I SCIEN<1 QUIT 0    ; Appt cancelled; cancelled appts rm'ed from file 44
+"RTN","BSDXAPI",297,0)
+    N BSDXIENS S BSDXIENS=SCIEN_","_DATE_","_CLINIC_","
+"RTN","BSDXAPI",298,0)
+    S BSDXFDA(44.003,BSDXIENS,3)=$E(NOTE,1,150)
+"RTN","BSDXAPI",299,0)
+    N BSDXERR
+"RTN","BSDXAPI",300,0)
+    D FILE^DIE("","BSDXFDA","BSDXERR")
+"RTN","BSDXAPI",301,0)
+    I $D(BSDXERR) QUIT "-1~Can't file for Pat "_PAT_" in Clinic "_CLINIC_" at "_DATE_". Fileman reported an error: "_BSDXERR("DIERR",1,"TEXT",1)
+"RTN","BSDXAPI",302,0)
+    QUIT 0
+"RTN","BSDXGPRV")
+0^36^B4804670
+"RTN","BSDXGPRV",1,0)
+BSDXGPRV ; WV/SMH - WINDOWS SCHEDULING RPCS ; 11/2/10 4:27pm
+"RTN","BSDXGPRV",2,0)
+ ;;1.42;BSDX;;Dec 07, 2010;Build 9
+"RTN","BSDXGPRV",3,0)
+ ;
+"RTN","BSDXGPRV",4,0)
+ ;
+"RTN","BSDXGPRV",5,0)
+ERROR ;
+"RTN","BSDXGPRV",6,0)
+ D ERR("RPMS Error")
+"RTN","BSDXGPRV",7,0)
+ Q
+"RTN","BSDXGPRV",8,0)
+ ;
+"RTN","BSDXGPRV",9,0)
+ERR(BSDXERR) ;Error processing
+"RTN","BSDXGPRV",10,0)
+ D ^%ZTER
+"RTN","BSDXGPRV",11,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",12,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR
+"RTN","BSDXGPRV",13,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",14,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDXGPRV",15,0)
+ Q
+"RTN","BSDXGPRV",16,0)
+ ;
+"RTN","BSDXGPRV",17,0)
+PD(BSDXY,HLIEN) ;EP Debugging entry point
+"RTN","BSDXGPRV",18,0)
+ ;
+"RTN","BSDXGPRV",19,0)
+ D DEBUG^%Serenji("P^BSDXGPRV(.BSDXY,HLIEN)","192.168.254.130")
+"RTN","BSDXGPRV",20,0)
+ ;
+"RTN","BSDXGPRV",21,0)
+ Q
+"RTN","BSDXGPRV",22,0)
+ ;
+"RTN","BSDXGPRV",23,0)
+P(BSDXY,HLIEN) ; Public Entry point; Get Providers for Hosp Location
+"RTN","BSDXGPRV",24,0)
+ ; Input: HLIEN - Hospital Location IEN
+"RTN","BSDXGPRV",25,0)
+ ; Output: ADO Datatable with columns:
+"RTN","BSDXGPRV",26,0)
+ ; - HOSPITAL_LOCATION_ID, BMXIEN, PROV_NAME, DEFAULT
+"RTN","BSDXGPRV",27,0)
+ ; If there are providers in the PROVIDER multiple of file 44 
+"RTN","BSDXGPRV",28,0)
+ ; (Hospital Location) return them;
+"RTN","BSDXGPRV",29,0)
+ ; If no providers in PROVIDER multiple of file 44, return nothing
+"RTN","BSDXGPRV",30,0)
+ ; Called by BSDX HOSP LOC PROVIDERS
+"RTN","BSDXGPRV",31,0)
+ ;
+"RTN","BSDXGPRV",32,0)
+ S BSDXI=0
+"RTN","BSDXGPRV",33,0)
+ I '$D(^SC(HLIEN,0)) D ERR("HOSPITAL LOCATION NOT FOUND") QUIT
+"RTN","BSDXGPRV",34,0)
+ D ^XBKVAR 
+"RTN","BSDXGPRV",35,0)
+ N $ET S $ET="G ERROR^BSDXGPRV"
+"RTN","BSDXGPRV",36,0)
+ K ^BSDXTMP($J)
+"RTN","BSDXGPRV",37,0)
+ S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDXGPRV",38,0)
+ S $P(^BSDXTMP($J,BSDXI),U,1)="I00020HOSPITAL_LOCATION_ID"
+"RTN","BSDXGPRV",39,0)
+ S $P(^BSDXTMP($J,BSDXI),U,2)="I00020BMXIEN"
+"RTN","BSDXGPRV",40,0)
+ S $P(^BSDXTMP($J,BSDXI),U,3)="T00030NAME"
+"RTN","BSDXGPRV",41,0)
+ S $P(^BSDXTMP($J,BSDXI),U,4)="T00005DEFAULT"
+"RTN","BSDXGPRV",42,0)
+ S ^BSDXTMP($J,BSDXI)=^BSDXTMP($J,BSDXI)_$C(30)
+"RTN","BSDXGPRV",43,0)
+ ;
+"RTN","BSDXGPRV",44,0)
+ N OUTPUT
+"RTN","BSDXGPRV",45,0)
+ D GETS^DIQ(44,HLIEN_",","2600*","IE","OUTPUT") ; Provider Multiple
+"RTN","BSDXGPRV",46,0)
+ ; No results
+"RTN","BSDXGPRV",47,0)
+ I '$D(OUTPUT) S ^BSDXTMP($J,BSDXI+1)=$C(31) QUIT
+"RTN","BSDXGPRV",48,0)
+ ; if results, get them
+"RTN","BSDXGPRV",49,0)
+ N I S I=""
+"RTN","BSDXGPRV",50,0)
+ F  S I=$O(OUTPUT(44.1,I)) Q:I=""  D
+"RTN","BSDXGPRV",51,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",52,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,1)=HLIEN                  ; HL IEN
+"RTN","BSDXGPRV",53,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,2)=$P(OUTPUT(44.1,I,.01,"I"),",") ; PROV IEN
+"RTN","BSDXGPRV",54,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,3)=$E(OUTPUT(44.1,I,.01,"E"),1,30) ; PROV NAME
+"RTN","BSDXGPRV",55,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,4)=OUTPUT(44.1,I,.02,"E") ; Default - YES, NO
+"RTN","BSDXGPRV",56,0)
+ . S ^BSDXTMP($J,BSDXI)=^BSDXTMP($J,BSDXI)_$C(30)
+"RTN","BSDXGPRV",57,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",58,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDXGPRV",59,0)
+ QUIT
+"SEC","^DIC",9002018.1,9002018.1,0,"AUDIT")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"DD")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"DEL")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"LAYGO")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"RD")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"WR")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"AUDIT")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"DD")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"DEL")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"LAYGO")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"RD")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"WR")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"AUDIT")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"DD")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"DEL")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"LAYGO")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"RD")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"WR")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"AUDIT")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"DD")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"DEL")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"LAYGO")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"RD")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"WR")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"AUDIT")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"DD")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"DEL")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"LAYGO")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"RD")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"WR")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"AUDIT")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"DD")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"DEL")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"LAYGO")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"RD")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"WR")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"AUDIT")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"DD")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"DEL")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"LAYGO")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"RD")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"WR")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"AUDIT")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"DD")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"DEL")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"LAYGO")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"RD")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"WR")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"AUDIT")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"DD")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"DEL")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"LAYGO")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"RD")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"WR")
+@
+"VER")
+8.0^22.0
+"^DD",9002018.1,9002018.1,0)
+FIELD^^2001^8
+"^DD",9002018.1,9002018.1,0,"DT")
+3040820
+"^DD",9002018.1,9002018.1,0,"IX","ALOC",9002018.1,.04)
+
+"^DD",9002018.1,9002018.1,0,"IX","ASSOC",9002018.12001,.01)
+
+"^DD",9002018.1,9002018.1,0,"IX","B",9002018.1,.01)
+
+"^DD",9002018.1,9002018.1,0,"NM","BSDX RESOURCE")
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.15,.01)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.21,.01)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.25,.02)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.3,.01)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.4,.07)
+
+"^DD",9002018.1,9002018.1,0,"VRPK")
+BSDX
+"^DD",9002018.1,9002018.1,.01,0)
+NAME^RF^^0;1^K:$L(X)>30!($L(X)<1)!'(X'?1P.E) X
+"^DD",9002018.1,9002018.1,.01,1,0)
+^.1
+"^DD",9002018.1,9002018.1,.01,1,1,0)
+9002018.1^B
+"^DD",9002018.1,9002018.1,.01,1,1,1)
+S ^BSDXRES("B",$E(X,1,30),DA)=""
+"^DD",9002018.1,9002018.1,.01,1,1,2)
+K ^BSDXRES("B",$E(X,1,30),DA)
+"^DD",9002018.1,9002018.1,.01,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.1,9002018.1,.01,"DT")
+3040719
+"^DD",9002018.1,9002018.1,.02,0)
+INACTIVE^S^1:YES;0:NO;^0;2^Q
+"^DD",9002018.1,9002018.1,.02,3)
+
+"^DD",9002018.1,9002018.1,.02,"DT")
+3030520
+"^DD",9002018.1,9002018.1,.03,0)
+TIME SCALE^S^5:5;10:10;15:15;20:20;30:30;60:60;^0;3^Q
+"^DD",9002018.1,9002018.1,.03,"DT")
+3040212
+"^DD",9002018.1,9002018.1,.04,0)
+HOSPITAL LOCATION^P44'^SC(^0;4^Q
+"^DD",9002018.1,9002018.1,.04,1,0)
+^.1
+"^DD",9002018.1,9002018.1,.04,1,1,0)
+9002018.1^ALOC
+"^DD",9002018.1,9002018.1,.04,1,1,1)
+S ^BSDXRES("ALOC",$E(X,1,30),DA)=""
+"^DD",9002018.1,9002018.1,.04,1,1,2)
+K ^BSDXRES("ALOC",$E(X,1,30),DA)
+"^DD",9002018.1,9002018.1,.04,1,1,"%D",0)
+^^1^1^3040915^
+"^DD",9002018.1,9002018.1,.04,1,1,"%D",1,0)
+Cross reference on hospital location.
+"^DD",9002018.1,9002018.1,.04,1,1,"DT")
+3040915
+"^DD",9002018.1,9002018.1,.04,"DT")
+3040915
+"^DD",9002018.1,9002018.1,1,0)
+LETTER TEXT^9002018.11^^1;0
+"^DD",9002018.1,9002018.1,1201,0)
+NO SHOW LETTER^9002018.11201^^12;0
+"^DD",9002018.1,9002018.1,1301,0)
+CLINIC CANCELLATION LETTER^9002018.11301^^13;0
+"^DD",9002018.1,9002018.1,2001,0)
+ASSOCIATED RPMS CLINICS^9002018.12001P^^20;0
+"^DD",9002018.1,9002018.11,0)
+LETTER TEXT SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.11,0,"DT")
+3040212
+"^DD",9002018.1,9002018.11,0,"NM","LETTER TEXT")
+
+"^DD",9002018.1,9002018.11,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.11,.01,0)
+LETTER TEXT^W^^0;1^Q
+"^DD",9002018.1,9002018.11,.01,3)
+Enter the text of reminder letters sent to patients with appointments with this resource.
+"^DD",9002018.1,9002018.11,.01,"DT")
+3040212
+"^DD",9002018.1,9002018.11201,0)
+NO SHOW LETTER SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.11201,0,"DT")
+3040613
+"^DD",9002018.1,9002018.11201,0,"NM","NO SHOW LETTER")
+
+"^DD",9002018.1,9002018.11201,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.11201,.01,0)
+NO SHOW LETTER^W^^0;1^Q
+"^DD",9002018.1,9002018.11201,.01,"DT")
+3040613
+"^DD",9002018.1,9002018.11301,0)
+CLINIC CANCELLATION LETTER SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.11301,0,"DT")
+3040613
+"^DD",9002018.1,9002018.11301,0,"NM","CLINIC CANCELLATION LETTER")
+
+"^DD",9002018.1,9002018.11301,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.11301,.01,0)
+CLINIC CANCELLATION LETTER^W^^0;1^Q
+"^DD",9002018.1,9002018.11301,.01,"DT")
+3040613
+"^DD",9002018.1,9002018.12001,0)
+ASSOCIATED RPMS CLINICS SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.12001,0,"DT")
+3040820
+"^DD",9002018.1,9002018.12001,0,"IX","B",9002018.12001,.01)
+
+"^DD",9002018.1,9002018.12001,0,"NM","ASSOCIATED RPMS CLINICS")
+
+"^DD",9002018.1,9002018.12001,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.12001,.01,0)
+ASSOCIATED RPMS CLINICS^MP44'^SC(^0;1^Q
+"^DD",9002018.1,9002018.12001,.01,1,0)
+^.1
+"^DD",9002018.1,9002018.12001,.01,1,1,0)
+9002018.12001^B
+"^DD",9002018.1,9002018.12001,.01,1,1,1)
+S ^BSDXRES(DA(1),20,"B",$E(X,1,30),DA)=""
+"^DD",9002018.1,9002018.12001,.01,1,1,2)
+K ^BSDXRES(DA(1),20,"B",$E(X,1,30),DA)
+"^DD",9002018.1,9002018.12001,.01,1,2,0)
+9002018.1^ASSOC
+"^DD",9002018.1,9002018.12001,.01,1,2,1)
+S ^BSDXRES("ASSOC",$E(X,1,30),DA(1),DA)=""
+"^DD",9002018.1,9002018.12001,.01,1,2,2)
+K ^BSDXRES("ASSOC",$E(X,1,30),DA(1),DA)
+"^DD",9002018.1,9002018.12001,.01,1,2,"%D",0)
+^^1^1^3040915^
+"^DD",9002018.1,9002018.12001,.01,1,2,"%D",1,0)
+Cross reference on ASSOCIATED RPMS CLINICS
+"^DD",9002018.1,9002018.12001,.01,1,2,"DT")
+3040915
+"^DD",9002018.1,9002018.12001,.01,3)
+ENTER ASSOCIATED RPMS CLINIC
+"^DD",9002018.1,9002018.12001,.01,"DT")
+3040915
+"^DD",9002018.15,9002018.15,0)
+FIELD^^.05^5
+"^DD",9002018.15,9002018.15,0,"DT")
+3030703
+"^DD",9002018.15,9002018.15,0,"IX","AC",9002018.15,.02)
+
+"^DD",9002018.15,9002018.15,0,"IX","B",9002018.15,.01)
+
+"^DD",9002018.15,9002018.15,0,"NM","BSDX RESOURCE USER")
+
+"^DD",9002018.15,9002018.15,0,"VRPK")
+BSDX
+"^DD",9002018.15,9002018.15,.01,0)
+RESOURCENAME^RP9002018.1'^BSDXRES(^0;1^Q
+"^DD",9002018.15,9002018.15,.01,1,0)
+^.1
+"^DD",9002018.15,9002018.15,.01,1,1,0)
+9002018.15^B
+"^DD",9002018.15,9002018.15,.01,1,1,1)
+S ^BSDXRSU("B",$E(X,1,30),DA)=""
+"^DD",9002018.15,9002018.15,.01,1,1,2)
+K ^BSDXRSU("B",$E(X,1,30),DA)
+"^DD",9002018.15,9002018.15,.01,3)
+
+"^DD",9002018.15,9002018.15,.01,"DT")
+3030508
+"^DD",9002018.15,9002018.15,.02,0)
+USERNAME^P200'^VA(200,^0;2^Q
+"^DD",9002018.15,9002018.15,.02,1,0)
+^.1
+"^DD",9002018.15,9002018.15,.02,1,1,0)
+9002018.15^AC
+"^DD",9002018.15,9002018.15,.02,1,1,1)
+S ^BSDXRSU("AC",$E(X,1,30),DA)=""
+"^DD",9002018.15,9002018.15,.02,1,1,2)
+K ^BSDXRSU("AC",$E(X,1,30),DA)
+"^DD",9002018.15,9002018.15,.02,1,1,"DT")
+3030508
+"^DD",9002018.15,9002018.15,.02,"DT")
+3030508
+"^DD",9002018.15,9002018.15,.03,0)
+OVERBOOK^S^1:YES;0:NO;^0;3^Q
+"^DD",9002018.15,9002018.15,.03,3)
+
+"^DD",9002018.15,9002018.15,.03,"DT")
+3030703
+"^DD",9002018.15,9002018.15,.04,0)
+MODIFY SCHEDULE^S^1:YES;0:NO;^0;4^Q
+"^DD",9002018.15,9002018.15,.04,"DT")
+3030701
+"^DD",9002018.15,9002018.15,.05,0)
+MODIFY APPOINTMENTS^S^1:YES;0:NO;^0;5^Q
+"^DD",9002018.15,9002018.15,.05,3)
+
+"^DD",9002018.15,9002018.15,.05,"DT")
+3040722
+"^DD",9002018.2,9002018.2,0)
+FIELD^^1^3
+"^DD",9002018.2,9002018.2,0,"DDA")
+N
+"^DD",9002018.2,9002018.2,0,"DT")
+3030508
+"^DD",9002018.2,9002018.2,0,"IX","AB",9002018.21,.01)
+
+"^DD",9002018.2,9002018.2,0,"IX","B",9002018.2,.01)
+
+"^DD",9002018.2,9002018.2,0,"NM","BSDX RESOURCE GROUP")
+
+"^DD",9002018.2,9002018.2,0,"PT",9002018.25,.01)
+
+"^DD",9002018.2,9002018.2,0,"PT",9002018.35,.03)
+
+"^DD",9002018.2,9002018.2,0,"VRPK")
+BSDX
+"^DD",9002018.2,9002018.2,.01,0)
+NAME^RF^^0;1^K:$L(X)>30!(X?.N)!($L(X)<3)!'(X'?1P.E) X
+"^DD",9002018.2,9002018.2,.01,1,0)
+^.1
+"^DD",9002018.2,9002018.2,.01,1,1,0)
+9002018.2^B
+"^DD",9002018.2,9002018.2,.01,1,1,1)
+S ^BSDXDEPT("B",$E(X,1,30),DA)=""
+"^DD",9002018.2,9002018.2,.01,1,1,2)
+K ^BSDXDEPT("B",$E(X,1,30),DA)
+"^DD",9002018.2,9002018.2,.01,3)
+NAME MUST BE 3-30 CHARACTERS, NOT NUMERIC OR STARTING WITH PUNCTUATION
+"^DD",9002018.2,9002018.2,.02,0)
+INACTIVATION DATE^D^^0;2^S %DT="E" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.2,9002018.2,.02,"DT")
+3030508
+"^DD",9002018.2,9002018.2,1,0)
+RESOURCE^9002018.21P^^1;0
+"^DD",9002018.2,9002018.21,0)
+RESOURCE SUB-FIELD^^.01^1
+"^DD",9002018.2,9002018.21,0,"DT")
+3030508
+"^DD",9002018.2,9002018.21,0,"IX","B",9002018.21,.01)
+
+"^DD",9002018.2,9002018.21,0,"NM","RESOURCE")
+
+"^DD",9002018.2,9002018.21,0,"UP")
+9002018.2
+"^DD",9002018.2,9002018.21,.01,0)
+RESOURCE^MP9002018.1'^BSDXRES(^0;1^Q
+"^DD",9002018.2,9002018.21,.01,1,0)
+^.1
+"^DD",9002018.2,9002018.21,.01,1,1,0)
+9002018.21^B
+"^DD",9002018.2,9002018.21,.01,1,1,1)
+S ^BSDXDEPT(DA(1),1,"B",$E(X,1,30),DA)=""
+"^DD",9002018.2,9002018.21,.01,1,1,2)
+K ^BSDXDEPT(DA(1),1,"B",$E(X,1,30),DA)
+"^DD",9002018.2,9002018.21,.01,1,2,0)
+9002018.2^AB
+"^DD",9002018.2,9002018.21,.01,1,2,1)
+S ^BSDXDEPT("AB",$E(X,1,30),DA(1),DA)=""
+"^DD",9002018.2,9002018.21,.01,1,2,2)
+K ^BSDXDEPT("AB",$E(X,1,30),DA(1),DA)
+"^DD",9002018.2,9002018.21,.01,1,2,"DT")
+3030508
+"^DD",9002018.2,9002018.21,.01,"DT")
+3030508
+"^DD",9002018.3,9002018.3,0)
+FIELD^^1^6
+"^DD",9002018.3,9002018.3,0,"DT")
+3030508
+"^DD",9002018.3,9002018.3,0,"IX","ARSCT",9002018.3,.02)
+
+"^DD",9002018.3,9002018.3,0,"IX","B",9002018.3,.01)
+
+"^DD",9002018.3,9002018.3,0,"NM","BSDX ACCESS BLOCK")
+
+"^DD",9002018.3,9002018.3,0,"VRPK")
+BSDX
+"^DD",9002018.3,9002018.3,.01,0)
+RESOURCE^RP9002018.1'^BSDXRES(^0;1^Q
+"^DD",9002018.3,9002018.3,.01,1,0)
+^.1
+"^DD",9002018.3,9002018.3,.01,1,1,0)
+9002018.3^B
+"^DD",9002018.3,9002018.3,.01,1,1,1)
+S ^BSDXAB("B",$E(X,1,30),DA)=""
+"^DD",9002018.3,9002018.3,.01,1,1,2)
+K ^BSDXAB("B",$E(X,1,30),DA)
+"^DD",9002018.3,9002018.3,.01,3)
+
+"^DD",9002018.3,9002018.3,.01,"DT")
+3030508
+"^DD",9002018.3,9002018.3,.02,0)
+STARTTIME^D^^0;2^S %DT="ET" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.3,9002018.3,.02,1,0)
+^.1
+"^DD",9002018.3,9002018.3,.02,1,1,0)
+9002018.3^ARSCT^MUMPS
+"^DD",9002018.3,9002018.3,.02,1,1,1)
+D XR4S^BSDX03(DA)
+"^DD",9002018.3,9002018.3,.02,1,1,2)
+D XR4K^BSDX03(DA)
+"^DD",9002018.3,9002018.3,.02,1,1,"%D",0)
+^^1^1^3030512^
+"^DD",9002018.3,9002018.3,.02,1,1,"%D",1,0)
+Supports lookup of all access blocks for a given resource during a given time period
+"^DD",9002018.3,9002018.3,.02,1,1,"DT")
+3030512
+"^DD",9002018.3,9002018.3,.02,"DT")
+3030512
+"^DD",9002018.3,9002018.3,.03,0)
+ENDTIME^D^^0;3^S %DT="ET" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.3,9002018.3,.03,3)
+
+"^DD",9002018.3,9002018.3,.03,"DT")
+3030508
+"^DD",9002018.3,9002018.3,.04,0)
+SLOTS^NJ2,0^^0;4^K:+X'=X!(X>99)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.3,9002018.3,.04,3)
+Type a Number between 0 and 99, 0 Decimal Digits
+"^DD",9002018.3,9002018.3,.04,"DT")
+3030508
+"^DD",9002018.3,9002018.3,.05,0)
+ACCESS TYPE^P9002018.35'^BSDXTYPE(^0;5^Q
+"^DD",9002018.3,9002018.3,.05,"DT")
+3030508
+"^DD",9002018.3,9002018.3,1,0)
+NOTE^9002018.31^^1;0
+"^DD",9002018.3,9002018.31,0)
+NOTE SUB-FIELD^^.01^1
+"^DD",9002018.3,9002018.31,0,"DT")
+3030508
+"^DD",9002018.3,9002018.31,0,"NM","NOTE")
+
+"^DD",9002018.3,9002018.31,0,"UP")
+9002018.3
+"^DD",9002018.3,9002018.31,.01,0)
+NOTE^W^^0;1^Q
+"^DD",9002018.3,9002018.31,.01,"DT")
+3030508
+"^DD",9002018.35,9002018.35,0)
+FIELD^^.07^7
+"^DD",9002018.35,9002018.35,0,"DT")
+3030521
+"^DD",9002018.35,9002018.35,0,"IX","B",9002018.35,.01)
+
+"^DD",9002018.35,9002018.35,0,"NM","BSDX ACCESS TYPE")
+
+"^DD",9002018.35,9002018.35,0,"PT",9002018.3,.05)
+
+"^DD",9002018.35,9002018.35,0,"PT",9002018.381,.01)
+
+"^DD",9002018.35,9002018.35,0,"PT",9002018.39,.02)
+
+"^DD",9002018.35,9002018.35,0,"PT",9002018.4,.06)
+
+"^DD",9002018.35,9002018.35,0,"VRPK")
+BSDX
+"^DD",9002018.35,9002018.35,.01,0)
+ACCESS TYPE NAME^RF^^0;1^K:$L(X)>30!($L(X)<3)!'(X'?1P.E) X
+"^DD",9002018.35,9002018.35,.01,1,0)
+^.1
+"^DD",9002018.35,9002018.35,.01,1,1,0)
+9002018.35^B
+"^DD",9002018.35,9002018.35,.01,1,1,1)
+S ^BSDXTYPE("B",$E(X,1,30),DA)=""
+"^DD",9002018.35,9002018.35,.01,1,1,2)
+K ^BSDXTYPE("B",$E(X,1,30),DA)
+"^DD",9002018.35,9002018.35,.01,3)
+Answer must be 3-30 characters in length.
+"^DD",9002018.35,9002018.35,.01,"DT")
+3030508
+"^DD",9002018.35,9002018.35,.02,0)
+INACTIVE^S^1:YES;0:NO;^0;2^Q
+"^DD",9002018.35,9002018.35,.02,3)
+
+"^DD",9002018.35,9002018.35,.02,"DT")
+3030520
+"^DD",9002018.35,9002018.35,.03,0)
+DEPARTMENT NAME^P9002018.2'^BSDXDEPT(^0;3^Q
+"^DD",9002018.35,9002018.35,.03,"DT")
+3030508
+"^DD",9002018.35,9002018.35,.04,0)
+DISPLAY COLOR^F^^0;4^K:$L(X)>30!($L(X)<1) X
+"^DD",9002018.35,9002018.35,.04,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.35,9002018.35,.04,"DT")
+3030508
+"^DD",9002018.35,9002018.35,.05,0)
+RED^NJ3,0^^0;5^K:+X'=X!(X>255)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.35,9002018.35,.05,3)
+Type a Number between 0 and 255, 0 Decimal Digits
+"^DD",9002018.35,9002018.35,.05,"DT")
+3030521
+"^DD",9002018.35,9002018.35,.06,0)
+GREEN^NJ3,0^^0;6^K:+X'=X!(X>255)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.35,9002018.35,.06,3)
+Type a Number between 0 and 255, 0 Decimal Digits
+"^DD",9002018.35,9002018.35,.06,"DT")
+3030521
+"^DD",9002018.35,9002018.35,.07,0)
+BLUE^NJ3,0^^0;7^K:+X'=X!(X>255)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.35,9002018.35,.07,3)
+Type a Number between 0 and 255, 0 Decimal Digits
+"^DD",9002018.35,9002018.35,.07,"DT")
+3030521
+"^DD",9002018.38,9002018.38,0)
+FIELD^^.01^1
+"^DD",9002018.38,9002018.38,0,"DT")
+3030527
+"^DD",9002018.38,9002018.38,0,"IX","B",9002018.38,.01)
+
+"^DD",9002018.38,9002018.38,0,"NM","BSDX ACCESS GROUP")
+
+"^DD",9002018.38,9002018.38,0,"PT",9002018.39,.01)
+
+"^DD",9002018.38,9002018.38,0,"VRPK")
+BSDX
+"^DD",9002018.38,9002018.38,.01,0)
+ACCESS GROUP^RF^^0;1^K:$L(X)>30!($L(X)<3)!'(X'?1P.E) X
+"^DD",9002018.38,9002018.38,.01,1,0)
+^.1
+"^DD",9002018.38,9002018.38,.01,1,1,0)
+9002018.38^B
+"^DD",9002018.38,9002018.38,.01,1,1,1)
+S ^BSDXAGP("B",$E(X,1,30),DA)=""
+"^DD",9002018.38,9002018.38,.01,1,1,2)
+K ^BSDXAGP("B",$E(X,1,30),DA)
+"^DD",9002018.38,9002018.38,.01,3)
+Answer must be 3-30 characters in length.
+"^DD",9002018.38,9002018.38,.01,"DT")
+3030527
+"^DD",9002018.39,9002018.39,0)
+FIELD^^.02^2
+"^DD",9002018.39,9002018.39,0,"DDA")
+N
+"^DD",9002018.39,9002018.39,0,"DT")
+3030527
+"^DD",9002018.39,9002018.39,0,"IX","B",9002018.39,.01)
+
+"^DD",9002018.39,9002018.39,0,"NM","BSDX ACCESS GROUP TYPE")
+
+"^DD",9002018.39,9002018.39,0,"VRPK")
+BSDX
+"^DD",9002018.39,9002018.39,.01,0)
+ACCESS GROUP^RP9002018.38'^BSDXAGP(^0;1^Q
+"^DD",9002018.39,9002018.39,.01,1,0)
+^.1
+"^DD",9002018.39,9002018.39,.01,1,1,0)
+9002018.39^B
+"^DD",9002018.39,9002018.39,.01,1,1,1)
+S ^BSDXAGTP("B",$E(X,1,30),DA)=""
+"^DD",9002018.39,9002018.39,.01,1,1,2)
+K ^BSDXAGTP("B",$E(X,1,30),DA)
+"^DD",9002018.39,9002018.39,.01,3)
+
+"^DD",9002018.39,9002018.39,.01,"DT")
+3030720
+"^DD",9002018.39,9002018.39,.02,0)
+ACCESS TYPE^P9002018.35'^BSDXTYPE(^0;2^Q
+"^DD",9002018.39,9002018.39,.02,"DT")
+3030720
+"^DD",9002018.4,9002018.4,0)
+FIELD^^1^14
+"^DD",9002018.4,9002018.4,0,"DT")
+3040615
+"^DD",9002018.4,9002018.4,0,"IX","ARSRC",9002018.4,.07)
+
+"^DD",9002018.4,9002018.4,0,"IX","B",9002018.4,.01)
+
+"^DD",9002018.4,9002018.4,0,"IX","CPAT",9002018.4,.05)
+
+"^DD",9002018.4,9002018.4,0,"NM","BSDX APPOINTMENT")
+
+"^DD",9002018.4,9002018.4,0,"VRPK")
+BSDX
+"^DD",9002018.4,9002018.4,.01,0)
+STARTTIME^RD^^0;1^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.01,1,0)
+^.1
+"^DD",9002018.4,9002018.4,.01,1,1,0)
+9002018.4^B
+"^DD",9002018.4,9002018.4,.01,1,1,1)
+S ^BSDXAPPT("B",$E(X,1,30),DA)=""
+"^DD",9002018.4,9002018.4,.01,1,1,2)
+K ^BSDXAPPT("B",$E(X,1,30),DA)
+"^DD",9002018.4,9002018.4,.01,3)
+
+"^DD",9002018.4,9002018.4,.01,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.02,0)
+ENDTIME^RD^^0;2^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.02,3)
+
+"^DD",9002018.4,9002018.4,.02,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.03,0)
+CHECKIN^RD^^0;3^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.03,3)
+
+"^DD",9002018.4,9002018.4,.03,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.04,0)
+AUXTIME^RD^^0;4^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.04,3)
+
+"^DD",9002018.4,9002018.4,.04,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.05,0)
+PATIENT^P9000001'^AUPNPAT(^0;5^Q
+"^DD",9002018.4,9002018.4,.05,1,0)
+^.1
+"^DD",9002018.4,9002018.4,.05,1,1,0)
+9002018.4^CPAT
+"^DD",9002018.4,9002018.4,.05,1,1,1)
+S ^BSDXAPPT("CPAT",$E(X,1,30),DA)=""
+"^DD",9002018.4,9002018.4,.05,1,1,2)
+K ^BSDXAPPT("CPAT",$E(X,1,30),DA)
+"^DD",9002018.4,9002018.4,.05,1,1,"%D",0)
+^^1^1^3040109^
+"^DD",9002018.4,9002018.4,.05,1,1,"%D",1,0)
+Cross reference of PATIENT field for lookup and sorting
+"^DD",9002018.4,9002018.4,.05,1,1,"DT")
+3040109
+"^DD",9002018.4,9002018.4,.05,"DT")
+3040109
+"^DD",9002018.4,9002018.4,.06,0)
+ACCESS TYPE ID^NJ6,0^^0;6^K:+X'=X!(X>999999)!(X<1)!(X?.E1"."1N.N) X
+"^DD",9002018.4,9002018.4,.06,3)
+Type a Number between 1 and 999999, 0 Decimal Digits
+"^DD",9002018.4,9002018.4,.06,"DT")
+3040614
+"^DD",9002018.4,9002018.4,.07,0)
+RESOURCE^P9002018.1'^BSDXRES(^0;7^Q
+"^DD",9002018.4,9002018.4,.07,1,0)
+^.1
+"^DD",9002018.4,9002018.4,.07,1,1,0)
+9002018.4^ARSRC^MUMPS
+"^DD",9002018.4,9002018.4,.07,1,1,1)
+D XR2S^BSDX03(DA)
+"^DD",9002018.4,9002018.4,.07,1,1,2)
+D XR2K^BSDX03(DA)
+"^DD",9002018.4,9002018.4,.07,1,1,"%D",0)
+^^1^1^3030512^
+"^DD",9002018.4,9002018.4,.07,1,1,"%D",1,0)
+This index is used to find all appointments for a given resource during a given time period
+"^DD",9002018.4,9002018.4,.07,1,1,"DT")
+3030512
+"^DD",9002018.4,9002018.4,.07,"DT")
+3030512
+"^DD",9002018.4,9002018.4,.08,0)
+DATA ENTRY CLERK^P200'^VA(200,^0;8^Q
+"^DD",9002018.4,9002018.4,.08,3)
+Enter the name of the clerk who made the appointment.
+"^DD",9002018.4,9002018.4,.08,21,0)
+^^1^1^3040214^
+"^DD",9002018.4,9002018.4,.08,21,1,0)
+Field contains the name of the clerk who made the appointment.
+"^DD",9002018.4,9002018.4,.08,"DT")
+3040214
+"^DD",9002018.4,9002018.4,.09,0)
+DATE APPT MADE^D^^0;9^S %DT="ETX" D ^%DT S X=Y K:X<1 X
+"^DD",9002018.4,9002018.4,.09,3)
+Enter the date the appointment was made.
+"^DD",9002018.4,9002018.4,.09,21,0)
+^^1^1^3040214^
+"^DD",9002018.4,9002018.4,.09,21,1,0)
+Field contains the date the appointment was made.
+"^DD",9002018.4,9002018.4,.09,"DT")
+3040214
+"^DD",9002018.4,9002018.4,.1,0)
+NOSHOW^S^1:YES;0:NO;^0;10^Q
+"^DD",9002018.4,9002018.4,.1,"DT")
+3040223
+"^DD",9002018.4,9002018.4,.11,0)
+REBOOK DATETIME^D^^0;11^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.11,"DT")
+3040613
+"^DD",9002018.4,9002018.4,.12,0)
+CANCEL DATETIME^D^^0;12^S %DT="ET" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.12,"DT")
+3040613
+"^DD",9002018.4,9002018.4,.13,0)
+WALKIN^S^y:YES;n:NO;^0;13^Q
+"^DD",9002018.4,9002018.4,.13,"DT")
+3040615
+"^DD",9002018.4,9002018.4,1,0)
+NOTE^9002018.41^^1;0
+"^DD",9002018.4,9002018.41,0)
+NOTE SUB-FIELD^^.01^1
+"^DD",9002018.4,9002018.41,0,"DT")
+3030508
+"^DD",9002018.4,9002018.41,0,"NM","NOTE")
+
+"^DD",9002018.4,9002018.41,0,"UP")
+9002018.4
+"^DD",9002018.4,9002018.41,.01,0)
+NOTE^W^^0;1^Q
+"^DD",9002018.4,9002018.41,.01,"DT")
+3030508
+"^DD",9002018.5,9002018.5,0)
+FIELD^^.03^3
+"^DD",9002018.5,9002018.5,0,"DT")
+3040226
+"^DD",9002018.5,9002018.5,0,"IX","B",9002018.5,.01)
+
+"^DD",9002018.5,9002018.5,0,"NM","BSDX APPLICATION")
+
+"^DD",9002018.5,9002018.5,0,"VRPK")
+BSDX
+"^DD",9002018.5,9002018.5,.01,0)
+MAJOR VERSION^RF^^0;1^K:$L(X)>30!($L(X)<1)!'(X'?1P.E) X
+"^DD",9002018.5,9002018.5,.01,1,0)
+^.1
+"^DD",9002018.5,9002018.5,.01,1,1,0)
+9002018.5^B
+"^DD",9002018.5,9002018.5,.01,1,1,1)
+S ^BSDXAPPL("B",$E(X,1,30),DA)=""
+"^DD",9002018.5,9002018.5,.01,1,1,2)
+K ^BSDXAPPL("B",$E(X,1,30),DA)
+"^DD",9002018.5,9002018.5,.01,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.5,9002018.5,.01,"DT")
+3040226
+"^DD",9002018.5,9002018.5,.02,0)
+MINOR VERSION^RF^^0;2^K:$L(X)>30!($L(X)<1)!'(X'?1P.E) X
+"^DD",9002018.5,9002018.5,.02,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.5,9002018.5,.02,"DT")
+3040226
+"^DD",9002018.5,9002018.5,.03,0)
+BUILD^D^^0;3^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.5,9002018.5,.03,"DT")
+3040226
+"^DIC",9002018.1,9002018.1,0)
+BSDX RESOURCE^9002018.1
+"^DIC",9002018.1,9002018.1,0,"GL")
+^BSDXRES(
+"^DIC",9002018.1,"B","BSDX RESOURCE",9002018.1)
+
+"^DIC",9002018.15,9002018.15,0)
+BSDX RESOURCE USER^9002018.15
+"^DIC",9002018.15,9002018.15,0,"GL")
+^BSDXRSU(
+"^DIC",9002018.15,"B","BSDX RESOURCE USER",9002018.15)
+
+"^DIC",9002018.2,9002018.2,0)
+BSDX RESOURCE GROUP^9002018.2
+"^DIC",9002018.2,9002018.2,0,"GL")
+^BSDXDEPT(
+"^DIC",9002018.2,"B","BSDX RESOURCE GROUP",9002018.2)
+
+"^DIC",9002018.3,9002018.3,0)
+BSDX ACCESS BLOCK^9002018.3
+"^DIC",9002018.3,9002018.3,0,"GL")
+^BSDXAB(
+"^DIC",9002018.3,"B","BSDX ACCESS BLOCK",9002018.3)
+
+"^DIC",9002018.35,9002018.35,0)
+BSDX ACCESS TYPE^9002018.35
+"^DIC",9002018.35,9002018.35,0,"GL")
+^BSDXTYPE(
+"^DIC",9002018.35,"B","BSDX ACCESS TYPE",9002018.35)
+
+"^DIC",9002018.38,9002018.38,0)
+BSDX ACCESS GROUP^9002018.38
+"^DIC",9002018.38,9002018.38,0,"GL")
+^BSDXAGP(
+"^DIC",9002018.38,"B","BSDX ACCESS GROUP",9002018.38)
+
+"^DIC",9002018.39,9002018.39,0)
+BSDX ACCESS GROUP TYPE^9002018.39
+"^DIC",9002018.39,9002018.39,0,"GL")
+^BSDXAGTP(
+"^DIC",9002018.39,"B","BSDX ACCESS GROUP TYPE",9002018.39)
+
+"^DIC",9002018.4,9002018.4,0)
+BSDX APPOINTMENT^9002018.4
+"^DIC",9002018.4,9002018.4,0,"GL")
+^BSDXAPPT(
+"^DIC",9002018.4,"B","BSDX APPOINTMENT",9002018.4)
+
+"^DIC",9002018.5,9002018.5,0)
+BSDX APPLICATION^9002018.5
+"^DIC",9002018.5,9002018.5,0,"GL")
+^BSDXAPPL(
+"^DIC",9002018.5,"B","BSDX APPLICATION",9002018.5)
+
+**END**
+**END**
Index: Scheduling/branches/Radiology-Support/kids/bsdx0150.v1.k
===================================================================
--- Scheduling/branches/Radiology-Support/kids/bsdx0150.v1.k	(revision 1134)
+++ Scheduling/branches/Radiology-Support/kids/bsdx0150.v1.k	(revision 1134)
@@ -0,0 +1,13368 @@
+KIDS Distribution saved on Jan 25, 2011@07:06:59
+BSDX 1.5 Alpha 1
+**KIDS**:BSDX 1.5V1^
+
+**INSTALL NAME**
+BSDX 1.5V1
+"BLD",7655,0)
+BSDX 1.5V1^IHS Windows Scheduling^^3110125^n
+"BLD",7655,1,0)
+^^1^1^3110125^^^^
+"BLD",7655,1,1,0)
+Clinical Scheduling M Server support routines, files, options and RPCs.
+"BLD",7655,4,0)
+^9.64PA^9002018.5^9
+"BLD",7655,4,9002018.1,0)
+9002018.1
+"BLD",7655,4,9002018.1,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.15,0)
+9002018.15
+"BLD",7655,4,9002018.15,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.2,0)
+9002018.2
+"BLD",7655,4,9002018.2,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.3,0)
+9002018.3
+"BLD",7655,4,9002018.3,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.35,0)
+9002018.35
+"BLD",7655,4,9002018.35,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.38,0)
+9002018.38
+"BLD",7655,4,9002018.38,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.39,0)
+9002018.39
+"BLD",7655,4,9002018.39,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.4,0)
+9002018.4
+"BLD",7655,4,9002018.4,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.5,0)
+9002018.5
+"BLD",7655,4,9002018.5,222)
+y^y^f^^n^^y^o^n
+"BLD",7655,4,"B",9002018.1,9002018.1)
+
+"BLD",7655,4,"B",9002018.15,9002018.15)
+
+"BLD",7655,4,"B",9002018.2,9002018.2)
+
+"BLD",7655,4,"B",9002018.3,9002018.3)
+
+"BLD",7655,4,"B",9002018.35,9002018.35)
+
+"BLD",7655,4,"B",9002018.38,9002018.38)
+
+"BLD",7655,4,"B",9002018.39,9002018.39)
+
+"BLD",7655,4,"B",9002018.4,9002018.4)
+
+"BLD",7655,4,"B",9002018.5,9002018.5)
+
+"BLD",7655,6.3)
+11
+"BLD",7655,"ABPKG")
+n
+"BLD",7655,"INIT")
+V0200^BSDX2E
+"BLD",7655,"KRN",0)
+^9.67PA^8989.52^19
+"BLD",7655,"KRN",.4,0)
+.4
+"BLD",7655,"KRN",.4,"NM",0)
+^9.68A^^
+"BLD",7655,"KRN",.401,0)
+.401
+"BLD",7655,"KRN",.402,0)
+.402
+"BLD",7655,"KRN",.403,0)
+.403
+"BLD",7655,"KRN",.5,0)
+.5
+"BLD",7655,"KRN",.84,0)
+.84
+"BLD",7655,"KRN",3.6,0)
+3.6
+"BLD",7655,"KRN",3.8,0)
+3.8
+"BLD",7655,"KRN",9.2,0)
+9.2
+"BLD",7655,"KRN",9.8,0)
+9.8
+"BLD",7655,"KRN",9.8,"NM",0)
+^9.68A^36^36
+"BLD",7655,"KRN",9.8,"NM",1,0)
+BSDX01^^0^B107139484
+"BLD",7655,"KRN",9.8,"NM",2,0)
+BSDX02^^0^B16323271
+"BLD",7655,"KRN",9.8,"NM",3,0)
+BSDX03^^0^B2855259
+"BLD",7655,"KRN",9.8,"NM",4,0)
+BSDX04^^0^B31079316
+"BLD",7655,"KRN",9.8,"NM",5,0)
+BSDX05^^0^B10878471
+"BLD",7655,"KRN",9.8,"NM",6,0)
+BSDX06^^0^B6812445
+"BLD",7655,"KRN",9.8,"NM",7,0)
+BSDX07^^0^B188802132
+"BLD",7655,"KRN",9.8,"NM",8,0)
+BSDX08^^0^B118482818
+"BLD",7655,"KRN",9.8,"NM",9,0)
+BSDX09^^0^B35707298
+"BLD",7655,"KRN",9.8,"NM",10,0)
+BSDX12^^0^B7203579
+"BLD",7655,"KRN",9.8,"NM",11,0)
+BSDX13^^0^B9772451
+"BLD",7655,"KRN",9.8,"NM",12,0)
+BSDX14^^0^B6450810
+"BLD",7655,"KRN",9.8,"NM",13,0)
+BSDX15^^0^B5327807
+"BLD",7655,"KRN",9.8,"NM",14,0)
+BSDX16^^0^B11948965
+"BLD",7655,"KRN",9.8,"NM",15,0)
+BSDX17^^0^B2072173
+"BLD",7655,"KRN",9.8,"NM",16,0)
+BSDX18^^0^B87953431
+"BLD",7655,"KRN",9.8,"NM",17,0)
+BSDX19^^0^B7890401
+"BLD",7655,"KRN",9.8,"NM",18,0)
+BSDX20^^0^B5911607
+"BLD",7655,"KRN",9.8,"NM",19,0)
+BSDX21^^0^B8672065
+"BLD",7655,"KRN",9.8,"NM",20,0)
+BSDX22^^0^B9479861
+"BLD",7655,"KRN",9.8,"NM",21,0)
+BSDX23^^0^B8488013
+"BLD",7655,"KRN",9.8,"NM",22,0)
+BSDX24^^0^B13455014
+"BLD",7655,"KRN",9.8,"NM",23,0)
+BSDX25^^0^B21230952
+"BLD",7655,"KRN",9.8,"NM",24,0)
+BSDX26^^0^B30714245
+"BLD",7655,"KRN",9.8,"NM",25,0)
+BSDX27^^0^B133007616
+"BLD",7655,"KRN",9.8,"NM",26,0)
+BSDX28^^0^B32389827
+"BLD",7655,"KRN",9.8,"NM",27,0)
+BSDX29^^0^B51424449
+"BLD",7655,"KRN",9.8,"NM",28,0)
+BSDX30^^0^B6616255
+"BLD",7655,"KRN",9.8,"NM",29,0)
+BSDX31^^0^B67823338
+"BLD",7655,"KRN",9.8,"NM",30,0)
+BSDX32^^0^B17196738
+"BLD",7655,"KRN",9.8,"NM",31,0)
+BSDX33^^0^B14923306
+"BLD",7655,"KRN",9.8,"NM",32,0)
+BSDX34^^0^B43182525
+"BLD",7655,"KRN",9.8,"NM",33,0)
+BSDX35^^0^B8147998
+"BLD",7655,"KRN",9.8,"NM",34,0)
+BSDX11^^0^B6358791
+"BLD",7655,"KRN",9.8,"NM",35,0)
+BSDXAPI^^0^B148584022
+"BLD",7655,"KRN",9.8,"NM",36,0)
+BSDXGPRV^^0^B4804670
+"BLD",7655,"KRN",9.8,"NM","B","BSDX01",1)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX02",2)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX03",3)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX04",4)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX05",5)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX06",6)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX07",7)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX08",8)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX09",9)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX11",34)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX12",10)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX13",11)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX14",12)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX15",13)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX16",14)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX17",15)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX18",16)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX19",17)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX20",18)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX21",19)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX22",20)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX23",21)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX24",22)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX25",23)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX26",24)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX27",25)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX28",26)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX29",27)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX30",28)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX31",29)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX32",30)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX33",31)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX34",32)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX35",33)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDXAPI",35)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDXGPRV",36)
+
+"BLD",7655,"KRN",19,0)
+19
+"BLD",7655,"KRN",19,"NM",0)
+^9.68A^1^1
+"BLD",7655,"KRN",19,"NM",1,0)
+BSDXRPC^^0
+"BLD",7655,"KRN",19,"NM","B","BSDXRPC",1)
+
+"BLD",7655,"KRN",19.1,0)
+19.1
+"BLD",7655,"KRN",19.1,"NM",0)
+^9.68A^2^2
+"BLD",7655,"KRN",19.1,"NM",1,0)
+BSDXZMENU^^0
+"BLD",7655,"KRN",19.1,"NM",2,0)
+BSDXZMGR^^0
+"BLD",7655,"KRN",19.1,"NM","B","BSDXZMENU",1)
+
+"BLD",7655,"KRN",19.1,"NM","B","BSDXZMGR",2)
+
+"BLD",7655,"KRN",101,0)
+101
+"BLD",7655,"KRN",101,"NM",0)
+^9.68A^4^4
+"BLD",7655,"KRN",101,"NM",1,0)
+BSDX ADD APPOINTMENT^^0
+"BLD",7655,"KRN",101,"NM",2,0)
+BSDX CANCEL APPOINTMENT^^0
+"BLD",7655,"KRN",101,"NM",3,0)
+BSDX CHECKIN APPOINTMENT^^0
+"BLD",7655,"KRN",101,"NM",4,0)
+BSDX NOSHOW APPOINTMENT^^0
+"BLD",7655,"KRN",101,"NM","B","BSDX ADD APPOINTMENT",1)
+
+"BLD",7655,"KRN",101,"NM","B","BSDX CANCEL APPOINTMENT",2)
+
+"BLD",7655,"KRN",101,"NM","B","BSDX CHECKIN APPOINTMENT",3)
+
+"BLD",7655,"KRN",101,"NM","B","BSDX NOSHOW APPOINTMENT",4)
+
+"BLD",7655,"KRN",409.61,0)
+409.61
+"BLD",7655,"KRN",771,0)
+771
+"BLD",7655,"KRN",870,0)
+870
+"BLD",7655,"KRN",8989.51,0)
+8989.51
+"BLD",7655,"KRN",8989.52,0)
+8989.52
+"BLD",7655,"KRN",8994,0)
+8994
+"BLD",7655,"KRN",8994,"NM",0)
+^9.68A^104^101
+"BLD",7655,"KRN",8994,"NM",1,0)
+BSDX ADD NEW APPOINTMENT^^0
+"BLD",7655,"KRN",8994,"NM",2,0)
+BSDX ADD NEW AVAILABILITY^^0
+"BLD",7655,"KRN",8994,"NM",3,0)
+BSDX APPT BLOCKS OVERLAP^^0
+"BLD",7655,"KRN",8994,"NM",4,0)
+BSDX CANCEL APPOINTMENT^^0
+"BLD",7655,"KRN",8994,"NM",5,0)
+BSDX CANCEL AVAILABILITY^^0
+"BLD",7655,"KRN",8994,"NM",6,0)
+BSDX CREATE APPT SCHEDULE^^0
+"BLD",7655,"KRN",8994,"NM",7,0)
+BSDX CREATE ASGND SLOT SCHED^^0
+"BLD",7655,"KRN",8994,"NM",10,0)
+BSDX GET BASIC REG INFO^^0
+"BLD",7655,"KRN",8994,"NM",12,0)
+BSDX TYPE BLOCKS OVERLAP^^0
+"BLD",7655,"KRN",8994,"NM",13,0)
+BSDX ADD/EDIT ACCESS TYPE^^0
+"BLD",7655,"KRN",8994,"NM",14,0)
+BSDX GET ACCESS GROUP TYPES^^0
+"BLD",7655,"KRN",8994,"NM",15,0)
+BSDX GROUP RESOURCE^^0
+"BLD",7655,"KRN",8994,"NM",16,0)
+BSDX RESOURCE GROUPS BY USER^^0
+"BLD",7655,"KRN",8994,"NM",17,0)
+BSDX ADD/EDIT RESOURCEUSER^^0
+"BLD",7655,"KRN",8994,"NM",18,0)
+BSDX DELETE RESOURCEUSER^^0
+"BLD",7655,"KRN",8994,"NM",19,0)
+BSDX SCHEDULE USER^^0
+"BLD",7655,"KRN",8994,"NM",20,0)
+BSDX ADD/EDIT RESOURCE^^0
+"BLD",7655,"KRN",8994,"NM",21,0)
+BSDX SCHEDULING USER INFO^^0
+"BLD",7655,"KRN",8994,"NM",22,0)
+BSDX RESOURCES^^0
+"BLD",7655,"KRN",8994,"NM",23,0)
+BSDX ADD/EDIT RESOURCE GROUP^^0
+"BLD",7655,"KRN",8994,"NM",24,0)
+BSDX DELETE RESOURCE GROUP^^0
+"BLD",7655,"KRN",8994,"NM",25,0)
+BSDX DELETE RES GROUP ITEM^^0
+"BLD",7655,"KRN",8994,"NM",26,0)
+BSDX DEPARTMENT RESOURCE^^0
+"BLD",7655,"KRN",8994,"NM",27,0)
+BSDX DEPARTMENTS BY USER^^0
+"BLD",7655,"KRN",8994,"NM",28,0)
+BSDX RESOURCES BY USER^^0
+"BLD",7655,"KRN",8994,"NM",29,0)
+BSDX ADD ACCESS GROUP ITEM^^0
+"BLD",7655,"KRN",8994,"NM",30,0)
+BSDX ADD RES GROUP ITEM^^0
+"BLD",7655,"KRN",8994,"NM",31,0)
+BSDX ADD/EDIT ACCESS GROUP^^0
+"BLD",7655,"KRN",8994,"NM",32,0)
+BSDX DELETE ACCESS GROUP^^0
+"BLD",7655,"KRN",8994,"NM",33,0)
+BSDX DELETE ACCESS GROUP ITEM^^0
+"BLD",7655,"KRN",8994,"NM",34,0)
+BSDX REGISTER EVENT^^0
+"BLD",7655,"KRN",8994,"NM",35,0)
+BSDX UNREGISTER EVENT^^0
+"BLD",7655,"KRN",8994,"NM",36,0)
+BSDX RAISE EVENT^^0
+"BLD",7655,"KRN",8994,"NM",37,0)
+BSDX SEARCH AVAILABILITY^^0
+"BLD",7655,"KRN",8994,"NM",38,0)
+BSDX CHECKIN APPOINTMENT^^0
+"BLD",7655,"KRN",8994,"NM",39,0)
+BSDX EDIT APPOINTMENT^^0
+"BLD",7655,"KRN",8994,"NM",40,0)
+BSDX PATIENT APPT DISPLAY^^0
+"BLD",7655,"KRN",8994,"NM",41,0)
+BSDXPatientLookupRS^^0
+"BLD",7655,"KRN",8994,"NM",42,0)
+BSDX SPACEBAR SET^^0
+"BLD",7655,"KRN",8994,"NM",43,0)
+BSDX COPY APPOINTMENT CANCEL^^0
+"BLD",7655,"KRN",8994,"NM",44,0)
+BSDX COPY APPOINTMENT STATUS^^0
+"BLD",7655,"KRN",8994,"NM",45,0)
+BSDX COPY APPOINTMENTS^^0
+"BLD",7655,"KRN",8994,"NM",46,0)
+BSDX CLINIC LETTERS^^0
+"BLD",7655,"KRN",8994,"NM",47,0)
+BSDX NOSHOW^^0
+"BLD",7655,"KRN",8994,"NM",48,0)
+BSDX IM HERE^^0
+"BLD",7655,"KRN",8994,"NM",49,0)
+BSDX HOSPITAL LOCATION^^0
+"BLD",7655,"KRN",8994,"NM",50,0)
+BSDX CLINIC SETUP^^0
+"BLD",7655,"KRN",8994,"NM",51,0)
+BSDX REBOOK LIST^^0
+"BLD",7655,"KRN",8994,"NM",52,0)
+BSDX REBOOK CLINIC LIST^^0
+"BLD",7655,"KRN",8994,"NM",53,0)
+BSDX REBOOK SET^^0
+"BLD",7655,"KRN",8994,"NM",54,0)
+BSDX RESOURCE LETTERS^^0
+"BLD",7655,"KRN",8994,"NM",55,0)
+BSDX CANCEL CLINIC LIST^^0
+"BLD",7655,"KRN",8994,"NM",56,0)
+BSDX CANCEL AV BY DATE^^0
+"BLD",7655,"KRN",8994,"NM",57,0)
+BSDX REBOOK NEXT BLOCK^^0
+"BLD",7655,"KRN",8994,"NM",58,0)
+BSDX EHR PATIENT^^0
+"BLD",7655,"KRN",8994,"NM",59,0)
+BSDX HOSP LOC PROVIDERS^^0
+"BLD",7655,"KRN",8994,"NM",60,0)
+BMX ADO SS^^0
+"BLD",7655,"KRN",8994,"NM",61,0)
+BMX ASYNC GET^^0
+"BLD",7655,"KRN",8994,"NM",62,0)
+BMX ASYNC QUEUE^^0
+"BLD",7655,"KRN",8994,"NM",63,0)
+BMX AV CODE^^0
+"BLD",7655,"KRN",8994,"NM",64,0)
+BMX DEMO^^0
+"BLD",7655,"KRN",8994,"NM",65,0)
+BMX DENTAL REPORT 1^^0
+"BLD",7655,"KRN",8994,"NM",66,0)
+BMX DENTAL REPORT 2^^0
+"BLD",7655,"KRN",8994,"NM",67,0)
+BMX EVENT POLL^^0
+"BLD",7655,"KRN",8994,"NM",68,0)
+BMX EVENT RAISE^^0
+"BLD",7655,"KRN",8994,"NM",69,0)
+BMX EVENT REGISTER^^0
+"BLD",7655,"KRN",8994,"NM",70,0)
+BMX EVENT UNREGISTER^^0
+"BLD",7655,"KRN",8994,"NM",71,0)
+BMX FIELD LIST^^0
+"BLD",7655,"KRN",8994,"NM",72,0)
+BMX FIND^^0
+"BLD",7655,"KRN",8994,"NM",73,0)
+BMX GET VARIABLE VALUE^^0
+"BLD",7655,"KRN",8994,"NM",74,0)
+BMX HEALTH SUMMARY^^0
+"BLD",7655,"KRN",8994,"NM",75,0)
+BMX IM HERE^^0
+"BLD",7655,"KRN",8994,"NM",76,0)
+BMX LOCK^^0
+"BLD",7655,"KRN",8994,"NM",77,0)
+BMX LOOKUP^^0
+"BLD",7655,"KRN",8994,"NM",78,0)
+BMX MULT LIST^^0
+"BLD",7655,"KRN",8994,"NM",79,0)
+BMX NTUSER^^0
+"BLD",7655,"KRN",8994,"NM",80,0)
+BMX PATIENT DEMOG DATA GET^^0
+"BLD",7655,"KRN",8994,"NM",81,0)
+BMX PDATA CHART^^0
+"BLD",7655,"KRN",8994,"NM",82,0)
+BMX SCHEMA ONLY^^0
+"BLD",7655,"KRN",8994,"NM",83,0)
+BMX SECURITY KEY^^0
+"BLD",7655,"KRN",8994,"NM",84,0)
+BMX SIGNATURE^^0
+"BLD",7655,"KRN",8994,"NM",85,0)
+BMX SQL^^0
+"BLD",7655,"KRN",8994,"NM",86,0)
+BMX SQL COLINFO^^0
+"BLD",7655,"KRN",8994,"NM",87,0)
+BMX TABLE^^0
+"BLD",7655,"KRN",8994,"NM",88,0)
+BMX TEST^^0
+"BLD",7655,"KRN",8994,"NM",89,0)
+BMX TIMER TEST^^0
+"BLD",7655,"KRN",8994,"NM",90,0)
+BMX TLIST^^0
+"BLD",7655,"KRN",8994,"NM",91,0)
+BMX UPDATE^^0
+"BLD",7655,"KRN",8994,"NM",92,0)
+BMX USER^^0
+"BLD",7655,"KRN",8994,"NM",93,0)
+BMX UTF-8^^0
+"BLD",7655,"KRN",8994,"NM",94,0)
+BMX VERSION INFO^^0
+"BLD",7655,"KRN",8994,"NM",95,0)
+BMXGetFac^^0
+"BLD",7655,"KRN",8994,"NM",96,0)
+BMXGetFacRS^^0
+"BLD",7655,"KRN",8994,"NM",97,0)
+BMXNRC^^0
+"BLD",7655,"KRN",8994,"NM",98,0)
+BMXNetGetCodes^^0
+"BLD",7655,"KRN",8994,"NM",99,0)
+BMXNetSetUser^^0
+"BLD",7655,"KRN",8994,"NM",100,0)
+BMXPatientInfoRS^^0
+"BLD",7655,"KRN",8994,"NM",101,0)
+BMXPatientLookupRS^^0
+"BLD",7655,"KRN",8994,"NM",102,0)
+BMXProviderLookupRS^^0
+"BLD",7655,"KRN",8994,"NM",103,0)
+BMXSetFac^^0
+"BLD",7655,"KRN",8994,"NM",104,0)
+BMXUserKeyRS^^0
+"BLD",7655,"KRN",8994,"NM","B","BMX ADO SS",60)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX ASYNC GET",61)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX ASYNC QUEUE",62)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX AV CODE",63)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX DEMO",64)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX DENTAL REPORT 1",65)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX DENTAL REPORT 2",66)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX EVENT POLL",67)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX EVENT RAISE",68)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX EVENT REGISTER",69)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX EVENT UNREGISTER",70)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX FIELD LIST",71)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX FIND",72)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX GET VARIABLE VALUE",73)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX HEALTH SUMMARY",74)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX IM HERE",75)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX LOCK",76)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX LOOKUP",77)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX MULT LIST",78)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX NTUSER",79)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX PATIENT DEMOG DATA GET",80)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX PDATA CHART",81)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX SCHEMA ONLY",82)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX SECURITY KEY",83)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX SIGNATURE",84)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX SQL",85)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX SQL COLINFO",86)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX TABLE",87)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX TEST",88)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX TIMER TEST",89)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX TLIST",90)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX UPDATE",91)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX USER",92)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX UTF-8",93)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX VERSION INFO",94)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXGetFac",95)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXGetFacRS",96)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXNRC",97)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXNetGetCodes",98)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXNetSetUser",99)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXPatientInfoRS",100)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXPatientLookupRS",101)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXProviderLookupRS",102)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXSetFac",103)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXUserKeyRS",104)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD ACCESS GROUP ITEM",29)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD NEW APPOINTMENT",1)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD NEW AVAILABILITY",2)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD RES GROUP ITEM",30)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD/EDIT ACCESS GROUP",31)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD/EDIT ACCESS TYPE",13)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD/EDIT RESOURCE",20)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD/EDIT RESOURCE GROUP",23)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD/EDIT RESOURCEUSER",17)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX APPT BLOCKS OVERLAP",3)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CANCEL APPOINTMENT",4)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CANCEL AV BY DATE",56)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CANCEL AVAILABILITY",5)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CANCEL CLINIC LIST",55)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CHECKIN APPOINTMENT",38)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CLINIC LETTERS",46)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CLINIC SETUP",50)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX COPY APPOINTMENT CANCEL",43)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX COPY APPOINTMENT STATUS",44)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX COPY APPOINTMENTS",45)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CREATE APPT SCHEDULE",6)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CREATE ASGND SLOT SCHED",7)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX DELETE ACCESS GROUP",32)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX DELETE ACCESS GROUP ITEM",33)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX DELETE RES GROUP ITEM",25)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX DELETE RESOURCE GROUP",24)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX DELETE RESOURCEUSER",18)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX DEPARTMENT RESOURCE",26)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX DEPARTMENTS BY USER",27)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX EDIT APPOINTMENT",39)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX EHR PATIENT",58)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX GET ACCESS GROUP TYPES",14)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX GET BASIC REG INFO",10)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX GROUP RESOURCE",15)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX HOSP LOC PROVIDERS",59)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX HOSPITAL LOCATION",49)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX IM HERE",48)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX NOSHOW",47)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX PATIENT APPT DISPLAY",40)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX RAISE EVENT",36)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX REBOOK CLINIC LIST",52)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX REBOOK LIST",51)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX REBOOK NEXT BLOCK",57)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX REBOOK SET",53)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX REGISTER EVENT",34)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX RESOURCE GROUPS BY USER",16)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX RESOURCE LETTERS",54)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX RESOURCES",22)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX RESOURCES BY USER",28)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX SCHEDULE USER",19)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX SCHEDULING USER INFO",21)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX SEARCH AVAILABILITY",37)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX SPACEBAR SET",42)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX TYPE BLOCKS OVERLAP",12)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX UNREGISTER EVENT",35)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDXPatientLookupRS",41)
+
+"BLD",7655,"KRN","B",.4,.4)
+
+"BLD",7655,"KRN","B",.401,.401)
+
+"BLD",7655,"KRN","B",.402,.402)
+
+"BLD",7655,"KRN","B",.403,.403)
+
+"BLD",7655,"KRN","B",.5,.5)
+
+"BLD",7655,"KRN","B",.84,.84)
+
+"BLD",7655,"KRN","B",3.6,3.6)
+
+"BLD",7655,"KRN","B",3.8,3.8)
+
+"BLD",7655,"KRN","B",9.2,9.2)
+
+"BLD",7655,"KRN","B",9.8,9.8)
+
+"BLD",7655,"KRN","B",19,19)
+
+"BLD",7655,"KRN","B",19.1,19.1)
+
+"BLD",7655,"KRN","B",101,101)
+
+"BLD",7655,"KRN","B",409.61,409.61)
+
+"BLD",7655,"KRN","B",771,771)
+
+"BLD",7655,"KRN","B",870,870)
+
+"BLD",7655,"KRN","B",8989.51,8989.51)
+
+"BLD",7655,"KRN","B",8989.52,8989.52)
+
+"BLD",7655,"KRN","B",8994,8994)
+
+"BLD",7655,"PRE")
+BSDX2E
+"BLD",7655,"QUES",0)
+^9.62^^
+"BLD",7655,"REQB",0)
+^9.611^^
+"DATA",9002018.5,1,0)
+1^5^3110125.0424
+"FIA",9002018.1)
+BSDX RESOURCE
+"FIA",9002018.1,0)
+^BSDXRES(
+"FIA",9002018.1,0,0)
+9002018.1
+"FIA",9002018.1,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.1,0,10)
+
+"FIA",9002018.1,0,11)
+
+"FIA",9002018.1,0,"RLRO")
+
+"FIA",9002018.1,0,"VR")
+1.5V1^BSDX
+"FIA",9002018.1,9002018.1)
+0
+"FIA",9002018.1,9002018.11)
+0
+"FIA",9002018.1,9002018.11201)
+0
+"FIA",9002018.1,9002018.11301)
+0
+"FIA",9002018.1,9002018.12001)
+0
+"FIA",9002018.15)
+BSDX RESOURCE USER
+"FIA",9002018.15,0)
+^BSDXRSU(
+"FIA",9002018.15,0,0)
+9002018.15P
+"FIA",9002018.15,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.15,0,10)
+
+"FIA",9002018.15,0,11)
+
+"FIA",9002018.15,0,"RLRO")
+
+"FIA",9002018.15,0,"VR")
+1.5V1^BSDX
+"FIA",9002018.15,9002018.15)
+0
+"FIA",9002018.2)
+BSDX RESOURCE GROUP
+"FIA",9002018.2,0)
+^BSDXDEPT(
+"FIA",9002018.2,0,0)
+9002018.2
+"FIA",9002018.2,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.2,0,10)
+
+"FIA",9002018.2,0,11)
+
+"FIA",9002018.2,0,"RLRO")
+
+"FIA",9002018.2,0,"VR")
+1.5V1^BSDX
+"FIA",9002018.2,9002018.2)
+0
+"FIA",9002018.2,9002018.21)
+0
+"FIA",9002018.3)
+BSDX ACCESS BLOCK
+"FIA",9002018.3,0)
+^BSDXAB(
+"FIA",9002018.3,0,0)
+9002018.3PA
+"FIA",9002018.3,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.3,0,10)
+
+"FIA",9002018.3,0,11)
+
+"FIA",9002018.3,0,"RLRO")
+
+"FIA",9002018.3,0,"VR")
+1.5V1^BSDX
+"FIA",9002018.3,9002018.3)
+0
+"FIA",9002018.3,9002018.31)
+0
+"FIA",9002018.35)
+BSDX ACCESS TYPE
+"FIA",9002018.35,0)
+^BSDXTYPE(
+"FIA",9002018.35,0,0)
+9002018.35
+"FIA",9002018.35,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.35,0,10)
+
+"FIA",9002018.35,0,11)
+
+"FIA",9002018.35,0,"RLRO")
+
+"FIA",9002018.35,0,"VR")
+1.5V1^BSDX
+"FIA",9002018.35,9002018.35)
+0
+"FIA",9002018.38)
+BSDX ACCESS GROUP
+"FIA",9002018.38,0)
+^BSDXAGP(
+"FIA",9002018.38,0,0)
+9002018.38
+"FIA",9002018.38,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.38,0,10)
+
+"FIA",9002018.38,0,11)
+
+"FIA",9002018.38,0,"RLRO")
+
+"FIA",9002018.38,0,"VR")
+1.5V1^BSDX
+"FIA",9002018.38,9002018.38)
+0
+"FIA",9002018.39)
+BSDX ACCESS GROUP TYPE
+"FIA",9002018.39,0)
+^BSDXAGTP(
+"FIA",9002018.39,0,0)
+9002018.39P
+"FIA",9002018.39,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.39,0,10)
+
+"FIA",9002018.39,0,11)
+
+"FIA",9002018.39,0,"RLRO")
+
+"FIA",9002018.39,0,"VR")
+1.5V1^BSDX
+"FIA",9002018.39,9002018.39)
+0
+"FIA",9002018.4)
+BSDX APPOINTMENT
+"FIA",9002018.4,0)
+^BSDXAPPT(
+"FIA",9002018.4,0,0)
+9002018.4DA
+"FIA",9002018.4,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.4,0,10)
+
+"FIA",9002018.4,0,11)
+
+"FIA",9002018.4,0,"RLRO")
+
+"FIA",9002018.4,0,"VR")
+1.5V1^BSDX
+"FIA",9002018.4,9002018.4)
+0
+"FIA",9002018.4,9002018.41)
+0
+"FIA",9002018.5)
+BSDX APPLICATION
+"FIA",9002018.5,0)
+^BSDXAPPL(
+"FIA",9002018.5,0,0)
+9002018.5
+"FIA",9002018.5,0,1)
+y^y^f^^n^^y^o^n
+"FIA",9002018.5,0,10)
+
+"FIA",9002018.5,0,11)
+
+"FIA",9002018.5,0,"RLRO")
+
+"FIA",9002018.5,0,"VR")
+1.5V1^BSDX
+"FIA",9002018.5,9002018.5)
+0
+"INIT")
+V0200^BSDX2E
+"IX",9002018.39,9002018.39,"AC",0)
+9002018.39^AC^INDEX OF ACCESS GROUP, ACCESS TYPE^R^^R^IR^I^9002018.39^^^^^S
+"IX",9002018.39,9002018.39,"AC",1)
+S ^BSDXAGTP("AC",$E(X(1),1,30),$E(X(2),1,30),DA)=""
+"IX",9002018.39,9002018.39,"AC",2)
+K ^BSDXAGTP("AC",$E(X(1),1,30),$E(X(2),1,30),DA)
+"IX",9002018.39,9002018.39,"AC",2.5)
+K ^BSDXAGTP("AC")
+"IX",9002018.39,9002018.39,"AC",11.1,0)
+^.114IA^2^2
+"IX",9002018.39,9002018.39,"AC",11.1,1,0)
+1^F^9002018.39^.01^30^1^F
+"IX",9002018.39,9002018.39,"AC",11.1,1,3)
+
+"IX",9002018.39,9002018.39,"AC",11.1,2,0)
+2^F^9002018.39^.02^30^2^F
+"IX",9002018.39,9002018.39,"AC",11.1,2,3)
+
+"KRN",19,10987,-1)
+0^1
+"KRN",19,10987,0)
+BSDXRPC^WINDOWS SCHEDULING PROCEDURE CALLS^^B^^^^^^^^IHS Windows Scheduling
+"KRN",19,10987,1,0)
+^19.06^4^4^3100618^^
+"KRN",19,10987,1,1,0)
+This option hosts RPCs in the BSDX namespace.  Windows Scheduling users
+"KRN",19,10987,1,2,0)
+ mustg have access to this option
+"KRN",19,10987,1,3,0)
+ 
+"KRN",19,10987,1,4,0)
+in order to use Windows Scheduling.
+"KRN",19,10987,99.1)
+61545,63078
+"KRN",19,10987,"RPC",0)
+^19.05P^101^101
+"KRN",19,10987,"RPC",1,0)
+BSDX ADD ACCESS GROUP ITEM
+"KRN",19,10987,"RPC",2,0)
+BSDX ADD NEW APPOINTMENT
+"KRN",19,10987,"RPC",3,0)
+BSDX ADD NEW AVAILABILITY
+"KRN",19,10987,"RPC",4,0)
+BSDX ADD RES GROUP ITEM
+"KRN",19,10987,"RPC",5,0)
+BSDX ADD/EDIT ACCESS GROUP
+"KRN",19,10987,"RPC",6,0)
+BSDX ADD/EDIT ACCESS TYPE
+"KRN",19,10987,"RPC",7,0)
+BSDX ADD/EDIT RESOURCE
+"KRN",19,10987,"RPC",8,0)
+BSDX ADD/EDIT RESOURCE GROUP
+"KRN",19,10987,"RPC",9,0)
+BSDX ADD/EDIT RESOURCEUSER
+"KRN",19,10987,"RPC",10,0)
+BSDX APPT BLOCKS OVERLAP
+"KRN",19,10987,"RPC",11,0)
+BSDX CANCEL APPOINTMENT
+"KRN",19,10987,"RPC",12,0)
+BSDX CANCEL AVAILABILITY
+"KRN",19,10987,"RPC",13,0)
+BSDX CHECKIN APPOINTMENT
+"KRN",19,10987,"RPC",14,0)
+BSDX CREATE APPT SCHEDULE
+"KRN",19,10987,"RPC",15,0)
+BSDX CREATE ASGND SLOT SCHED
+"KRN",19,10987,"RPC",16,0)
+BSDX DELETE ACCESS GROUP
+"KRN",19,10987,"RPC",17,0)
+BSDX DELETE ACCESS GROUP ITEM
+"KRN",19,10987,"RPC",18,0)
+BSDX DELETE RES GROUP ITEM
+"KRN",19,10987,"RPC",19,0)
+BSDX DELETE RESOURCE GROUP
+"KRN",19,10987,"RPC",20,0)
+BSDX DELETE RESOURCEUSER
+"KRN",19,10987,"RPC",21,0)
+BSDX DEPARTMENT RESOURCE
+"KRN",19,10987,"RPC",22,0)
+BSDX DEPARTMENTS BY USER
+"KRN",19,10987,"RPC",23,0)
+BSDX EDIT APPOINTMENT
+"KRN",19,10987,"RPC",24,0)
+BSDX GET ACCESS GROUP TYPES
+"KRN",19,10987,"RPC",25,0)
+BSDX GET BASIC REG INFO
+"KRN",19,10987,"RPC",26,0)
+BSDX GROUP RESOURCE
+"KRN",19,10987,"RPC",27,0)
+BSDX PATIENT APPT DISPLAY
+"KRN",19,10987,"RPC",28,0)
+BSDX RAISE EVENT
+"KRN",19,10987,"RPC",29,0)
+BSDX REGISTER EVENT
+"KRN",19,10987,"RPC",30,0)
+BSDX RESOURCE GROUPS BY USER
+"KRN",19,10987,"RPC",31,0)
+BSDX RESOURCES
+"KRN",19,10987,"RPC",32,0)
+BSDX RESOURCES BY USER
+"KRN",19,10987,"RPC",33,0)
+BSDX SCHEDULE USER
+"KRN",19,10987,"RPC",34,0)
+BSDX SCHEDULING USER INFO
+"KRN",19,10987,"RPC",35,0)
+BSDX SEARCH AVAILABILITY
+"KRN",19,10987,"RPC",36,0)
+BSDX TYPE BLOCKS OVERLAP
+"KRN",19,10987,"RPC",37,0)
+BSDX UNREGISTER EVENT
+"KRN",19,10987,"RPC",38,0)
+BSDXPatientLookupRS
+"KRN",19,10987,"RPC",39,0)
+BSDX SPACEBAR SET
+"KRN",19,10987,"RPC",40,0)
+BSDX COPY APPOINTMENTS
+"KRN",19,10987,"RPC",41,0)
+BSDX COPY APPOINTMENT CANCEL
+"KRN",19,10987,"RPC",42,0)
+BSDX COPY APPOINTMENT STATUS
+"KRN",19,10987,"RPC",43,0)
+BSDX CLINIC LETTERS
+"KRN",19,10987,"RPC",44,0)
+BSDX NOSHOW
+"KRN",19,10987,"RPC",45,0)
+BSDX IM HERE
+"KRN",19,10987,"RPC",46,0)
+BSDX HOSPITAL LOCATION
+"KRN",19,10987,"RPC",47,0)
+BSDX CLINIC SETUP
+"KRN",19,10987,"RPC",49,0)
+BSDX REBOOK LIST
+"KRN",19,10987,"RPC",50,0)
+BSDX REBOOK CLINIC LIST
+"KRN",19,10987,"RPC",51,0)
+BSDX REBOOK SET
+"KRN",19,10987,"RPC",52,0)
+BSDX RESOURCE LETTERS
+"KRN",19,10987,"RPC",53,0)
+BSDX CANCEL CLINIC LIST
+"KRN",19,10987,"RPC",54,0)
+BSDX CANCEL AV BY DATE
+"KRN",19,10987,"RPC",55,0)
+BSDX REBOOK NEXT BLOCK
+"KRN",19,10987,"RPC",56,0)
+BSDX HOSP LOC PROVIDERS
+"KRN",19,10987,"RPC",57,0)
+BMX ADO SS
+"KRN",19,10987,"RPC",58,0)
+BMX ASYNC GET
+"KRN",19,10987,"RPC",59,0)
+BMX ASYNC QUEUE
+"KRN",19,10987,"RPC",60,0)
+BMX AV CODE
+"KRN",19,10987,"RPC",61,0)
+BMX DEMO
+"KRN",19,10987,"RPC",62,0)
+BMX DENTAL REPORT 1
+"KRN",19,10987,"RPC",63,0)
+BMX DENTAL REPORT 2
+"KRN",19,10987,"RPC",64,0)
+BMX EVENT POLL
+"KRN",19,10987,"RPC",65,0)
+BMX EVENT RAISE
+"KRN",19,10987,"RPC",66,0)
+BMX EVENT REGISTER
+"KRN",19,10987,"RPC",67,0)
+BMX EVENT UNREGISTER
+"KRN",19,10987,"RPC",68,0)
+BMX FIELD LIST
+"KRN",19,10987,"RPC",69,0)
+BMX FIND
+"KRN",19,10987,"RPC",70,0)
+BMX GET VARIABLE VALUE
+"KRN",19,10987,"RPC",71,0)
+BMX HEALTH SUMMARY
+"KRN",19,10987,"RPC",72,0)
+BMX IM HERE
+"KRN",19,10987,"RPC",73,0)
+BMX LOCK
+"KRN",19,10987,"RPC",74,0)
+BMX LOOKUP
+"KRN",19,10987,"RPC",75,0)
+BMX MULT LIST
+"KRN",19,10987,"RPC",76,0)
+BMX NTUSER
+"KRN",19,10987,"RPC",77,0)
+BMX PATIENT DEMOG DATA GET
+"KRN",19,10987,"RPC",78,0)
+BMX PDATA CHART
+"KRN",19,10987,"RPC",79,0)
+BMX SCHEMA ONLY
+"KRN",19,10987,"RPC",80,0)
+BMX SECURITY KEY
+"KRN",19,10987,"RPC",81,0)
+BMX SIGNATURE
+"KRN",19,10987,"RPC",82,0)
+BMX SQL
+"KRN",19,10987,"RPC",83,0)
+BMX SQL COLINFO
+"KRN",19,10987,"RPC",84,0)
+BMX TABLE
+"KRN",19,10987,"RPC",85,0)
+BMX TEST
+"KRN",19,10987,"RPC",86,0)
+BMX TIMER TEST
+"KRN",19,10987,"RPC",87,0)
+BMX TLIST
+"KRN",19,10987,"RPC",88,0)
+BMX UPDATE
+"KRN",19,10987,"RPC",89,0)
+BMX USER
+"KRN",19,10987,"RPC",90,0)
+BMX UTF-8
+"KRN",19,10987,"RPC",91,0)
+BMX VERSION INFO
+"KRN",19,10987,"RPC",92,0)
+BMXGetFac
+"KRN",19,10987,"RPC",93,0)
+BMXGetFacRS
+"KRN",19,10987,"RPC",94,0)
+BMXNRC
+"KRN",19,10987,"RPC",95,0)
+BMXNetGetCodes
+"KRN",19,10987,"RPC",96,0)
+BMXNetSetUser
+"KRN",19,10987,"RPC",97,0)
+BMXPatientInfoRS
+"KRN",19,10987,"RPC",98,0)
+BMXPatientLookupRS
+"KRN",19,10987,"RPC",99,0)
+BMXProviderLookupRS
+"KRN",19,10987,"RPC",100,0)
+BMXSetFac
+"KRN",19,10987,"RPC",101,0)
+BMXUserKeyRS
+"KRN",19,10987,"U")
+WINDOWS SCHEDULING PROCEDURE C
+"KRN",19.1,480,-1)
+0^1
+"KRN",19.1,480,0)
+BSDXZMENU^IHS Windows Scheduling
+"KRN",19.1,481,-1)
+0^2
+"KRN",19.1,481,0)
+BSDXZMGR^IHS Windows Scheduling Manager
+"KRN",101,4262,-1)
+0^2
+"KRN",101,4262,0)
+BSDX CANCEL APPOINTMENT^BSDX CANCEL APPOINTMENT^^A^^^^^^^^
+"KRN",101,4262,1,0)
+^^4^4^3040915^
+"KRN",101,4262,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4262,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4262,1,3,0)
+cancel an appointment in the IHS Windows Scheduling package
+"KRN",101,4262,1,4,0)
+when the corresponding appointment in RPMS Scheduling is cancelled.
+"KRN",101,4262,4)
+^^^BSDX CANCEL APPOINTMENT
+"KRN",101,4262,20)
+I $G(SDAMEVT)=2,$D(^BSDXAPPL) D CANEVT^BSDX08($G(DFN),$G(SDT),$G(SDCL))
+"KRN",101,4262,99)
+61598,46412
+"KRN",101,4263,-1)
+0^1
+"KRN",101,4263,0)
+BSDX ADD APPOINTMENT^BSDX ADD APPOINTMENT^^A^^^^^^^^
+"KRN",101,4263,1,0)
+^101.06^4^4^3040915^^
+"KRN",101,4263,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4263,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4263,1,3,0)
+add an appointment in the IHS Windows Scheduling package
+"KRN",101,4263,1,4,0)
+when the corresponding appointment in RPMS Scheduling is added.
+"KRN",101,4263,4)
+^^^BSDX ADD APPOINTMENT
+"KRN",101,4263,20)
+I $G(SDAMEVT)=1,$D(^BSDXAPPL) D ADDEVT^BSDX07($G(DFN),$G(SDT),$G(SDCL),$G(SDDA))
+"KRN",101,4263,99)
+61598,46412
+"KRN",101,4264,-1)
+0^4
+"KRN",101,4264,0)
+BSDX NOSHOW APPOINTMENT^BSDX NOSHOW APPOINTMENT^^A^^^^^^^^
+"KRN",101,4264,1,0)
+^101.06^4^4^3040915^^
+"KRN",101,4264,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4264,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4264,1,3,0)
+no-show an appointment in the IHS Windows Scheduling package
+"KRN",101,4264,1,4,0)
+when the corresponding appointment in RPMS Scheduling is no-showed.
+"KRN",101,4264,4)
+^^^BSDX NOSHOW APPOINTMENT
+"KRN",101,4264,20)
+I $G(SDAMEVT)=3,$D(^BSDXAPPL) D NOSEVT^BSDX31($G(DFN),$G(SDT),$G(SDCL))
+"KRN",101,4264,99)
+61598,46412
+"KRN",101,4265,-1)
+0^3
+"KRN",101,4265,0)
+BSDX CHECKIN APPOINTMENT^BSDX CHECKIN APPOINTMENT^^A^^^^^^^^
+"KRN",101,4265,1,0)
+^101.06^4^4^3040915^^^
+"KRN",101,4265,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4265,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4265,1,3,0)
+check in an appointment in the IHS Windows Scheduling package
+"KRN",101,4265,1,4,0)
+when the corresponding appointment in RPMS Scheduling is checked in.
+"KRN",101,4265,4)
+^^^BSDX CHECKIN APPOINTMENT
+"KRN",101,4265,20)
+I $G(SDAMEVT)=4,$D(^BSDXAPPL) D CHKEVT^BSDX25($G(DFN),$G(SDT),$G(SDCL))
+"KRN",101,4265,99)
+61598,46412
+"KRN",8994,2396,-1)
+0^80
+"KRN",8994,2396,0)
+BMX PATIENT DEMOG DATA GET^PDATA^BMXRPC1^1
+"KRN",8994,2397,-1)
+0^77
+"KRN",8994,2397,0)
+BMX LOOKUP^LOOKUP^BMXRPC^4
+"KRN",8994,2398,-1)
+0^71
+"KRN",8994,2398,0)
+BMX FIELD LIST^FLDLIST^BMXRPC2^4
+"KRN",8994,2399,-1)
+0^72
+"KRN",8994,2399,0)
+BMX FIND^FIND^BMXFIND^4
+"KRN",8994,2400,-1)
+0^87
+"KRN",8994,2400,0)
+BMX TABLE^TABLE^BMXFIND^4
+"KRN",8994,2401,-1)
+0^85
+"KRN",8994,2401,0)
+BMX SQL^SQL^BMXSQL^4
+"KRN",8994,2402,-1)
+0^90
+"KRN",8994,2402,0)
+BMX TLIST^TLIST^BMXSQL^4
+"KRN",8994,2403,-1)
+0^86
+"KRN",8994,2403,0)
+BMX SQL COLINFO^SQLCOL^BMXSQL^4
+"KRN",8994,2404,-1)
+0^73
+"KRN",8994,2404,0)
+BMX GET VARIABLE VALUE^VARVAL^BMXRPC3^1
+"KRN",8994,2405,-1)
+0^92
+"KRN",8994,2405,0)
+BMX USER^USER^BMXRPC3^1
+"KRN",8994,2406,-1)
+0^79
+"KRN",8994,2406,0)
+BMX NTUSER^NTUSER^BMXRPC3^1
+"KRN",8994,2407,-1)
+0^103
+"KRN",8994,2407,0)
+BMXSetFac^SETFCRS^BMXRPC3^1
+"KRN",8994,2408,-1)
+0^95
+"KRN",8994,2408,0)
+BMXGetFac^GETFC^BMXRPC3^1
+"KRN",8994,2409,-1)
+0^83
+"KRN",8994,2409,0)
+BMX SECURITY KEY^APSEC^BMXRPC3^1
+"KRN",8994,2410,-1)
+0^84
+"KRN",8994,2410,0)
+BMX SIGNATURE^SIGCHK^BMXRPC3^1
+"KRN",8994,2411,-1)
+0^78
+"KRN",8994,2411,0)
+BMX MULT LIST^MLTLIST^BMXRPC2^4
+"KRN",8994,2412,-1)
+0^96
+"KRN",8994,2412,0)
+BMXGetFacRS^GETFCRS^BMXRPC3^1
+"KRN",8994,2413,-1)
+0^101
+"KRN",8994,2413,0)
+BMXPatientLookupRS^PTLOOKRS^BMXRPC4^1
+"KRN",8994,2414,-1)
+0^100
+"KRN",8994,2414,0)
+BMXPatientInfoRS^PTINFORS^BMXRPC4^1
+"KRN",8994,2415,-1)
+0^74
+"KRN",8994,2415,0)
+BMX HEALTH SUMMARY^HS^BMXRPC5^4
+"KRN",8994,2416,-1)
+0^65
+"KRN",8994,2416,0)
+BMX DENTAL REPORT 1^BMXADE^BMXADE1^4
+"KRN",8994,2417,-1)
+0^104
+"KRN",8994,2417,0)
+BMXUserKeyRS^USRKEYRS^BMXRPC6^1
+"KRN",8994,2418,-1)
+0^102
+"KRN",8994,2418,0)
+BMXProviderLookupRS^PRVLKRS^BMXQA2^1
+"KRN",8994,2419,-1)
+0^81
+"KRN",8994,2419,0)
+BMX PDATA CHART^PDATA^BMXRPC6^4
+"KRN",8994,2420,-1)
+0^66
+"KRN",8994,2420,0)
+BMX DENTAL REPORT 2^BMXADE^BMXADE2^4
+"KRN",8994,2421,-1)
+0^97
+"KRN",8994,2421,0)
+BMXNRC^ZTM^BMXNRC^4
+"KRN",8994,2422,-1)
+0^98
+"KRN",8994,2422,0)
+BMXNetGetCodes^NTUGET^BMXRPC3^4
+"KRN",8994,2423,-1)
+0^99
+"KRN",8994,2423,0)
+BMXNetSetUser^NTUSET^BMXRPC3^4
+"KRN",8994,2424,-1)
+0^64
+"KRN",8994,2424,0)
+BMX DEMO^PDEMO^BMXRPC6^4
+"KRN",8994,2425,-1)
+0^63
+"KRN",8994,2425,0)
+BMX AV CODE^WINVAL^BMXRPC7^2
+"KRN",8994,2426,-1)
+0^76
+"KRN",8994,2426,0)
+BMX LOCK^BMXLOCK^BMXRPC8^1
+"KRN",8994,2427,-1)
+0^94
+"KRN",8994,2427,0)
+BMX VERSION INFO^BMXVER^BMXRPC8^4
+"KRN",8994,2428,-1)
+0^75
+"KRN",8994,2428,0)
+BMX IM HERE^IMHERE^BMXRPC8^1^P
+"KRN",8994,2428,1,0)
+^8994.01^2^2^3040304^^^
+"KRN",8994,2428,1,1,0)
+Returns a simple value to client.  Used to establish continued existence
+"KRN",8994,2428,1,2,0)
+of the client to the server; resets the server READ timeout.
+"KRN",8994,2429,-1)
+0^91
+"KRN",8994,2429,0)
+BMX UPDATE^FILE^BMXADOF^1
+"KRN",8994,2430,-1)
+0^88
+"KRN",8994,2430,0)
+BMX TEST^TESTRPC^BMXRPC9^4
+"KRN",8994,2431,-1)
+0^82
+"KRN",8994,2431,0)
+BMX SCHEMA ONLY^SONLY^BMXRPC9^1
+"KRN",8994,2432,-1)
+0^60
+"KRN",8994,2432,0)
+BMX ADO SS^SS^BMXADO^4
+"KRN",8994,2433,-1)
+0^68
+"KRN",8994,2433,0)
+BMX EVENT RAISE^RAISEVNT^BMXMEVN^4
+"KRN",8994,2434,-1)
+0^69
+"KRN",8994,2434,0)
+BMX EVENT REGISTER^REGEVNT^BMXMEVN^4
+"KRN",8994,2435,-1)
+0^70
+"KRN",8994,2435,0)
+BMX EVENT UNREGISTER^UNREG^BMXMEVN^4
+"KRN",8994,2436,-1)
+0^67
+"KRN",8994,2436,0)
+BMX EVENT POLL^POLL^BMXMEVN^4
+"KRN",8994,2437,-1)
+0^89
+"KRN",8994,2437,0)
+BMX TIMER TEST^TTEST^BMXMEVN^4
+"KRN",8994,2438,-1)
+0^61
+"KRN",8994,2438,0)
+BMX ASYNC GET^ASYNCGET^BMXMEVN^4
+"KRN",8994,2439,-1)
+0^62
+"KRN",8994,2439,0)
+BMX ASYNC QUEUE^ASYNCQUE^BMXMEVN^4
+"KRN",8994,2440,-1)
+0^16
+"KRN",8994,2440,0)
+BSDX RESOURCE GROUPS BY USER^DEPUSR^BSDX01^4
+"KRN",8994,2441,-1)
+0^22
+"KRN",8994,2441,0)
+BSDX RESOURCES^RESUSR^BSDX01^4
+"KRN",8994,2442,-1)
+0^6
+"KRN",8994,2442,0)
+BSDX CREATE APPT SCHEDULE^CRSCH^BSDX02^4
+"KRN",8994,2443,-1)
+0^1
+"KRN",8994,2443,0)
+BSDX ADD NEW APPOINTMENT^APPADD^BSDX07^4
+"KRN",8994,2444,-1)
+0^4
+"KRN",8994,2444,0)
+BSDX CANCEL APPOINTMENT^APPDEL^BSDX08^4
+"KRN",8994,2445,-1)
+0^7
+"KRN",8994,2445,0)
+BSDX CREATE ASGND SLOT SCHED^CASSCH^BSDX04^4
+"KRN",8994,2446,-1)
+0^2
+"KRN",8994,2446,0)
+BSDX ADD NEW AVAILABILITY^AVADD^BSDX12^4
+"KRN",8994,2447,-1)
+0^5
+"KRN",8994,2447,0)
+BSDX CANCEL AVAILABILITY^AVDEL^BSDX13^4
+"KRN",8994,2448,-1)
+0^3
+"KRN",8994,2448,0)
+BSDX APPT BLOCKS OVERLAP^APBLKOV^BSDX05^4
+"KRN",8994,2449,-1)
+0^12
+"KRN",8994,2449,0)
+BSDX TYPE BLOCKS OVERLAP^TPBLKOV^BSDX06^4
+"KRN",8994,2450,-1)
+0^10
+"KRN",8994,2450,0)
+BSDX GET BASIC REG INFO^GETREGA^BSDX09^4
+"KRN",8994,2451,-1)
+0^15
+"KRN",8994,2451,0)
+BSDX GROUP RESOURCE^DEPRES^BSDX01^4
+"KRN",8994,2452,-1)
+0^13
+"KRN",8994,2452,0)
+BSDX ADD/EDIT ACCESS TYPE^ACCTYP^BSDX14^4
+"KRN",8994,2453,-1)
+0^14
+"KRN",8994,2453,0)
+BSDX GET ACCESS GROUP TYPES^GRPTYP^BSDX15^4
+"KRN",8994,2454,-1)
+0^20
+"KRN",8994,2454,0)
+BSDX ADD/EDIT RESOURCE^RSRC^BSDX16^4
+"KRN",8994,2455,-1)
+0^19
+"KRN",8994,2455,0)
+BSDX SCHEDULE USER^SCHUSR^BSDX17^4
+"KRN",8994,2456,-1)
+0^18
+"KRN",8994,2456,0)
+BSDX DELETE RESOURCEUSER^DELRU^BSDX18^4
+"KRN",8994,2457,-1)
+0^17
+"KRN",8994,2457,0)
+BSDX ADD/EDIT RESOURCEUSER^ADDRU^BSDX18^4
+"KRN",8994,2458,-1)
+0^21
+"KRN",8994,2458,0)
+BSDX SCHEDULING USER INFO^SUINFO^BSDX01^4
+"KRN",8994,2459,-1)
+0^23
+"KRN",8994,2459,0)
+BSDX ADD/EDIT RESOURCE GROUP^ADDRG^BSDX19^4
+"KRN",8994,2460,-1)
+0^24
+"KRN",8994,2460,0)
+BSDX DELETE RESOURCE GROUP^DELRG^BSDX19^4
+"KRN",8994,2461,-1)
+0^27
+"KRN",8994,2461,0)
+BSDX DEPARTMENTS BY USER^DEPUSR^BSDX01^4
+"KRN",8994,2462,-1)
+0^28
+"KRN",8994,2462,0)
+BSDX RESOURCES BY USER^RESUSR^BSDX01^4
+"KRN",8994,2463,-1)
+0^26
+"KRN",8994,2463,0)
+BSDX DEPARTMENT RESOURCE^DEPRES^BSDX01^4
+"KRN",8994,2464,-1)
+0^25
+"KRN",8994,2464,0)
+BSDX DELETE RES GROUP ITEM^DELRGI^BSDX20^4
+"KRN",8994,2465,-1)
+0^30
+"KRN",8994,2465,0)
+BSDX ADD RES GROUP ITEM^ADDRGI^BSDX20^4
+"KRN",8994,2466,-1)
+0^31
+"KRN",8994,2466,0)
+BSDX ADD/EDIT ACCESS GROUP^ADDAG^BSDX21^4
+"KRN",8994,2467,-1)
+0^32
+"KRN",8994,2467,0)
+BSDX DELETE ACCESS GROUP^DELAG^BSDX21^4
+"KRN",8994,2468,-1)
+0^29
+"KRN",8994,2468,0)
+BSDX ADD ACCESS GROUP ITEM^ADDAGI^BSDX22^4
+"KRN",8994,2469,-1)
+0^33
+"KRN",8994,2469,0)
+BSDX DELETE ACCESS GROUP ITEM^DELAGI^BSDX22^4
+"KRN",8994,2470,-1)
+0^34
+"KRN",8994,2470,0)
+BSDX REGISTER EVENT^REGEVNT^BSDX23^4
+"KRN",8994,2471,-1)
+0^35
+"KRN",8994,2471,0)
+BSDX UNREGISTER EVENT^UNREG^BSDX23^4
+"KRN",8994,2472,-1)
+0^36
+"KRN",8994,2472,0)
+BSDX RAISE EVENT^RAISEVNT^BSDX23^4
+"KRN",8994,2473,-1)
+0^37
+"KRN",8994,2473,0)
+BSDX SEARCH AVAILABILITY^SEARCH^BSDX24^4
+"KRN",8994,2474,-1)
+0^38
+"KRN",8994,2474,0)
+BSDX CHECKIN APPOINTMENT^CHECKIN^BSDX25^4
+"KRN",8994,2475,-1)
+0^39
+"KRN",8994,2475,0)
+BSDX EDIT APPOINTMENT^EDITAPT^BSDX26^4
+"KRN",8994,2476,-1)
+0^40
+"KRN",8994,2476,0)
+BSDX PATIENT APPT DISPLAY^PADISP^BSDX27^4
+"KRN",8994,2477,-1)
+0^41
+"KRN",8994,2477,0)
+BSDXPatientLookupRS^PTLOOKRS^BSDX28^1
+"KRN",8994,2478,-1)
+0^42
+"KRN",8994,2478,0)
+BSDX SPACEBAR SET^SPACE^BSDX30^4
+"KRN",8994,2479,-1)
+0^45
+"KRN",8994,2479,0)
+BSDX COPY APPOINTMENTS^BSDXCP^BSDX29^4
+"KRN",8994,2480,-1)
+0^44
+"KRN",8994,2480,0)
+BSDX COPY APPOINTMENT STATUS^CPSTAT^BSDX29^4
+"KRN",8994,2481,-1)
+0^43
+"KRN",8994,2481,0)
+BSDX COPY APPOINTMENT CANCEL^CPCANC^BSDX29^4
+"KRN",8994,2482,-1)
+0^46
+"KRN",8994,2482,0)
+BSDX CLINIC LETTERS^CLDISP^BSDX27^4
+"KRN",8994,2483,-1)
+0^47
+"KRN",8994,2483,0)
+BSDX NOSHOW^NOSHOW^BSDX31^4
+"KRN",8994,2484,-1)
+0^48
+"KRN",8994,2484,0)
+BSDX IM HERE^IMHERE^BSDX31^1
+"KRN",8994,2484,1,0)
+^^2^2^3040304^
+"KRN",8994,2484,1,1,0)
+Returns a simple value to client.  Used to establish continued existence
+"KRN",8994,2484,1,2,0)
+of the client to the server; resets the server READ timeout.
+"KRN",8994,2485,-1)
+0^49
+"KRN",8994,2485,0)
+BSDX HOSPITAL LOCATION^HOSPLOC^BSDX32^4
+"KRN",8994,2486,-1)
+0^50
+"KRN",8994,2486,0)
+BSDX CLINIC SETUP^CLNSET^BSDX32^4
+"KRN",8994,2487,-1)
+0^51
+"KRN",8994,2487,0)
+BSDX REBOOK LIST^RBLETT^BSDX34^4
+"KRN",8994,2488,-1)
+0^52
+"KRN",8994,2488,0)
+BSDX REBOOK CLINIC LIST^RBCLIN^BSDX34^4
+"KRN",8994,2489,-1)
+0^53
+"KRN",8994,2489,0)
+BSDX REBOOK SET^SETRBK^BSDX33^4
+"KRN",8994,2490,-1)
+0^54
+"KRN",8994,2490,0)
+BSDX RESOURCE LETTERS^RSRCLTR^BSDX35^4
+"KRN",8994,2491,-1)
+0^55
+"KRN",8994,2491,0)
+BSDX CANCEL CLINIC LIST^CANCLIN^BSDX34^4
+"KRN",8994,2492,-1)
+0^56
+"KRN",8994,2492,0)
+BSDX CANCEL AV BY DATE^AVDELDT^BSDX13^4
+"KRN",8994,2493,-1)
+0^57
+"KRN",8994,2493,0)
+BSDX REBOOK NEXT BLOCK^RBNEXT^BSDX33^4
+"KRN",8994,2494,-1)
+0^58
+"KRN",8994,2494,0)
+BSDX EHR PATIENT^EHRPT^BSDX30^4
+"KRN",8994,2501,-1)
+0^59
+"KRN",8994,2501,0)
+BSDX HOSP LOC PROVIDERS^P^BSDXGPRV^4
+"KRN",8994,2502,-1)
+0^93
+"KRN",8994,2502,0)
+BMX UTF-8^UTF8^BMXRPC^1^P
+"KRN",8994,2502,1,0)
+^^4^4^3100907^
+"KRN",8994,2502,1,1,0)
+This RPC returns a single value of 1 if database supports UTF-8; 0 if 
+"KRN",8994,2502,1,2,0)
+not. Only works on GT.M.
+"KRN",8994,2502,1,3,0)
+ 
+"KRN",8994,2502,1,4,0)
+Doesn't take any parameters.
+"MBREQ")
+0
+"ORD",3,19.1)
+19.1;3;1;;KEY^XPDTA1;;;KEYF2^XPDIA1;;KEYDEL^XPDIA1
+"ORD",3,19.1,0)
+SECURITY KEY
+"ORD",15,101)
+101;15;;;PRO^XPDTA;PROF1^XPDIA;PROE1^XPDIA;PROF2^XPDIA;;PRODEL^XPDIA
+"ORD",15,101,0)
+PROTOCOL
+"ORD",16,8994)
+8994;16;1;;;;;;;RPCDEL^XPDIA1
+"ORD",16,8994,0)
+REMOTE PROCEDURE
+"ORD",18,19)
+19;18;;;OPT^XPDTA;OPTF1^XPDIA;OPTE1^XPDIA;OPTF2^XPDIA;;OPTDEL^XPDIA
+"ORD",18,19,0)
+OPTION
+"PKG",211,-1)
+1^1
+"PKG",211,0)
+IHS Windows Scheduling^BSDX^IHS Windows Scheduling Extensions
+"PKG",211,20,0)
+^9.402P^^
+"PKG",211,22,0)
+^9.49I^1^1
+"PKG",211,22,1,0)
+1.5V1^3110125
+"PKG",211,22,1,1,0)
+^^1^1^3110125
+"PKG",211,22,1,1,1,0)
+Clinical Scheduling M Server support routines, files, options and RPCs.
+"PKG",211,"VERSION")
+1.5V1
+"PRE")
+BSDX2E
+"QUES","XPF1",0)
+Y
+"QUES","XPF1","??")
+^D REP^XPDH
+"QUES","XPF1","A")
+Shall I write over your |FLAG| File
+"QUES","XPF1","B")
+YES
+"QUES","XPF1","M")
+D XPF1^XPDIQ
+"QUES","XPF2",0)
+Y
+"QUES","XPF2","??")
+^D DTA^XPDH
+"QUES","XPF2","A")
+Want my data |FLAG| yours
+"QUES","XPF2","B")
+YES
+"QUES","XPF2","M")
+D XPF2^XPDIQ
+"QUES","XPI1",0)
+YO
+"QUES","XPI1","??")
+^D INHIBIT^XPDH
+"QUES","XPI1","A")
+Want KIDS to INHIBIT LOGONs during the install
+"QUES","XPI1","B")
+NO
+"QUES","XPI1","M")
+D XPI1^XPDIQ
+"QUES","XPM1",0)
+PO^VA(200,:EM
+"QUES","XPM1","??")
+^D MG^XPDH
+"QUES","XPM1","A")
+Enter the Coordinator for Mail Group '|FLAG|'
+"QUES","XPM1","B")
+
+"QUES","XPM1","M")
+D XPM1^XPDIQ
+"QUES","XPO1",0)
+Y
+"QUES","XPO1","??")
+^D MENU^XPDH
+"QUES","XPO1","A")
+Want KIDS to Rebuild Menu Trees Upon Completion of Install
+"QUES","XPO1","B")
+NO
+"QUES","XPO1","M")
+D XPO1^XPDIQ
+"QUES","XPZ1",0)
+Y
+"QUES","XPZ1","??")
+^D OPT^XPDH
+"QUES","XPZ1","A")
+Want to DISABLE Scheduled Options, Menu Options, and Protocols
+"QUES","XPZ1","B")
+NO
+"QUES","XPZ1","M")
+D XPZ1^XPDIQ
+"QUES","XPZ2",0)
+Y
+"QUES","XPZ2","??")
+^D RTN^XPDH
+"QUES","XPZ2","A")
+Want to MOVE routines to other CPUs
+"QUES","XPZ2","B")
+NO
+"QUES","XPZ2","M")
+D XPZ2^XPDIQ
+"RTN")
+37
+"RTN","BSDX01")
+0^1^B107139484
+"RTN","BSDX01",1,0)
+BSDX01 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 9/29/10 10:20am
+"RTN","BSDX01",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX01",3,0)
+ ;
+"RTN","BSDX01",4,0)
+SUINFOD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",5,0)
+ ;D DEBUG^%Serenji("SUINFO^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",6,0)
+ ;
+"RTN","BSDX01",7,0)
+ Q
+"RTN","BSDX01",8,0)
+ ;
+"RTN","BSDX01",9,0)
+SUINFO(BSDXY,BSDXDUZ)  ;EP
+"RTN","BSDX01",10,0)
+ ;Called by BSDX SCHEDULING USER INFO
+"RTN","BSDX01",11,0)
+ ;Returns ADO Recordset having column MANAGER
+"RTN","BSDX01",12,0)
+ ;MANAGER = YES if user has keys BSDXZMGR or XUPROGMODE
+"RTN","BSDX01",13,0)
+ ;
+"RTN","BSDX01",14,0)
+ N BSDXMGR,BSDXERR
+"RTN","BSDX01",15,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",16,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",17,0)
+ S BSDXI=0
+"RTN","BSDX01",18,0)
+ S BSDXERR=""
+"RTN","BSDX01",19,0)
+ S ^BSDXTMP($J,BSDXI)="T00010MANAGER"_$C(30)
+"RTN","BSDX01",20,0)
+ ;Check SECURITY KEY file for BSDXZMGR or XUPROGMODE keys
+"RTN","BSDX01",21,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",22,0)
+ S BSDXMGR=$$APSEC("BSDXZMGR",BSDXDUZ)
+"RTN","BSDX01",23,0)
+ S BSDXMGR=$S(BSDXMGR=1:"YES",1:"NO")
+"RTN","BSDX01",24,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX01",25,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXMGR_$C(30)
+"RTN","BSDX01",26,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",27,0)
+ Q
+"RTN","BSDX01",28,0)
+DEPUSRD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",29,0)
+ ;
+"RTN","BSDX01",30,0)
+ ;
+"RTN","BSDX01",31,0)
+ ;D DEBUG^%Serenji("DEPUSR^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",32,0)
+ ;
+"RTN","BSDX01",33,0)
+ Q
+"RTN","BSDX01",34,0)
+ ;
+"RTN","BSDX01",35,0)
+DEPUSR(BSDXY,BSDXDUZ)  ;EP
+"RTN","BSDX01",36,0)
+ ;Called by BSDX RESOURCE GROUPS BY USER
+"RTN","BSDX01",37,0)
+ ;Returns ADO Recordset with all ACTIVE resource group names to which user has access
+"RTN","BSDX01",38,0)
+ ;based on entries in BSDX RESOURCE USER file (Say this again for myself: Groups ONLY!!)
+"RTN","BSDX01",39,0)
+ ;If BSDXDUZ=0 then returns all department names for current DUZ
+"RTN","BSDX01",40,0)
+    ;if not linked, always returned.
+"RTN","BSDX01",41,0)
+ ;If user BSDXDUZ possesses the key BSDXZMGR or XUPROGMODE
+"RTN","BSDX01",42,0)
+ ;then ALL resource group names are returned regardless of whether any active resources
+"RTN","BSDX01",43,0)
+ ;are associated with the group or not.
+"RTN","BSDX01",44,0)
+ ;
+"RTN","BSDX01",45,0)
+ ;
+"RTN","BSDX01",46,0)
+ N BSDXERR,BSDXRET,BSDXIEN,BSDXRES,BSDXDEP,BSDXDDR,BSDXDEPN,BSDXRDAT,BSDXRNOD,BSDXI
+"RTN","BSDX01",47,0)
+ N BSDXMGR,BSDXNOD
+"RTN","BSDX01",48,0)
+ K ^BSDXTEMP($J)
+"RTN","BSDX01",49,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",50,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",51,0)
+ S BSDXI=0
+"RTN","BSDX01",52,0)
+ S BSDXERR=""
+"RTN","BSDX01",53,0)
+ S ^BSDXTMP($J,BSDXI)="I00020RESOURCE_GROUPID^T00030RESOURCE_GROUP"_$C(30)
+"RTN","BSDX01",54,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",55,0)
+ ;Check SECURITY KEY file for BSDXZMGR or XUPROGMODE keys
+"RTN","BSDX01",56,0)
+ S BSDXMGR=$$APSEC("BSDXZMGR",BSDXDUZ)
+"RTN","BSDX01",57,0)
+ ;
+"RTN","BSDX01",58,0)
+ ;User does not have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",59,0)
+ ;$O THRU AC XREF OF BSDX RESOURCE USER
+"RTN","BSDX01",60,0)
+ I 'BSDXMGR,$D(^BSDXRSU("AC",BSDXDUZ)) S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRSU("AC",BSDXDUZ,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",61,0)
+ . S BSDXRES=$P(^BSDXRSU(BSDXIEN,0),U)
+"RTN","BSDX01",62,0)
+ . Q:'$D(^BSDXDEPT("AB",BSDXRES))  ; If not part of a group, quit ("AB" is the whole file index for the resource multiple in Group file)
+"RTN","BSDX01",63,0)
+    . ; Q:'$$INDIV2(BSDXRES)  ; If not in the same division as user, quit
+"RTN","BSDX01",64,0)
+ . S BSDXRNOD=^BSDXRES(BSDXRES,0)
+"RTN","BSDX01",65,0)
+ . ;QUIT if the resource is inactive
+"RTN","BSDX01",66,0)
+ . Q:$P(BSDXRNOD,U,2)=1
+"RTN","BSDX01",67,0)
+ . S BSDXDEP=0 F  S BSDXDEP=$O(^BSDXDEPT("AB",BSDXRES,BSDXDEP)) Q:'+BSDXDEP  D
+"RTN","BSDX01",68,0)
+ . . Q:'$D(^BSDXDEPT(BSDXDEP,0))
+"RTN","BSDX01",69,0)
+ . . Q:$D(^BSDXTEMP($J,BSDXDEP))
+"RTN","BSDX01",70,0)
+ . . S ^BSDXTEMP($J,BSDXDEP)=""
+"RTN","BSDX01",71,0)
+ . . S BSDXDEPN=$P(^BSDXDEPT(BSDXDEP,0),U)
+"RTN","BSDX01",72,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX01",73,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXDEP_U_BSDXDEPN_$C(30)
+"RTN","BSDX01",74,0)
+ . . Q
+"RTN","BSDX01",75,0)
+ . Q
+"RTN","BSDX01",76,0)
+ ;
+"RTN","BSDX01",77,0)
+ ;User does have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",78,0)
+ ;$O THRU BSDX RESOURCE GROUP file directly
+"RTN","BSDX01",79,0)
+ I BSDXMGR S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXDEPT(BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",80,0)
+ . Q:'$D(^BSDXDEPT(BSDXIEN,0))
+"RTN","BSDX01",81,0)
+ . S BSDXNOD=^BSDXDEPT(BSDXIEN,0)
+"RTN","BSDX01",82,0)
+ . S BSDXDEPN=$P(BSDXNOD,U)
+"RTN","BSDX01",83,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX01",84,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXDEPN_$C(30)
+"RTN","BSDX01",85,0)
+ . Q
+"RTN","BSDX01",86,0)
+ ;
+"RTN","BSDX01",87,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",88,0)
+ Q
+"RTN","BSDX01",89,0)
+ ;
+"RTN","BSDX01",90,0)
+ ;
+"RTN","BSDX01",91,0)
+RESUSRD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",92,0)
+ ;
+"RTN","BSDX01",93,0)
+ ;
+"RTN","BSDX01",94,0)
+ ;D DEBUG^%Serenji("RESUSR^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",95,0)
+ ;
+"RTN","BSDX01",96,0)
+ Q
+"RTN","BSDX01",97,0)
+ ;
+"RTN","BSDX01",98,0)
+RESUSR(BSDXY,BSDXDUZ) ;EP
+"RTN","BSDX01",99,0)
+ ;Returns ADO Recordset with ALL RESOURCE names
+"RTN","BSDX01",100,0)
+ ;Inactive RESOURCES are NOT filtered out
+"RTN","BSDX01",101,0)
+ ;Called by BSDX RESOURCES BY USER
+"RTN","BSDX01",102,0)
+ ;
+"RTN","BSDX01",103,0)
+ N BSDXERR,BSDXRET,BSDXIEN,BSDXRES,BSDXDEP,BSDXDDR,BSDXDEPN,BSDXRDAT,BSDXRNOD,BSDXI,BSDX,BSDXLTR
+"RTN","BSDX01",104,0)
+ N BSDXNOS,BSDXCAN
+"RTN","BSDX01",105,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",106,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",107,0)
+ S BSDXI=0
+"RTN","BSDX01",108,0)
+ S BSDXERR=""
+"RTN","BSDX01",109,0)
+ S ^BSDXTMP($J,BSDXI)="I00010RESOURCEID^T00030RESOURCE_NAME^T00010INACTIVE^I00010TIMESCALE^I00010HOSPITAL_LOCATION_ID^T00030LETTER_TEXT^T00030NO_SHOW_LETTER"
+"RTN","BSDX01",110,0)
+ S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^T00030CLINIC_CANCELLATION_LETTER^I00010VIEW^I00010OVERBOOK^I00010MODIFY_SCHEDULE^I00010MODIFY_APPOINTMENTS"_$C(30)
+"RTN","BSDX01",111,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",112,0)
+ ;$O THRU AC XREF OF BSDX RESOURCE USER
+"RTN","BSDX01",113,0)
+ ;Rmoved these lines in order to just return all resource names
+"RTN","BSDX01",114,0)
+ ;I $D(^BSDXRSU("AC",BSDXDUZ)) S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRSU("AC",BSDXDUZ,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",115,0)
+ ;. S BSDXRES=$P(^BSDXRSU(BSDXIEN,0),U)
+"RTN","BSDX01",116,0)
+ ;
+"RTN","BSDX01",117,0)
+ ;$O THRU BSDX RESOURCE File
+"RTN","BSDX01",118,0)
+ S BSDXRES=0 F  S BSDXRES=$O(^BSDXRES(BSDXRES)) Q:'+BSDXRES  D
+"RTN","BSDX01",119,0)
+ . Q:'$D(^BSDXRES(BSDXRES,0))
+"RTN","BSDX01",120,0)
+ . S BSDXRNOD=^BSDXRES(BSDXRES,0)
+"RTN","BSDX01",121,0)
+ . N BSDXSC S BSDXSC=$P(BSDXRNOD,U,4)  ; Hospital Location
+"RTN","BSDX01",122,0)
+    . ;Q:$P(BSDXRNOD,U,2)=1  ;Inactive resources not filtered
+"RTN","BSDX01",123,0)
+ . ;S BSDXRDAT=$P(BSDXRNOD,U,1,4)
+"RTN","BSDX01",124,0)
+ . ;I '$$INDIV(BSDXSC) QUIT  ; If not in division, quit
+"RTN","BSDX01",125,0)
+    . K BSDXRDAT
+"RTN","BSDX01",126,0)
+ . F BSDX=1:1:4 S $P(BSDXRDAT,U,BSDX)=$P(BSDXRNOD,U,BSDX)
+"RTN","BSDX01",127,0)
+ . S BSDXRDAT=BSDXRES_U_BSDXRDAT
+"RTN","BSDX01",128,0)
+ . ;Get letter text from wp field
+"RTN","BSDX01",129,0)
+ . S BSDXLTR=""
+"RTN","BSDX01",130,0)
+ . I $D(^BSDXRES(BSDXRES,1)) D
+"RTN","BSDX01",131,0)
+ . . S BSDXIEN=0
+"RTN","BSDX01",132,0)
+ . . F  S BSDXIEN=$O(^BSDXRES(BSDXRES,1,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",133,0)
+ . . . S BSDXLTR=BSDXLTR_$G(^BSDXRES(BSDXRES,1,BSDXIEN,0))
+"RTN","BSDX01",134,0)
+ . . . S BSDXLTR=BSDXLTR_$C(13)_$C(10)
+"RTN","BSDX01",135,0)
+ . S BSDXNOS=""
+"RTN","BSDX01",136,0)
+ . I $D(^BSDXRES(BSDXRES,12)) D
+"RTN","BSDX01",137,0)
+ . . S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRES(BSDXRES,12,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",138,0)
+ . . . S BSDXNOS=BSDXNOS_$G(^BSDXRES(BSDXRES,12,BSDXIEN,0))
+"RTN","BSDX01",139,0)
+ . . . S BSDXNOS=BSDXNOS_$C(13)_$C(10)
+"RTN","BSDX01",140,0)
+ . S BSDXCAN=""
+"RTN","BSDX01",141,0)
+ . I $D(^BSDXRES(BSDXRES,13)) D
+"RTN","BSDX01",142,0)
+ . . S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRES(BSDXRES,13,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",143,0)
+ . . . S BSDXCAN=BSDXCAN_$G(^BSDXRES(BSDXRES,13,BSDXIEN,0))
+"RTN","BSDX01",144,0)
+ . . . S BSDXCAN=BSDXCAN_$C(13)_$C(10)
+"RTN","BSDX01",145,0)
+ . N BSDXACC,BSDXMGR
+"RTN","BSDX01",146,0)
+ . S BSDXACC="0^0^0^0"
+"RTN","BSDX01",147,0)
+ . S BSDXMGR=$O(^DIC(19.1,"B","BSDXZMGR",0))
+"RTN","BSDX01",148,0)
+ . I +BSDXMGR,$D(^VA(200,BSDXDUZ,51,BSDXMGR)) S BSDXACC="1^1^1^1"
+"RTN","BSDX01",149,0)
+ . S BSDXMGR=$O(^DIC(19.1,"B","XUPROGMODE",0))
+"RTN","BSDX01",150,0)
+ . I +BSDXMGR,$D(^VA(200,BSDXDUZ,51,BSDXMGR)) S BSDXACC="1^1^1^1"
+"RTN","BSDX01",151,0)
+ . I BSDXACC="0^0^0^0" D
+"RTN","BSDX01",152,0)
+ . . N BSDXNOD,BSDXRUID
+"RTN","BSDX01",153,0)
+ . . S BSDXRUID=0
+"RTN","BSDX01",154,0)
+ . . ;Get entry for this user and resource
+"RTN","BSDX01",155,0)
+ . . F  S BSDXRUID=$O(^BSDXRSU("AC",BSDXDUZ,BSDXRUID)) Q:'+BSDXRUID  I $D(^BSDXRSU(BSDXRUID,0)),$P(^(0),U)=BSDXRES Q
+"RTN","BSDX01",156,0)
+ . . Q:'+BSDXRUID
+"RTN","BSDX01",157,0)
+ . . S $P(BSDXACC,U)=1
+"RTN","BSDX01",158,0)
+ . . S BSDXNOD=$G(^BSDXRSU(BSDXRUID,0))
+"RTN","BSDX01",159,0)
+ . . S $P(BSDXACC,U,2)=+$P(BSDXNOD,U,3)
+"RTN","BSDX01",160,0)
+ . . S $P(BSDXACC,U,3)=+$P(BSDXNOD,U,4)
+"RTN","BSDX01",161,0)
+ . . S $P(BSDXACC,U,4)=+$P(BSDXNOD,U,5)
+"RTN","BSDX01",162,0)
+ . S BSDXRDAT=BSDXRDAT_U_BSDXLTR_U_BSDXNOS_U_BSDXCAN_U_BSDXACC
+"RTN","BSDX01",163,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX01",164,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXRDAT_$C(30)
+"RTN","BSDX01",165,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",166,0)
+ Q
+"RTN","BSDX01",167,0)
+ ;
+"RTN","BSDX01",168,0)
+DEPRESD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",169,0)
+ ;
+"RTN","BSDX01",170,0)
+ ;
+"RTN","BSDX01",171,0)
+ ;D DEBUG^%Serenji("DEPRES^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",172,0)
+ ;
+"RTN","BSDX01",173,0)
+ Q
+"RTN","BSDX01",174,0)
+ ;
+"RTN","BSDX01",175,0)
+DEPRES(BSDXY,BSDXDUZ) ;EP
+"RTN","BSDX01",176,0)
+ ;Called by BSDX GROUP RESOURCE
+"RTN","BSDX01",177,0)
+ ;Returns ADO Recordset with all ACTIVE GROUP/RESOURCE combinations
+"RTN","BSDX01",178,0)
+ ;to which user has access based on entries in BSDX RESOURCE USER file
+"RTN","BSDX01",179,0)
+ ;If BSDXDUZ=0 then returns all ACTIVE GROUP/RESOURCE combinations for current DUZ
+"RTN","BSDX01",180,0)
+ ;If user BSDXDUZ possesses the key BSDXZMGR or XUPROGMODE
+"RTN","BSDX01",181,0)
+ ;then ALL ACTIVE resource group names are returned
+"RTN","BSDX01",182,0)
+ ;
+"RTN","BSDX01",183,0)
+ N BSDXERR,BSDXRET,BSDXIEN,BSDXRES,BSDXDEP,BSDXDDR,BSDXDEPN,BSDXRDAT,BSDXRNOD,BSDXI
+"RTN","BSDX01",184,0)
+ N BSDXRESN,BSDXMGR,BSDXRESD,BSDXNOD,BSDXSUBID
+"RTN","BSDX01",185,0)
+ K ^BSDXTEMP($J)
+"RTN","BSDX01",186,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",187,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",188,0)
+ S BSDXI=0
+"RTN","BSDX01",189,0)
+ S BSDXERR=""
+"RTN","BSDX01",190,0)
+ S ^BSDXTMP($J,BSDXI)="I00020RESOURCE_GROUPID^T00030RESOURCE_GROUP^I00020RESOURCE_GROUP_ITEMID^T00030RESOURCE_NAME^I00020RESOURCEID"_$C(30)
+"RTN","BSDX01",191,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",192,0)
+ ;Check SECURITY KEY file for BSDXZMGR or XUPROGMODE keys
+"RTN","BSDX01",193,0)
+ S BSDXMGR=$$APSEC("BSDXZMGR",BSDXDUZ)
+"RTN","BSDX01",194,0)
+ ;
+"RTN","BSDX01",195,0)
+ ;User does not have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",196,0)
+ ;$O THRU AC XREF OF BSDX RESOURCE USER
+"RTN","BSDX01",197,0)
+ I 'BSDXMGR,$D(^BSDXRSU("AC",BSDXDUZ))  S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRSU("AC",BSDXDUZ,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",198,0)
+ . S BSDXRES=$P(^BSDXRSU(BSDXIEN,0),U)
+"RTN","BSDX01",199,0)
+ . Q:'$D(^BSDXDEPT("AB",BSDXRES))  ; Quit if Resource isn't part of any Group
+"RTN","BSDX01",200,0)
+    . ;Q:'$$INDIV2(BSDXRES)  ; Quit if Resource isn't in same division as user.
+"RTN","BSDX01",201,0)
+ . S BSDXRNOD=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX01",202,0)
+ . Q:BSDXRNOD=""
+"RTN","BSDX01",203,0)
+ . ;QUIT if the resource is inactive
+"RTN","BSDX01",204,0)
+ . Q:$P(BSDXRNOD,U,2)=1
+"RTN","BSDX01",205,0)
+ . S BSDXRESN=$P(BSDXRNOD,U)
+"RTN","BSDX01",206,0)
+ . S BSDXDEP=0 F  S BSDXDEP=$O(^BSDXDEPT("AB",BSDXRES,BSDXDEP)) Q:'+BSDXDEP  D
+"RTN","BSDX01",207,0)
+ . . Q:'$D(^BSDXDEPT(BSDXDEP,0))
+"RTN","BSDX01",208,0)
+ . . S BSDXDEPN=$P(^BSDXDEPT(BSDXDEP,0),U)
+"RTN","BSDX01",209,0)
+ . . S BSDXSUBID=$O(^BSDXDEPT(BSDXDEP,1,"B",BSDXRES,0))
+"RTN","BSDX01",210,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX01",211,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXDEP_U_BSDXDEPN_U_BSDXSUBID_U_BSDXRESN_U_BSDXRES_$C(30)
+"RTN","BSDX01",212,0)
+ . Q
+"RTN","BSDX01",213,0)
+ ;
+"RTN","BSDX01",214,0)
+ ;User does have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",215,0)
+ ;$O THRU BSDX RESOURCE GROUP file directly
+"RTN","BSDX01",216,0)
+ I BSDXMGR S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXDEPT(BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",217,0)
+ . Q:'$D(^BSDXDEPT(BSDXIEN,0))
+"RTN","BSDX01",218,0)
+ . S BSDXNOD=^BSDXDEPT(BSDXIEN,0)
+"RTN","BSDX01",219,0)
+ . S BSDXDEPN=$P(BSDXNOD,U)
+"RTN","BSDX01",220,0)
+ . S BSDXRES=0 F  S BSDXRES=$O(^BSDXDEPT(BSDXIEN,1,BSDXRES)) Q:'+BSDXRES  D
+"RTN","BSDX01",221,0)
+ . . N BSDXRESD
+"RTN","BSDX01",222,0)
+ . . Q:'$D(^BSDXDEPT(BSDXIEN,1,BSDXRES,0))  ; Quit if zero node is invalid in multiple
+"RTN","BSDX01",223,0)
+ . . S BSDXRESD=$P(^BSDXDEPT(BSDXIEN,1,BSDXRES,0),"^")
+"RTN","BSDX01",224,0)
+ . . Q:'$D(^BSDXRES(BSDXRESD,0))  ; Quit if zero node of resouce file is invalid
+"RTN","BSDX01",225,0)
+    . . ;Q:'$$INDIV2(BSDXRESD)  ; Quit if resource is not in the same division
+"RTN","BSDX01",226,0)
+ . . S BSDXRNOD=$G(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX01",227,0)
+ . . Q:BSDXRNOD=""
+"RTN","BSDX01",228,0)
+ . . ;QUIT if the resource is inactive
+"RTN","BSDX01",229,0)
+ . . Q:$P(BSDXRNOD,U,2)=1
+"RTN","BSDX01",230,0)
+ . . S BSDXRESN=$P(BSDXRNOD,U)
+"RTN","BSDX01",231,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX01",232,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXDEPN_U_BSDXRES_U_BSDXRESN_U_BSDXRESD_$C(30)
+"RTN","BSDX01",233,0)
+ . . Q
+"RTN","BSDX01",234,0)
+ . Q
+"RTN","BSDX01",235,0)
+ ;
+"RTN","BSDX01",236,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",237,0)
+ Q
+"RTN","BSDX01",238,0)
+ ;
+"RTN","BSDX01",239,0)
+APSEC(BSDXKEY,BSDXDUZ) ;EP - Return TRUE (1) if user has keys BSDXKEY or XUPROGMODE, otherwise, returns FALSE (0)
+"RTN","BSDX01",240,0)
+ ;
+"RTN","BSDX01",241,0)
+ N BSDXIEN,BSDXPROG,BSDXPKEY
+"RTN","BSDX01",242,0)
+ I '$G(BSDXDUZ) Q 0
+"RTN","BSDX01",243,0)
+ ;
+"RTN","BSDX01",244,0)
+ ;Test for programmer mode key
+"RTN","BSDX01",245,0)
+ S BSDXPROG=0
+"RTN","BSDX01",246,0)
+ I $D(^DIC(19.1,"B","XUPROGMODE")) D
+"RTN","BSDX01",247,0)
+ . S BSDXPKEY=$O(^DIC(19.1,"B","XUPROGMODE",0))
+"RTN","BSDX01",248,0)
+ . I '+BSDXPKEY Q
+"RTN","BSDX01",249,0)
+ . I '$D(^VA(200,BSDXDUZ,51,BSDXPKEY,0)) Q
+"RTN","BSDX01",250,0)
+ . S BSDXPROG=1
+"RTN","BSDX01",251,0)
+ I BSDXPROG Q 1
+"RTN","BSDX01",252,0)
+ ;
+"RTN","BSDX01",253,0)
+ I BSDXKEY="" Q 0
+"RTN","BSDX01",254,0)
+ I '$D(^DIC(19.1,"B",BSDXKEY)) Q 0
+"RTN","BSDX01",255,0)
+ S BSDXIEN=$O(^DIC(19.1,"B",BSDXKEY,0))
+"RTN","BSDX01",256,0)
+ I '+BSDXIEN Q 0
+"RTN","BSDX01",257,0)
+ I '$D(^VA(200,BSDXDUZ,51,BSDXIEN,0)) Q 0
+"RTN","BSDX01",258,0)
+ Q 1
+"RTN","BSDX01",259,0)
+INDIV(BSDXSC) ; PEP - Is ^SC clinic in the same DUZ(2) as user?
+"RTN","BSDX01",260,0)
+    ; Input: BSDXSC - Hospital Location IEN
+"RTN","BSDX01",261,0)
+    ; Output: True or False
+"RTN","BSDX01",262,0)
+    I '+BSDXSC QUIT 1  ;If not tied to clinic, yes
+"RTN","BSDX01",263,0)
+    I '$D(^SC(BSDXSC,0)) QUIT 1 ; If Clinic does not exist, yes
+"RTN","BSDX01",264,0)
+    ; Jump to Division:Medical Center Division:Inst File Pointer for
+"RTN","BSDX01",265,0)
+    ; Institution IEN (and get its internal value)
+"RTN","BSDX01",266,0)
+    N DIV S DIV=$$GET1^DIQ(44,BSDXSC_",","3.5:.07","I")
+"RTN","BSDX01",267,0)
+    I DIV="" Q 1 ; If clinic has no division, consider it avial to user.
+"RTN","BSDX01",268,0)
+    I DIV=DUZ(2) Q 1 ; If same, then User is in same Div as Clinic
+"RTN","BSDX01",269,0)
+    E  Q 0 ; Otherwise, no
+"RTN","BSDX01",270,0)
+    QUIT
+"RTN","BSDX01",271,0)
+INDIV2(BSDXRES) ; PEP - Is Resource in the same DUZ(2) as user?
+"RTN","BSDX01",272,0)
+    ; Input BSDXRES - BSDX RESOURCE IEN
+"RTN","BSDX01",273,0)
+    ; Output: True of False
+"RTN","BSDX01",274,0)
+    Q $$INDIV($P($G(^BSDXRES(BSDXRES,0)),U,4)) ; Extract Hospital Location and send to $$INDIV
+"RTN","BSDX01",275,0)
+UnitTestINDIV 
+"RTN","BSDX01",276,0)
+    W "Testing if they are the same",!
+"RTN","BSDX01",277,0)
+    S DUZ(2)=67
+"RTN","BSDX01",278,0)
+    I '$$INDIV(1) W "ERROR",!
+"RTN","BSDX01",279,0)
+    I '$$INDIV(2) W "ERROR",!
+"RTN","BSDX01",280,0)
+    W "Testing if Div not defined in 44, should be true",!
+"RTN","BSDX01",281,0)
+    I '$$INDIV(3) W "ERROR",!
+"RTN","BSDX01",282,0)
+    W "Testing empty string. Should be true",!
+"RTN","BSDX01",283,0)
+    I '$$INDIV("") W "ERROR",!
+"RTN","BSDX01",284,0)
+    W "Testing if they are different",!
+"RTN","BSDX01",285,0)
+    S DUZ(2)=899
+"RTN","BSDX01",286,0)
+    I $$INDIV(1) W "ERROR",!
+"RTN","BSDX01",287,0)
+    I $$INDIV(2) W "ERROR",!
+"RTN","BSDX01",288,0)
+    QUIT
+"RTN","BSDX01",289,0)
+UnitTestINDIV2 
+"RTN","BSDX01",290,0)
+    W "Testing if they are the same",!
+"RTN","BSDX01",291,0)
+    S DUZ(2)=69
+"RTN","BSDX01",292,0)
+    I $$INDIV2(22)'=0 W "ERROR",!
+"RTN","BSDX01",293,0)
+    I $$INDIV2(25)'=1 W "ERROR",!
+"RTN","BSDX01",294,0)
+    I $$INDIV2(26)'=1 W "ERROR",!
+"RTN","BSDX01",295,0)
+    I $$INDIV2(27)'=1 W "ERROR",!
+"RTN","BSDX01",296,0)
+    QUIT
+"RTN","BSDX02")
+0^2^B16323271
+"RTN","BSDX02",1,0)
+BSDX02 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 12:25pm
+"RTN","BSDX02",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX02",3,0)
+    ; 
+"RTN","BSDX02",4,0)
+    ; Change Log
+"RTN","BSDX02",5,0)
+    ; July 15 2010: UJO/SMH - Pass FM dates in instead of US dates for i18n
+"RTN","BSDX02",6,0)
+ ;
+"RTN","BSDX02",7,0)
+ ;
+"RTN","BSDX02",8,0)
+CRSCHD(BSDXY,BSDXRES,BSDXSTART,BSDXEND) ;EP
+"RTN","BSDX02",9,0)
+ ;Entry point for debugging
+"RTN","BSDX02",10,0)
+ ;
+"RTN","BSDX02",11,0)
+ ;D DEBUG^%Serenji("CRSCH^BSDX02(.BSDXY,BSDXRES,BSDXSTART,BSDXEND)")
+"RTN","BSDX02",12,0)
+ Q
+"RTN","BSDX02",13,0)
+ ;
+"RTN","BSDX02",14,0)
+CRSCH(BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXWKIN)     ;
+"RTN","BSDX02",15,0)
+ ;Called by BSDX CREATE APPT SCHEDULE
+"RTN","BSDX02",16,0)
+ ;Create Resource Appointment Schedule recordset
+"RTN","BSDX02",17,0)
+ ;On error, returns 0 in APPOINTMENTID field and error text in NOTE field
+"RTN","BSDX02",18,0)
+ ;
+"RTN","BSDX02",19,0)
+ ;$O Thru ^BSDXAPPT("ARSRC", RESOURCE, STARTTIME, APPTID)
+"RTN","BSDX02",20,0)
+ ;BMXRES is a | delimited list of resource names
+"RTN","BSDX02",21,0)
+ ;BSDXWKIN - If 1, then return walkins, otherwise skip them
+"RTN","BSDX02",22,0)
+ ;9-27-2004 Added walkin to returned datatable
+"RTN","BSDX02",23,0)
+ ;TODO: Change BSDXRES from names to IDs
+"RTN","BSDX02",24,0)
+ ;
+"RTN","BSDX02",25,0)
+ N BSDXERR,BSDXIEN,BSDXDEPD,BSDXDEPN,BSDXRESD,BSDXI,BSDXJ,BSDXRESN,BSDXS,BSDXAD,BSDXZ,BSDXQ,BSDXNOD
+"RTN","BSDX02",26,0)
+ N BSDXPAT,BSDXNOT,BSDXZPCD,BSDXPCD
+"RTN","BSDX02",27,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX02",28,0)
+ S BSDXERR=""
+"RTN","BSDX02",29,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX02",30,0)
+ S ^BSDXTMP($J,0)="I00020APPOINTMENTID^D00030START_TIME^D00030END_TIME^D00030CHECKIN^D00030AUXTIME^I00020PATIENTID^T00030PATIENTNAME^T00030RESOURCENAME^I00005NOSHOW^T00020HRN^I00005ACCESSTYPEID^I00005WALKIN^T00250NOTE"_$C(30)
+"RTN","BSDX02",31,0)
+ D ^XBKVAR S X="ETRAP^BSDX02",@^%ZOSF("TRAP")
+"RTN","BSDX02",32,0)
+ ;
+"RTN","BSDX02",33,0)
+ ; S %DT="T",X=BSDXSTART D ^%DT S BSDXSTART=Y
+"RTN","BSDX02",34,0)
+ ; I BSDXSTART=-1 S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX02",35,0)
+ ; S %DT="T",X=BSDXEND D ^%DT S BSDXEND=Y
+"RTN","BSDX02",36,0)
+ ; I BSDXEND=-1 S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX02",37,0)
+    ;
+"RTN","BSDX02",38,0)
+ S BSDXI=0
+"RTN","BSDX02",39,0)
+ D STRES
+"RTN","BSDX02",40,0)
+ ;
+"RTN","BSDX02",41,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",42,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX02",43,0)
+ Q
+"RTN","BSDX02",44,0)
+ ;
+"RTN","BSDX02",45,0)
+STRES ;
+"RTN","BSDX02",46,0)
+ F BSDXJ=1:1:$L(BSDXRES,"|") S BSDXRESN=$P(BSDXRES,"|",BSDXJ) D
+"RTN","BSDX02",47,0)
+ . Q:BSDXRESN=""
+"RTN","BSDX02",48,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX02",49,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX02",50,0)
+ . Q:'+BSDXRESD
+"RTN","BSDX02",51,0)
+ . Q:'$D(^BSDXAPPT("ARSRC",BSDXRESD))
+"RTN","BSDX02",52,0)
+ . S BSDXS=BSDXSTART-.0001
+"RTN","BSDX02",53,0)
+ . F  S BSDXS=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX02",54,0)
+ . . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D STCOMM(BSDXAD,BSDXRESN)
+"RTN","BSDX02",55,0)
+ Q
+"RTN","BSDX02",56,0)
+ ;
+"RTN","BSDX02",57,0)
+STCOMM(BSDXAD,BSDXRESN)      ;
+"RTN","BSDX02",58,0)
+ ;BSDXAD is the appointment IEN
+"RTN","BSDX02",59,0)
+ N BSDXC,BSDXQ,BSDXZ,BSDXSUBC,BSDXHRN,BSDXPATD,BSDXATID,BSDXISWK
+"RTN","BSDX02",60,0)
+ Q:'$D(^BSDXAPPT(BSDXAD,0))
+"RTN","BSDX02",61,0)
+ S BSDXNOD=^BSDXAPPT(BSDXAD,0)
+"RTN","BSDX02",62,0)
+ Q:$P(BSDXNOD,U,12)]""  ;CANCELLED
+"RTN","BSDX02",63,0)
+ S BSDXISWK=0
+"RTN","BSDX02",64,0)
+ S:$P(BSDXNOD,U,13)="y" BSDXISWK=1
+"RTN","BSDX02",65,0)
+ I +$G(BSDXWKIN) Q:BSDXISWK  ;Don't return walkins if appt is WALKIN and BSDXWKIN is 1
+"RTN","BSDX02",66,0)
+ S BSDXZ=BSDXAD_"^"
+"RTN","BSDX02",67,0)
+ F BSDXQ=1:1:4 D
+"RTN","BSDX02",68,0)
+ . S Y=$P(BSDXNOD,U,BSDXQ)
+"RTN","BSDX02",69,0)
+ . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX02",70,0)
+ . S BSDXZ=BSDXZ_Y_"^"
+"RTN","BSDX02",71,0)
+ S BSDXPATD=$P(BSDXNOD,U,5)
+"RTN","BSDX02",72,0)
+ S BSDXZ=BSDXZ_BSDXPATD_"^" ;PATIENT ID
+"RTN","BSDX02",73,0)
+ S BSDXPAT=""
+"RTN","BSDX02",74,0)
+ I BSDXPATD]"",$D(^DPT(BSDXPATD,0)) S BSDXPAT=$P(^DPT(BSDXPATD,0),U)
+"RTN","BSDX02",75,0)
+ S BSDXZ=BSDXZ_BSDXPAT_"^" ;PATIENT NAME
+"RTN","BSDX02",76,0)
+ S BSDXZ=BSDXZ_BSDXRESN_"^" ;RESOURCENAME
+"RTN","BSDX02",77,0)
+ S BSDXZ=BSDXZ_+$P(BSDXNOD,U,10)_"^" ;NOSHOW
+"RTN","BSDX02",78,0)
+ S BSDXHRN=""
+"RTN","BSDX02",79,0)
+ I $D(DUZ(2)),DUZ(2)>0 S BSDXHRN=$P($G(^AUPNPAT(BSDXPATD,41,DUZ(2),0)),U,2) ;HRN
+"RTN","BSDX02",80,0)
+ S BSDXZ=BSDXZ_BSDXHRN_"^"
+"RTN","BSDX02",81,0)
+ S BSDXATID=$P(BSDXNOD,U,6)
+"RTN","BSDX02",82,0)
+ S:'+BSDXATID BSDXATID=0 ;UNKNOWN TYPE
+"RTN","BSDX02",83,0)
+ S BSDXZ=BSDXZ_BSDXATID_"^"_BSDXISWK_"^"
+"RTN","BSDX02",84,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",85,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXZ
+"RTN","BSDX02",86,0)
+ ;NOTE
+"RTN","BSDX02",87,0)
+ S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXAD,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX02",88,0)
+ . S BSDXNOT=$G(^BSDXAPPT(BSDXAD,1,BSDXQ,0))
+"RTN","BSDX02",89,0)
+ . S:$E(BSDXNOT,$L(BSDXNOT)-1,$L(BSDXNOT))'=" " BSDXNOT=BSDXNOT_" "
+"RTN","BSDX02",90,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX02",91,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXNOT
+"RTN","BSDX02",92,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",93,0)
+ S ^BSDXTMP($J,BSDXI)=$C(30)
+"RTN","BSDX02",94,0)
+ Q
+"RTN","BSDX02",95,0)
+ ;
+"RTN","BSDX02",96,0)
+ERR(BSDXI,BSDXERR) ;Error processing
+"RTN","BSDX02",97,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",98,0)
+ S ^BSDXTMP($J,BSDXI)="0^^^^^^^^^^^"_BSDXERR_$C(30)
+"RTN","BSDX02",99,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",100,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX02",101,0)
+ Q
+"RTN","BSDX02",102,0)
+ ;
+"RTN","BSDX02",103,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX02",104,0)
+ D ^%ZTER
+"RTN","BSDX02",105,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX02",106,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",107,0)
+ D ERR(BSDXI,"BSDX31 Error: "_$G(%ZTERROR))
+"RTN","BSDX02",108,0)
+ Q
+"RTN","BSDX03")
+0^3^B2855259
+"RTN","BSDX03",1,0)
+BSDX03 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX03",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX03",3,0)
+ ;
+"RTN","BSDX03",4,0)
+ ;
+"RTN","BSDX03",5,0)
+ Q
+"RTN","BSDX03",6,0)
+ ;
+"RTN","BSDX03",7,0)
+XR2S(BSDXDA) ;EP
+"RTN","BSDX03",8,0)
+ ;XR2 is the ARSRC xref for the
+"RTN","BSDX03",9,0)
+ ;RESOURCE field of the BSDX APPOINTMENT file
+"RTN","BSDX03",10,0)
+ ;Format is ^BSDXAPPT("ARSRC",RESOURCEID,STARTTIME,APPTID)
+"RTN","BSDX03",11,0)
+ Q:'$D(^BSDXAPPT(BSDXDA,0))
+"RTN","BSDX03",12,0)
+ N BSDXNOD,BSDXAPPID,BSDXRSID,BSDXS
+"RTN","BSDX03",13,0)
+ S BSDXNOD=^BSDXAPPT(BSDXDA,0)
+"RTN","BSDX03",14,0)
+ S BSDXAPPID=BSDXDA
+"RTN","BSDX03",15,0)
+ S BSDXRSID=$P(BSDXNOD,U,7)
+"RTN","BSDX03",16,0)
+ Q:'+BSDXAPPID>0
+"RTN","BSDX03",17,0)
+ Q:'+BSDXRSID>0
+"RTN","BSDX03",18,0)
+ S BSDXS=$P(BSDXNOD,U)
+"RTN","BSDX03",19,0)
+ Q:'+BSDXS
+"RTN","BSDX03",20,0)
+ S ^BSDXAPPT("ARSRC",BSDXRSID,BSDXS,BSDXAPPID)=""
+"RTN","BSDX03",21,0)
+ Q
+"RTN","BSDX03",22,0)
+ ;
+"RTN","BSDX03",23,0)
+XR2K(BSDXA) ;EP
+"RTN","BSDX03",24,0)
+ Q:'$D(^BSDXAPPT(BSDXA,0))
+"RTN","BSDX03",25,0)
+ N BSDXNOD,BSDXAPPID,BSDXRSID,BSDXS
+"RTN","BSDX03",26,0)
+ S BSDXNOD=^BSDXAPPT(BSDXA,0)
+"RTN","BSDX03",27,0)
+ S BSDXAPPID=BSDXA
+"RTN","BSDX03",28,0)
+ S BSDXRSID=$P(BSDXNOD,U,7)
+"RTN","BSDX03",29,0)
+ S BSDXS=$P(BSDXNOD,U)
+"RTN","BSDX03",30,0)
+ Q:'+BSDXAPPID>0
+"RTN","BSDX03",31,0)
+ Q:'+BSDXRSID>0
+"RTN","BSDX03",32,0)
+ Q:'+BSDXS>0
+"RTN","BSDX03",33,0)
+ K ^BSDXAPPT("ARSRC",BSDXRSID,BSDXS,BSDXAPPID)
+"RTN","BSDX03",34,0)
+ Q
+"RTN","BSDX03",35,0)
+XR4S(BSDXDA) ;EP
+"RTN","BSDX03",36,0)
+ ;XR4 is the ARSCT xref for the
+"RTN","BSDX03",37,0)
+ ;STARTTIME field of the BSDX ACCESS BLOCK file
+"RTN","BSDX03",38,0)
+ ;Format is ^BSDXAB("ARSCT",RESOURCEID,STARTTIME,DA)
+"RTN","BSDX03",39,0)
+ Q:'$D(^BSDXAB(BSDXDA,0))
+"RTN","BSDX03",40,0)
+ N BSDXNOD,BSDXR,BSDXS
+"RTN","BSDX03",41,0)
+ S BSDXNOD=^BSDXAB(BSDXDA,0)
+"RTN","BSDX03",42,0)
+ S BSDXR=$P(BSDXNOD,U)
+"RTN","BSDX03",43,0)
+ S BSDXS=$P(BSDXNOD,U,2)
+"RTN","BSDX03",44,0)
+ Q:'+BSDXR>0
+"RTN","BSDX03",45,0)
+ Q:'+BSDXS>0
+"RTN","BSDX03",46,0)
+ S ^BSDXAB("ARSCT",BSDXR,BSDXS,BSDXDA)=""
+"RTN","BSDX03",47,0)
+ Q
+"RTN","BSDX03",48,0)
+ ;
+"RTN","BSDX03",49,0)
+XR4K(BSDXDA) ;EP
+"RTN","BSDX03",50,0)
+ Q:'$D(^BSDXAB(BSDXDA,0))
+"RTN","BSDX03",51,0)
+ N BSDXNOD,BSDXR,BSDXS
+"RTN","BSDX03",52,0)
+ S BSDXNOD=^BSDXAB(BSDXDA,0)
+"RTN","BSDX03",53,0)
+ S BSDXR=$P(BSDXNOD,U)
+"RTN","BSDX03",54,0)
+ S BSDXS=$P(BSDXNOD,U,2)
+"RTN","BSDX03",55,0)
+ Q:'+BSDXR>0
+"RTN","BSDX03",56,0)
+ Q:'+BSDXS>0
+"RTN","BSDX03",57,0)
+ K ^BSDXAB("ARSCT",BSDXR,BSDXS,BSDXDA)
+"RTN","BSDX03",58,0)
+ Q
+"RTN","BSDX04")
+0^4^B31079316
+"RTN","BSDX04",1,0)
+BSDX04 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;  ; 7/15/10 12:44pm
+"RTN","BSDX04",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX04",3,0)
+    ; Change Log:
+"RTN","BSDX04",4,0)
+    ; July 11 2010: Pass BSDXSTART and END as FM dates rather than US formatted dates
+"RTN","BSDX04",5,0)
+    ;       for i18n
+"RTN","BSDX04",6,0)
+ ;
+"RTN","BSDX04",7,0)
+ ;
+"RTN","BSDX04",8,0)
+CASSCHD(BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXTYPES,BSDXSRCH) ;EP
+"RTN","BSDX04",9,0)
+ ;
+"RTN","BSDX04",10,0)
+ ;D DEBUG^%Serenji("CASSCH^BSDX04(.BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXTYPES,BSDXSRCH)")
+"RTN","BSDX04",11,0)
+ ;
+"RTN","BSDX04",12,0)
+ Q
+"RTN","BSDX04",13,0)
+ ;
+"RTN","BSDX04",14,0)
+CASSET ;EP
+"RTN","BSDX04",15,0)
+ ;Error Trap
+"RTN","BSDX04",16,0)
+ D ^%ZTER
+"RTN","BSDX04",17,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=99999
+"RTN","BSDX04",18,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX04",19,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX04",20,0)
+ Q
+"RTN","BSDX04",21,0)
+ ;
+"RTN","BSDX04",22,0)
+CASSCH(BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXTYPES,BSDXSRCH) ;EP
+"RTN","BSDX04",23,0)
+ ;Called by BSDX CREATE ASGND SLOT SCHED
+"RTN","BSDX04",24,0)
+ ;Create Assigned Slot Schedule recordset
+"RTN","BSDX04",25,0)
+ ;This call is used both to create a schedule of availability for the calendar display
+"RTN","BSDX04",26,0)
+ ;and to search for availability in the Find Appointment function
+"RTN","BSDX04",27,0)
+ ;
+"RTN","BSDX04",28,0)
+ ;BSDXRES is resource name
+"RTN","BSDX04",29,0)
+    ;
+"RTN","BSDX04",30,0)
+    ;//smh
+"RTN","BSDX04",31,0)
+    ; BSDXSTART and BSDXEND both passed in FM Format.
+"RTN","BSDX04",32,0)
+    ; BSDXSTART is the Date Portion of FM Date
+"RTN","BSDX04",33,0)
+    ; BSDXEND -- pass date and h,m,s as well
+"RTN","BSDX04",34,0)
+    ;//smh
+"RTN","BSDX04",35,0)
+ ;
+"RTN","BSDX04",36,0)
+ ;BSDXTYPES is |-delimited list of Access Type Names
+"RTN","BSDX04",37,0)
+ ;If BSDXTYPES is "" then the screen passes all types.
+"RTN","BSDX04",38,0)
+ ;
+"RTN","BSDX04",39,0)
+ ;BSDXSRCH is |-delimited search info for the Find Appointment function
+"RTN","BSDX04",40,0)
+ ;First piece is 1 if we are in a Find Appointment call
+"RTN","BSDX04",41,0)
+ ;Second piece is weekday info in the format MTWHFSU
+"RTN","BSDX04",42,0)
+ ;Third piece is AM PM info in the form AP
+"RTN","BSDX04",43,0)
+ ;If 2nd or 3rd pieces are null, the screen for that piece is skipped
+"RTN","BSDX04",44,0)
+ ;
+"RTN","BSDX04",45,0)
+ ;Test lines:
+"RTN","BSDX04",46,0)
+ ;D CASSCH^BSDX04(.RES,"REMILLARD,MIKE","<fmdate>","<fmdate>") ZW RES
+"RTN","BSDX04",47,0)
+ ;BSDX CREATE ASGND SLOT SCHED^ROGERS,BUCK^<fmdate>^<fmdate>^2
+"RTN","BSDX04",48,0)
+ ;S ^HW("BSDX04")=BSDXRES_U_BSDXSTART_U_BSDXEND
+"RTN","BSDX04",49,0)
+ ;
+"RTN","BSDX04",50,0)
+ N BSDXERR,BSDXIEN,BSDXDEP,BSDXTYPED,BSDXTYPE,BSDXALO,BSDXBS,BSDXI,BSDXNEND,BSDXNSTART,BSDXPEND,BSDXRESD,BSDXRESN,BSDXS,BSDXZ,BSDXTMP,BSDXQ,BSDXNOT,BSDXNOD,BSDXAD
+"RTN","BSDX04",51,0)
+ N BSDXSUBCD
+"RTN","BSDX04",52,0)
+ S X="CASSET^BSDX04",@^%ZOSF("TRAP")
+"RTN","BSDX04",53,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX04",54,0)
+ S BSDXERR=""
+"RTN","BSDX04",55,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX04",56,0)
+ S ^BSDXTMP($J,0)="D00030START_TIME^D00030END_TIME^I00010SLOTS^T00030RESOURCE^T00010ACCESS_TYPE^T00250NOTE^I00030AVAILABILITYID"_$C(30)
+"RTN","BSDX04",57,0)
+ S BSDXALO=0,BSDXI=2
+"RTN","BSDX04",58,0)
+ ;
+"RTN","BSDX04",59,0)
+ ;Get Access Type IDs
+"RTN","BSDX04",60,0)
+ N BSDXK,BSDXTYPED,BSDXL
+"RTN","BSDX04",61,0)
+ I '+BSDXSRCH S BSDXTYPED=""
+"RTN","BSDX04",62,0)
+ I +BSDXSRCH F BSDXK=1:1:$L(BSDXTYPES,"|") D
+"RTN","BSDX04",63,0)
+ . S BSDXL=$P(BSDXTYPES,"|",BSDXK)
+"RTN","BSDX04",64,0)
+ . I BSDXL="" S $P(BSDXTYPED,"|",BSDXK)=0 Q
+"RTN","BSDX04",65,0)
+ . I '$D(^BSDXTYPE("B",BSDXL)) S $P(BSDXTYPED,"|",BSDXK)=0 Q
+"RTN","BSDX04",66,0)
+ . S $P(BSDXTYPED,"|",BSDXK)=$O(^BSDXTYPE("B",BSDXL,0))
+"RTN","BSDX04",67,0)
+ ;
+"RTN","BSDX04",68,0)
+ D
+"RTN","BSDX04",69,0)
+ . S BSDXBS=0
+"RTN","BSDX04",70,0)
+ . S BSDXRESN=BSDXRES
+"RTN","BSDX04",71,0)
+ . Q:BSDXRESN=""
+"RTN","BSDX04",72,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX04",73,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0)) Q:'+BSDXRESD
+"RTN","BSDX04",74,0)
+ . Q:'$D(^BSDXAB("ARSCT",BSDXRESD))
+"RTN","BSDX04",75,0)
+ . D STRES(BSDXRESN,BSDXRESD)
+"RTN","BSDX04",76,0)
+ . Q
+"RTN","BSDX04",77,0)
+ ;
+"RTN","BSDX04",78,0)
+ ;start, end, slots, resource, accesstype, note, availabilityid
+"RTN","BSDX04",79,0)
+ ;I '+BSDXSRCH,BSDXALO D
+"RTN","BSDX04",80,0)
+ I BSDXALO D
+"RTN","BSDX04",81,0)
+ . ;If first block start time > input start time then pad with new block
+"RTN","BSDX04",82,0)
+ . I BSDXBS>BSDXSTART K BSDXTMP D
+"RTN","BSDX04",83,0)
+ . . S Y=BSDXSTART X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",84,0)
+ . . S BSDXTMP=Y
+"RTN","BSDX04",85,0)
+ . . S Y=BSDXBS X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",86,0)
+ . . S BSDXTMP=BSDXTMP_"^"_Y_"^0^"_BSDXRESN_"^0^^0"_$C(30)
+"RTN","BSDX04",87,0)
+ . . S ^BSDXTMP($J,1)=BSDXTMP
+"RTN","BSDX04",88,0)
+ . ;
+"RTN","BSDX04",89,0)
+ . ;If first block start time < input start time then trim
+"RTN","BSDX04",90,0)
+ . I BSDXBS<BSDXSTART D
+"RTN","BSDX04",91,0)
+ . . S Y=BSDXSTART
+"RTN","BSDX04",92,0)
+ . . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",93,0)
+ . . S $P(^BSDXTMP($J,2),U,1)=Y
+"RTN","BSDX04",94,0)
+ . ;
+"RTN","BSDX04",95,0)
+ . ;If last block end time < input end time then pad end with new block
+"RTN","BSDX04",96,0)
+ . I BSDXPEND<BSDXEND D
+"RTN","BSDX04",97,0)
+ . . S Y=BSDXPEND X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",98,0)
+ . . S BSDXTMP=Y
+"RTN","BSDX04",99,0)
+ . . S Y=BSDXEND X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",100,0)
+ . . S BSDXTMP=BSDXTMP_"^"_Y_"^0^"_BSDXRESN_"^0^^0"_$C(30)
+"RTN","BSDX04",101,0)
+ . . S ^BSDXTMP($J,BSDXI-1)=BSDXTMP
+"RTN","BSDX04",102,0)
+ . ;
+"RTN","BSDX04",103,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX04",104,0)
+ Q
+"RTN","BSDX04",105,0)
+ ;
+"RTN","BSDX04",106,0)
+STRES(BSDXRESN,BSDXRESD) ;
+"RTN","BSDX04",107,0)
+ ;BSDXRESD is a Resource ID
+"RTN","BSDX04",108,0)
+ ;$O THRU "ARSCT" XREF OF ^BSDXAB
+"RTN","BSDX04",109,0)
+ S BSDXS=$P(BSDXSTART,"."),BSDXS=BSDXS-.0001
+"RTN","BSDX04",110,0)
+ S BSDXNEND=0,BSDXNSTART=0,BSDXPEND=0
+"RTN","BSDX04",111,0)
+ F  S BSDXS=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX04",112,0)
+ . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D STCOMM(BSDXRESN,BSDXRESD,BSDXS,BSDXAD) ;BSDXAD Is the AvailabilityID
+"RTN","BSDX04",113,0)
+ . Q
+"RTN","BSDX04",114,0)
+ Q
+"RTN","BSDX04",115,0)
+ ;
+"RTN","BSDX04",116,0)
+STCOMM(BSDXRESN,BSDXRESD,BSDXS,BSDXAD) ;
+"RTN","BSDX04",117,0)
+ N BSDXNSTART,BSDXNEND,BSDXNOD,Y,BSDXQ,BSDXZ,BSDXATID,BSDXATOK
+"RTN","BSDX04",118,0)
+ Q:'$D(^BSDXAB(BSDXAD,0))
+"RTN","BSDX04",119,0)
+ S BSDXNOD=^BSDXAB(BSDXAD,0)
+"RTN","BSDX04",120,0)
+ S BSDXATID=$P(BSDXNOD,U,5)
+"RTN","BSDX04",121,0)
+ ;
+"RTN","BSDX04",122,0)
+ ;Screen for Access Type
+"RTN","BSDX04",123,0)
+ ;S BSDXATOK=0
+"RTN","BSDX04",124,0)
+ ;I BSDXTYPED="" S BSDXATOK=1
+"RTN","BSDX04",125,0)
+ ;E  D
+"RTN","BSDX04",126,0)
+ ;. F J=1:1:$L(BSDXTYPED,"|") I BSDXATID=$P(BSDXTYPED,"|",J) S BSDXATOK=1 Q
+"RTN","BSDX04",127,0)
+ ;Q:'BSDXATOK
+"RTN","BSDX04",128,0)
+ ;
+"RTN","BSDX04",129,0)
+ ;I +BSDXSRCH
+"RTN","BSDX04",130,0)
+ ;Screen for Weekday
+"RTN","BSDX04",131,0)
+ ;
+"RTN","BSDX04",132,0)
+ ;Screen for AM PM
+"RTN","BSDX04",133,0)
+ ;
+"RTN","BSDX04",134,0)
+ S BSDXZ=""
+"RTN","BSDX04",135,0)
+ S BSDXNSTART=$P(BSDXNOD,U,2)
+"RTN","BSDX04",136,0)
+ S BSDXNEND=$P(BSDXNOD,U,3)
+"RTN","BSDX04",137,0)
+ I BSDXNEND'>BSDXSTART Q  ;End is less than start
+"RTN","BSDX04",138,0)
+ I +BSDXBS=0 S BSDXBS=$P(BSDXNOD,U,2) ;First block start time
+"RTN","BSDX04",139,0)
+ F BSDXQ=2:1:3 D  ;Start and End times
+"RTN","BSDX04",140,0)
+ . S Y=$P(BSDXNOD,U,BSDXQ)
+"RTN","BSDX04",141,0)
+ . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",142,0)
+ . S BSDXZ=BSDXZ_Y_"^"
+"RTN","BSDX04",143,0)
+ S BSDXZ=BSDXZ_$P(BSDXNOD,U,4)_"^" ;SLOTS
+"RTN","BSDX04",144,0)
+ S BSDXZ=BSDXZ_BSDXRESN_"^" ;Resource name
+"RTN","BSDX04",145,0)
+ S BSDXZ=BSDXZ_BSDXATID_"^" ;Access type ID
+"RTN","BSDX04",146,0)
+ S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAB(BSDXAD,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX04",147,0)
+ . S BSDXNOT=BSDXNOT_$G(^BSDXAB(BSDXAD,1,BSDXQ,0))_" "
+"RTN","BSDX04",148,0)
+ S BSDXZ=BSDXZ_BSDXNOT ;_"^"
+"RTN","BSDX04",149,0)
+ ;I '+BSDXSRCH,BSDXPEND,BSDXNSTART>BSDXPEND D  ;Fill in gap between appointment
+"RTN","BSDX04",150,0)
+ I BSDXPEND,BSDXNSTART>BSDXPEND D  ;Fill in gap between appointment
+"RTN","BSDX04",151,0)
+ . S Y=BSDXPEND X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",152,0)
+ . S BSDXTMP=Y
+"RTN","BSDX04",153,0)
+ . S Y=BSDXNSTART X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",154,0)
+ . S BSDXTMP=BSDXTMP_"^"_Y_"^0^"_BSDXRESN_"^0^^0"_$C(30)
+"RTN","BSDX04",155,0)
+ . S ^BSDXTMP($J,BSDXI-1)=BSDXTMP
+"RTN","BSDX04",156,0)
+ S BSDXPEND=BSDXNEND
+"RTN","BSDX04",157,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXZ_"^"_BSDXAD_$C(30)
+"RTN","BSDX04",158,0)
+ S BSDXI=BSDXI+2
+"RTN","BSDX04",159,0)
+ S BSDXALO=1 ;At Least One record will be returned
+"RTN","BSDX04",160,0)
+ Q
+"RTN","BSDX05")
+0^5^B10878471
+"RTN","BSDX05",1,0)
+BSDX05  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 5:36pm
+"RTN","BSDX05",2,0)
+    ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX05",3,0)
+    ;
+"RTN","BSDX05",4,0)
+    ; Change Log:
+"RTN","BSDX05",5,0)
+    ; UJO/SMH - July 11 2010: pass FM Dates for Start and End rather than US Dates
+"RTN","BSDX05",6,0)
+    ; UJO/SMH - Dec 8 2010: In STCOMM, the logic was that an appointment 
+"RTN","BSDX05",7,0)
+    ;  that was a walk-in didn't count towards slot calculations.
+"RTN","BSDX05",8,0)
+    ;  I checked PIMS, and Walk-ins do indeed count towards slot calculations.
+"RTN","BSDX05",9,0)
+    ;  Therefore, I commented this line out:
+"RTN","BSDX05",10,0)
+    ;    ;Q:$P(BSDXNOD,U,13)="y"  ;WALKIN
+"RTN","BSDX05",11,0)
+    ;
+"RTN","BSDX05",12,0)
+APBLKOV(BSDXY,BSDXSTART,BSDXEND,BSDXRES)     ;EP
+"RTN","BSDX05",13,0)
+    ;Called by BSDX APPT BLOCKS OVERLAP
+"RTN","BSDX05",14,0)
+       ; July 11 2010 - pass FM Dates for Start and End rather than US Dates
+"RTN","BSDX05",15,0)
+    ;(Duplicates old qryAppointmentBlocksOverlapB)
+"RTN","BSDX05",16,0)
+    ;BSDXRES is resource name
+"RTN","BSDX05",17,0)
+    ;
+"RTN","BSDX05",18,0)
+    ;Test lines:
+"RTN","BSDX05",19,0)
+    ;D APBLKOV^BSDX05(.RES,"11-8-2000","11-8-2004","WHITT") ZW RES
+"RTN","BSDX05",20,0)
+    ;BSDX APPT BLOCKS OVERLAP^11-8-2000^11-8-2004^WHITT
+"RTN","BSDX05",21,0)
+    ;S ^HW("BSDXD05")=BSDXSTART_U_BSDXEND_U_BSDXRES
+"RTN","BSDX05",22,0)
+    ;
+"RTN","BSDX05",23,0)
+    N BSDXERR,BSDXIEN,BSDXDEP,BSDXBS,BSDXI,BSDXNEND,BSDXNSTART,BSDXPEND,BSDXRESD,BSDXRESN,BSDXS,BSDXAD,BSDXNOD
+"RTN","BSDX05",24,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX05",25,0)
+    S BSDXERR=""
+"RTN","BSDX05",26,0)
+    S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX05",27,0)
+    S ^BSDXTMP($J,0)="D00030START_TIME^D00030END_TIME"_$C(30)
+"RTN","BSDX05",28,0)
+    D
+"RTN","BSDX05",29,0)
+    . S BSDXBS=0
+"RTN","BSDX05",30,0)
+    . S BSDXEND=BSDXEND+.9999 ;Go to end of day
+"RTN","BSDX05",31,0)
+    . S BSDXRESN=BSDXRES
+"RTN","BSDX05",32,0)
+    . Q:BSDXRESN=""
+"RTN","BSDX05",33,0)
+    . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX05",34,0)
+    . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX05",35,0)
+    . Q:'+BSDXRESD
+"RTN","BSDX05",36,0)
+    . Q:'$D(^BSDXAPPT("ARSRC",BSDXRESD))
+"RTN","BSDX05",37,0)
+    . D STRES(BSDXRESD,BSDXSTART,BSDXEND)
+"RTN","BSDX05",38,0)
+    . Q
+"RTN","BSDX05",39,0)
+    ;
+"RTN","BSDX05",40,0)
+    S BSDXI=$G(BSDXI)+1
+"RTN","BSDX05",41,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX05",42,0)
+    Q
+"RTN","BSDX05",43,0)
+    ;
+"RTN","BSDX05",44,0)
+STRES(BSDXRESD,BSDXSTART,BSDXEND)   ;
+"RTN","BSDX05",45,0)
+    ;$O THRU "ARSRC" XREF OF ^BSDXAPPT
+"RTN","BSDX05",46,0)
+    ;Start at the beginning of the day -- appts can't overlap days
+"RTN","BSDX05",47,0)
+    S BSDXS=$P(BSDXSTART,"."),BSDXS=BSDXS-.0001
+"RTN","BSDX05",48,0)
+    S BSDXI=0
+"RTN","BSDX05",49,0)
+    F  S BSDXS=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX05",50,0)
+    . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D STCOMM(BSDXAD) ;BSDXAD Is the AppointmentID
+"RTN","BSDX05",51,0)
+    . Q
+"RTN","BSDX05",52,0)
+    Q
+"RTN","BSDX05",53,0)
+    ;
+"RTN","BSDX05",54,0)
+STCOMM(BSDXAD)  ;
+"RTN","BSDX05",55,0)
+    S BSDXNEND=0,BSDXNSTART=0,BSDXPEND=0
+"RTN","BSDX05",56,0)
+    Q:'$D(^BSDXAPPT(BSDXAD,0))
+"RTN","BSDX05",57,0)
+    S BSDXNOD=^BSDXAPPT(BSDXAD,0)
+"RTN","BSDX05",58,0)
+    Q:$P(BSDXNOD,U,10)=1  ;NO-SHOW Flag
+"RTN","BSDX05",59,0)
+    Q:$P(BSDXNOD,U,12)]""  ;CANCELLED APPT
+"RTN","BSDX05",60,0)
+    ; Q:$P(BSDXNOD,U,13)="y"  ;WALKIN -- new in V 1.42. See top comments.
+"RTN","BSDX05",61,0)
+    S BSDXNSTART=$P(BSDXNOD,U)
+"RTN","BSDX05",62,0)
+    S BSDXNEND=$P(BSDXNOD,U,2)
+"RTN","BSDX05",63,0)
+    I BSDXNEND'>BSDXSTART Q  ;End is less than start
+"RTN","BSDX05",64,0)
+    S Y=BSDXNSTART X ^DD("DD") S BSDXNSTART=$TR(Y,"@"," ")
+"RTN","BSDX05",65,0)
+    S Y=BSDXNEND X ^DD("DD") S BSDXNEND=$TR(Y,"@"," ")
+"RTN","BSDX05",66,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX05",67,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXNSTART_U_BSDXNEND_$C(30)
+"RTN","BSDX05",68,0)
+    Q
+"RTN","BSDX06")
+0^6^B6812445
+"RTN","BSDX06",1,0)
+BSDX06 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 4:51pm
+"RTN","BSDX06",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX06",3,0)
+    ; Change Log:
+"RTN","BSDX06",4,0)
+    ; UJO/SMH: July 15 2010: Change in BSDXSTART and BSDXEND: get
+"RTN","BSDX06",5,0)
+    ; dates in FM format for i18n
+"RTN","BSDX06",6,0)
+ ;
+"RTN","BSDX06",7,0)
+ ;
+"RTN","BSDX06",8,0)
+TPBLKOV(BSDXY,BSDXSTART,BSDXEND,BSDXRES)  ;EP
+"RTN","BSDX06",9,0)
+ ;Called by BSDXD TYPE BLOCKS OVERLAP
+"RTN","BSDX06",10,0)
+ ;(Duplicates old qryTypeBlocksOverlapB)
+"RTN","BSDX06",11,0)
+ ;BSDXRES is resource name
+"RTN","BSDX06",12,0)
+ ;
+"RTN","BSDX06",13,0)
+ ;Test lines:
+"RTN","BSDX06",14,0)
+ ;D TPBLKOV^BSDX06(.RES,"3030513","3030516","REMILLARD,MIKE") ZW RES
+"RTN","BSDX06",15,0)
+ ;BSDX TYPE BLOCKS OVERLAP^303513^3030516^REMILLARD,MIKE
+"RTN","BSDX06",16,0)
+ ;S ^HW("BSDXD06")=BSDXSTART_U_BSDXEND_U_BSDXRES
+"RTN","BSDX06",17,0)
+ ;
+"RTN","BSDX06",18,0)
+ N BSDXERR,BSDXIEN,BSDXDEP,BSDXBS,BSDXI,BSDXNEND,BSDXNSTART,BSDXPEND,BSDXRESD,BSDXRESN,BSDXS,BSDXTPID,BSDXNOD,BSDXAD
+"RTN","BSDX06",19,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX06",20,0)
+ S BSDXERR=""
+"RTN","BSDX06",21,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX06",22,0)
+ S ^BSDXTMP($J,0)="D00030StartTime^D00030EndTime^I00010AppointmentTypeID^I00010AvailabilityID^T00030ResourceName"_$C(30)
+"RTN","BSDX06",23,0)
+ S BSDXI=0
+"RTN","BSDX06",24,0)
+ D
+"RTN","BSDX06",25,0)
+ . S BSDXBS=0
+"RTN","BSDX06",26,0)
+ . I $L(BSDXEND,".")=1 S BSDXEND=BSDXEND+.9999 ;Go to end of day if only date (not time) is passed
+"RTN","BSDX06",27,0)
+ . S BSDXRESN=BSDXRES
+"RTN","BSDX06",28,0)
+ . Q:BSDXRESN=""
+"RTN","BSDX06",29,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX06",30,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX06",31,0)
+ . Q:'+BSDXRESD
+"RTN","BSDX06",32,0)
+ . D STCOMM(BSDXRESN,BSDXRESD)
+"RTN","BSDX06",33,0)
+ . Q
+"RTN","BSDX06",34,0)
+ ;
+"RTN","BSDX06",35,0)
+ S BSDXI=$G(BSDXI)+1
+"RTN","BSDX06",36,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX06",37,0)
+ Q
+"RTN","BSDX06",38,0)
+ ;
+"RTN","BSDX06",39,0)
+STCOMM(BSDXRESN,BSDXRESD) ;EP
+"RTN","BSDX06",40,0)
+ ;
+"RTN","BSDX06",41,0)
+ Q:'$D(^BSDXAB("ARSCT",BSDXRESD))
+"RTN","BSDX06",42,0)
+ Q:'$D(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX06",43,0)
+ ;$O THRU "ARSCT" XREF OF ^BSDXAB
+"RTN","BSDX06",44,0)
+ S BSDXNEND=0,BSDXNSTART=0,BSDXPEND=0
+"RTN","BSDX06",45,0)
+ ;Start at the beginning of the day -- AV Blocks can't overlap days
+"RTN","BSDX06",46,0)
+ S BSDXS=$P(BSDXSTART,"."),BSDXS=BSDXS-.0001
+"RTN","BSDX06",47,0)
+ F  S BSDXS=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX06",48,0)
+ . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D
+"RTN","BSDX06",49,0)
+ . . Q:'$D(^BSDXAB(BSDXAD,0))
+"RTN","BSDX06",50,0)
+ . . S BSDXNOD=^BSDXAB(BSDXAD,0)
+"RTN","BSDX06",51,0)
+ . . S BSDXNSTART=$P(BSDXNOD,U,2)
+"RTN","BSDX06",52,0)
+ . . S BSDXNEND=$P(BSDXNOD,U,3)
+"RTN","BSDX06",53,0)
+ . . I BSDXNEND'>BSDXSTART Q
+"RTN","BSDX06",54,0)
+ . . S Y=BSDXNSTART X ^DD("DD") S BSDXNSTART=$TR(Y,"@"," ")
+"RTN","BSDX06",55,0)
+ . . S Y=BSDXNEND X ^DD("DD") S BSDXNEND=$TR(Y,"@"," ")
+"RTN","BSDX06",56,0)
+ . . S BSDXTPID=$P(BSDXNOD,U,5)
+"RTN","BSDX06",57,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX06",58,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXNSTART_U_BSDXNEND_U_BSDXTPID_U_BSDXAD_U_BSDXRESN_$C(30)
+"RTN","BSDX06",59,0)
+ . . Q
+"RTN","BSDX06",60,0)
+ . Q
+"RTN","BSDX06",61,0)
+ Q
+"RTN","BSDX07")
+0^7^B188802132
+"RTN","BSDX07",1,0)
+BSDX07 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS  ; 1/26/11 11:29am
+"RTN","BSDX07",2,0)
+    ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX07",3,0)
+    ;
+"RTN","BSDX07",4,0)
+    ; Change Log:
+"RTN","BSDX07",5,0)
+    ; UJO/SMH
+"RTN","BSDX07",6,0)
+    ; v1.3 July 13 2010 - Add support i18n - Dates input as FM dates, not US.
+"RTN","BSDX07",7,0)
+    ; v1.42 Oct 22 2010 - Transaction now restartable by providing arguments
+"RTN","BSDX07",8,0)
+    ;   thanks to Rick Marshall and Zach Gonzalez at Oroville.
+"RTN","BSDX07",9,0)
+    ; v1.42 Oct 30 2010 - Extensive refactoring.
+"RTN","BSDX07",10,0)
+    ;
+"RTN","BSDX07",11,0)
+    ; Error Reference:
+"RTN","BSDX07",12,0)
+    ; -1: Patient Record is locked. This means something is wrong!!!!
+"RTN","BSDX07",13,0)
+    ; -2: Start Time is not a valid Fileman date
+"RTN","BSDX07",14,0)
+    ; -3: End Time is not a valid Fileman date
+"RTN","BSDX07",15,0)
+    ; -4: End Time does not have time inside of it.
+"RTN","BSDX07",16,0)
+    ; -5: BSDXPATID is not numeric
+"RTN","BSDX07",17,0)
+    ; -6: Patient Does not exist in ^DPT
+"RTN","BSDX07",18,0)
+    ; -7: Resource Name does not exist in B index of BSDX RESOURCE
+"RTN","BSDX07",19,0)
+    ; -8: Resouce doesn't exist in ^BSDXRES
+"RTN","BSDX07",20,0)
+    ; -9: Couldn't add appointment to BSDX APPOINTMENT
+"RTN","BSDX07",21,0)
+    ; -10: Couldn't add appointment to files 2 and/or 44
+"RTN","BSDX07",22,0)
+    ; -100: Mumps Error
+"RTN","BSDX07",23,0)
+ 
+"RTN","BSDX07",24,0)
+APPADDD(BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID)    ;EP
+"RTN","BSDX07",25,0)
+    ;Entry point for debugging
+"RTN","BSDX07",26,0)
+    D DEBUG^%Serenji("APPADD^BSDX07(.BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID)")
+"RTN","BSDX07",27,0)
+    Q
+"RTN","BSDX07",28,0)
+    ;
+"RTN","BSDX07",29,0)
+UT ; Unit Tests
+"RTN","BSDX07",30,0)
+    N ZZZ
+"RTN","BSDX07",31,0)
+    ; Test for bad start date
+"RTN","BSDX07",32,0)
+    D APPADD(.ZZZ,2100123,3100123.3,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",33,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-2 W "Error in -2",!
+"RTN","BSDX07",34,0)
+    ; Test for bad end date
+"RTN","BSDX07",35,0)
+    D APPADD(.ZZZ,3100123,2100123.3,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",36,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-3 W "Error in -3",!
+"RTN","BSDX07",37,0)
+    ; Test for end date without time
+"RTN","BSDX07",38,0)
+    D APPADD(.ZZZ,3100123.1,3100123,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",39,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-4 W "Error in -4",!
+"RTN","BSDX07",40,0)
+    ; Test for mumps error
+"RTN","BSDX07",41,0)
+    S bsdxdie=1
+"RTN","BSDX07",42,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",43,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-100 W "Error in -100: M Error",!
+"RTN","BSDX07",44,0)
+    K bsdxdie
+"RTN","BSDX07",45,0)
+    ; Test for TRESTART
+"RTN","BSDX07",46,0)
+    s bsdxrestart=1
+"RTN","BSDX07",47,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",48,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=0&(+$P(^BSDXTMP($J,1),U,2)'=-10) W "Error in TRESTART",!
+"RTN","BSDX07",49,0)
+    k bsdxrestart
+"RTN","BSDX07",50,0)
+    ; Test for non-numeric patient
+"RTN","BSDX07",51,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,"CAT,DOG","Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",52,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-5 W "Error in -5",!
+"RTN","BSDX07",53,0)
+    ; Test for a non-existent patient
+"RTN","BSDX07",54,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,8989898989,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",55,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-6 W "Error in -6",!
+"RTN","BSDX07",56,0)
+    ; Test for a non-existent resource name
+"RTN","BSDX07",57,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"lkajsflkjsadf",30,"Sam's Note",1)
+"RTN","BSDX07",58,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-7 W "Error in -7",!
+"RTN","BSDX07",59,0)
+    ; Test for corrupted resource
+"RTN","BSDX07",60,0)
+    ; Can't test for -8 since it requires DB corruption
+"RTN","BSDX07",61,0)
+    ; Test for inability to add appointment to BSDX Appointment
+"RTN","BSDX07",62,0)
+    ; Also requires something wrong in the DB
+"RTN","BSDX07",63,0)
+    ; Test for inability to add appointment to 2,44
+"RTN","BSDX07",64,0)
+    ; Test by creating a duplicate appointment
+"RTN","BSDX07",65,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",66,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",67,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-10 W "Error in -10",!
+"RTN","BSDX07",68,0)
+    ; Test for normality:
+"RTN","BSDX07",69,0)
+    D APPADD(.ZZZ,3110123.09,3110123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",70,0)
+    ; Does Appt exist?
+"RTN","BSDX07",71,0)
+    N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX07",72,0)
+    I 'APPID W "Error Making Appt-1" QUIT
+"RTN","BSDX07",73,0)
+    I +^BSDXAPPT(APPID,0)'=3110123.09 W "Error Making Appt-2"
+"RTN","BSDX07",74,0)
+    I '$D(^DPT(3,"S",3110123.09)) W "Error Making Appt-3"
+"RTN","BSDX07",75,0)
+    I '$D(^SC(2,"S",3110123.09)) W "Error Making Appt-4"
+"RTN","BSDX07",76,0)
+    QUIT
+"RTN","BSDX07",77,0)
+    ; 
+"RTN","BSDX07",78,0)
+APPADD(BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID) ;EP
+"RTN","BSDX07",79,0)
+    ;Called by RPC: BSDX ADD NEW APPOINTMENT
+"RTN","BSDX07",80,0)
+    ;
+"RTN","BSDX07",81,0)
+    ;Add new appointment to 3 files
+"RTN","BSDX07",82,0)
+    ; - BSDX APPOINTMENT
+"RTN","BSDX07",83,0)
+    ; - Hosp Location Appointment SubSubfile if Resource is linked to clinic
+"RTN","BSDX07",84,0)
+    ; - Patient Appointment Subfile if Resource is linked to clinic
+"RTN","BSDX07",85,0)
+    ;
+"RTN","BSDX07",86,0)
+    ;Paramters:
+"RTN","BSDX07",87,0)
+    ;BSDXY: Global Return (RPC must be set to Global Array)
+"RTN","BSDX07",88,0)
+    ;BSDXSTART: FM Start Date
+"RTN","BSDX07",89,0)
+    ;BSDXEND: FM End Date
+"RTN","BSDX07",90,0)
+    ;BSDXPATID: Patient DFN
+"RTN","BSDX07",91,0)
+    ;BSDXRES is ResourceName in BSDX RESOURCE file (not IEN)
+"RTN","BSDX07",92,0)
+    ;BSDXLEN is the appointment duration in minutes
+"RTN","BSDX07",93,0)
+    ;BSDXNOTE is the Appiontment Note
+"RTN","BSDX07",94,0)
+    ;BSDXATID is used for 2 purposes:
+"RTN","BSDX07",95,0)
+    ; if BSDXATID = "WALKIN" then BSDAPI is called to create a walkin appt.
+"RTN","BSDX07",96,0)
+    ; if BSDXATID = a number, then it is the access type id (used for rebooking)
+"RTN","BSDX07",97,0)
+    ;
+"RTN","BSDX07",98,0)
+    ;Return:
+"RTN","BSDX07",99,0)
+    ; ADO.net Recordset having fields:
+"RTN","BSDX07",100,0)
+    ; AppointmentID and ErrorNumber
+"RTN","BSDX07",101,0)
+    ;
+"RTN","BSDX07",102,0)
+    ;Test lines:
+"RTN","BSDX07",103,0)
+    ;BSDX ADD NEW APPOINTMENT^3091122.0930^3091122.1000^370^Dr Office^30^EXAM^WALKIN
+"RTN","BSDX07",104,0)
+    ;
+"RTN","BSDX07",105,0)
+    ; Return Array; set Return and clear array
+"RTN","BSDX07",106,0)
+    S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX07",107,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX07",108,0)
+    ; $ET
+"RTN","BSDX07",109,0)
+    N $ET S $ET="G ETRAP^BSDX07"
+"RTN","BSDX07",110,0)
+    ; Counter
+"RTN","BSDX07",111,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX07",112,0)
+    ; Lock BSDX node, only to synchronize access to the globals.
+"RTN","BSDX07",113,0)
+    ; It's not expected that the error will ever happen as no filing
+"RTN","BSDX07",114,0)
+    ; is supposed to take 5 seconds.
+"RTN","BSDX07",115,0)
+    L +^BSDXAPPT(BSDXPATID):5 I '$T D ERR(BSDXI,"-1~Patient record is locked. Please contact technical support.") Q
+"RTN","BSDX07",116,0)
+    ; Header Node
+"RTN","BSDX07",117,0)
+    S ^BSDXTMP($J,BSDXI)="I00020APPOINTMENTID^T00100ERRORID"_$C(30)
+"RTN","BSDX07",118,0)
+    ;Restartable Transaction; restore paramters when starting.
+"RTN","BSDX07",119,0)
+    ; (Params restored are what's passed here + BSDXI)
+"RTN","BSDX07",120,0)
+    TSTART (BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID,BSDXI):T="BSDX ADD NEW APPOINTMENT^BSDX07"
+"RTN","BSDX07",121,0)
+    ;
+"RTN","BSDX07",122,0)
+    ; Turn off SDAM APPT PROTOCOL BSDX Entries
+"RTN","BSDX07",123,0)
+    N BSDXNOEV
+"RTN","BSDX07",124,0)
+    S BSDXNOEV=1 ;Don't execute BSDX ADD APPOINTMENT protocol
+"RTN","BSDX07",125,0)
+    ;
+"RTN","BSDX07",126,0)
+    ; Set Error Message to be empty
+"RTN","BSDX07",127,0)
+    N BSDXERR S BSDXERR=0
+"RTN","BSDX07",128,0)
+    ;
+"RTN","BSDX07",129,0)
+    ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX07",130,0)
+    I $G(bsdxdie) S X=1/0
+"RTN","BSDX07",131,0)
+    ;;;test
+"RTN","BSDX07",132,0)
+    ;;;test for TRESTART
+"RTN","BSDX07",133,0)
+    I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX07",134,0)
+    ;;;test
+"RTN","BSDX07",135,0)
+    ;
+"RTN","BSDX07",136,0)
+    ; -- Start and End Date Processing --
+"RTN","BSDX07",137,0)
+    ; If C# sends the dates with extra zeros, remove them
+"RTN","BSDX07",138,0)
+    S BSDXSTART=+BSDXSTART,BSDXEND=+BSDXEND
+"RTN","BSDX07",139,0)
+    ; Are the dates valid? Must be FM Dates > than 2010
+"RTN","BSDX07",140,0)
+    I BSDXSTART'>3100000 D ERR(BSDXI,"-2~BSDX07 Error: Invalid Start Time") Q
+"RTN","BSDX07",141,0)
+    I BSDXEND'>3100000 D ERR(BSDXI,"-3~BSDX07 Error: Invalid End Time") Q
+"RTN","BSDX07",142,0)
+    ; If Ending date doesn't have a time, this is an error
+"RTN","BSDX07",143,0)
+    I $L(BSDXEND,".")=1 D ERR(BSDXI,"-4~BSDX07 Error: Invalid End Time") Q
+"RTN","BSDX07",144,0)
+    ; If the Start Date is greater than the end date, swap dates
+"RTN","BSDX07",145,0)
+    N BSDXTMP
+"RTN","BSDX07",146,0)
+    I BSDXSTART>BSDXEND S BSDXTMP=BSDXEND,BSDXEND=BSDXSTART,BSDXSTART=BSDXTMP
+"RTN","BSDX07",147,0)
+    ;
+"RTN","BSDX07",148,0)
+    ; Check if the patient exists:
+"RTN","BSDX07",149,0)
+    ; - DFN valid number?
+"RTN","BSDX07",150,0)
+    ; - Valid Patient in file 2?
+"RTN","BSDX07",151,0)
+    I '+BSDXPATID D ERR(BSDXI,"-5~BSDX07 Error: Invalid Patient ID") Q 
+"RTN","BSDX07",152,0)
+    I '$D(^DPT(BSDXPATID,0)) D ERR(BSDXI,"-6~BSDX07 Error: Invalid Patient ID") Q
+"RTN","BSDX07",153,0)
+    ;
+"RTN","BSDX07",154,0)
+    ;Validate Resource entry
+"RTN","BSDX07",155,0)
+    I '$D(^BSDXRES("B",BSDXRES)) D ERR(BSDXI,"-7~BSDX07 Error: Invalid Resource ID") Q
+"RTN","BSDX07",156,0)
+    N BSDXRESD ; Resource IEN
+"RTN","BSDX07",157,0)
+    S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0))
+"RTN","BSDX07",158,0)
+    N BSDXRNOD ; Resouce zero node
+"RTN","BSDX07",159,0)
+    S BSDXRNOD=$G(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX07",160,0)
+    I BSDXRNOD="" D ERR(BSDXI,"-8~BSDX07 Error: invalid Resource entry.") Q
+"RTN","BSDX07",161,0)
+    ;
+"RTN","BSDX07",162,0)
+    ; Walk-in (Unscheduled) Appointment?
+"RTN","BSDX07",163,0)
+    N BSDXWKIN S BSDXWKIN=0
+"RTN","BSDX07",164,0)
+    I BSDXATID="WALKIN" S BSDXWKIN=1
+"RTN","BSDX07",165,0)
+    ; Reset Access Type ID if it doesn't say "WALKIN" and isn't a number
+"RTN","BSDX07",166,0)
+    I BSDXATID'?.N&(BSDXATID'="WALKIN") S BSDXATID=""
+"RTN","BSDX07",167,0)
+    ;
+"RTN","BSDX07",168,0)
+    ; Done with all checks, let's make appointment in BSDX APPOINTMENT
+"RTN","BSDX07",169,0)
+    N BSDXAPPTID
+"RTN","BSDX07",170,0)
+    S BSDXAPPTID=$$BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRESD,BSDXATID)
+"RTN","BSDX07",171,0)
+    I 'BSDXAPPTID D ERR(BSDXI,"-9~BSDX07 Error: Unable to add appointment to BSDX APPOINTMENT file.") Q
+"RTN","BSDX07",172,0)
+    I BSDXNOTE]"" D BSDXWP(BSDXAPPTID,BSDXNOTE)
+"RTN","BSDX07",173,0)
+    ;
+"RTN","BSDX07",174,0)
+    ; Then Create Subfiles in 2/44 Appointment
+"RTN","BSDX07",175,0)
+    N BSDXSCD S BSDXSCD=$P(BSDXRNOD,U,4)  ; Hosp Location IEN
+"RTN","BSDX07",176,0)
+    ; Only if we have a valid Hosp Loc can we make an appointment
+"RTN","BSDX07",177,0)
+    I +BSDXSCD,$D(^SC(BSDXSCD,0)) D  I +BSDXERR D ERR(BSDXI,"-10~BSDX07 Error: MAKE^BSDXAPI returned error code: "_BSDXERR) Q
+"RTN","BSDX07",178,0)
+    . N BSDXC
+"RTN","BSDX07",179,0)
+    . S BSDXC("PAT")=BSDXPATID
+"RTN","BSDX07",180,0)
+    . S BSDXC("CLN")=BSDXSCD
+"RTN","BSDX07",181,0)
+    . S BSDXC("TYP")=3 ;3 for scheduled appts, 4 for walkins
+"RTN","BSDX07",182,0)
+    . S:BSDXWKIN BSDXC("TYP")=4
+"RTN","BSDX07",183,0)
+    . S BSDXC("ADT")=BSDXSTART
+"RTN","BSDX07",184,0)
+    . S BSDXC("LEN")=BSDXLEN
+"RTN","BSDX07",185,0)
+    . S BSDXC("OI")=$E($G(BSDXNOTE),1,150) ;File 44 has 150 character limit on OTHER field
+"RTN","BSDX07",186,0)
+    . S BSDXC("OI")=$TR(BSDXC("OI"),";"," ") ;No semicolons allowed by MAKE^BSDXAPI
+"RTN","BSDX07",187,0)
+    . S BSDXC("OI")=$$STRIP(BSDXC("OI")) ;Strip control characters from note
+"RTN","BSDX07",188,0)
+    . S BSDXC("USR")=DUZ
+"RTN","BSDX07",189,0)
+    . S BSDXERR=$$MAKE^BSDXAPI(.BSDXC)
+"RTN","BSDX07",190,0)
+    . Q:BSDXERR
+"RTN","BSDX07",191,0)
+    . ;Update RPMS Clinic availability
+"RTN","BSDX07",192,0)
+    . D AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN)
+"RTN","BSDX07",193,0)
+    . Q
+"RTN","BSDX07",194,0)
+    ;
+"RTN","BSDX07",195,0)
+    ;Return Recordset
+"RTN","BSDX07",196,0)
+    TCOMMIT
+"RTN","BSDX07",197,0)
+    L -^BSDXAPPT(BSDXPATID)
+"RTN","BSDX07",198,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",199,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXAPPTID_"^"_$C(30)
+"RTN","BSDX07",200,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",201,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX07",202,0)
+    Q
+"RTN","BSDX07",203,0)
+BSDXDEL(BSDXAPPTID) ;Deletes appointment BSDXAPPTID from BSDXAPPOINTMETN
+"RTN","BSDX07",204,0)
+    N DA,DIK
+"RTN","BSDX07",205,0)
+    S DIK="^BSDXAPPT(",DA=BSDXAPPTID
+"RTN","BSDX07",206,0)
+    D ^DIK
+"RTN","BSDX07",207,0)
+    Q
+"RTN","BSDX07",208,0)
+    ;
+"RTN","BSDX07",209,0)
+STRIP(BSDXZ)    ;Replace control characters with spaces
+"RTN","BSDX07",210,0)
+    N BSDXI
+"RTN","BSDX07",211,0)
+    F BSDXI=1:1:$L(BSDXZ) I (32>$A($E(BSDXZ,BSDXI))) S BSDXZ=$E(BSDXZ,1,BSDXI-1)_" "_$E(BSDXZ,BSDXI+1,999)
+"RTN","BSDX07",212,0)
+    Q BSDXZ
+"RTN","BSDX07",213,0)
+    ;
+"RTN","BSDX07",214,0)
+BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRESD,BSDXATID)  ;ADD BSDX APPOINTMENT ENTRY
+"RTN","BSDX07",215,0)
+    ;Returns ien in BSDXAPPT or 0 if failed
+"RTN","BSDX07",216,0)
+    ;Create entry in BSDX APPOINTMENT
+"RTN","BSDX07",217,0)
+    N BSDXAPPTID
+"RTN","BSDX07",218,0)
+    S BSDXFDA(9002018.4,"+1,",.01)=BSDXSTART
+"RTN","BSDX07",219,0)
+    S BSDXFDA(9002018.4,"+1,",.02)=BSDXEND
+"RTN","BSDX07",220,0)
+    S BSDXFDA(9002018.4,"+1,",.05)=BSDXPATID
+"RTN","BSDX07",221,0)
+    S BSDXFDA(9002018.4,"+1,",.07)=BSDXRESD
+"RTN","BSDX07",222,0)
+    S BSDXFDA(9002018.4,"+1,",.08)=$G(DUZ)
+"RTN","BSDX07",223,0)
+    S BSDXFDA(9002018.4,"+1,",.09)=$$NOW^XLFDT
+"RTN","BSDX07",224,0)
+    S:BSDXATID="WALKIN" BSDXFDA(9002018.4,"+1,",.13)="y"
+"RTN","BSDX07",225,0)
+    S:BSDXATID?.N BSDXFDA(9002018.4,"+1,",.06)=BSDXATID
+"RTN","BSDX07",226,0)
+    N BSDXIEN,BSDXMSG
+"RTN","BSDX07",227,0)
+    D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX07",228,0)
+    S BSDXAPPTID=+$G(BSDXIEN(1))
+"RTN","BSDX07",229,0)
+    Q BSDXAPPTID
+"RTN","BSDX07",230,0)
+    ;
+"RTN","BSDX07",231,0)
+BSDXWP(BSDXAPPTID,BSDXNOTE) ;
+"RTN","BSDX07",232,0)
+    ;Add WP field
+"RTN","BSDX07",233,0)
+    I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX07",234,0)
+    I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX07",235,0)
+    I $D(BSDXNOTE(.5)) D
+"RTN","BSDX07",236,0)
+    . D WP^DIE(9002018.4,BSDXAPPTID_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX07",237,0)
+    Q
+"RTN","BSDX07",238,0)
+    ;
+"RTN","BSDX07",239,0)
+ADDEVT(BSDXPATID,BSDXSTART,BSDXSC,BSDXSCDA) ;EP
+"RTN","BSDX07",240,0)
+    ;Called by BSDX ADD APPOINTMENT protocol
+"RTN","BSDX07",241,0)
+    ;BSDXSC=IEN of clinic in ^SC
+"RTN","BSDX07",242,0)
+    ;BSDXSCDA=IEN for ^SC(BSDXSC,"S",BSDXSTART,1,BSDXSCDA). Use to get Length & Note
+"RTN","BSDX07",243,0)
+    ;
+"RTN","BSDX07",244,0)
+    N BSDXNOD,BSDXLEN,BSDXAPPTID,BSDXNODP,BSDXWKIN,BSDXRES
+"RTN","BSDX07",245,0)
+    Q:+$G(BSDXNOEV)
+"RTN","BSDX07",246,0)
+    I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0))
+"RTN","BSDX07",247,0)
+    E  I $D(^BSDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0))
+"RTN","BSDX07",248,0)
+    Q:'+$G(BSDXRES)
+"RTN","BSDX07",249,0)
+    S BSDXNOD=$G(^SC(BSDXSC,"S",BSDXSTART,1,BSDXSCDA,0))
+"RTN","BSDX07",250,0)
+    Q:BSDXNOD=""
+"RTN","BSDX07",251,0)
+    S BSDXNODP=$G(^DPT(BSDXPATID,"S",BSDXSTART,0))
+"RTN","BSDX07",252,0)
+    S BSDXWKIN=""
+"RTN","BSDX07",253,0)
+    S:$P(BSDXNODP,U,7)=4 BSDXWKIN="WALKIN" ;Purpose of Visit field of DPT Appointment subfile
+"RTN","BSDX07",254,0)
+    S BSDXLEN=$P(BSDXNOD,U,2)
+"RTN","BSDX07",255,0)
+    Q:'+BSDXLEN
+"RTN","BSDX07",256,0)
+    S BSDXEND=$$FMADD^XLFDT(BSDXSTART,0,0,BSDXLEN,0)
+"RTN","BSDX07",257,0)
+    S BSDXAPPTID=$$BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXWKIN)
+"RTN","BSDX07",258,0)
+    Q:'+BSDXAPPTID
+"RTN","BSDX07",259,0)
+    S BSDXNOTE=$P(BSDXNOD,U,4)
+"RTN","BSDX07",260,0)
+    I BSDXNOTE]"" D BSDXWP(BSDXAPPTID,BSDXNOTE)
+"RTN","BSDX07",261,0)
+    D ADDEVT3(BSDXRES)
+"RTN","BSDX07",262,0)
+    Q
+"RTN","BSDX07",263,0)
+    ;
+"RTN","BSDX07",264,0)
+ADDEVT3(BSDXRES)    ;
+"RTN","BSDX07",265,0)
+    ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX07",266,0)
+    N BSDXRESN
+"RTN","BSDX07",267,0)
+    S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX07",268,0)
+    Q:BSDXRESN=""
+"RTN","BSDX07",269,0)
+    S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX07",270,0)
+    ;D EVENT^BSDX23("SCHEDULE-"_BSDXRESN,"","","")
+"RTN","BSDX07",271,0)
+    D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX07",272,0)
+    Q
+"RTN","BSDX07",273,0)
+    ;
+"RTN","BSDX07",274,0)
+ERR(BSDXI,BSDXERR)  ;Error processing
+"RTN","BSDX07",275,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",276,0)
+    S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX07",277,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX07",278,0)
+    S ^BSDXTMP($J,BSDXI)="0^"_BSDXERR_$C(30)
+"RTN","BSDX07",279,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",280,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX07",281,0)
+    L -^BSDXAPPT(BSDXPATID)
+"RTN","BSDX07",282,0)
+    Q
+"RTN","BSDX07",283,0)
+    ;
+"RTN","BSDX07",284,0)
+ETRAP   ;EP Error trap entry
+"RTN","BSDX07",285,0)
+    N $ET S $ET="D ^%ZTER HALT"  ; Emergency Error Trap
+"RTN","BSDX07",286,0)
+    ; Rollback, otherwise ^XTER will be empty from future rollback
+"RTN","BSDX07",287,0)
+    I $TL>0 TROLLBACK 
+"RTN","BSDX07",288,0)
+    D ^%ZTER
+"RTN","BSDX07",289,0)
+    S $EC=""  ; Clear Error
+"RTN","BSDX07",290,0)
+    ; Log error message and send to client
+"RTN","BSDX07",291,0)
+    I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX07",292,0)
+    D ERR(BSDXI,"-100~BSDX07 Error: "_$G(%ZTERZE))
+"RTN","BSDX07",293,0)
+    Q
+"RTN","BSDX07",294,0)
+    ;
+"RTN","BSDX07",295,0)
+DAY ;;^SUN^MON^TUES^WEDNES^THURS^FRI^SATUR
+"RTN","BSDX07",296,0)
+    ;
+"RTN","BSDX07",297,0)
+DOW S %=$E(X,1,3),Y=$E(X,4,5),Y=Y>2&'(%#4)+$E("144025036146",Y)
+"RTN","BSDX07",298,0)
+    F %=%:-1:281 S Y=%#4=1+1+Y
+"RTN","BSDX07",299,0)
+    S Y=$E(X,6,7)+Y#7
+"RTN","BSDX07",300,0)
+    Q
+"RTN","BSDX07",301,0)
+    ;
+"RTN","BSDX07",302,0)
+AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN)   ;Update RPMS Clinic availability
+"RTN","BSDX07",303,0)
+    ;SEE SDM1
+"RTN","BSDX07",304,0)
+    N Y,DFN
+"RTN","BSDX07",305,0)
+    N SL,STARTDAY,X,SC,SB,HSI,SI,STR,SDDIF,SDMAX,SDDATE,SDDMAX,SDSDATE,CCXN,MXOK,COV,SDPROG
+"RTN","BSDX07",306,0)
+    N X1,SDEDT,X2,SD,SM,SS,S,SDLOCK,ST,I
+"RTN","BSDX07",307,0)
+    S Y=BSDXSCD,DFN=BSDXPATID
+"RTN","BSDX07",308,0)
+    S SL=$G(^SC(+Y,"SL")),X=$P(SL,U,3),STARTDAY=$S($L(X):X,1:8),SC=Y,SB=STARTDAY-1/100,X=$P(SL,U,6),HSI=$S(X=1:X,X:X,1:4),SI=$S(X="":4,X<3:4,X:X,1:4),STR="#@!$* XXWVUTSRQPONMLKJIHGFEDCBA0123456789jklmnopqrstuvwxyz",SDDIF=$S(HSI<3:8/HSI,1:2) K Y
+"RTN","BSDX07",309,0)
+    ;Determine maximum days for scheduling
+"RTN","BSDX07",310,0)
+    S SDMAX(1)=$P($G(^SC(+SC,"SDP")),U,2) S:'SDMAX(1) SDMAX(1)=365
+"RTN","BSDX07",311,0)
+    S (SDMAX,SDDMAX)=$$FMADD^XLFDT(DT,SDMAX(1))
+"RTN","BSDX07",312,0)
+    S SDDATE=BSDXSTART
+"RTN","BSDX07",313,0)
+    S SDSDATE=SDDATE,SDDATE=SDDATE\1
+"RTN","BSDX07",314,0)
+1   ;L  Q:$D(SDXXX)  S CCXN=0 K MXOK,COV,SDPROT Q:DFN<0  S SC=+SC
+"RTN","BSDX07",315,0)
+    Q:$D(SDXXX)  S CCXN=0 K MXOK,COV,SDPROT Q:DFN<0  S SC=+SC
+"RTN","BSDX07",316,0)
+    S X1=DT,SDEDT=365 S:$D(^SC(SC,"SDP")) SDEDT=$P(^SC(SC,"SDP"),"^",2)
+"RTN","BSDX07",317,0)
+    S X2=SDEDT D C^%DTC S SDEDT=X
+"RTN","BSDX07",318,0)
+    S Y=BSDXSTART
+"RTN","BSDX07",319,0)
+EN1 S (X,SD)=Y,SM=0 D DOW
+"RTN","BSDX07",320,0)
+S   I '$D(^SC(SC,"ST",$P(SD,"."),1)) S SS=+$O(^SC(+SC,"T"_Y,SD)) Q:SS'>0  Q:^(SS,1)=""  S ^SC(+SC,"ST",$P(SD,"."),1)=$E($P($T(DAY),U,Y+2),1,2)_" "_$E(SD,6,7)_$J("",SI+SI-6)_^(1),^(0)=$P(SD,".")
+"RTN","BSDX07",321,0)
+    S S=BSDXLEN
+"RTN","BSDX07",322,0)
+    ;Check if BSDXLEN evenly divisible by appointment length
+"RTN","BSDX07",323,0)
+    S RPMSL=$P(SL,U)
+"RTN","BSDX07",324,0)
+    I BSDXLEN<RPMSL S BSDXLEN=RPMSL
+"RTN","BSDX07",325,0)
+    I BSDXLEN#RPMSL'=0 D
+"RTN","BSDX07",326,0)
+    . S BSDXINC=BSDXLEN\RPMSL
+"RTN","BSDX07",327,0)
+    . S BSDXINC=BSDXINC+1
+"RTN","BSDX07",328,0)
+    . S BSDXLEN=RPMSL*BSDXINC
+"RTN","BSDX07",329,0)
+    S SL=S_U_$P(SL,U,2,99)
+"RTN","BSDX07",330,0)
+SC  S SDLOCK=$S('$D(SDLOCK):1,1:SDLOCK+1) Q:SDLOCK>9
+"RTN","BSDX07",331,0)
+    L +^SC(SC,"ST",$P(SD,"."),1):5 G:'$T SC
+"RTN","BSDX07",332,0)
+    S SDLOCK=0,S=^SC(SC,"ST",$P(SD,"."),1)
+"RTN","BSDX07",333,0)
+    S I=SD#1-SB*100,ST=I#1*SI\.6+($P(I,".")*SI),SS=SL*HSI/60*SDDIF+ST+ST
+"RTN","BSDX07",334,0)
+    I (I<1!'$F(S,"["))&(S'["CAN") L -^SC(SC,"ST",$P(SD,"."),1) Q
+"RTN","BSDX07",335,0)
+    I SM<7 S %=$F(S,"[",SS-1) S:'%!($P(SL,"^",6)<3) %=999 I $F(S,"]",SS)'<%!(SDDIF=2&$E(S,ST+ST+1,SS-1)["[") S SM=7
+"RTN","BSDX07",336,0)
+    ;
+"RTN","BSDX07",337,0)
+SP  I ST+ST>$L(S),$L(S)<80 S S=S_" " G SP
+"RTN","BSDX07",338,0)
+    S SDNOT=1
+"RTN","BSDX07",339,0)
+    S ABORT=0
+"RTN","BSDX07",340,0)
+    F I=ST+ST:SDDIF:SS-SDDIF D  Q:ABORT
+"RTN","BSDX07",341,0)
+    . S ST=$E(S,I+1) S:ST="" ST=" "
+"RTN","BSDX07",342,0)
+    . S Y=$E(STR,$F(STR,ST)-2)
+"RTN","BSDX07",343,0)
+    . I S["CAN"!(ST="X"&($D(^SC(+SC,"ST",$P(SD,"."),"CAN")))) S ABORT=1 Q
+"RTN","BSDX07",344,0)
+    . I Y="" S ABORT=1 Q
+"RTN","BSDX07",345,0)
+    . S:Y'?1NL&(SM<6) SM=6 S ST=$E(S,I+2,999) S:ST="" ST=" " S S=$E(S,1,I)_Y_ST
+"RTN","BSDX07",346,0)
+    . Q
+"RTN","BSDX07",347,0)
+    S ^SC(SC,"ST",$P(SD,"."),1)=S
+"RTN","BSDX07",348,0)
+    L -^SC(SC,"ST",$P(SD,"."),1)
+"RTN","BSDX07",349,0)
+    Q
+"RTN","BSDX08")
+0^8^B118482818
+"RTN","BSDX08",1,0)
+BSDX08 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 1/25/11 12:39pm
+"RTN","BSDX08",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX08",3,0)
+ ; 
+"RTN","BSDX08",4,0)
+ ; Original by HMW. New Written by Sam Habiel. Licensed under LGPL.
+"RTN","BSDX08",5,0)
+ ; 
+"RTN","BSDX08",6,0)
+ ; Change History
+"RTN","BSDX08",7,0)
+ ; 3101022 UJO/SMH v1.42
+"RTN","BSDX08",8,0)
+ ;  - Transaction now restartable. Thanks to 
+"RTN","BSDX08",9,0)
+ ;   --> Zach Gonzalez and Rick Marshall for fix.
+"RTN","BSDX08",10,0)
+ ;  - Extra TROLLBACK in Lock Statement when lock fails.
+"RTN","BSDX08",11,0)
+ ;   --> Removed--Rollback is already in ERR tag.
+"RTN","BSDX08",12,0)
+ ;  - Added new statements to old SD code in AVUPDT to obviate
+"RTN","BSDX08",13,0)
+ ;   --> need to restore variables in transaction
+"RTN","BSDX08",14,0)
+ ;  - Refactored this chunk of code. Don't really know whether it 
+"RTN","BSDX08",15,0)
+ ;   --> worked in the first place. Waiting for bug report to know.
+"RTN","BSDX08",16,0)
+ ;  - Refactored all of APPDEL.
+"RTN","BSDX08",17,0)
+ ; 
+"RTN","BSDX08",18,0)
+ ; 3111125 UJO/SMH v1.5
+"RTN","BSDX08",19,0)
+ ;  - Added ability to remove checked in appointments. Added a couple
+"RTN","BSDX08",20,0)
+ ;    of units tests for that under UT2.
+"RTN","BSDX08",21,0)
+ ;  - Minor reformatting because of how KIDS adds tabs.
+"RTN","BSDX08",22,0)
+ ; 
+"RTN","BSDX08",23,0)
+ ; Error Reference:
+"RTN","BSDX08",24,0)
+ ;  -1~BSDX08: Appt record is locked. Please contact technical support.
+"RTN","BSDX08",25,0)
+ ;  -2~BSDX08: Invalid Appointment ID
+"RTN","BSDX08",26,0)
+ ;  -3~BSDX08: Invalid Appointment ID
+"RTN","BSDX08",27,0)
+ ;  -4~BSDX08: Cancelled appointment does not have a Resouce ID  
+"RTN","BSDX08",28,0)
+ ;  -5~BSDX08: Resouce ID does not exist in BSDX RESOURCE
+"RTN","BSDX08",29,0)
+ ;  -6~BSDX08: Invalid Hosp Location stored in Database
+"RTN","BSDX08",30,0)
+ ;  -7~BSDX08: Patient does not have an appointment in PIMS Clinic
+"RTN","BSDX08",31,0)
+ ;  -8^BSDX08: Unable to find associated PIMS appointment for this patient
+"RTN","BSDX08",32,0)
+ ;  -9^BSDX08: BSDXAPI returned an error: (error)
+"RTN","BSDX08",33,0)
+ ;  -100~BSDX08 Error: (Mumps Error)
+"RTN","BSDX08",34,0)
+ ;
+"RTN","BSDX08",35,0)
+APPDELD(BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT) ;EP
+"RTN","BSDX08",36,0)
+ ;Entry point for debugging
+"RTN","BSDX08",37,0)
+ D DEBUG^%Serenji("APPDEL^BSDX08(.BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT)")
+"RTN","BSDX08",38,0)
+ Q
+"RTN","BSDX08",39,0)
+ ;
+"RTN","BSDX08",40,0)
+UT ; Unit Tests
+"RTN","BSDX08",41,0)
+ ; Test 1: Make normal appointment and cancel it. See if every thing works
+"RTN","BSDX08",42,0)
+ N ZZZ
+"RTN","BSDX08",43,0)
+ D APPADD^BSDX07(.ZZZ,3110123.2,3110123.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",44,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",45,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Sam's Cancel Note")
+"RTN","BSDX08",46,0)
+ I $P(^BSDXAPPT(APPID,0),U,12)'>0 W "Error in Cancellation-1"
+"RTN","BSDX08",47,0)
+ I $O(^SC(2,"S",3110123.2,1,0))]"" W "Error in Cancellation-2"
+"RTN","BSDX08",48,0)
+ I $P(^DPT(4,"S",3110123.2,0),U,2)'="PC" W "Error in Cancellation-3"
+"RTN","BSDX08",49,0)
+ I ^DPT(4,"S",3110123.2,"R")'="Sam's Cancel Note" W "Error in Cancellation-4"
+"RTN","BSDX08",50,0)
+ ;
+"RTN","BSDX08",51,0)
+ ; Test 2: Check for -1
+"RTN","BSDX08",52,0)
+ ; Make appt
+"RTN","BSDX08",53,0)
+ D APPADD^BSDX07(.ZZZ,3110125.2,3110125.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",54,0)
+ ; Lock the node in another job
+"RTN","BSDX08",55,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",56,0)
+ ; W "Lock ^BSDXAPPT("_APPID_") in another session. You have 10 seconds." H 10
+"RTN","BSDX08",57,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Sam's Cancel Note")
+"RTN","BSDX08",58,0)
+ ;
+"RTN","BSDX08",59,0)
+ ; Test 3: Check for -100
+"RTN","BSDX08",60,0)
+ S bsdxdie=1
+"RTN","BSDX08",61,0)
+ D APPADD^BSDX07(.ZZZ,3110126.2,3110126.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",62,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",63,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Reasons")
+"RTN","BSDX08",64,0)
+ I $P(^BSDXTMP($J,1),"~")'=-100 W "Error in -100",!
+"RTN","BSDX08",65,0)
+ K bsdxdie
+"RTN","BSDX08",66,0)
+ ;
+"RTN","BSDX08",67,0)
+ ; Test 4: Restartable transaction
+"RTN","BSDX08",68,0)
+ S bsdxrestart=1
+"RTN","BSDX08",69,0)
+ D APPADD^BSDX07(.ZZZ,3110128.2,3110128.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",70,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",71,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Reasons")
+"RTN","BSDX08",72,0)
+ I $P(^DPT(4,"S",3110128.2,0),U,2)'="PC" W "Error in Restartable Transaction",!
+"RTN","BSDX08",73,0)
+ ;
+"RTN","BSDX08",74,0)
+ ; Test 5: for invalid Appointment ID (-2 and -3)
+"RTN","BSDX08",75,0)
+ D APPDEL^BSDX08(.ZZZ,0,"PC",1,"Reasons")
+"RTN","BSDX08",76,0)
+ I $P(^BSDXTMP($J,1),"~")'=-2 W "Error in -2",!
+"RTN","BSDX08",77,0)
+ D APPDEL^BSDX08(.ZZZ,999999,"PC",1,"Reasons")
+"RTN","BSDX08",78,0)
+ I $P(^BSDXTMP($J,1),"~")'=-3 W "Error in -3",!
+"RTN","BSDX08",79,0)
+UT2 ; More unit Tests
+"RTN","BSDX08",80,0)
+ ;
+"RTN","BSDX08",81,0)
+ ; Test 6: for Cancelling walkin and checked-in appointments 
+"RTN","BSDX08",82,0)
+ S BSDXSTART=$E($$NOW^XLFDT,1,12),BSDXEND=BSDXSTART+.0001
+"RTN","BSDX08",83,0)
+ D APPADD^BSDX07(.ZZZ,BSDXSTART,BSDXEND,4,"Dr Office",10,"Sam's Note",1) ; Add appt
+"RTN","BSDX08",84,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",85,0)
+ I APPID=0 W "Error in test 6",!
+"RTN","BSDX08",86,0)
+ D CHECKIN^BSDX25(.ZZZ,APPID,$$NOW^XLFDT) ; check-in
+"RTN","BSDX08",87,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",10,"Cancel Note") ; Delete appt
+"RTN","BSDX08",88,0)
+ I $P(^BSDXTMP($J,1),$C(30))'="" W "Error in test 6",!
+"RTN","BSDX08",89,0)
+ ;
+"RTN","BSDX08",90,0)
+ ; Test 7: for cancelling walkin and checked-in appointments
+"RTN","BSDX08",91,0)
+ S BSDXSTART=$E($$NOW^XLFDT,1,12)+.0001,BSDXEND=BSDXSTART+.0001
+"RTN","BSDX08",92,0)
+ D APPADD^BSDX07(.ZZZ,BSDXSTART,BSDXEND,4,"Dr Office",10,"Sam's Note",1) ; Add appt
+"RTN","BSDX08",93,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",94,0)
+ I APPID=0 W "Error in test 6",!
+"RTN","BSDX08",95,0)
+ D CHECKIN^BSDX25(.ZZZ,APPID,$$NOW^XLFDT) ; Checkin
+"RTN","BSDX08",96,0)
+ S BSDXRES=$O(^BSDXRES("B","Dr Office",""))
+"RTN","BSDX08",97,0)
+ S BSDXCLN=$P(^BSDXRES(BSDXRES,0),U,4)
+"RTN","BSDX08",98,0)
+ S BSDXRESULT=$$RMCI^BSDXAPI(4,BSDXCLN,BSDXSTART) ; remove checkin
+"RTN","BSDX08",99,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",10,"Cancel Note") ; delete appt
+"RTN","BSDX08",100,0)
+ I $P(^BSDXTMP($J,1),$C(30))'="" W "Error in test 6",!
+"RTN","BSDX08",101,0)
+ QUIT
+"RTN","BSDX08",102,0)
+APPDEL(BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT)        ;EP
+"RTN","BSDX08",103,0)
+ ;Called by RPC: BSDX CANCEL APPOINTMENT
+"RTN","BSDX08",104,0)
+ ;Cancels existing appointment in BSDX APPOINTMENT and 44/2 subfiles
+"RTN","BSDX08",105,0)
+ ;Input Parameters:
+"RTN","BSDX08",106,0)
+ ; - BSDXAPTID is entry number in BSDX APPOINTMENT file
+"RTN","BSDX08",107,0)
+ ; - BSDXTYP is C for clinic-cancelled and PC for patient cancelled
+"RTN","BSDX08",108,0)
+ ; - BSDXCR is pointer to CANCELLATION REASON File (409.2)
+"RTN","BSDX08",109,0)
+ ; - BSDXNOT is user note
+"RTN","BSDX08",110,0)
+ ;
+"RTN","BSDX08",111,0)
+ ; Returns error code in recordset field ERRORID. Empty string is success.
+"RTN","BSDX08",112,0)
+ ; Returns Global Array. Must use this type in RPC.
+"RTN","BSDX08",113,0)
+ ;
+"RTN","BSDX08",114,0)
+ ; Return Array: set Return and clear array
+"RTN","BSDX08",115,0)
+ S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX08",116,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX08",117,0)
+ ;
+"RTN","BSDX08",118,0)
+ ; Set min DUZ vars if they don't exist
+"RTN","BSDX08",119,0)
+ D ^XBKVAR
+"RTN","BSDX08",120,0)
+ ;
+"RTN","BSDX08",121,0)
+ ; $ET
+"RTN","BSDX08",122,0)
+ N $ET S $ET="G ETRAP^BSDX08"
+"RTN","BSDX08",123,0)
+ ;
+"RTN","BSDX08",124,0)
+ ; Counter
+"RTN","BSDX08",125,0)
+ N BSDXI S BSDXI=0
+"RTN","BSDX08",126,0)
+ ; Header Node
+"RTN","BSDX08",127,0)
+ S ^BSDXTMP($J,BSDXI)="T00100ERRORID"_$C(30)
+"RTN","BSDX08",128,0)
+ ;
+"RTN","BSDX08",129,0)
+ ; Lock BSDX node, only to synchronize access to the globals.
+"RTN","BSDX08",130,0)
+ ; It's not expected that the error will ever happen as no filing
+"RTN","BSDX08",131,0)
+ ; is supposed to take 5 seconds.
+"RTN","BSDX08",132,0)
+ L +^BSDXAPPT(BSDXAPTID):5 I '$T D ERR(BSDXI,"-1~BSDX08: Appt record is locked. Please contact technical support.") Q
+"RTN","BSDX08",133,0)
+ ;
+"RTN","BSDX08",134,0)
+ ;Restartable Transaction; restore paramters when starting.
+"RTN","BSDX08",135,0)
+ ; (Params restored are what's passed here + BSDXI)
+"RTN","BSDX08",136,0)
+ TSTART (BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT,BSDXI):T="BSDX CANCEL APPOINTEMENT^BSDX08"
+"RTN","BSDX08",137,0)
+ ;
+"RTN","BSDX08",138,0)
+ ; Turn off SDAM APPT PROTOCOL BSDX Entries
+"RTN","BSDX08",139,0)
+ N BSDXNOEV
+"RTN","BSDX08",140,0)
+ S BSDXNOEV=1 ;Don't execute BSDX CANCEL APPOINTMENT protocol
+"RTN","BSDX08",141,0)
+ ;
+"RTN","BSDX08",142,0)
+ ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX08",143,0)
+ I $G(bsdxdie) S X=1/0
+"RTN","BSDX08",144,0)
+ ;;;test
+"RTN","BSDX08",145,0)
+ ;;;test for TRESTART
+"RTN","BSDX08",146,0)
+ I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX08",147,0)
+ ;;;test
+"RTN","BSDX08",148,0)
+ ;
+"RTN","BSDX08",149,0)
+ ; Check appointment ID and whether it exists
+"RTN","BSDX08",150,0)
+ I '+BSDXAPTID D ERR(BSDXI,"-2~BSDX08: Invalid Appointment ID") Q
+"RTN","BSDX08",151,0)
+ I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(BSDXI,"-3~BSDX08: Invalid Appointment ID") Q
+"RTN","BSDX08",152,0)
+ ;
+"RTN","BSDX08",153,0)
+ ; Start Processing:
+"RTN","BSDX08",154,0)
+ ; First, add cancellation date to appt entry in BSDX APPOINTMENT
+"RTN","BSDX08",155,0)
+ N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPTID,0) ; BSDX Appt Node
+"RTN","BSDX08",156,0)
+ N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) ; Patient ID
+"RTN","BSDX08",157,0)
+ N BSDXSTART S BSDXSTART=$P(BSDXNOD,U) ; Start Time
+"RTN","BSDX08",158,0)
+ D BSDXCAN(BSDXAPTID)  ; Add a cancellation date in BSDX APPOINTMENT
+"RTN","BSDX08",159,0)
+ ;
+"RTN","BSDX08",160,0)
+ ; Second, cancel appt in "S" nodes in file 2 and 44, then update Legacy PIMS Availability
+"RTN","BSDX08",161,0)
+ N BSDXSC1 S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID
+"RTN","BSDX08",162,0)
+ ; If the resouce id doesn't exist...
+"RTN","BSDX08",163,0)
+ I BSDXSC1="" D ERR(BSDXI,"-4~BSDX08: Cancelled appointment does not have a Resouce ID") QUIT
+"RTN","BSDX08",164,0)
+ I '$D(^BSDXRES(BSDXSC1,0)) D ERR(BSDXI,"-5~BSDX08: Resouce ID does not exist in BSDX RESOURCE") QUIT
+"RTN","BSDX08",165,0)
+ ; Get zero node of resouce
+"RTN","BSDX08",166,0)
+ S BSDXNOD=^BSDXRES(BSDXSC1,0)
+"RTN","BSDX08",167,0)
+ ; Get Hosp location
+"RTN","BSDX08",168,0)
+ N BSDXLOC S BSDXLOC=$P(BSDXNOD,U,4)
+"RTN","BSDX08",169,0)
+ ; Error indicator for Hosp Location filing for getting out of routine
+"RTN","BSDX08",170,0)
+ N BSDXERR S BSDXERR=0
+"RTN","BSDX08",171,0)
+ ; Only file in 2/44 if there is an associated hospital location
+"RTN","BSDX08",172,0)
+ I BSDXLOC D  QUIT:BSDXERR  
+"RTN","BSDX08",173,0)
+ . I '$D(^SC(BSDXLOC,0)) S BSDXERR=1 D ERR(BSDXI,"-6~BSDX08: Invalid Hosp Location stored in Database") QUIT
+"RTN","BSDX08",174,0)
+ . ; Get the IEN of the appointment in the "S" node of ^SC
+"RTN","BSDX08",175,0)
+ . N BSDXSCIEN
+"RTN","BSDX08",176,0)
+ . S BSDXSCIEN=$$SCIEN^BSDXAPI(BSDXPATID,BSDXLOC,BSDXSTART)
+"RTN","BSDX08",177,0)
+ . I BSDXSCIEN="" S BSDXERR=1 D ERR(BSDXI,"-7~BSDX08: Patient does not have an appointment in PIMS Clinic") QUIT
+"RTN","BSDX08",178,0)
+ . ; Get the appointment node
+"RTN","BSDX08",179,0)
+ . S BSDXNOD=$G(^SC(BSDXLOC,"S",BSDXSTART,1,BSDXSCIEN,0))
+"RTN","BSDX08",180,0)
+ . I BSDXNOD="" S BSDXERR=1 D ERR(BSDXI,"-8^BSDX08: Unable to find associated PIMS appointment for this patient") QUIT
+"RTN","BSDX08",181,0)
+ . N BSDXLEN S BSDXLEN=$P(BSDXNOD,U,2)
+"RTN","BSDX08",182,0)
+ . ; Cancel through BSDXAPI
+"RTN","BSDX08",183,0)
+ . N BSDXZ
+"RTN","BSDX08",184,0)
+ . D APCAN(.BSDXZ,BSDXLOC,BSDXPATID,BSDXSTART)
+"RTN","BSDX08",185,0)
+ . I +BSDXZ>0 S BSDXERR=1 D ERR(BSDXI,"-9^BSDX08: BSDXAPI returned an error: "_$P(BSDXZ,U,2)) QUIT
+"RTN","BSDX08",186,0)
+ . ; Update Legacy PIMS clinic Availability
+"RTN","BSDX08",187,0)
+ . D AVUPDT(BSDXLOC,BSDXSTART,BSDXLEN)
+"RTN","BSDX08",188,0)
+ ;
+"RTN","BSDX08",189,0)
+ TCOMMIT
+"RTN","BSDX08",190,0)
+ L -^BSDXAPPT(BSDXAPTID)
+"RTN","BSDX08",191,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",192,0)
+ S ^BSDXTMP($J,BSDXI)=""_$C(30)
+"RTN","BSDX08",193,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",194,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX08",195,0)
+ Q
+"RTN","BSDX08",196,0)
+ ;
+"RTN","BSDX08",197,0)
+AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN) ;Update Legacy PIMS Clinic availability
+"RTN","BSDX08",198,0)
+ ;See SDCNP0
+"RTN","BSDX08",199,0)
+ N SD,S  ; Start Date
+"RTN","BSDX08",200,0)
+ S (SD,S)=BSDXSTART 
+"RTN","BSDX08",201,0)
+ N I ; Clinic IEN in 44
+"RTN","BSDX08",202,0)
+ S I=BSDXSCD
+"RTN","BSDX08",203,0)
+ ; if day has no schedule in legacy PIMS, forget about this update.
+"RTN","BSDX08",204,0)
+ Q:'$D(^SC(I,"ST",SD\1,1))
+"RTN","BSDX08",205,0)
+ N SL ; Clinic characteristics node (length of appt, when appts start etc)
+"RTN","BSDX08",206,0)
+ S SL=^SC(I,"SL")
+"RTN","BSDX08",207,0)
+ N X ; Hour Clinic Display Begins
+"RTN","BSDX08",208,0)
+ S X=$P(SL,U,3)
+"RTN","BSDX08",209,0)
+ N STARTDAY ; When does the day start?
+"RTN","BSDX08",210,0)
+ S STARTDAY=$S($L(X):X,1:8) ; If defined, use it; otherwise, 8am
+"RTN","BSDX08",211,0)
+ N SB ; ?? Who knows? Day Start - 1 divided by 100.
+"RTN","BSDX08",212,0)
+ S SB=STARTDAY-1/100
+"RTN","BSDX08",213,0)
+ S X=$P(SL,U,6) ; Now X is Display increments per hour
+"RTN","BSDX08",214,0)
+ N HSI ; Slots per hour, try 1
+"RTN","BSDX08",215,0)
+ S HSI=$S(X:X,1:4) ; if defined, use it; otherwise, 4
+"RTN","BSDX08",216,0)
+ N SI ; Slots per hour, try 2
+"RTN","BSDX08",217,0)
+ S SI=$S(X="":4,X<3:4,X:X,1:4) ; If slots "", or less than 3, then 4
+"RTN","BSDX08",218,0)
+ N STR ; ??
+"RTN","BSDX08",219,0)
+ S STR="#@!$* XXWVUTSRQPONMLKJIHGFEDCBA0123456789jklmnopqrstuvwxyz"
+"RTN","BSDX08",220,0)
+ N SDDIF ; Slots per hour diff??
+"RTN","BSDX08",221,0)
+ S SDDIF=$S(HSI<3:8/HSI,1:2)
+"RTN","BSDX08",222,0)
+ S SL=BSDXLEN ; Dammit, reusing variable; SL now Appt Length from GUI
+"RTN","BSDX08",223,0)
+ S S=^SC(I,"ST",SD\1,1) ; reusing var again; S now Day Pattern from PIMS
+"RTN","BSDX08",224,0)
+ N Y ; Hours since start of Date
+"RTN","BSDX08",225,0)
+ S Y=SD#1-SB*100 ;SD#1=FM Time portion; -SB minus start of day; conv to hrs
+"RTN","BSDX08",226,0)
+ N ST  ; ??
+"RTN","BSDX08",227,0)
+ ; Y#1 -> Minutes; *SI -> * Slots per hour; \.6 trunc min to hour
+"RTN","BSDX08",228,0)
+ ; Y\1 -> Hours since start of day; * SI: * slots
+"RTN","BSDX08",229,0)
+ S ST=Y#1*SI\.6+(Y\1*SI) 
+"RTN","BSDX08",230,0)
+ N SS ; how many slots are supposed to be taken by appointment
+"RTN","BSDX08",231,0)
+ S SS=SL*HSI/60 ; (nb: try SL: 30 min; HSI: 4 slots)
+"RTN","BSDX08",232,0)
+ N I
+"RTN","BSDX08",233,0)
+ I Y'<1 D  ; If Hours since start of Date is greater than 1
+"RTN","BSDX08",234,0)
+ . ; loop through pattern. Tired of documenting.
+"RTN","BSDX08",235,0)
+ . F I=ST+ST:SDDIF D  Q:Y=""  Q:SS'>0
+"RTN","BSDX08",236,0)
+ . . S Y=$E(STR,$F(STR,$E(S,I+1))) Q:Y=""  
+"RTN","BSDX08",237,0)
+ . . S S=$E(S,1,I)_Y_$E(S,I+2,999)
+"RTN","BSDX08",238,0)
+ . . S SS=SS-1 
+"RTN","BSDX08",239,0)
+ . . Q:SS'>0
+"RTN","BSDX08",240,0)
+ S ^SC(BSDXSCD,"ST",SD\1,1)=S  ; new pattern; global set
+"RTN","BSDX08",241,0)
+ Q
+"RTN","BSDX08",242,0)
+ ;
+"RTN","BSDX08",243,0)
+APCAN(BSDXZ,BSDXLOC,BSDXDFN,BSDXSD)         ;
+"RTN","BSDX08",244,0)
+ ;Cancel appointment for patient BSDXDFN in clinic BSDXSC1
+"RTN","BSDX08",245,0)
+ ;at time BSDXSD
+"RTN","BSDX08",246,0)
+ N BSDXC,%H
+"RTN","BSDX08",247,0)
+ S BSDXC("PAT")=BSDXPATID
+"RTN","BSDX08",248,0)
+ S BSDXC("CLN")=BSDXLOC
+"RTN","BSDX08",249,0)
+ S BSDXC("TYP")=BSDXTYP
+"RTN","BSDX08",250,0)
+ S BSDXC("ADT")=BSDXSD
+"RTN","BSDX08",251,0)
+ S %H=$H D YMD^%DTC
+"RTN","BSDX08",252,0)
+ S BSDXC("CDT")=X+%
+"RTN","BSDX08",253,0)
+ S BSDXC("NOT")=BSDXNOT
+"RTN","BSDX08",254,0)
+ S:'+$G(BSDXCR) BSDXCR=11 ;Other
+"RTN","BSDX08",255,0)
+ S BSDXC("CR")=BSDXCR
+"RTN","BSDX08",256,0)
+ S BSDXC("USR")=DUZ
+"RTN","BSDX08",257,0)
+ ;
+"RTN","BSDX08",258,0)
+ S BSDXZ=$$CANCEL^BSDXAPI(.BSDXC)
+"RTN","BSDX08",259,0)
+ Q
+"RTN","BSDX08",260,0)
+ ;
+"RTN","BSDX08",261,0)
+BSDXCAN(BSDXAPTID) ;
+"RTN","BSDX08",262,0)
+ ;Cancel BSDX APPOINTMENT entry
+"RTN","BSDX08",263,0)
+ N %DT,X,BSDXDATE,Y,BSDXIENS,BSDXFDA,BSDXMSG
+"RTN","BSDX08",264,0)
+ S %DT="XT",X="NOW" D ^%DT ; X ^DD("DD")
+"RTN","BSDX08",265,0)
+ S BSDXDATE=Y
+"RTN","BSDX08",266,0)
+ S BSDXIENS=BSDXAPTID_","
+"RTN","BSDX08",267,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.12)=BSDXDATE
+"RTN","BSDX08",268,0)
+ K BSDXMSG
+"RTN","BSDX08",269,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX08",270,0)
+ Q
+"RTN","BSDX08",271,0)
+ ;
+"RTN","BSDX08",272,0)
+CANEVT(BSDXPAT,BSDXSTART,BSDXSC) ;EP Called by BSDX CANCEL APPOINTMENT event
+"RTN","BSDX08",273,0)
+ ;when appointments cancelled via PIMS interface.
+"RTN","BSDX08",274,0)
+ ;Propagates cancellation to BSDXAPPT and raises refresh event to running GUI clients
+"RTN","BSDX08",275,0)
+ N BSDXFOUND,BSDXRES
+"RTN","BSDX08",276,0)
+ Q:+$G(BSDXNOEV)
+"RTN","BSDX08",277,0)
+ Q:'+$G(BSDXSC)
+"RTN","BSDX08",278,0)
+ S BSDXFOUND=0
+"RTN","BSDX08",279,0)
+ I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$CANEVT1(BSDXRES,BSDXSTART,BSDXPAT)
+"RTN","BSDX08",280,0)
+ I BSDXFOUND D CANEVT3(BSDXRES) Q
+"RTN","BSDX08",281,0)
+ I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$CANEVT1(BSDXRES,BSDXSTART,BSDXPAT)
+"RTN","BSDX08",282,0)
+ I BSDXFOUND D CANEVT3(BSDXRES)
+"RTN","BSDX08",283,0)
+ Q
+"RTN","BSDX08",284,0)
+ ;
+"RTN","BSDX08",285,0)
+CANEVT1(BSDXRES,BSDXSTART,BSDXPAT) ;
+"RTN","BSDX08",286,0)
+ ;Get appointment id in BSDXAPT
+"RTN","BSDX08",287,0)
+ ;If found, call BSDXCAN(BSDXAPPT) and return 1
+"RTN","BSDX08",288,0)
+ ;else return 0
+"RTN","BSDX08",289,0)
+ N BSDXFOUND,BSDXAPPT
+"RTN","BSDX08",290,0)
+ S BSDXFOUND=0
+"RTN","BSDX08",291,0)
+ Q:'+BSDXRES BSDXFOUND
+"RTN","BSDX08",292,0)
+ Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND
+"RTN","BSDX08",293,0)
+ S BSDXAPPT=0 F  S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT  D  Q:BSDXFOUND
+"RTN","BSDX08",294,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""
+"RTN","BSDX08",295,0)
+ . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q
+"RTN","BSDX08",296,0)
+ I BSDXFOUND,+$G(BSDXAPPT) D BSDXCAN(BSDXAPPT)
+"RTN","BSDX08",297,0)
+ Q BSDXFOUND
+"RTN","BSDX08",298,0)
+ ;
+"RTN","BSDX08",299,0)
+CANEVT3(BSDXRES) ;
+"RTN","BSDX08",300,0)
+ ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX08",301,0)
+ ;
+"RTN","BSDX08",302,0)
+ N BSDXRESN
+"RTN","BSDX08",303,0)
+ S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX08",304,0)
+ Q:BSDXRESN=""
+"RTN","BSDX08",305,0)
+ S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX08",306,0)
+ ;D EVENT^BSDX23("SCHEDULE-"_BSDXRESN,"","","")
+"RTN","BSDX08",307,0)
+ D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX08",308,0)
+ Q
+"RTN","BSDX08",309,0)
+ ;
+"RTN","BSDX08",310,0)
+ERR(BSDXI,BSDXERR) ;Error processing
+"RTN","BSDX08",311,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",312,0)
+ S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX08",313,0)
+ I $TL>0 TROLLBACK
+"RTN","BSDX08",314,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX08",315,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",316,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX08",317,0)
+ L -^BSDXAPPT(BSDXAPTID)
+"RTN","BSDX08",318,0)
+ QUIT
+"RTN","BSDX08",319,0)
+ ;
+"RTN","BSDX08",320,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX08",321,0)
+ N $ET S $ET="D ^%ZTER HALT"  ; Emergency Error Trap
+"RTN","BSDX08",322,0)
+ ; Rollback, otherwise ^XTER will be empty from future rollback
+"RTN","BSDX08",323,0)
+ I $TL>0 TROLLBACK 
+"RTN","BSDX08",324,0)
+ D ^%ZTER
+"RTN","BSDX08",325,0)
+ S $EC=""  ; Clear Error
+"RTN","BSDX08",326,0)
+ ; Log error message and send to client
+"RTN","BSDX08",327,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX08",328,0)
+ D ERR(BSDXI,"-100~BSDX08 Error: "_$G(%ZTERZE))
+"RTN","BSDX08",329,0)
+ QUIT
+"RTN","BSDX08",330,0)
+ ;
+"RTN","BSDX08",331,0)
+ ;;;NB: This is code that is unused in both original and port.
+"RTN","BSDX08",332,0)
+ ; ; If not appt in the "S" node is found in ^SC then check associated RPMS Clinic Multiple
+"RTN","BSDX08",333,0)
+ ; I BSDXSCIEN="" D  I 'BSDXZ Q  ;Q:BSDXZ
+"RTN","BSDX08",334,0)
+ ; . S BSDXERR="BSDX08: Unable to find associated RPMS appointment for this patient. "
+"RTN","BSDX08",335,0)
+ ; . S BSDXZ=1
+"RTN","BSDX08",336,0)
+ ; . ; Check if there are associated RPMS clinics. (not currently used) Does the multiple exist? No, then quit
+"RTN","BSDX08",337,0)
+ ; . I '$D(^BSDXRES(BSDXSC1,20)) S BSDXZ=0 QUIT
+"RTN","BSDX08",338,0)
+ ; . ; Loop through the multiple. Get Location and then the ^SC "S" node IEN.
+"RTN","BSDX08",339,0)
+ ; . N BSDX1 S BSDX1=0
+"RTN","BSDX08",340,0)
+ ; . F  S BSDX1=$O(^BSDXRES(BSDXSC1,20,BSDX1)) Q:'+BSDX1  Q:BSDXZ=0  D
+"RTN","BSDX08",341,0)
+ ; . . Q:'$D(^BSDXRES(BSDXSC1,20,BSDX1,0))
+"RTN","BSDX08",342,0)
+ ; . . S BSDXLOC=$P(^BSDXRES(BSDXSC1,20,BSDX1,0),U)
+"RTN","BSDX08",343,0)
+ ; . . S BSDXSCIEN=$$SCIEN^BSDXAPI(BSDXPATID,BSDXLOC,BSDXSTART) I +BSDXSCIEN S BSDXZ=0 Q
+"RTN","BSDX09")
+0^9^B35707298
+"RTN","BSDX09",1,0)
+BSDX09 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;  ; 10/20/10 4:16pm
+"RTN","BSDX09",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX09",3,0)
+ ;
+"RTN","BSDX09",4,0)
+ ; Change Log:
+"RTN","BSDX09",5,0)
+ ; UJO/TH - v 1.3 on 3100714 - Extra Demographics:
+"RTN","BSDX09",6,0)
+ ; - Email
+"RTN","BSDX09",7,0)
+ ; - Cell Phone
+"RTN","BSDX09",8,0)
+ ; - Country
+"RTN","BSDX09",9,0)
+ ; - + refactoring of routine
+"RTN","BSDX09",10,0)
+ ; 
+"RTN","BSDX09",11,0)
+ ; UJO/TH - v 1.3 on 3100715 - Change SSN to PID and get PID field instead
+"RTN","BSDX09",12,0)
+ ;
+"RTN","BSDX09",13,0)
+    ; UJO/TH - v 1.42 on 3101020 - Add Sex field.
+"RTN","BSDX09",14,0)
+    ;
+"RTN","BSDX09",15,0)
+GETREGA(BSDXRET,BSDXPAT)        ;EP
+"RTN","BSDX09",16,0)
+ ;
+"RTN","BSDX09",17,0)
+    ; See below for the returned fields
+"RTN","BSDX09",18,0)
+ ;
+"RTN","BSDX09",19,0)
+ ;For patient with ien BSDXPAT
+"RTN","BSDX09",20,0)
+ ;K ^BSDXTMP($J)
+"RTN","BSDX09",21,0)
+ S BSDXERR=""
+"RTN","BSDX09",22,0)
+ S BSDXRET="^BSDXTMP("_$J_")"
+"RTN","BSDX09",23,0)
+ ;
+"RTN","BSDX09",24,0)
+ N OUT S OUT=$NA(^BSDXTMP($J,0))
+"RTN","BSDX09",25,0)
+ S $P(@OUT,U,1)="T00030IEN"
+"RTN","BSDX09",26,0)
+ S $P(@OUT,U,2)="T00030STREET"
+"RTN","BSDX09",27,0)
+ S $P(@OUT,U,3)="T00030CITY"
+"RTN","BSDX09",28,0)
+ S $P(@OUT,U,4)="T00030STATE"
+"RTN","BSDX09",29,0)
+ S $P(@OUT,U,5)="T00030ZIP"
+"RTN","BSDX09",30,0)
+ S $P(@OUT,U,6)="T00030NAME"
+"RTN","BSDX09",31,0)
+ S $P(@OUT,U,7)="D00030DOB"
+"RTN","BSDX09",32,0)
+ S $P(@OUT,U,8)="T00030PID"
+"RTN","BSDX09",33,0)
+ S $P(@OUT,U,9)="T00030HRN"
+"RTN","BSDX09",34,0)
+ S $P(@OUT,U,10)="T00030HOMEPHONE"
+"RTN","BSDX09",35,0)
+ S $P(@OUT,U,11)="T00030OFCPHONE"
+"RTN","BSDX09",36,0)
+ S $P(@OUT,U,12)="T00030MSGPHONE"
+"RTN","BSDX09",37,0)
+ S $P(@OUT,U,13)="T00030NOK NAME"
+"RTN","BSDX09",38,0)
+ S $P(@OUT,U,14)="T00030RELATIONSHIP"
+"RTN","BSDX09",39,0)
+ S $P(@OUT,U,15)="T00030PHONE"
+"RTN","BSDX09",40,0)
+ S $P(@OUT,U,16)="T00030STREET"
+"RTN","BSDX09",41,0)
+ S $P(@OUT,U,17)="T00030CITY"
+"RTN","BSDX09",42,0)
+ S $P(@OUT,U,18)="T00030STATE"
+"RTN","BSDX09",43,0)
+ S $P(@OUT,U,19)="T00030ZIP"
+"RTN","BSDX09",44,0)
+ S $P(@OUT,U,20)="D00030DATAREVIEWED"
+"RTN","BSDX09",45,0)
+ S $P(@OUT,U,21)="T00030RegistrationComments"
+"RTN","BSDX09",46,0)
+ S $P(@OUT,U,22)="T00050EMAIL ADDRESS"
+"RTN","BSDX09",47,0)
+ S $P(@OUT,U,23)="T00020PHONE NUMBER [CELLULAR]"
+"RTN","BSDX09",48,0)
+ S $P(@OUT,U,24)="T00030COUNTRY"
+"RTN","BSDX09",49,0)
+ S $P(@OUT,U,25)="T00030SEX"
+"RTN","BSDX09",50,0)
+ S $E(@OUT,$L(@OUT)+1)=$C(30)
+"RTN","BSDX09",51,0)
+ ;
+"RTN","BSDX09",52,0)
+ ;
+"RTN","BSDX09",53,0)
+ N BSDXNOD,BSDXNAM,Y,U
+"RTN","BSDX09",54,0)
+ S U="^"
+"RTN","BSDX09",55,0)
+ S BSDXY="ERROR"
+"RTN","BSDX09",56,0)
+ K NAME
+"RTN","BSDX09",57,0)
+ I '+BSDXPAT S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX09",58,0)
+ I '$D(^DPT(+BSDXPAT,0)) S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX09",59,0)
+ S BSDXY=""
+"RTN","BSDX09",60,0)
+ S $P(BSDXY,U)=BSDXPAT
+"RTN","BSDX09",61,0)
+ ;//smh S $P(BSDXY,U,23)=""
+"RTN","BSDX09",62,0)
+ S $P(BSDXY,U,21)=""
+"RTN","BSDX09",63,0)
+ S BSDXNOD=^DPT(+BSDXPAT,0)
+"RTN","BSDX09",64,0)
+ S $P(BSDXY,"^",6)=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX09",65,0)
+ S $P(BSDXY,"^",8)=$$GET1^DIQ(2,BSDXPAT,"PRIMARY LONG ID") ;PID
+"RTN","BSDX09",66,0)
+ S Y=$P(BSDXNOD,U,3) I Y]""  X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX09",67,0)
+ S $P(BSDXY,"^",7)=Y ;DOB
+"RTN","BSDX09",68,0)
+ S $P(BSDXY,"^",9)=""
+"RTN","BSDX09",69,0)
+ I $D(DUZ(2)) I DUZ(2)>0 S $P(BSDXY,"^",9)=$P($G(^AUPNPAT(BSDXPAT,41,DUZ(2),0)),U,2) ;HRN
+"RTN","BSDX09",70,0)
+ D MAIL
+"RTN","BSDX09",71,0)
+ D PHONE
+"RTN","BSDX09",72,0)
+ D NOK
+"RTN","BSDX09",73,0)
+ D DATAREV
+"RTN","BSDX09",74,0)
+ ;/smh D MEDICARE
+"RTN","BSDX09",75,0)
+ D REGCMT
+"RTN","BSDX09",76,0)
+ S $P(BSDXY,"^",22)=$$GET1^DIQ(2,BSDXPAT,"EMAIL ADDRESS")
+"RTN","BSDX09",77,0)
+ S $P(BSDXY,"^",23)=$$GET1^DIQ(2,BSDXPAT,"PHONE NUMBER [CELLULAR]")
+"RTN","BSDX09",78,0)
+ S $P(BSDXY,"^",24)=$$GET1^DIQ(2,BSDXPAT,"COUNTRY:DESCRIPTION")
+"RTN","BSDX09",79,0)
+ S $P(BSDXY,"^",25)=$$GET1^DIQ(2,BSDXPAT,"SEX")
+"RTN","BSDX09",80,0)
+ N BSDXBEG,BSDXEND,BSDXLEN,BSDXI
+"RTN","BSDX09",81,0)
+ S BSDXLEN=$L(BSDXY)
+"RTN","BSDX09",82,0)
+ S BSDXBEG=0,BSDXI=2
+"RTN","BSDX09",83,0)
+ F  D  Q:BSDXEND=BSDXLEN
+"RTN","BSDX09",84,0)
+ . S BSDXEND=BSDXBEG+100
+"RTN","BSDX09",85,0)
+ . S:BSDXEND>BSDXLEN BSDXEND=BSDXLEN
+"RTN","BSDX09",86,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX09",87,0)
+ . S ^BSDXTMP($J,BSDXI)=$E(BSDXY,BSDXBEG,BSDXEND)
+"RTN","BSDX09",88,0)
+ . S BSDXBEG=BSDXBEG+101
+"RTN","BSDX09",89,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(30)_$C(31)
+"RTN","BSDX09",90,0)
+ Q
+"RTN","BSDX09",91,0)
+ ;
+"RTN","BSDX09",92,0)
+MAIL N BSDXST
+"RTN","BSDX09",93,0)
+ Q:'$D(^DPT(+BSDXPAT,.11))
+"RTN","BSDX09",94,0)
+ S BSDXNOD=^DPT(+BSDXPAT,.11)
+"RTN","BSDX09",95,0)
+ Q:BSDXNOD=""
+"RTN","BSDX09",96,0)
+ S $P(BSDXY,"^",2)=$E($P(BSDXNOD,U),1,50) ;STREET
+"RTN","BSDX09",97,0)
+ S $P(BSDXY,"^",3)=$P(BSDXNOD,U,4) ;CITY
+"RTN","BSDX09",98,0)
+ S BSDXST=$P(BSDXNOD,U,5)
+"RTN","BSDX09",99,0)
+ I +BSDXST,$D(^DIC(5,+BSDXST,0)) S BSDXST=$P(^DIC(5,+BSDXST,0),U,2)
+"RTN","BSDX09",100,0)
+ S $P(BSDXY,"^",4)=BSDXST ;STATE
+"RTN","BSDX09",101,0)
+ S $P(BSDXY,"^",5)=$P(BSDXNOD,U,6) ;ZIP
+"RTN","BSDX09",102,0)
+ Q
+"RTN","BSDX09",103,0)
+ ;
+"RTN","BSDX09",104,0)
+PHONE ;PHONE 10,11,12 HOME,OFC,MSG
+"RTN","BSDX09",105,0)
+ I $D(^DPT(+BSDXPAT,.13)) D
+"RTN","BSDX09",106,0)
+ . S BSDXNOD=^DPT(+BSDXPAT,.13)
+"RTN","BSDX09",107,0)
+ . S $P(BSDXY,U,10)=$P(BSDXNOD,U,1)
+"RTN","BSDX09",108,0)
+ . S $P(BSDXY,U,11)=$P(BSDXNOD,U,2)
+"RTN","BSDX09",109,0)
+ I $D(^DPT(+BSDXPAT,.121)) D
+"RTN","BSDX09",110,0)
+ . S BSDXNOD=^DPT(+BSDXPAT,.121)
+"RTN","BSDX09",111,0)
+ . S $P(BSDXY,U,12)=$P(BSDXNOD,U,10)
+"RTN","BSDX09",112,0)
+ Q
+"RTN","BSDX09",113,0)
+ ;
+"RTN","BSDX09",114,0)
+NOK ;NOK
+"RTN","BSDX09",115,0)
+ ;   13 NOK NAME^RELATIONSHIP^PHONE^STREET^CITY^STATE^ZIP
+"RTN","BSDX09",116,0)
+ N Y,BSDXST
+"RTN","BSDX09",117,0)
+ I $D(^DPT(+BSDXPAT,.21)) D
+"RTN","BSDX09",118,0)
+ . S BSDXNOD=^DPT(+BSDXPAT,.21)
+"RTN","BSDX09",119,0)
+ . S $P(BSDXY,U,13)=$P(BSDXNOD,U,1)
+"RTN","BSDX09",120,0)
+ . S $P(BSDXY,U,14)=$$VAL^XBDIQ1(9000001,BSDXPAT,2802)
+"RTN","BSDX09",121,0)
+ . S $P(BSDXY,U,15)=$P(BSDXNOD,U,9)
+"RTN","BSDX09",122,0)
+ . S $P(BSDXY,U,16)=$P(BSDXNOD,U,3)
+"RTN","BSDX09",123,0)
+ . S $P(BSDXY,U,17)=$P(BSDXNOD,U,6)
+"RTN","BSDX09",124,0)
+ . S BSDXST=$P(BSDXNOD,U,7)
+"RTN","BSDX09",125,0)
+ . I +BSDXST D
+"RTN","BSDX09",126,0)
+ . . I $D(^DIC(5,+BSDXST,0)) S BSDXST=$P(^DIC(5,+BSDXST,0),U,2),$P(BSDXY,U,18)=BSDXST
+"RTN","BSDX09",127,0)
+ . S $P(BSDXY,U,19)=$P(BSDXNOD,U,8)
+"RTN","BSDX09",128,0)
+ Q
+"RTN","BSDX09",129,0)
+ ;
+"RTN","BSDX09",130,0)
+DATAREV S $P(BSDXY,U,20)=$P($$VAL^XBDIQ1(9000001,BSDXPAT,16651),"@")
+"RTN","BSDX09",131,0)
+ Q
+"RTN","BSDX09",132,0)
+ ;
+"RTN","BSDX09",133,0)
+REGCMT N BSDXI,BSDXM,BSDXR
+"RTN","BSDX09",134,0)
+ S BSDXR=""
+"RTN","BSDX09",135,0)
+ D ENP^XBDIQ1(9000001,BSDXPAT,1301,"BSDXM(")
+"RTN","BSDX09",136,0)
+ S BSDXI=0 F  S BSDXI=$O(BSDXM(1301,BSDXI)) Q:'+BSDXI  D
+"RTN","BSDX09",137,0)
+ . S BSDXR=BSDXR_" "_BSDXM(1301,BSDXI)
+"RTN","BSDX09",138,0)
+ ; S $P(BSDXY,U,23)=$TR($E(BSDXR,1,1024),U," ") ; MJL 1/17/2007 //smh
+"RTN","BSDX09",139,0)
+ S $P(BSDXY,U,21)=$TR($E(BSDXR,1,1024),U," ") ;
+"RTN","BSDX09",140,0)
+ Q
+"RTN","BSDX09",141,0)
+ ;
+"RTN","BSDX09",142,0)
+GETMCAID(BSDXY,BSDXPAT) ; not in wv
+"RTN","BSDX09",143,0)
+ ;Returns PATIENTIEN^ENTRY#^MEDICAID#^SUBENTRY#^ELIG.BEGIN^ELIG.END |
+"RTN","BSDX09",144,0)
+ ;File is not dinum
+"RTN","BSDX09",145,0)
+ N C,N,ASDGX,BSDXM,BSDXBLD,BSDXCNT
+"RTN","BSDX09",146,0)
+ N BSDXIEN
+"RTN","BSDX09",147,0)
+ S BSDXBLD=""
+"RTN","BSDX09",148,0)
+ S BSDXIEN=0
+"RTN","BSDX09",149,0)
+ S BSDXCNT=1
+"RTN","BSDX09",150,0)
+ F  S BSDXIEN=$O(^AUPNMCD("B",BSDXPAT,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX09",151,0)
+ . S BSDXNUM=$$VAL^XBDIQ1(9000004,BSDXIEN,.03) ;MCAID#
+"RTN","BSDX09",152,0)
+ . D ENPM^XBDIQ1(9000004.11,BSDXIEN_",0",".01:.02","ASDGX(")
+"RTN","BSDX09",153,0)
+ . S C=1,N=0,BSDXM=""
+"RTN","BSDX09",154,0)
+ . F  S N=$O(ASDGX(N)) Q:'N  D
+"RTN","BSDX09",155,0)
+ . . S $P(BSDXY,"|",C)=BSDXPAT_U_BSDXIEN_U_BSDXNUM_U_N_U_ASDGX(N,.01)_U_ASDGX(N,.02)
+"RTN","BSDX09",156,0)
+ . . S C=C+1
+"RTN","BSDX09",157,0)
+ . . Q
+"RTN","BSDX09",158,0)
+ . Q
+"RTN","BSDX09",159,0)
+ Q
+"RTN","BSDX09",160,0)
+ ;
+"RTN","BSDX09",161,0)
+MEDICARE ; not in WV
+"RTN","BSDX09",162,0)
+ S $P(BSDXY,U,21)=$$VAL^XBDIQ1(9000003,BSDXPAT,.03)
+"RTN","BSDX09",163,0)
+ S $P(BSDXY,U,22)=$$VAL^XBDIQ1(9000003,BSDXPAT,.04)
+"RTN","BSDX09",164,0)
+ Q
+"RTN","BSDX09",165,0)
+ ;
+"RTN","BSDX09",166,0)
+GETMCARE(BSDXY,BSDXPAT)      ;
+"RTN","BSDX09",167,0)
+ ;Returns IEN^MEDICARE#^SUFFIX^SUBENTRY#^TYPE^ELIG.BEGIN^ELIG.END |
+"RTN","BSDX09",168,0)
+ ;File is dinum
+"RTN","BSDX09",169,0)
+ ;
+"RTN","BSDX09",170,0)
+ N ASDGX,C,N,BSDXNUM,BSDXSUF,BSDXBLD
+"RTN","BSDX09",171,0)
+ S BSDXNUM=$$VAL^XBDIQ1(9000003,BSDXPAT,.03)
+"RTN","BSDX09",172,0)
+ S BSDXSUF=$$VAL^XBDIQ1(9000003,BSDXPAT,.04)
+"RTN","BSDX09",173,0)
+ D ENPM^XBDIQ1(9000003.11,BSDXPAT_",0",".01:.03","ASDGX(")
+"RTN","BSDX09",174,0)
+ S C=1,N=0,BSDXBLD=""
+"RTN","BSDX09",175,0)
+ F  S N=$O(ASDGX(N)) Q:'N  D
+"RTN","BSDX09",176,0)
+ . S $P(BSDXY,"|",C)=BSDXPAT_U_BSDXNUM_U_BSDXSUF_U_N_U_ASDGX(N,.03)_U_ASDGX(N,.01)_U_ASDGX(N,.02)
+"RTN","BSDX09",177,0)
+ . S C=C+1
+"RTN","BSDX09",178,0)
+ . Q
+"RTN","BSDX09",179,0)
+ Q
+"RTN","BSDX09",180,0)
+ ;
+"RTN","BSDX09",181,0)
+GETPVTIN(BSDXY,BSDXPAT) ;
+"RTN","BSDX09",182,0)
+ ;Returns IEN^SUBENTRY^INSURER^POLICYNUMBER^ELIG.BEGIN^ELIG.END|...
+"RTN","BSDX09",183,0)
+ ;File is dinum
+"RTN","BSDX09",184,0)
+ ;
+"RTN","BSDX09",185,0)
+ N ASDGX,C,N
+"RTN","BSDX09",186,0)
+ D ENPM^XBDIQ1(9000006.11,BSDXPAT_",0",".01;.02;.06;.07","ASDGX(")
+"RTN","BSDX09",187,0)
+ S C=1,N=0
+"RTN","BSDX09",188,0)
+ F  S N=$O(ASDGX(N)) Q:'N  D
+"RTN","BSDX09",189,0)
+ . S $P(BSDXY,"|",C)=BSDXPAT_U_N_U_ASDGX(N,.01)_U_ASDGX(N,.02)_U_ASDGX(N,.06)_U_ASDGX(N,.07)
+"RTN","BSDX09",190,0)
+ . S C=C+1
+"RTN","BSDX09",191,0)
+ . Q
+"RTN","BSDX09",192,0)
+ Q
+"RTN","BSDX09",193,0)
+ ;
+"RTN","BSDX09",194,0)
+DFN(FILE,BSDXPAT) ; -- returns ien for file
+"RTN","BSDX09",195,0)
+ I FILE'[9000004 Q BSDXPAT
+"RTN","BSDX09",196,0)
+ Q +$O(^AUPNMCD("B",BSDXPAT,0))
+"RTN","BSDX11")
+0^34^B6358791
+"RTN","BSDX11",1,0)
+BSDX11 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX11",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX11",3,0)
+ ;
+"RTN","BSDX11",4,0)
+ENV0100 ;EP Version 1.0 Environment check
+"RTN","BSDX11",5,0)
+ I '$G(IOM) D HOME^%ZIS
+"RTN","BSDX11",6,0)
+ I '$G(DUZ) W !,"DUZ UNDEFINED OR 0." D SORRY(2) Q
+"RTN","BSDX11",7,0)
+ I '$L($G(DUZ(0))) W !,"DUZ(0) UNDEFINED OR NULL." D SORRY(2) Q
+"RTN","BSDX11",8,0)
+ I '(DUZ(0)["@") W:'$D(ZTQUEUED) !,"DUZ(0) DOES NOT CONTAIN AN '@'." D SORRY(2) Q
+"RTN","BSDX11",9,0)
+ S X=$$GET1^DIQ(200,DUZ,.01)
+"RTN","BSDX11",10,0)
+ W !!,$$CJ^XLFSTR("Hello, "_$P(X,",",2)_" "_$P(X,","),IOM)
+"RTN","BSDX11",11,0)
+ W !!,$$CJ^XLFSTR("Checking Environment...",IOM)
+"RTN","BSDX11",12,0)
+ ;
+"RTN","BSDX11",13,0)
+ ;is the PIMS requirement present?
+"RTN","BSDX11",14,0)
+ I '$$INSTALLD("PIMS*5.3*1003") D
+"RTN","BSDX11",15,0)
+ .D BMES^XPDUTL("Version 1.0 of the BSDX Package")
+"RTN","BSDX11",16,0)
+ . D BMES^XPDUTL("Cannot Be Installed Unless")
+"RTN","BSDX11",17,0)
+ . D BMES^XPDUTL("Patch 1003 of version 5.3 of the PIMS Package has been installed.")
+"RTN","BSDX11",18,0)
+ . D SORRY(2)
+"RTN","BSDX11",19,0)
+ . Q
+"RTN","BSDX11",20,0)
+ ;is the BMX requirement present?
+"RTN","BSDX11",21,0)
+ I '$$INSTALLD("BMX 1.0") D
+"RTN","BSDX11",22,0)
+ .D BMES^XPDUTL("Version 1.0 of the BSDX Package")
+"RTN","BSDX11",23,0)
+ . D BMES^XPDUTL("Cannot Be Installed Unless")
+"RTN","BSDX11",24,0)
+ . D BMES^XPDUTL("version 1.0 of the BMX Package has been installed.")
+"RTN","BSDX11",25,0)
+ . D SORRY(2)
+"RTN","BSDX11",26,0)
+ . Q
+"RTN","BSDX11",27,0)
+ Q
+"RTN","BSDX11",28,0)
+ ;End Environment check
+"RTN","BSDX11",29,0)
+ ;
+"RTN","BSDX11",30,0)
+V0100 ;EP Version 1.0 PostInit
+"RTN","BSDX11",31,0)
+ ;Add Protocol items to BSDAM APPOINTMENT EVENTS protocol
+"RTN","BSDX11",32,0)
+ ;
+"RTN","BSDX11",33,0)
+ N BSDXDA,BSDXFDA,BSDXDA1,BSDXSEQ,BSDXDAT,BSDXNOD,BSDXIEN,BSDXMSG
+"RTN","BSDX11",34,0)
+ S BSDXDA=$O(^ORD(101,"B","BSDAM APPOINTMENT EVENTS",0))
+"RTN","BSDX11",35,0)
+ Q:'+BSDXDA
+"RTN","BSDX11",36,0)
+ S BSDXDAT="BSDX ADD APPOINTMENT;10.2^BSDX CANCEL APPOINTMENT;10.4^BSDX CHECKIN APPOINTMENT;10.6^BSDX NOSHOW APPOINTMENT;10.8"
+"RTN","BSDX11",37,0)
+ F J=1:1:$L(BSDXDAT,U) D
+"RTN","BSDX11",38,0)
+ . K BSDXIEN,BSDXMSG,BSDXFDA
+"RTN","BSDX11",39,0)
+ . S BSDXNOD=$P(BSDXDAT,U,J)
+"RTN","BSDX11",40,0)
+ . S BSDXDA1=$P(BSDXNOD,";")
+"RTN","BSDX11",41,0)
+ . S BSDXSEQ=$P(BSDXNOD,";",2)
+"RTN","BSDX11",42,0)
+ . S BSDXDA1=$O(^ORD(101,"B",BSDXDA1,0))
+"RTN","BSDX11",43,0)
+ . Q:'+BSDXDA1
+"RTN","BSDX11",44,0)
+ . Q:$D(^ORD(101,BSDXDA,10,"B",BSDXDA1))
+"RTN","BSDX11",45,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",",".01")=BSDXDA1
+"RTN","BSDX11",46,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",","3")=BSDXSEQ
+"RTN","BSDX11",47,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX11",48,0)
+ . Q
+"RTN","BSDX11",49,0)
+ Q
+"RTN","BSDX11",50,0)
+ ;
+"RTN","BSDX11",51,0)
+SORRY(X) ;
+"RTN","BSDX11",52,0)
+ KILL DIFQ
+"RTN","BSDX11",53,0)
+ S XPDQUIT=X
+"RTN","BSDX11",54,0)
+ W *7,!,$$CJ^XLFSTR("Sorry....Please fix it.",IOM)
+"RTN","BSDX11",55,0)
+ Q
+"RTN","BSDX11",56,0)
+ ;
+"RTN","BSDX11",57,0)
+INSTALLD(BMXPKG) ;
+"RTN","BSDX11",58,0)
+ ;Determine if BMXPKG is present.
+"RTN","BSDX11",59,0)
+ Q 1
+"RTN","BSDX11",60,0)
+ ;S BSDXFIN=$O(^XPD(9.7,"B","PIMS*5.3*1003",""))
+"RTN","BSDX11",61,0)
+ S BSDXFIN=$O(^XPD(9.7,"B",BMXPKG,""))
+"RTN","BSDX11",62,0)
+ I $G(BSDXFIN)="" Q 0
+"RTN","BSDX11",63,0)
+ S BSDXSTAT=$P($G(^XPD(9.7,BSDXFIN,0)),U,9)
+"RTN","BSDX11",64,0)
+ ;'0' Loaded from Distribution
+"RTN","BSDX11",65,0)
+ ;'1' Queued for Install 
+"RTN","BSDX11",66,0)
+ ;'2' Start of Install 
+"RTN","BSDX11",67,0)
+ ;'3' Install Completed 
+"RTN","BSDX11",68,0)
+ ;'4' FOR De-Installed; 
+"RTN","BSDX11",69,0)
+ ;
+"RTN","BSDX11",70,0)
+ I BSDXSTAT'=3 Q 0
+"RTN","BSDX11",71,0)
+ Q 1
+"RTN","BSDX12")
+0^10^B7203579
+"RTN","BSDX12",1,0)
+BSDX12 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/18/10 2:14pm
+"RTN","BSDX12",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX12",3,0)
+    ; 
+"RTN","BSDX12",4,0)
+    ; Change Log:
+"RTN","BSDX12",5,0)
+    ; v 1.3 - i18n support - 3100718
+"RTN","BSDX12",6,0)
+    ; BSDXSTART and BSDXEND passed in FM Dates, not US dates
+"RTN","BSDX12",7,0)
+ ;
+"RTN","BSDX12",8,0)
+ ;
+"RTN","BSDX12",9,0)
+AVADD(BSDXY,BSDXSTART,BSDXEND,BSDXTYPID,BSDXRES,BSDXSLOTS,BSDXNOTE)  ;EP
+"RTN","BSDX12",10,0)
+ ;Called by BSDX ADD NEW AVAILABILITY
+"RTN","BSDX12",11,0)
+ ;Create entry in BSDX ACCESS BLOCK
+"RTN","BSDX12",12,0)
+ ;
+"RTN","BSDX12",13,0)
+ ;BSDXRES is Resource Name
+"RTN","BSDX12",14,0)
+ ;Returns recordset having fields 
+"RTN","BSDX12",15,0)
+ ; AvailabilityID and ErrorNumber
+"RTN","BSDX12",16,0)
+ ;
+"RTN","BSDX12",17,0)
+ ;Test lines:
+"RTN","BSDX12",18,0)
+ ;D AVADD^BSDX12(.RES,"3091227.09","3091227.0930","1","WHITT",2,"SCRATCH AV NOTE") ZW RES
+"RTN","BSDX12",19,0)
+ ;BSDX ADD NEW AVAILABILITY^3091227.09^3091227.0930^1^WHITT^2^SCRATCH AVAILABILITY NOTE
+"RTN","BSDX12",20,0)
+ ;
+"RTN","BSDX12",21,0)
+ N BSDXERR,BSDXIEN,BSDXDEP,BSDXI,BSDXAVID,BSDXI,BSDXERR,BSDXFDA,BSDXMSG,BSDXRESD
+"RTN","BSDX12",22,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX12",23,0)
+ S BSDXERR=0
+"RTN","BSDX12",24,0)
+ S BSDXI=0
+"RTN","BSDX12",25,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX12",26,0)
+ S ^BSDXTMP($J,0)="I00020AVAILABILITYID^I00020ERRORID"_$C(30)
+"RTN","BSDX12",27,0)
+ ;Check input data for errors
+"RTN","BSDX12",28,0)
+    ; i18n - FM Dates passed in
+"RTN","BSDX12",29,0)
+ ; S:BSDXSTART["@0000" BSDXSTART=$P(BSDXSTART,"@")
+"RTN","BSDX12",30,0)
+ ; S:BSDXEND["@0000" BSDXEND=$P(BSDXEND,"@")
+"RTN","BSDX12",31,0)
+ ; S %DT="T",X=BSDXSTART D ^%DT S BSDXSTART=Y
+"RTN","BSDX12",32,0)
+ ; I BSDXSTART=-1 D ERR(70) Q
+"RTN","BSDX12",33,0)
+ ; S %DT="T",X=BSDXEND D ^%DT S BSDXEND=Y
+"RTN","BSDX12",34,0)
+ ; I BSDXEND=-1 D ERR(70) Q
+"RTN","BSDX12",35,0)
+    ; Make sure dates are canonical and don't contain extra zeros
+"RTN","BSDX12",36,0)
+    S BSDXSTART=+BSDXSTART,BSDXEND=+BSDXEND
+"RTN","BSDX12",37,0)
+    ;
+"RTN","BSDX12",38,0)
+ I $L(BSDXEND,".")=1 D ERR(70) Q
+"RTN","BSDX12",39,0)
+ I BSDXSTART>BSDXEND S BSDXTMP=BSDXEND,BSDXEND=BSDXSTART,BSDXSTART=BSDXTMP
+"RTN","BSDX12",40,0)
+ ;Validate Access Type
+"RTN","BSDX12",41,0)
+ I '+BSDXTYPID,'$D(^BSDXTYPE(BSDXTYPID,0)) D ERR(70) Q
+"RTN","BSDX12",42,0)
+ ;Validate Resource
+"RTN","BSDX12",43,0)
+ I '$D(^BSDXRES("B",BSDXRES)) S BSDXERR=70 D ERR(BSDXERR) Q
+"RTN","BSDX12",44,0)
+ S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0)) I '+BSDXRESD S BSDXERR=70 D ERR(BSDXERR) Q
+"RTN","BSDX12",45,0)
+ ;
+"RTN","BSDX12",46,0)
+ ;Create entry in BSDX ACCESS BLOCK
+"RTN","BSDX12",47,0)
+ S BSDXFDA(9002018.3,"+1,",.01)=BSDXRESD
+"RTN","BSDX12",48,0)
+ S BSDXFDA(9002018.3,"+1,",.02)=BSDXSTART
+"RTN","BSDX12",49,0)
+ S BSDXFDA(9002018.3,"+1,",.03)=BSDXEND
+"RTN","BSDX12",50,0)
+ S BSDXFDA(9002018.3,"+1,",.04)=BSDXSLOTS
+"RTN","BSDX12",51,0)
+ S BSDXFDA(9002018.3,"+1,",.05)=BSDXTYPID
+"RTN","BSDX12",52,0)
+ K BSDXIEN,BSDXMSG
+"RTN","BSDX12",53,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX12",54,0)
+ S BSDXAVID=+$G(BSDXIEN(1))
+"RTN","BSDX12",55,0)
+ I 'BSDXAVID D ERR(70) Q
+"RTN","BSDX12",56,0)
+ ;
+"RTN","BSDX12",57,0)
+ ;Add WP field
+"RTN","BSDX12",58,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX12",59,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX12",60,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX12",61,0)
+ . D WP^DIE(9002018.3,BSDXAVID_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX12",62,0)
+ ;
+"RTN","BSDX12",63,0)
+ ;Return Recordset
+"RTN","BSDX12",64,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",65,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXAVID_"^-1"_$C(30)
+"RTN","BSDX12",66,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",67,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX12",68,0)
+ Q
+"RTN","BSDX12",69,0)
+ ;
+"RTN","BSDX12",70,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX12",71,0)
+ S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX12",72,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",73,0)
+ S ^BSDXTMP($J,BSDXI)="0^"_BSDXERR_$C(30)
+"RTN","BSDX12",74,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",75,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX12",76,0)
+ Q
+"RTN","BSDX13")
+0^11^B9772451
+"RTN","BSDX13",1,0)
+BSDX13 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 6:05pm
+"RTN","BSDX13",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX13",3,0)
+    ;
+"RTN","BSDX13",4,0)
+    ; Change Log:
+"RTN","BSDX13",5,0)
+    ; V 1.3 - i18n support - Dates passed to Routine as FM Date - WV/SMH
+"RTN","BSDX13",6,0)
+ Q
+"RTN","BSDX13",7,0)
+AVDELDTD(BSDXY,BSDXRESD,BSDXSTART,BSDXEND) ;EP
+"RTN","BSDX13",8,0)
+ ;Entry point for debugging
+"RTN","BSDX13",9,0)
+ ;
+"RTN","BSDX13",10,0)
+ ;D DEBUG^%Serenji("AVDELDT^BSDX13(.BSDXY,BSDXRESD,BSDXSTART,BSDXEND)")
+"RTN","BSDX13",11,0)
+ Q
+"RTN","BSDX13",12,0)
+ ;
+"RTN","BSDX13",13,0)
+AVDELDT(BSDXY,BSDXRESD,BSDXSTART,BSDXEND) ;EP
+"RTN","BSDX13",14,0)
+ ;Cancel availability in a date range
+"RTN","BSDX13",15,0)
+ ;Called by BSDX CANCEL AV BY DATE
+"RTN","BSDX13",16,0)
+ ;
+"RTN","BSDX13",17,0)
+ ;BSDXRESD is BSDX RESOURCE ien
+"RTN","BSDX13",18,0)
+ ;BSDXSTART and BSDXEND are FM dates (change in v 1.3)
+"RTN","BSDX13",19,0)
+ ;
+"RTN","BSDX13",20,0)
+ S X="ERROR^BSDX13",@^%ZOSF("TRAP")
+"RTN","BSDX13",21,0)
+ N BMXIEN,BSDXI
+"RTN","BSDX13",22,0)
+ S BSDXI=0
+"RTN","BSDX13",23,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX13",24,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX13",25,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX13",26,0)
+ ; S X=BSDXSTART ; commented out *v1.3
+"RTN","BSDX13",27,0)
+ ; S %DT="X" D ^%DT
+"RTN","BSDX13",28,0)
+ ; I Y=-1 D ERR(0,"AVDELDT-BSDX13: Invalid Start Date") Q
+"RTN","BSDX13",29,0)
+ ; S BSDXSTART=$P(Y,".")
+"RTN","BSDX13",30,0)
+ ; S X=BSDXEND
+"RTN","BSDX13",31,0)
+ ; S %DT="X" D ^%DT
+"RTN","BSDX13",32,0)
+ ; I Y=-1 D ERR(0,"AVDELDT-BSDX13: Invalid End Date") Q
+"RTN","BSDX13",33,0)
+ S BSDXEND=$P(BSDXEND,".")_".99999"
+"RTN","BSDX13",34,0)
+ I '+BSDXRESD D ERR(0,"AVDELDT-BSDX13: Invalid Resource ID") Q
+"RTN","BSDX13",35,0)
+ ;
+"RTN","BSDX13",36,0)
+ F  S BSDXSTART=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXSTART)) Q:'+BSDXSTART  Q:BSDXSTART>BSDXEND  D
+"RTN","BSDX13",37,0)
+ . S BMXIEN=0
+"RTN","BSDX13",38,0)
+ . F  S BMXIEN=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXSTART,BMXIEN)) Q:'+BMXIEN  D
+"RTN","BSDX13",39,0)
+ . . D CALLDIK(BMXIEN)
+"RTN","BSDX13",40,0)
+ ;
+"RTN","BSDX13",41,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",42,0)
+ S ^BSDXTMP($J,BSDXI)="-1^"_$C(30)_$C(31)
+"RTN","BSDX13",43,0)
+ Q
+"RTN","BSDX13",44,0)
+ERROR ;
+"RTN","BSDX13",45,0)
+ D ^%ZTER
+"RTN","BSDX13",46,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX13",47,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",48,0)
+ D ERR(0,"BSDX13 M Error: <"_$G(%ZTERZE)_">")
+"RTN","BSDX13",49,0)
+ Q
+"RTN","BSDX13",50,0)
+ ;
+"RTN","BSDX13",51,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX13",52,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX13",53,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",54,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX13",55,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",56,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX13",57,0)
+ Q
+"RTN","BSDX13",58,0)
+ ;
+"RTN","BSDX13",59,0)
+AVDEL(BSDXY,BSDXAVID) ;EP
+"RTN","BSDX13",60,0)
+ ;Called by BSDX CANCEL AVAILABILITY
+"RTN","BSDX13",61,0)
+ ;Deletes Access block
+"RTN","BSDX13",62,0)
+ ;BSDXAVID is entry number in BSDX AVAILABILITY file
+"RTN","BSDX13",63,0)
+ ;Returns error code in recordset field ERRORID
+"RTN","BSDX13",64,0)
+ ;
+"RTN","BSDX13",65,0)
+ S X="ERROR^BSDX13",@^%ZOSF("TRAP")
+"RTN","BSDX13",66,0)
+ N BSDXNOD,BSDXSTART,DIK,DA,BSDXID,BSDXI,BSDXEND,BSDXRSID
+"RTN","BSDX13",67,0)
+ ;
+"RTN","BSDX13",68,0)
+ S BSDXI=0
+"RTN","BSDX13",69,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX13",70,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX13",71,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX13",72,0)
+ I '+BSDXAVID D ERR(70) Q
+"RTN","BSDX13",73,0)
+ I '$D(^BSDXAB(BSDXAVID,0)) D ERR(70) Q
+"RTN","BSDX13",74,0)
+ ;
+"RTN","BSDX13",75,0)
+ ;
+"RTN","BSDX13",76,0)
+ ;TODO: Test for existing appointments in availability block
+"RTN","BSDX13",77,0)
+ ; (corresponds to old qryAppointmentBlocksOverlapC
+"RTN","BSDX13",78,0)
+ ;  and AVBlockHasAppointments)
+"RTN","BSDX13",79,0)
+ ;
+"RTN","BSDX13",80,0)
+ ;I $$APTINBLK(BSDXAVID) D ERR(20) Q
+"RTN","BSDX13",81,0)
+ ;
+"RTN","BSDX13",82,0)
+ ;Delete AVAILABILITY entries
+"RTN","BSDX13",83,0)
+ D CALLDIK(BSDXAVID)
+"RTN","BSDX13",84,0)
+ ;
+"RTN","BSDX13",85,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",86,0)
+ S ^BSDXTMP($J,BSDXI)="-1^"_$C(30)_$C(31)
+"RTN","BSDX13",87,0)
+ Q
+"RTN","BSDX13",88,0)
+ ;
+"RTN","BSDX13",89,0)
+CALLDIK(BSDXAVID) ;
+"RTN","BSDX13",90,0)
+ ;Delete AVAILABILITY entries
+"RTN","BSDX13",91,0)
+ ;
+"RTN","BSDX13",92,0)
+ S DIK="^BSDXAB("
+"RTN","BSDX13",93,0)
+ S DA=BSDXAVID
+"RTN","BSDX13",94,0)
+ D ^DIK
+"RTN","BSDX13",95,0)
+ ;
+"RTN","BSDX13",96,0)
+ Q
+"RTN","BSDX13",97,0)
+ ;
+"RTN","BSDX13",98,0)
+APTINBLK(BSDXAVID) ;
+"RTN","BSDX13",99,0)
+ ;
+"RTN","BSDX13",100,0)
+ ;NOTE: This Subroutine Not called in current version.  Keep code for later use.
+"RTN","BSDX13",101,0)
+ ;
+"RTN","BSDX13",102,0)
+ ;N BSDXS,BSDXID,BSDXHIT,BSDXNOD,BSDXE,BSDXSTART,BSDXEND,BSDXRSID
+"RTN","BSDX13",103,0)
+ ;S BSDXNOD=^BSDXAB(BSDXAVID,0)
+"RTN","BSDX13",104,0)
+ ;S BSDXSTART=$P(BSDXNOD,U,3)
+"RTN","BSDX13",105,0)
+ ;S BSDXEND=$P(BSDXNOD,U,4)
+"RTN","BSDX13",106,0)
+ ;S BSDXRSID=$P(BSDXNOD,U,1)
+"RTN","BSDX13",107,0)
+ ;I '$D(^BSDXDAPRS("ARSRC",BSDXRSID)) Q 0
+"RTN","BSDX13",108,0)
+ ;;If any appointments start at the AV block start time:
+"RTN","BSDX13",109,0)
+ ;I $D(^BSDXDAPRS("ARSRC",BSDXRSID,BSDXSTART)) Q 1
+"RTN","BSDX13",110,0)
+ ;;Find the first appt time BSDXS on the same day as the av block
+"RTN","BSDX13",111,0)
+ ;S BSDXS=$O(^BSDXDAPRS("ARSRC",BSDXRSID,$P(BSDXSTART,".")))
+"RTN","BSDX13",112,0)
+ ;I BSDXS>BSDXEND Q 0
+"RTN","BSDX13",113,0)
+ ;;For all the appts that day with start times less
+"RTN","BSDX13",114,0)
+ ;;than the av block's end time, find any whose end time is
+"RTN","BSDX13",115,0)
+ ;;greater than the av block's start time
+"RTN","BSDX13",116,0)
+ ;S BSDXHIT=0
+"RTN","BSDX13",117,0)
+ ;S BSDXS=BSDXS-.0001
+"RTN","BSDX13",118,0)
+ ;F  S BSDXS=$O(^BSDXDAPRS("ARSRC",BSDXRSID,BSDXS)) Q:'+BSDXS  Q:BSDXS'<BSDXEND  D  Q:BSDXHIT
+"RTN","BSDX13",119,0)
+ ;. S BSDXID=0 F  S BSDXID=$O(^BSDXDAPRS("ARSRC",BSDXRSID,BSDXS,BSDXID)) Q:'+BSDXID  D  Q:BSDXHIT
+"RTN","BSDX13",120,0)
+ ;. . Q:'$D(^BSDXDAPT(BSDXID,0))
+"RTN","BSDX13",121,0)
+ ;. . S BSDXNOD=^BSDXDAPT(BSDXID,0)
+"RTN","BSDX13",122,0)
+ ;. . S BSDXE=$P(BSDXNOD,U,2)
+"RTN","BSDX13",123,0)
+ ;. . I BSDXE>BSDXSTART S BSDXHIT=1 Q
+"RTN","BSDX13",124,0)
+ ;;
+"RTN","BSDX13",125,0)
+ ;I BSDXHIT Q 1
+"RTN","BSDX13",126,0)
+ Q 0
+"RTN","BSDX13",127,0)
+ ;
+"RTN","BSDX13",128,0)
+ ;ERR(ERRNO) ;Error processing
+"RTN","BSDX13",129,0)
+ ;N BSDXERR
+"RTN","BSDX13",130,0)
+ ;S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX13",131,0)
+ ;S BSDXI=BSDXI+1
+"RTN","BSDX13",132,0)
+ ;S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX13",133,0)
+ ;S BSDXI=BSDXI+1
+"RTN","BSDX13",134,0)
+ ;S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX13",135,0)
+ ;Q
+"RTN","BSDX14")
+0^12^B6450810
+"RTN","BSDX14",1,0)
+BSDX14 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX14",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX14",3,0)
+ ;
+"RTN","BSDX14",4,0)
+ ;
+"RTN","BSDX14",5,0)
+ACCTYPD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX14",6,0)
+ ;Entry point for debugging
+"RTN","BSDX14",7,0)
+ ;
+"RTN","BSDX14",8,0)
+ ;D DEBUG^%Serenji("ACCTYP^BSDX14(.BSDXY,BSDXVAL)")
+"RTN","BSDX14",9,0)
+ Q
+"RTN","BSDX14",10,0)
+ ;
+"RTN","BSDX14",11,0)
+ACCTYP(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX14",12,0)
+ ;Called by BSDX ADD/EDIT ACCESS TYPE
+"RTN","BSDX14",13,0)
+ ;Add/Edit ACCESS TYPE entry
+"RTN","BSDX14",14,0)
+ ;BSDXVAL is IEN|NAME|INACTIVE|COLOR|RED|GREEN|BLUE
+"RTN","BSDX14",15,0)
+ ;If IEN=0 Then this is a new ACCTYPE
+"RTN","BSDX14",16,0)
+ ;Test Line:
+"RTN","BSDX14",17,0)
+ ;D ACCTYP^BSDX14(.RES,"0|ORAL HYGIENE|false|Red")
+"RTN","BSDX14",18,0)
+ ;
+"RTN","BSDX14",19,0)
+ S X="ERROR^BSDX14",@^%ZOSF("TRAP")
+"RTN","BSDX14",20,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXNAM
+"RTN","BSDX14",21,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX14",22,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSTYPEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX14",23,0)
+ I BSDXVAL="" D ERR(0,"BSDX14: Invalid null input Parameter") Q
+"RTN","BSDX14",24,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX14",25,0)
+ I +BSDXIEN D
+"RTN","BSDX14",26,0)
+ . S BSDX="EDIT"
+"RTN","BSDX14",27,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX14",28,0)
+ E  D
+"RTN","BSDX14",29,0)
+ . S BSDX="ADD"
+"RTN","BSDX14",30,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX14",31,0)
+ ;
+"RTN","BSDX14",32,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX14",33,0)
+ I BSDXNAM="" D ERR(0,"BSDX14: Invalid null Access Type name.") Q
+"RTN","BSDX14",34,0)
+ ;
+"RTN","BSDX14",35,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX14",36,0)
+ I $D(^BSDXTYPE("B",BSDXNAM)),$O(^BSDXTYPE("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX14",37,0)
+ . D ERR(0,"BSDX14: Cannot have two Access Types with the same name.")
+"RTN","BSDX14",38,0)
+ . Q
+"RTN","BSDX14",39,0)
+ ;
+"RTN","BSDX14",40,0)
+ S BSDXINA=$P(BSDXVAL,"|",3)
+"RTN","BSDX14",41,0)
+ S BSDXINA=$S(BSDXINA="YES":1,1:0)
+"RTN","BSDX14",42,0)
+ ;
+"RTN","BSDX14",43,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.01)=$P(BSDXVAL,"|",2) ;NAME
+"RTN","BSDX14",44,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.02)=BSDXINA ;INACTIVE
+"RTN","BSDX14",45,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.04)=$P(BSDXVAL,"|",4) ;COLOR
+"RTN","BSDX14",46,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.05)=$P(BSDXVAL,"|",5) ;RED
+"RTN","BSDX14",47,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.06)=$P(BSDXVAL,"|",6) ;GREEN
+"RTN","BSDX14",48,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.07)=$P(BSDXVAL,"|",7) ;BLUE
+"RTN","BSDX14",49,0)
+ K BSDXMSG
+"RTN","BSDX14",50,0)
+ I BSDX="ADD" D
+"RTN","BSDX14",51,0)
+ . K BSDXIEN
+"RTN","BSDX14",52,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX14",53,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX14",54,0)
+ E  D
+"RTN","BSDX14",55,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX14",56,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^-1"_$C(30)_$C(31)
+"RTN","BSDX14",57,0)
+ Q
+"RTN","BSDX14",58,0)
+ ;
+"RTN","BSDX14",59,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX14",60,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX14",61,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX14",62,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX14",63,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX14",64,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX14",65,0)
+ Q
+"RTN","BSDX14",66,0)
+ ;
+"RTN","BSDX14",67,0)
+ERROR ;
+"RTN","BSDX14",68,0)
+ D ^%ZTER
+"RTN","BSDX14",69,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX14",70,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX14",71,0)
+ D ERR(0,"BSDX14 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX14",72,0)
+ Q
+"RTN","BSDX15")
+0^13^B5327807
+"RTN","BSDX15",1,0)
+BSDX15 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX15",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX15",3,0)
+ ;
+"RTN","BSDX15",4,0)
+ ;
+"RTN","BSDX15",5,0)
+GRPTYP(BSDXY) ;EP
+"RTN","BSDX15",6,0)
+ ;Called by BSDX GET ACCESS GROUP TYPES
+"RTN","BSDX15",7,0)
+ ;Returns ADO recordset containing ACTIVE Access types ordered alphabetically
+"RTN","BSDX15",8,0)
+ ;by Access Group
+"RTN","BSDX15",9,0)
+ ;AccessGroupID, AccessGroup, AccessTypeID, AccessType
+"RTN","BSDX15",10,0)
+ ;
+"RTN","BSDX15",11,0)
+ ;Test Code:
+"RTN","BSDX15",12,0)
+ ;D GRPTYP^BSDX15(.RES) ZW RES
+"RTN","BSDX15",13,0)
+ ;
+"RTN","BSDX15",14,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX15",15,0)
+ N BSDX1
+"RTN","BSDX15",16,0)
+ S BSDXI=0
+"RTN","BSDX15",17,0)
+ S X="ETRAP^BSDX15",@^%ZOSF("TRAP")
+"RTN","BSDX15",18,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ACCESS_GROUP_TYPEID^I00020ACCESS_GROUP_ID^T00030ACCESS_GROUP^I00020ACCESS_TYPE_ID^T00030ACCESS_TYPE"_$C(30)
+"RTN","BSDX15",19,0)
+ ;
+"RTN","BSDX15",20,0)
+ ;N BSDX0,BSDX1,BSDXNOD,BSDXGPN,BSDXTN
+"RTN","BSDX15",21,0)
+ ;$O Through "B" x-ref of BSDX ACCESS GROUP file
+"RTN","BSDX15",22,0)
+ ;S BSDXGPN=0 F  S BSDXGPN=$O(^BSDXAGP("B",BSDXGPN)) Q:BSDXGPN=""  D
+"RTN","BSDX15",23,0)
+ ;. S BSDX0=$O(^BSDXAGP("B",BSDXGPN,0))
+"RTN","BSDX15",24,0)
+ ;. Q:'+BSDX0
+"RTN","BSDX15",25,0)
+ ;. Q:'$D(^BSDXAGP(BSDX0,0))  ;INDEX VALIDITY CHECK
+"RTN","BSDX15",26,0)
+ ;. Q:'$D(^BSDXAGTP("B",BSDX0))
+"RTN","BSDX15",27,0)
+ ;. ;$O through "B" x-ref of BSDX ACCESS GROUP TYPE
+"RTN","BSDX15",28,0)
+ ;. S BSDX1=0 F  S BSDX1=$O(^BSDXAGTP("B",BSDX0,BSDX1)) Q:'+BSDX1  D
+"RTN","BSDX15",29,0)
+ ;. . Q:'$D(^BSDXAGTP(BSDX1,0))
+"RTN","BSDX15",30,0)
+ ;. . S BSDX2=$P(^BSDXAGTP(BSDX1,0),U,2)
+"RTN","BSDX15",31,0)
+ ;. . Q:'+BSDX2
+"RTN","BSDX15",32,0)
+ ;. . Q:'$D(^BSDXTYPE(BSDX2,0))
+"RTN","BSDX15",33,0)
+ ;. . S BSDXNOD=^BSDXTYPE(BSDX2,0)
+"RTN","BSDX15",34,0)
+ ;. . Q:$P(BSDXNOD,U,2)=1  ;INACTIVE
+"RTN","BSDX15",35,0)
+ ;. . S BSDXTN=$P(BSDXNOD,U)
+"RTN","BSDX15",36,0)
+ ;. . S BSDXI=BSDXI+1
+"RTN","BSDX15",37,0)
+ ;. . S ^BSDXTMP($J,BSDXI)=BSDX1_U_BSDX0_U_BSDXGPN_U_BSDX2_U_BSDXTN_$C(30)
+"RTN","BSDX15",38,0)
+ ;. . Q
+"RTN","BSDX15",39,0)
+ ;. Q
+"RTN","BSDX15",40,0)
+ ;
+"RTN","BSDX15",41,0)
+ ;$O Through "AC" x-ref of BSDX ACCESS GROUP TYPE file
+"RTN","BSDX15",42,0)
+ N BSDXAGID,BSDXAGN,BSDXATID,BSDXATN,BSDXAGTID
+"RTN","BSDX15",43,0)
+ S BSDXAGID=0
+"RTN","BSDX15",44,0)
+ F  S BSDXAGID=$O(^BSDXAGTP("AC",BSDXAGID)) Q:'+BSDXAGID  D
+"RTN","BSDX15",45,0)
+ . I '$D(^BSDXAGP(BSDXAGID,0)) Q
+"RTN","BSDX15",46,0)
+ . S BSDXAGN=$P(^BSDXAGP(BSDXAGID,0),U)
+"RTN","BSDX15",47,0)
+ . S BSDXATID=0 F  S BSDXATID=$O(^BSDXAGTP("AC",BSDXAGID,BSDXATID)) Q:'+BSDXATID  D
+"RTN","BSDX15",48,0)
+ . . S BSDXNOD=$G(^BSDXTYPE(BSDXATID,0))
+"RTN","BSDX15",49,0)
+ . . I BSDXNOD="" Q
+"RTN","BSDX15",50,0)
+ . . I $P(BSDXNOD,U,2)=1 Q  ;Inactive
+"RTN","BSDX15",51,0)
+ . . S BSDXATN=$P(BSDXNOD,U)
+"RTN","BSDX15",52,0)
+ . . S BSDXAGTID=$O(^BSDXAGTP("AC",BSDXAGID,BSDXATID,0))
+"RTN","BSDX15",53,0)
+ . . I '+BSDXAGTID Q
+"RTN","BSDX15",54,0)
+ . . I '$D(^BSDXAGTP(BSDXAGTID,0)) Q
+"RTN","BSDX15",55,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX15",56,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXAGTID_U_BSDXAGID_U_BSDXAGN_U_BSDXATID_U_BSDXATN_$C(30)
+"RTN","BSDX15",57,0)
+ . . Q
+"RTN","BSDX15",58,0)
+ . Q
+"RTN","BSDX15",59,0)
+ ;
+"RTN","BSDX15",60,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",61,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX15",62,0)
+ Q
+"RTN","BSDX15",63,0)
+ ;
+"RTN","BSDX15",64,0)
+ERR(BSDXI,BSDXID,BSDXERR) ;Error processing
+"RTN","BSDX15",65,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",66,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_"^^^^"_$C(30)
+"RTN","BSDX15",67,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",68,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX15",69,0)
+ Q
+"RTN","BSDX15",70,0)
+ ;
+"RTN","BSDX15",71,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX15",72,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX15",73,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",74,0)
+ D ERR(BSDXI,99,70)
+"RTN","BSDX15",75,0)
+ Q
+"RTN","BSDX16")
+0^14^B11948965
+"RTN","BSDX16",1,0)
+BSDX16 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 
+"RTN","BSDX16",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX16",3,0)
+ ;
+"RTN","BSDX16",4,0)
+ ;
+"RTN","BSDX16",5,0)
+RSRCD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX16",6,0)
+ ;Entry point for debugging
+"RTN","BSDX16",7,0)
+ ;
+"RTN","BSDX16",8,0)
+ ;D DEBUG^%Serenji("RSRC^BSDX16(.BSDXY,BSDXVAL)")
+"RTN","BSDX16",9,0)
+ Q
+"RTN","BSDX16",10,0)
+ ;
+"RTN","BSDX16",11,0)
+RSRC(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX16",12,0)
+ ;
+"RTN","BSDX16",13,0)
+ ;Called by BSDX ADD/EDIT RESOURCE
+"RTN","BSDX16",14,0)
+ ;Add/Edit BSDX RESOURCE entry
+"RTN","BSDX16",15,0)
+ ;BSDXVAL is sResourceID|sResourceName|sInactive|sHospLocID|TIME_SCALE|LETTER_TEXT|NO_SHOW_LETTER|CANCELLATION_LETTER
+"RTN","BSDX16",16,0)
+ ;If IEN=0 Then this is a new Resource
+"RTN","BSDX16",17,0)
+ ;Test Line:
+"RTN","BSDX16",18,0)
+ ;D RSRC^BSDX16(.RES,"sResourceID|sResourceName|sInactive|sHospLocID")
+"RTN","BSDX16",19,0)
+ ;
+"RTN","BSDX16",20,0)
+ S X="ERROR^BSDX16",@^%ZOSF("TRAP")
+"RTN","BSDX16",21,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXINA,BSDXNOTE,BSDXNAM
+"RTN","BSDX16",22,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX16",23,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX16",24,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX16",25,0)
+ ; Changed following from a $G = "" to $D check: $G didn't work since BSDXVAL is an array. MJL 10/18/2006
+"RTN","BSDX16",26,0)
+ I BSDXVAL="",$D(BSDXVAL)<2 D ERR(0,"BSDX16: Invalid null input Parameter") Q
+"RTN","BSDX16",27,0)
+ ;Unpack array at @XWBARY
+"RTN","BSDX16",28,0)
+ I BSDXVAL="" D
+"RTN","BSDX16",29,0)
+ . N BSDXC S BSDXC=0 F  S BSDXC=$O(BSDXVAL(BSDXC)) Q:'BSDXC  D
+"RTN","BSDX16",30,0)
+ . . S BSDXVAL=BSDXVAL_BSDXVAL(BSDXC)
+"RTN","BSDX16",31,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX16",32,0)
+ I +BSDXIEN D
+"RTN","BSDX16",33,0)
+ . S BSDX="EDIT"
+"RTN","BSDX16",34,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX16",35,0)
+ E  D
+"RTN","BSDX16",36,0)
+ . S BSDX="ADD"
+"RTN","BSDX16",37,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX16",38,0)
+ ;
+"RTN","BSDX16",39,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX16",40,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX16",41,0)
+ I $D(^BSDXRES("B",BSDXNAM)),$O(^BSDXRES("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX16",42,0)
+ . D ERR(0,"BSDX16: Cannot have two Resources with the same name.")
+"RTN","BSDX16",43,0)
+ . Q
+"RTN","BSDX16",44,0)
+ ;
+"RTN","BSDX16",45,0)
+ S BSDXINA=$P(BSDXVAL,"|",3)
+"RTN","BSDX16",46,0)
+ S BSDXINA=$S(BSDXINA="YES":1,1:0)
+"RTN","BSDX16",47,0)
+ ;
+"RTN","BSDX16",48,0)
+ S BSDXFDA(9002018.1,BSDXIENS,.01)=$P(BSDXVAL,"|",2) ;NAME
+"RTN","BSDX16",49,0)
+ S BSDXFDA(9002018.1,BSDXIENS,.02)=BSDXINA ;INACTIVE
+"RTN","BSDX16",50,0)
+ I +$P(BSDXVAL,"|",5) S BSDXFDA(9002018.1,BSDXIENS,.03)=+$P(BSDXVAL,"|",5) ;TIME SCALE
+"RTN","BSDX16",51,0)
+ I +$P(BSDXVAL,"|",4) S BSDXFDA(9002018.1,BSDXIENS,.04)=$P(BSDXVAL,"|",4) ;HOSPITAL LOCATION
+"RTN","BSDX16",52,0)
+ K BSDXMSG
+"RTN","BSDX16",53,0)
+ I BSDX="ADD" D  ;TODO: Check for error
+"RTN","BSDX16",54,0)
+ . K BSDXIEN
+"RTN","BSDX16",55,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX16",56,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX16",57,0)
+ E  D
+"RTN","BSDX16",58,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX16",59,0)
+ ;
+"RTN","BSDX16",60,0)
+ ;LETTER TEXT wp field
+"RTN","BSDX16",61,0)
+ S BSDXNOTE=$P(BSDXVAL,"|",6)
+"RTN","BSDX16",62,0)
+ ;
+"RTN","BSDX16",63,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX16",64,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX16",65,0)
+ ;
+"RTN","BSDX16",66,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX16",67,0)
+ . D WP^DIE(9002018.1,BSDXIEN_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX16",68,0)
+ ;
+"RTN","BSDX16",69,0)
+ ;NO SHOW LETTER wp fields
+"RTN","BSDX16",70,0)
+ K BSDXNOTE
+"RTN","BSDX16",71,0)
+ S BSDXNOTE=$P(BSDXVAL,"|",7)
+"RTN","BSDX16",72,0)
+ ;
+"RTN","BSDX16",73,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX16",74,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX16",75,0)
+ ;
+"RTN","BSDX16",76,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX16",77,0)
+ . D WP^DIE(9002018.1,BSDXIEN_",",1201,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX16",78,0)
+ ;
+"RTN","BSDX16",79,0)
+ ;CANCELLATION LETTER wp field
+"RTN","BSDX16",80,0)
+ K BSDXNOTE
+"RTN","BSDX16",81,0)
+ S BSDXNOTE=$P(BSDXVAL,"|",8)
+"RTN","BSDX16",82,0)
+ ;
+"RTN","BSDX16",83,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX16",84,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX16",85,0)
+ ;
+"RTN","BSDX16",86,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX16",87,0)
+ . D WP^DIE(9002018.1,BSDXIEN_",",1301,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX16",88,0)
+ ;
+"RTN","BSDX16",89,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^"_$C(30)_$C(31)
+"RTN","BSDX16",90,0)
+ Q
+"RTN","BSDX16",91,0)
+ ;
+"RTN","BSDX16",92,0)
+ERROR ;
+"RTN","BSDX16",93,0)
+ D ^%ZTER
+"RTN","BSDX16",94,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX16",95,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX16",96,0)
+ D ERR(0,"BSDX16 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX16",97,0)
+ Q
+"RTN","BSDX16",98,0)
+ ;
+"RTN","BSDX16",99,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX16",100,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX16",101,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX16",102,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX16",103,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX16",104,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX16",105,0)
+ Q
+"RTN","BSDX17")
+0^15^B2072173
+"RTN","BSDX17",1,0)
+BSDX17 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX17",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX17",3,0)
+ ;
+"RTN","BSDX17",4,0)
+ ;
+"RTN","BSDX17",5,0)
+SCHUSRD(BSDXY) ;EP
+"RTN","BSDX17",6,0)
+ ;Entry point for debugging
+"RTN","BSDX17",7,0)
+ ;
+"RTN","BSDX17",8,0)
+ ;D DEBUG^%Serenji("SCHUSR^BSDX17(.BSDXY)")
+"RTN","BSDX17",9,0)
+ Q
+"RTN","BSDX17",10,0)
+ ;
+"RTN","BSDX17",11,0)
+SCHUSR(BSDXY) ;EP
+"RTN","BSDX17",12,0)
+ ;Return recordset of all users in NEW PERSON having BSDXZMENU key
+"RTN","BSDX17",13,0)
+ ;Called by BSDX SCHEDULE USER
+"RTN","BSDX17",14,0)
+ ;Test Line:
+"RTN","BSDX17",15,0)
+ ;D SCHUSR^BSDX17(.RES)
+"RTN","BSDX17",16,0)
+ ;
+"RTN","BSDX17",17,0)
+ N BSDXDUZ,BSDXKEY,BSDXI,BSDXNAM,BSDXKEYN
+"RTN","BSDX17",18,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX17",19,0)
+ K ^TEMP($J,"BSDX17")
+"RTN","BSDX17",20,0)
+ S BSDXI=0
+"RTN","BSDX17",21,0)
+ S ^BSDXTMP($J,0)="I00020USERID^T00030USERNAME"_$C(30)
+"RTN","BSDX17",22,0)
+ ;$O Through ^VA(200,"AB",
+"RTN","BSDX17",23,0)
+ F BSDXKEYN="BSDXZMENU","BSDXZMGR","XUPROGMODE" S BSDXKEY=+$O(^DIC(19.1,"B",BSDXKEYN,0)) D
+"RTN","BSDX17",24,0)
+ . Q:'+BSDXKEY  S BSDXDUZ=0 F  S BSDXDUZ=$O(^VA(200,"AB",BSDXKEY,BSDXDUZ)) Q:'+BSDXDUZ  D
+"RTN","BSDX17",25,0)
+ . . Q:BSDXDUZ<1  ;IHS/HMW **1**
+"RTN","BSDX17",26,0)
+ . . Q:'$D(^VA(200,BSDXDUZ,0))
+"RTN","BSDX17",27,0)
+ . . Q:$D(^TEMP($J,"BSDX17",BSDXDUZ))
+"RTN","BSDX17",28,0)
+ . . S BSDXNAM=$P(^VA(200,BSDXDUZ,0),U)
+"RTN","BSDX17",29,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX17",30,0)
+ . . S ^TEMP($J,"BSDX17",BSDXDUZ)=""
+"RTN","BSDX17",31,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXDUZ_"^"_BSDXNAM_$C(30)
+"RTN","BSDX17",32,0)
+ . . Q
+"RTN","BSDX17",33,0)
+ . Q
+"RTN","BSDX17",34,0)
+ ;
+"RTN","BSDX17",35,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX17",36,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX17",37,0)
+ Q
+"RTN","BSDX18")
+0^16^B87953431
+"RTN","BSDX18",1,0)
+BSDX18 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX18",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX18",3,0)
+ ;
+"RTN","BSDX18",4,0)
+ ;
+"RTN","BSDX18",5,0)
+DELRUD(BSDXY,BSDXIEN) ;EP
+"RTN","BSDX18",6,0)
+ ;Entry point for debugging
+"RTN","BSDX18",7,0)
+ ;
+"RTN","BSDX18",8,0)
+ ;D DEBUG^%Serenji("DELRU^BSDX18(.BSDXY,BSDXIEN)")
+"RTN","BSDX18",9,0)
+ Q
+"RTN","BSDX18",10,0)
+ ;
+"RTN","BSDX18",11,0)
+DELRU(BSDXY,BSDXIEN) ;EP
+"RTN","BSDX18",12,0)
+ ;Deletes entry BSDXIEN from RESOURCE USERS file
+"RTN","BSDX18",13,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX18",14,0)
+ ;Called by BSDX DELETE RESOURCEUSER
+"RTN","BSDX18",15,0)
+ ;Test Line:
+"RTN","BSDX18",16,0)
+ ;D DELRU^BSDX18(.RES,99)
+"RTN","BSDX18",17,0)
+ ;
+"RTN","BSDX18",18,0)
+ N BSDXI,DIK,DA
+"RTN","BSDX18",19,0)
+ S BSDXI=0
+"RTN","BSDX18",20,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX18",21,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEUSERID^I00020ERRORID"_$C(30)
+"RTN","BSDX18",22,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",23,0)
+ I '$D(^BSDXRSU(BSDXIEN,0)) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",24,0)
+ ;Delete entry BSDXIEN
+"RTN","BSDX18",25,0)
+ S DIK="^BSDXRSU("
+"RTN","BSDX18",26,0)
+ S DA=BSDXIEN
+"RTN","BSDX18",27,0)
+ D ^DIK
+"RTN","BSDX18",28,0)
+ ;
+"RTN","BSDX18",29,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX18",30,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX18",31,0)
+ Q
+"RTN","BSDX18",32,0)
+ ;
+"RTN","BSDX18",33,0)
+ADDRUD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX18",34,0)
+ ;Entry point for debugging
+"RTN","BSDX18",35,0)
+ ;
+"RTN","BSDX18",36,0)
+ ;D DEBUG^%Serenji("ADDRU^BSDX18(.BSDXY,BSDXVAL)")
+"RTN","BSDX18",37,0)
+ Q
+"RTN","BSDX18",38,0)
+ ;
+"RTN","BSDX18",39,0)
+ADDRU(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX18",40,0)
+ ;
+"RTN","BSDX18",41,0)
+ ;Called by BSDX ADD/EDIT RESOURCEUSER
+"RTN","BSDX18",42,0)
+ ;Add/Edit BSDX RESOURCEUSER entry
+"RTN","BSDX18",43,0)
+ ;BSDXVAL is sResourceUserID|sOverbook|sModifySchedule|ResourceID|UserID|sModifyAppointments
+"RTN","BSDX18",44,0)
+ ;If IEN=0 Then this is a new ResourceUser entry
+"RTN","BSDX18",45,0)
+ ;Test Line:
+"RTN","BSDX18",46,0)
+ ;D ADDRU^BSDX18(.RES,"sResourceUserID|sOverbook|sModifySchedule|sResourceID|sUserID|sModifyAppointments")
+"RTN","BSDX18",47,0)
+ ;
+"RTN","BSDX18",48,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXOVB,BSDXMOD,BSDXI,BSDXUID,BSDXRID
+"RTN","BSDX18",49,0)
+ N BSDXRES,BSDXRSU,BSDXF,BSDXAPPT
+"RTN","BSDX18",50,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX18",51,0)
+ S BSDXI=0
+"RTN","BSDX18",52,0)
+ S ^BSDXTMP($J,BSDXI)="I00020RESOURCEID^I00020ERRORID"_$C(30)
+"RTN","BSDX18",53,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX18",54,0)
+ I +BSDXIEN D
+"RTN","BSDX18",55,0)
+ . S BSDX="EDIT"
+"RTN","BSDX18",56,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",57,0)
+ E  D
+"RTN","BSDX18",58,0)
+ . S BSDX="ADD"
+"RTN","BSDX18",59,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX18",60,0)
+ ;
+"RTN","BSDX18",61,0)
+ I '+$P(BSDXVAL,"|",4) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",62,0)
+ I '+$P(BSDXVAL,"|",5) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",63,0)
+ ;
+"RTN","BSDX18",64,0)
+ S BSDXRID=$P(BSDXVAL,"|",4) ;ResourceID
+"RTN","BSDX18",65,0)
+ S BSDXUID=$P(BSDXVAL,"|",5) ;UserID
+"RTN","BSDX18",66,0)
+ S BSDXRSU=0 ;ResourceUserID
+"RTN","BSDX18",67,0)
+ S BSDXF=0 ;flag
+"RTN","BSDX18",68,0)
+ ;If this is an add, check if the user is already assigned to the resource.
+"RTN","BSDX18",69,0)
+ ;If so, then change to an edit
+"RTN","BSDX18",70,0)
+ I BSDX="ADD" F  S BSDXRSU=$O(^BSDXRSU("AC",BSDXUID,BSDXRSU)) Q:'+BSDXRSU  D  Q:BSDXF
+"RTN","BSDX18",71,0)
+ . S BSDXRES=$G(^BSDXRSU(BSDXRSU,0))
+"RTN","BSDX18",72,0)
+ . S BSDXRES=$P(BSDXRES,U) ;ResourceID
+"RTN","BSDX18",73,0)
+ . S:BSDXRES=BSDXRID BSDXF=1
+"RTN","BSDX18",74,0)
+ I BSDXF S BSDX="EDIT",BSDXIEN=BSDXRSU,BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",75,0)
+ ;
+"RTN","BSDX18",76,0)
+ S BSDXOVB=$P(BSDXVAL,"|",2)
+"RTN","BSDX18",77,0)
+ S BSDXOVB=$S(BSDXOVB="YES":1,1:0)
+"RTN","BSDX18",78,0)
+ S BSDXMOD=$P(BSDXVAL,"|",3)
+"RTN","BSDX18",79,0)
+ S BSDXMOD=$S(BSDXMOD="YES":1,1:0)
+"RTN","BSDX18",80,0)
+ S BSDXAPPT=$P(BSDXVAL,"|",6)
+"RTN","BSDX18",81,0)
+ S BSDXAPPT=$S(BSDXAPPT="YES":1,1:0)
+"RTN","BSDX18",82,0)
+ ;
+"RTN","BSDX18",83,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.01)=$P(BSDXVAL,"|",4) ;RESOURCE ID
+"RTN","BSDX18",84,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.02)=$P(BSDXVAL,"|",5) ;USERID
+"RTN","BSDX18",85,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.03)=BSDXOVB ;OVERBOOK
+"RTN","BSDX18",86,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.04)=BSDXMOD ;MODIFY SCHEDULE
+"RTN","BSDX18",87,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.05)=BSDXAPPT ;ADD, EDIT, DELETE APPOINMENTS
+"RTN","BSDX18",88,0)
+ K BSDXMSG
+"RTN","BSDX18",89,0)
+ I BSDX="ADD" D
+"RTN","BSDX18",90,0)
+ . K BSDXIEN
+"RTN","BSDX18",91,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX18",92,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX18",93,0)
+ E  D
+"RTN","BSDX18",94,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX18",95,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^-1"_$C(31)
+"RTN","BSDX18",96,0)
+ Q
+"RTN","BSDX18",97,0)
+ ;
+"RTN","BSDX18",98,0)
+ERR(BSDXI,BSDXID,BSDXERR) ;Error processing
+"RTN","BSDX18",99,0)
+ S BSDXERR=BSDXERR+134234112 ;vbObjectError
+"RTN","BSDX18",100,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX18",101,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXID_"^"_BSDXERR_$C(30)
+"RTN","BSDX18",102,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX18",103,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX18",104,0)
+ Q
+"RTN","BSDX18",105,0)
+ ;
+"RTN","BSDX18",106,0)
+MADERR(BSDXMSG) ;
+"RTN","BSDX18",107,0)
+ W !,BSDXMSG
+"RTN","BSDX18",108,0)
+ Q
+"RTN","BSDX18",109,0)
+ ;
+"RTN","BSDX18",110,0)
+MADSCR(BSDXDUZ,BSDXZMGR,BSDXZMENU,BSDXZPROG) ;EP - File 200 screening code for MADDRU
+"RTN","BSDX18",111,0)
+ ;Called from DIR to screen for scheduling users
+"RTN","BSDX18",112,0)
+ I $D(^VA(200,BSDXDUZ,51,"B",BSDXZMENU)) Q 1
+"RTN","BSDX18",113,0)
+ I $D(^VA(200,BSDXDUZ,51,"B",BSDXZMGR)) Q 1
+"RTN","BSDX18",114,0)
+ I $D(^VA(200,BSDXDUZ,51,"B",BSDXZPROG)) Q 1
+"RTN","BSDX18",115,0)
+ Q 0
+"RTN","BSDX18",116,0)
+ ;
+"RTN","BSDX18",117,0)
+MADDRU ;EP -Command line utility to bulk-add users and set access rights IHS/HMW 20060420 **1**
+"RTN","BSDX18",118,0)
+ ;Main entry point
+"RTN","BSDX18",119,0)
+ ;
+"RTN","BSDX18",120,0)
+ N BSDX,BSDXZMENU,BSDXZMGR,BSDXZPROG,DIR
+"RTN","BSDX18",121,0)
+ ;
+"RTN","BSDX18",122,0)
+ ;INIT
+"RTN","BSDX18",123,0)
+ K ^TMP($J)
+"RTN","BSDX18",124,0)
+ S BSDXZMENU=$O(^DIC(19.1,"B","BSDXZMENU",0)) I '+BSDXZMENU D MADERR("Error: BSDXZMENU KEY NOT FOUND.") Q
+"RTN","BSDX18",125,0)
+ S BSDXZMGR=$O(^DIC(19.1,"B","BSDXZMGR",0)) I '+BSDXZMGR D MADERR("Error: BSDXZMGR KEY NOT FOUND.") Q
+"RTN","BSDX18",126,0)
+ S BSDXZPROG=$O(^DIC(19.1,"B","XUPROGMODE",0)) I '+BSDXZPROG D MADERR("Error: XUPROGMODE KEY NOT FOUND.") Q
+"RTN","BSDX18",127,0)
+ ;
+"RTN","BSDX18",128,0)
+ D MADUSR
+"RTN","BSDX18",129,0)
+ I '$D(^TMP($J,"BSDX MADDRU","USER")) D MADERR("Cancelled:  No Users selected.") Q
+"RTN","BSDX18",130,0)
+ D MADRES
+"RTN","BSDX18",131,0)
+ I '$D(^TMP($J,"BSDX MADDRU","RESOURCE")) D MADERR("Cancelled:  No Resources selected.") Q
+"RTN","BSDX18",132,0)
+ I '$$MADACC(.BSDX) ;D MADERR("Selected users will have no access to the selected clinics.")
+"RTN","BSDX18",133,0)
+ I '$$MADCONF(.BSDX) W ! D MADERR("--Cancelled") Q
+"RTN","BSDX18",134,0)
+ D MADASS(.BSDX)
+"RTN","BSDX18",135,0)
+ W ! D MADERR("--Done")
+"RTN","BSDX18",136,0)
+ ;
+"RTN","BSDX18",137,0)
+ Q
+"RTN","BSDX18",138,0)
+ ;
+"RTN","BSDX18",139,0)
+MADUSR ;Prompt for users from file 200 who have BSDXUSER key
+"RTN","BSDX18",140,0)
+ ;Store results in ^TMP($J,"BSDX MADDRU","USER",DUZ) array
+"RTN","BSDX18",141,0)
+ N DIRUT,Y,DIR
+"RTN","BSDX18",142,0)
+ S DIR(0)="PO^200:EMZ",DIR("S")="I $$MADSCR^BSDX18(Y,BSDXZMGR,BSDXZMENU,BSDXZPROG)"
+"RTN","BSDX18",143,0)
+ S Y=0
+"RTN","BSDX18",144,0)
+ K ^TMP($J,"BSDX MADDRU","USER")
+"RTN","BSDX18",145,0)
+ W !!,"-------Select Users-------"
+"RTN","BSDX18",146,0)
+ F  D ^DIR Q:$G(DIRUT)  Q:'Y  D
+"RTN","BSDX18",147,0)
+ . S ^TMP($J,"BSDX MADDRU","USER",+Y)=""
+"RTN","BSDX18",148,0)
+ Q
+"RTN","BSDX18",149,0)
+ ;
+"RTN","BSDX18",150,0)
+MADRES ;Prompt for Resources
+"RTN","BSDX18",151,0)
+ ;Store results in ^TMP($J,"BSDX MADDRU","RESOURCE",ResourceID) array
+"RTN","BSDX18",152,0)
+ N DIRUT,Y,DIR
+"RTN","BSDX18",153,0)
+ S DIR(0)="PO^9002018.1:EMZ"
+"RTN","BSDX18",154,0)
+ S Y=0
+"RTN","BSDX18",155,0)
+ K ^TMP($J,"BSDX MADDRU","RESOURCE")
+"RTN","BSDX18",156,0)
+ W !!,"-------Select Resources-------"
+"RTN","BSDX18",157,0)
+ F  D ^DIR Q:$G(DIRUT)  Q:'Y  D
+"RTN","BSDX18",158,0)
+ . S ^TMP($J,"BSDX MADDRU","RESOURCE",+Y)=""
+"RTN","BSDX18",159,0)
+ Q
+"RTN","BSDX18",160,0)
+ ;
+"RTN","BSDX18",161,0)
+MADACC(BSDX) ;Prompt for access level.
+"RTN","BSDX18",162,0)
+ ;Start with Overbook and go to read-only access.
+"RTN","BSDX18",163,0)
+ ;Store results in variables for:
+"RTN","BSDX18",164,0)
+ ;sOverbook, sModifySchedule, sModifyAppointments
+"RTN","BSDX18",165,0)
+ ;
+"RTN","BSDX18",166,0)
+ N DIRUT,Y,DIR,J
+"RTN","BSDX18",167,0)
+ W !!,"-------Select Access Level-------"
+"RTN","BSDX18",168,0)
+ S Y=0
+"RTN","BSDX18",169,0)
+ F J="MODIFY","OVERBOOK","WRITE","READ" S BSDX(J)=1
+"RTN","BSDX18",170,0)
+ S DIR(0)="Y"
+"RTN","BSDX18",171,0)
+ ;
+"RTN","BSDX18",172,0)
+ S DIR("A")="Allow users to Modify Clinic Availability"
+"RTN","BSDX18",173,0)
+ D ^DIR
+"RTN","BSDX18",174,0)
+ Q:$G(DIRUT) 0
+"RTN","BSDX18",175,0)
+ Q:Y 1
+"RTN","BSDX18",176,0)
+ S BSDX("MODIFY")=0
+"RTN","BSDX18",177,0)
+ ;
+"RTN","BSDX18",178,0)
+ S DIR("A")="Allow users to Overbook the selected clinics"
+"RTN","BSDX18",179,0)
+ D ^DIR
+"RTN","BSDX18",180,0)
+ Q:$G(DIRUT) 0
+"RTN","BSDX18",181,0)
+ Q:Y 1
+"RTN","BSDX18",182,0)
+ S BSDX("OVERBOOK")=0
+"RTN","BSDX18",183,0)
+ ;
+"RTN","BSDX18",184,0)
+ S DIR("A")="Allow users to Add, Edit and Delete appointments in the selected resources"
+"RTN","BSDX18",185,0)
+ D ^DIR
+"RTN","BSDX18",186,0)
+ Q:$G(DIRUT)
+"RTN","BSDX18",187,0)
+ Q:Y 1
+"RTN","BSDX18",188,0)
+ S BSDX("WRITE")=0
+"RTN","BSDX18",189,0)
+ ;
+"RTN","BSDX18",190,0)
+ S DIR("A")="Allow users to View appointments in the selected resources"
+"RTN","BSDX18",191,0)
+ D ^DIR
+"RTN","BSDX18",192,0)
+ Q:$G(DIRUT)
+"RTN","BSDX18",193,0)
+ Q:Y 1
+"RTN","BSDX18",194,0)
+ S BSDX("READ")=0
+"RTN","BSDX18",195,0)
+ ;
+"RTN","BSDX18",196,0)
+ Q 0
+"RTN","BSDX18",197,0)
+ ;
+"RTN","BSDX18",198,0)
+MADCONF(BSDX) ;Confirm selections
+"RTN","BSDX18",199,0)
+ N DIR,DIRUT,Y
+"RTN","BSDX18",200,0)
+ S DIR(0)="Y"
+"RTN","BSDX18",201,0)
+ W !!,"-------Confirm Selections-------"
+"RTN","BSDX18",202,0)
+ I BSDX("READ")=0 D
+"RTN","BSDX18",203,0)
+ . S DIR("A")="Are you sure you want to remove all access to these clinics for these users"
+"RTN","BSDX18",204,0)
+ E  D
+"RTN","BSDX18",205,0)
+ . W !,"Selected users will be assigned the following access:"
+"RTN","BSDX18",206,0)
+ . W !,"Modify clinic availability:  ",?50,BSDX("MODIFY")
+"RTN","BSDX18",207,0)
+ . W !,"Overbook Appointments:  ",?50,BSDX("OVERBOOK")
+"RTN","BSDX18",208,0)
+ . W !,"Add, Edit and Delete Appointments:  ",?50,BSDX("WRITE")
+"RTN","BSDX18",209,0)
+ . W !,"View Clinic Appointments:  ",?50,BSDX("READ")
+"RTN","BSDX18",210,0)
+ . S DIR("A")="Are you sure you want to assign these access rights to the selected users"
+"RTN","BSDX18",211,0)
+ D ^DIR
+"RTN","BSDX18",212,0)
+ Q:$G(DIRUT) 0
+"RTN","BSDX18",213,0)
+ Q:$G(Y) 1
+"RTN","BSDX18",214,0)
+ Q 0
+"RTN","BSDX18",215,0)
+ ;
+"RTN","BSDX18",216,0)
+MADASS(BSDX) ;
+"RTN","BSDX18",217,0)
+ ;Assign access level to selected users and resources
+"RTN","BSDX18",218,0)
+ ;Loop through selected users
+"RTN","BSDX18",219,0)
+ ;. Loop through selected resources
+"RTN","BSDX18",220,0)
+ ; . . If an entry in ^BSDXRSU for this user/resource combination exists, then
+"RTN","BSDX18",221,0)
+ ; . . . S sResourceUserID = to it
+"RTN","BSDX18",222,0)
+ ; . . Else
+"RTN","BSDX18",223,0)
+ ; . . . S sResourceUserID = 0
+"RTN","BSDX18",224,0)
+ ; . . Call MADFILE
+"RTN","BSDX18",225,0)
+ N BSDXU,BSDXR,BSDXRUID,BSDXVAL
+"RTN","BSDX18",226,0)
+ S BSDXU=0
+"RTN","BSDX18",227,0)
+ F  S BSDXU=$O(^TMP($J,"BSDX MADDRU","USER",BSDXU)) Q:'+BSDXU  D
+"RTN","BSDX18",228,0)
+ . S BSDXR=0 F  S BSDXR=$O(^TMP($J,"BSDX MADDRU","RESOURCE",BSDXR)) Q:'+BSDXR  D
+"RTN","BSDX18",229,0)
+ . . S BSDXRUID=$$MADEXST(BSDXU,BSDXR)
+"RTN","BSDX18",230,0)
+ . . S BSDXVAL=BSDXRUID_"|"_BSDX("OVERBOOK")_"|"_BSDX("MODIFY")_"|"_BSDXR_"|"_BSDXU_"|"_BSDX("WRITE")
+"RTN","BSDX18",231,0)
+ . . I +BSDXRUID,BSDX("READ")=0 D MADDEL(BSDXRUID)
+"RTN","BSDX18",232,0)
+ . . Q:BSDX("READ")=0
+"RTN","BSDX18",233,0)
+ . . D MADFILE(BSDXVAL)
+"RTN","BSDX18",234,0)
+ . . Q
+"RTN","BSDX18",235,0)
+ . Q
+"RTN","BSDX18",236,0)
+ Q
+"RTN","BSDX18",237,0)
+ ;
+"RTN","BSDX18",238,0)
+MADDEL(BSDXRUID) ;
+"RTN","BSDX18",239,0)
+ ;Delete entry BSDXRUID from BSDX RESOURCE USER file
+"RTN","BSDX18",240,0)
+ N DIK,DA
+"RTN","BSDX18",241,0)
+ Q:'+BSDXRUID
+"RTN","BSDX18",242,0)
+ Q:'$D(^BSDXRSU(BSDXRUID))
+"RTN","BSDX18",243,0)
+ S DIK="^BSDXRSU("
+"RTN","BSDX18",244,0)
+ S DA=BSDXRUID
+"RTN","BSDX18",245,0)
+ D ^DIK
+"RTN","BSDX18",246,0)
+ Q
+"RTN","BSDX18",247,0)
+ ;
+"RTN","BSDX18",248,0)
+MADFILE(BSDXVAL) ;
+"RTN","BSDX18",249,0)
+ ;
+"RTN","BSDX18",250,0)
+ ;Add/Edit BSDX RESOURCEUSER entry
+"RTN","BSDX18",251,0)
+ ;BSDXVAL is sResourceUserID|sOverbook|sModifySchedule|ResourceID|UserID|sModifyAppointments
+"RTN","BSDX18",252,0)
+ ;If sResourceUserID=0 Then this is a new ResourceUser entry
+"RTN","BSDX18",253,0)
+ ;
+"RTN","BSDX18",254,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXOVB,BSDXMOD,BSDXI,BSDXUID,BSDXRID
+"RTN","BSDX18",255,0)
+ N BSDXRES,BSDXRSU,BSDXF,BSDXAPPT
+"RTN","BSDX18",256,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX18",257,0)
+ I +BSDXIEN D
+"RTN","BSDX18",258,0)
+ . S BSDX="EDIT"
+"RTN","BSDX18",259,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",260,0)
+ E  D
+"RTN","BSDX18",261,0)
+ . S BSDX="ADD"
+"RTN","BSDX18",262,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX18",263,0)
+ ;
+"RTN","BSDX18",264,0)
+ I '+$P(BSDXVAL,"|",4) D MADERR("Error in MADFILE^BSDX18: No Resource ID") Q
+"RTN","BSDX18",265,0)
+ I '+$P(BSDXVAL,"|",5) D MADERR("Error in MADFILE^BSDX18: No User ID") Q
+"RTN","BSDX18",266,0)
+ ;
+"RTN","BSDX18",267,0)
+ S BSDXRID=$P(BSDXVAL,"|",4) ;ResourceID
+"RTN","BSDX18",268,0)
+ S BSDXUID=$P(BSDXVAL,"|",5) ;UserID
+"RTN","BSDX18",269,0)
+ S BSDXRSU=0 ;ResourceUserID
+"RTN","BSDX18",270,0)
+ S BSDXF=0 ;flag
+"RTN","BSDX18",271,0)
+ ;If this is an add, check if the user is already assigned to the resource.
+"RTN","BSDX18",272,0)
+ ;If so, then change to an edit
+"RTN","BSDX18",273,0)
+ I BSDX="ADD" F  S BSDXRSU=$O(^BSDXRSU("AC",BSDXUID,BSDXRSU)) Q:'+BSDXRSU  D  Q:BSDXF
+"RTN","BSDX18",274,0)
+ . S BSDXRES=$G(^BSDXRSU(BSDXRSU,0))
+"RTN","BSDX18",275,0)
+ . S BSDXRES=$P(BSDXRES,U) ;ResourceID
+"RTN","BSDX18",276,0)
+ . S:BSDXRES=BSDXRID BSDXF=1
+"RTN","BSDX18",277,0)
+ I BSDXF S BSDX="EDIT",BSDXIEN=BSDXRSU,BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",278,0)
+ ;
+"RTN","BSDX18",279,0)
+ S BSDXOVB=$P(BSDXVAL,"|",2)
+"RTN","BSDX18",280,0)
+ S BSDXMOD=$P(BSDXVAL,"|",3)
+"RTN","BSDX18",281,0)
+ S BSDXAPPT=$P(BSDXVAL,"|",6)
+"RTN","BSDX18",282,0)
+ ;
+"RTN","BSDX18",283,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.01)=$P(BSDXVAL,"|",4) ;RESOURCE ID
+"RTN","BSDX18",284,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.02)=$P(BSDXVAL,"|",5) ;USERID
+"RTN","BSDX18",285,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.03)=BSDXOVB ;OVERBOOK
+"RTN","BSDX18",286,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.04)=BSDXMOD ;MODIFY SCHEDULE
+"RTN","BSDX18",287,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.05)=BSDXAPPT ;ADD, EDIT, DELETE APPOINMENTS
+"RTN","BSDX18",288,0)
+ K BSDXMSG
+"RTN","BSDX18",289,0)
+ I BSDX="ADD" D
+"RTN","BSDX18",290,0)
+ . K BSDXIEN
+"RTN","BSDX18",291,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX18",292,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX18",293,0)
+ E  D
+"RTN","BSDX18",294,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX18",295,0)
+ Q
+"RTN","BSDX18",296,0)
+ ;
+"RTN","BSDX18",297,0)
+MADEXST(BSDXU,BSDXR) ;
+"RTN","BSDX18",298,0)
+ ;Returns BSDX RESOURCE USER ID
+"RTN","BSDX18",299,0)
+ ;if there is a BSDX RESOURCE USER entry for
+"RTN","BSDX18",300,0)
+ ;user BSDXU and resource BSDXR
+"RTN","BSDX18",301,0)
+ ;Otherwise, returns 0
+"RTN","BSDX18",302,0)
+ ;
+"RTN","BSDX18",303,0)
+ N BSDXID,BSDXFOUND,BSDXNOD
+"RTN","BSDX18",304,0)
+ I '$D(^BSDXRSU("AC",BSDXU)) Q 0
+"RTN","BSDX18",305,0)
+ S BSDXID=0,BSDXFOUND=0
+"RTN","BSDX18",306,0)
+ F  S BSDXID=$O(^BSDXRSU("AC",BSDXU,BSDXID)) Q:'+BSDXID  D  Q:BSDXFOUND
+"RTN","BSDX18",307,0)
+ . S BSDXNOD=$G(^BSDXRSU(BSDXID,0))
+"RTN","BSDX18",308,0)
+ . I +BSDXNOD=BSDXR S BSDXFOUND=BSDXID
+"RTN","BSDX18",309,0)
+ . Q
+"RTN","BSDX18",310,0)
+ Q BSDXFOUND
+"RTN","BSDX19")
+0^17^B7890401
+"RTN","BSDX19",1,0)
+BSDX19 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX19",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX19",3,0)
+ ;
+"RTN","BSDX19",4,0)
+ ;
+"RTN","BSDX19",5,0)
+ADDRGD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX19",6,0)
+ ;Entry point for debugging
+"RTN","BSDX19",7,0)
+ ;
+"RTN","BSDX19",8,0)
+ ;D DEBUG^%Serenji("ADDRG^BSDX19(.BSDXY,BSDXVAL)")
+"RTN","BSDX19",9,0)
+ Q
+"RTN","BSDX19",10,0)
+ ;
+"RTN","BSDX19",11,0)
+ADDRG(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX19",12,0)
+ ;Called by BSDX ADD/EDIT RESOURCE GROUP
+"RTN","BSDX19",13,0)
+ ;Add a new BSDX RESOURCE GROUP entry
+"RTN","BSDX19",14,0)
+ ;BSDXVAL is IEN|NAME of the entry
+"RTN","BSDX19",15,0)
+ ;Returns IEN of added/edited entry or 0 if error
+"RTN","BSDX19",16,0)
+ ;
+"RTN","BSDX19",17,0)
+ S X="ERROR^BSDX19",@^%ZOSF("TRAP")
+"RTN","BSDX19",18,0)
+ N BSDXIENS,BSDXFDA,BSDXMSG,BSDXIEN,BSDX,BSDXNAM
+"RTN","BSDX19",19,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX19",20,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX19",21,0)
+ I BSDXVAL="" D ERR(0,"BSDX16: Invalid null input Parameter") Q
+"RTN","BSDX19",22,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX19",23,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX19",24,0)
+ I +BSDXIEN D
+"RTN","BSDX19",25,0)
+ . S BSDX="EDIT"
+"RTN","BSDX19",26,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX19",27,0)
+ E  D
+"RTN","BSDX19",28,0)
+ . S BSDX="ADD"
+"RTN","BSDX19",29,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX19",30,0)
+ ;
+"RTN","BSDX19",31,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX19",32,0)
+ I $D(^BSDXDEPT("B",BSDXNAM)),$O(^BSDXDEPT("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX19",33,0)
+ . D ERR(0,"BSDX19: Cannot have two Resource Groups with the same name.")
+"RTN","BSDX19",34,0)
+ . Q
+"RTN","BSDX19",35,0)
+ ;
+"RTN","BSDX19",36,0)
+ S BSDXFDA(9002018.2,BSDXIENS,.01)=BSDXNAM ;NAME
+"RTN","BSDX19",37,0)
+ I BSDX="ADD" D
+"RTN","BSDX19",38,0)
+ . K BSDXIEN
+"RTN","BSDX19",39,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX19",40,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX19",41,0)
+ E  D
+"RTN","BSDX19",42,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX19",43,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^"_$C(30)_$C(31)
+"RTN","BSDX19",44,0)
+ Q
+"RTN","BSDX19",45,0)
+ ;
+"RTN","BSDX19",46,0)
+DELRGD(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX19",47,0)
+ ;Entry point for debugging
+"RTN","BSDX19",48,0)
+ ;
+"RTN","BSDX19",49,0)
+ ;D DEBUG^%Serenji("DELRG^BSDX19(.BSDXY,BSDXGRP)")
+"RTN","BSDX19",50,0)
+ Q
+"RTN","BSDX19",51,0)
+ ;
+"RTN","BSDX19",52,0)
+DELRG(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX19",53,0)
+ ;Deletes entry name BSDXGRP from BSDX RESOURCE GROUP file
+"RTN","BSDX19",54,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX19",55,0)
+ ;Called by BSDX DELETE RESOURCE GROUP
+"RTN","BSDX19",56,0)
+ ;Test Line:
+"RTN","BSDX19",57,0)
+ ;D DELRU^BSDX18(.RES,99)
+"RTN","BSDX19",58,0)
+ ;
+"RTN","BSDX19",59,0)
+ N BSDXI,DIK,DA,BSDXIEN
+"RTN","BSDX19",60,0)
+ S BSDXI=0
+"RTN","BSDX19",61,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX19",62,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX19",63,0)
+ I BSDXGRP="" D ERR(0,"DELRG~BSDX19: Invalid null Resource Group Name") Q
+"RTN","BSDX19",64,0)
+ S BSDXIEN=$O(^BSDXDEPT("B",BSDXGRP,0))
+"RTN","BSDX19",65,0)
+ I '+BSDXIEN D ERR(0,"DELRG~BSDX19: Invalid Resource Group Name") Q
+"RTN","BSDX19",66,0)
+ I '$D(^BSDXDEPT(BSDXIEN,0)) D ERR(0,"DELRG~BSDX19: Invalid Resource Group IEN") Q
+"RTN","BSDX19",67,0)
+ ;Delete entry BSDXIEN
+"RTN","BSDX19",68,0)
+ S DIK="^BSDXDEPT("
+"RTN","BSDX19",69,0)
+ S DA=BSDXIEN
+"RTN","BSDX19",70,0)
+ D ^DIK
+"RTN","BSDX19",71,0)
+ ;
+"RTN","BSDX19",72,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",73,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_$C(30)_$C(31)
+"RTN","BSDX19",74,0)
+ Q
+"RTN","BSDX19",75,0)
+ ;
+"RTN","BSDX19",76,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX19",77,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX19",78,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",79,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX19",80,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",81,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX19",82,0)
+ Q
+"RTN","BSDX19",83,0)
+ ;
+"RTN","BSDX19",84,0)
+ERROR ;
+"RTN","BSDX19",85,0)
+ D ^%ZTER
+"RTN","BSDX19",86,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX19",87,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",88,0)
+ D ERR(0,"BSDX19 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX19",89,0)
+ Q
+"RTN","BSDX20")
+0^18^B5911607
+"RTN","BSDX20",1,0)
+BSDX20 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX20",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX20",3,0)
+ ;
+"RTN","BSDX20",4,0)
+ ;
+"RTN","BSDX20",5,0)
+DELRGID(BSDXY,BSDXIEN) ;EP
+"RTN","BSDX20",6,0)
+ ;Entry point for debugging
+"RTN","BSDX20",7,0)
+ ;
+"RTN","BSDX20",8,0)
+ ;D DEBUG^%Serenji("DELRGI^BSDX20(.BSDXY,BSDXIEN)")
+"RTN","BSDX20",9,0)
+ Q
+"RTN","BSDX20",10,0)
+ ;
+"RTN","BSDX20",11,0)
+DELRGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX20",12,0)
+ ;Deletes entry BSDXIEN1 from entry BSDXIEN in the RESOURCE GROUP file
+"RTN","BSDX20",13,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX20",14,0)
+ ;Called by BSDX DELETE RES GROUP ITEM
+"RTN","BSDX20",15,0)
+ ;Test Line:
+"RTN","BSDX20",16,0)
+ ;D DELRU^BSDX18(.RES,99)
+"RTN","BSDX20",17,0)
+ ;
+"RTN","BSDX20",18,0)
+ N BSDXI,DIK,DA
+"RTN","BSDX20",19,0)
+ S BSDXI=0
+"RTN","BSDX20",20,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX20",21,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPID^I00020ERRORID"_$C(30)
+"RTN","BSDX20",22,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",23,0)
+ I '+BSDXIEN1 D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",24,0)
+ I '$D(^BSDXDEPT(BSDXIEN,1,BSDXIEN1,0)) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",25,0)
+ ;
+"RTN","BSDX20",26,0)
+ ;Delete entry BSDXIEN1
+"RTN","BSDX20",27,0)
+ S DIK="^BSDXDEPT("_BSDXIEN_",1,"
+"RTN","BSDX20",28,0)
+ S DA=BSDXIEN1,DA(1)=BSDXIEN
+"RTN","BSDX20",29,0)
+ D ^DIK
+"RTN","BSDX20",30,0)
+ ;
+"RTN","BSDX20",31,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",32,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX20",33,0)
+ Q
+"RTN","BSDX20",34,0)
+ ;
+"RTN","BSDX20",35,0)
+ADDRGID(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX20",36,0)
+ ;Entry point for debugging
+"RTN","BSDX20",37,0)
+ ;
+"RTN","BSDX20",38,0)
+ ;D DEBUG^%Serenji("ADDRGI^BSDX20(.BSDXY,BSDXIEN,BSDXIEN1)")
+"RTN","BSDX20",39,0)
+ Q
+"RTN","BSDX20",40,0)
+ ;
+"RTN","BSDX20",41,0)
+ADDRGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX20",42,0)
+ ;Adds RESOURCEID BSEDXIEN1 to RESOURCE GROUP entry BSDXIEN
+"RTN","BSDX20",43,0)
+ ;Return recordset containing added subentry number error message or "" if no error
+"RTN","BSDX20",44,0)
+ ;Called by BSDX ADD RES GROUP ITEM
+"RTN","BSDX20",45,0)
+ ;Test Line:
+"RTN","BSDX20",46,0)
+ ;D ADDRGI^BSDX20(.RES,1,1)
+"RTN","BSDX20",47,0)
+ ;
+"RTN","BSDX20",48,0)
+ N BSDXI,BSDXIENS,BSDXMSG,BSDXFDA
+"RTN","BSDX20",49,0)
+ S X="ETRAP^BSDX20",@^%ZOSF("TRAP")
+"RTN","BSDX20",50,0)
+ S BSDXI=0
+"RTN","BSDX20",51,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX20",52,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPITEMID^I00020ERRORID"_$C(30)
+"RTN","BSDX20",53,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",54,0)
+ I '+BSDXIEN1 D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",55,0)
+ I '$D(^BSDXDEPT(BSDXIEN,0)) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",56,0)
+ I '$D(^BSDXRES(BSDXIEN1,0)) D ERR(BSDXI,BSDXIEN1,70) Q
+"RTN","BSDX20",57,0)
+ I $D(^BSDXDEPT(BSDXIEN,1,"B",BSDXIEN1)) D ERR(BSDXI,0,0) Q
+"RTN","BSDX20",58,0)
+ ;^BSDXDEPT(3,1,"B",3,1)=
+"RTN","BSDX20",59,0)
+ ;
+"RTN","BSDX20",60,0)
+ S BSDXIENS="+1,"_BSDXIEN_","
+"RTN","BSDX20",61,0)
+ S BSDXFDA(9002018.21,BSDXIENS,.01)=BSDXIEN1 ;RESOURCEID
+"RTN","BSDX20",62,0)
+ K BSDXIEN
+"RTN","BSDX20",63,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX20",64,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",65,0)
+ S ^BSDXTMP($J,BSDXI)=+$G(BSDXIEN(1))_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX20",66,0)
+ Q
+"RTN","BSDX20",67,0)
+ ;
+"RTN","BSDX20",68,0)
+ERR(BSDXI,BSDXID,BSDXERR) ;Error processing
+"RTN","BSDX20",69,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",70,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXID_"^"_BSDXERR_$C(30)
+"RTN","BSDX20",71,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",72,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX20",73,0)
+ Q
+"RTN","BSDX20",74,0)
+ ;
+"RTN","BSDX20",75,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX20",76,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX20",77,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",78,0)
+ D ERR(BSDXI,99,70)
+"RTN","BSDX20",79,0)
+ Q
+"RTN","BSDX21")
+0^19^B8672065
+"RTN","BSDX21",1,0)
+BSDX21 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 5/21/10 9:42pm
+"RTN","BSDX21",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX21",3,0)
+ ;
+"RTN","BSDX21",4,0)
+ ;
+"RTN","BSDX21",5,0)
+ADDAGD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX21",6,0)
+ ;Entry point for debugging
+"RTN","BSDX21",7,0)
+ ;
+"RTN","BSDX21",8,0)
+ ;D DEBUG^%Serenji("ADDAG^BSDX21(.BSDXY,BSDXVAL)")
+"RTN","BSDX21",9,0)
+ Q
+"RTN","BSDX21",10,0)
+ ;
+"RTN","BSDX21",11,0)
+ADDAG(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX21",12,0)
+ ;Called by BSDX ADD/EDIT ACCESS GROUP
+"RTN","BSDX21",13,0)
+ ;Add a new BSDX ACCESS GROUP entry
+"RTN","BSDX21",14,0)
+ ;BSDXVAL is NAME of the entry
+"RTN","BSDX21",15,0)
+ ;
+"RTN","BSDX21",16,0)
+ S X="ERROR^BSDX21",@^%ZOSF("TRAP")
+"RTN","BSDX21",17,0)
+ N BSDXIENS,BSDXFDA,BSDXMSG,BSDXIEN,BSDX,BSDXNAM
+"RTN","BSDX21",18,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX21",19,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX21",20,0)
+ I BSDXVAL="" D ERR(0,"BSDX21: Invalid null input Parameter") Q
+"RTN","BSDX21",21,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX21",22,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX21",23,0)
+ I +BSDXIEN D
+"RTN","BSDX21",24,0)
+ . S BSDX="EDIT"
+"RTN","BSDX21",25,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX21",26,0)
+ E  D
+"RTN","BSDX21",27,0)
+ . S BSDX="ADD"
+"RTN","BSDX21",28,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX21",29,0)
+ ;
+"RTN","BSDX21",30,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX21",31,0)
+ I BSDXNAM="" D ERR(0,"BSDX14: Invalid null Access Type name.") Q
+"RTN","BSDX21",32,0)
+ ;
+"RTN","BSDX21",33,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX21",34,0)
+ I $D(^BSDXAGP("B",BSDXNAM)),$O(^BSDXAGP("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX21",35,0)
+ . D ERR(0,"BSDX21: Cannot have two Access Groups with the same name.")
+"RTN","BSDX21",36,0)
+ . Q
+"RTN","BSDX21",37,0)
+ ;
+"RTN","BSDX21",38,0)
+ S BSDXFDA(9002018.38,BSDXIENS,.01)=BSDXNAM ;NAME
+"RTN","BSDX21",39,0)
+ I BSDX="ADD" D
+"RTN","BSDX21",40,0)
+ . K BSDXIEN
+"RTN","BSDX21",41,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX21",42,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX21",43,0)
+ E  D
+"RTN","BSDX21",44,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX21",45,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^"_$C(30)_$C(31)
+"RTN","BSDX21",46,0)
+ Q
+"RTN","BSDX21",47,0)
+ ;
+"RTN","BSDX21",48,0)
+DELAGD(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX21",49,0)
+ ;Entry point for debugging
+"RTN","BSDX21",50,0)
+ ;
+"RTN","BSDX21",51,0)
+ ;D DEBUG^%Serenji("DELAG^BSDX21(.BSDXY,BSDXGRP)")
+"RTN","BSDX21",52,0)
+ Q
+"RTN","BSDX21",53,0)
+ ;
+"RTN","BSDX21",54,0)
+DELAG(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX21",55,0)
+ ;Deletes entry having IEN BSDXGRP from BSDX ACCESS GROUP file
+"RTN","BSDX21",56,0)
+ ;Also deletes all entries in BSDX ACCESS GROUP TYPE that point to this group
+"RTN","BSDX21",57,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX21",58,0)
+ ;Called by BSDX DELETE ACCESS GROUP
+"RTN","BSDX21",59,0)
+ ;Test Line:
+"RTN","BSDX21",60,0)
+ ;D DELAG^BSDX21(.RES,99)
+"RTN","BSDX21",61,0)
+ ;
+"RTN","BSDX21",62,0)
+ S X="ERROR^BSDX21",@^%ZOSF("TRAP")
+"RTN","BSDX21",63,0)
+ N BSDXI,DIK,DA,BSDXIEN,BSDXIEN1
+"RTN","BSDX21",64,0)
+ S BSDXI=0
+"RTN","BSDX21",65,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX21",66,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX21",67,0)
+ S BSDXIEN=BSDXGRP
+"RTN","BSDX21",68,0)
+ ;I '$D(^BSDXAGP("B",BSDXGRP)) D ERR(BSDXI,0,0) Q
+"RTN","BSDX21",69,0)
+ ;S BSDXIEN=$O(^BSDXAGP("B",BSDXGRP,0))
+"RTN","BSDX21",70,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN) Q
+"RTN","BSDX21",71,0)
+ I '$D(^BSDXAGP(BSDXIEN,0)) D ERR(0,"BSDX14: Invalid Access Group ID name.") Q
+"RTN","BSDX21",72,0)
+ ;
+"RTN","BSDX21",73,0)
+ ;Delete BSDXACCESS GROUP TYPE entries
+"RTN","BSDX21",74,0)
+ ;
+"RTN","BSDX21",75,0)
+ S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXAGTP("B",BSDXIEN,BSDXIEN1)) Q:'BSDXIEN1  D
+"RTN","BSDX21",76,0)
+ . S DIK="^BSDXAGTP("
+"RTN","BSDX21",77,0)
+ . S DA=BSDXIEN1
+"RTN","BSDX21",78,0)
+ . D ^DIK
+"RTN","BSDX21",79,0)
+ . Q
+"RTN","BSDX21",80,0)
+ ;
+"RTN","BSDX21",81,0)
+ ;Delete entry BSDXIEN in BSDX ACCESS GROUP
+"RTN","BSDX21",82,0)
+ S DIK="^BSDXAGP("
+"RTN","BSDX21",83,0)
+ S DA=BSDXIEN
+"RTN","BSDX21",84,0)
+ D ^DIK
+"RTN","BSDX21",85,0)
+ ;
+"RTN","BSDX21",86,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",87,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_""_$C(30)_$C(31)
+"RTN","BSDX21",88,0)
+ Q
+"RTN","BSDX21",89,0)
+ ;
+"RTN","BSDX21",90,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX21",91,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX21",92,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",93,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX21",94,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",95,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX21",96,0)
+ Q
+"RTN","BSDX21",97,0)
+ ;
+"RTN","BSDX21",98,0)
+ERROR ;
+"RTN","BSDX21",99,0)
+ D ^%ZTER
+"RTN","BSDX21",100,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX21",101,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",102,0)
+ D ERR(0,"BSDX21 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX21",103,0)
+ Q
+"RTN","BSDX22")
+0^20^B9479861
+"RTN","BSDX22",1,0)
+BSDX22 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX22",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX22",3,0)
+ ;
+"RTN","BSDX22",4,0)
+ ;
+"RTN","BSDX22",5,0)
+DELAGID(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",6,0)
+ ;Entry point for debugging
+"RTN","BSDX22",7,0)
+ ;
+"RTN","BSDX22",8,0)
+ ;D DEBUG^%Serenji("DELAGI^BSDX22(.BSDXY,BSDXIEN,BSDXIEN1)")
+"RTN","BSDX22",9,0)
+ Q
+"RTN","BSDX22",10,0)
+ ;
+"RTN","BSDX22",11,0)
+DELAGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",12,0)
+ ;Deletes entry having Access Group BSDXIEN and Access Type BSDXIEN1 the ACCESS GROUP TYPE file
+"RTN","BSDX22",13,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX22",14,0)
+ ;Called by BSDX DELETE ACCESS GROUP ITEM
+"RTN","BSDX22",15,0)
+ ;Test Line:
+"RTN","BSDX22",16,0)
+ ;D DELAGI^BSDX22(.RES,99)
+"RTN","BSDX22",17,0)
+ ;
+"RTN","BSDX22",18,0)
+ S X="ERROR^BSDX22",@^%ZOSF("TRAP")
+"RTN","BSDX22",19,0)
+ N BSDXI,DIK,DA,BSDXIEN2
+"RTN","BSDX22",20,0)
+ S BSDXI=0
+"RTN","BSDX22",21,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX22",22,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPTYPEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX22",23,0)
+ I '+BSDXIEN D ERR(0,"BSDX22: Invalid null Access Group ID") Q
+"RTN","BSDX22",24,0)
+ I '+BSDXIEN1 D ERR(0,"BSDX22: Invalid null Access Type ID") Q
+"RTN","BSDX22",25,0)
+ I '$D(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1)) D  Q
+"RTN","BSDX22",26,0)
+ . D ERR(0,"BSDX22: Invalid null Access Group Type ID")
+"RTN","BSDX22",27,0)
+ . Q
+"RTN","BSDX22",28,0)
+ S BSDXIEN2=$O(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1,0))
+"RTN","BSDX22",29,0)
+ I '+BSDXIEN2 D ERR(0,"BSDX22: Invalid null Access Group Type ID") Q
+"RTN","BSDX22",30,0)
+ ;
+"RTN","BSDX22",31,0)
+ ;Delete entry
+"RTN","BSDX22",32,0)
+ S DIK="^BSDXAGTP("
+"RTN","BSDX22",33,0)
+ S DA=BSDXIEN2
+"RTN","BSDX22",34,0)
+ D ^DIK
+"RTN","BSDX22",35,0)
+ ;
+"RTN","BSDX22",36,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",37,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN2_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX22",38,0)
+ Q
+"RTN","BSDX22",39,0)
+ ;
+"RTN","BSDX22",40,0)
+ADDAGID(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",41,0)
+ ;Entry point for debugging
+"RTN","BSDX22",42,0)
+ ;
+"RTN","BSDX22",43,0)
+ ;D DEBUG^%Serenji("ADDAGI^BSDX22(.BSDXY,BSDXIEN,BSDXIEN1)")
+"RTN","BSDX22",44,0)
+ Q
+"RTN","BSDX22",45,0)
+ ;
+"RTN","BSDX22",46,0)
+ADDAGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",47,0)
+ ;Adds ACCESS GROUP TYPE file entry having access group BSDXIEN and access type BSDXIEN1
+"RTN","BSDX22",48,0)
+ ;Return recordset containing added entry number error message or "" if no error
+"RTN","BSDX22",49,0)
+ ;Called by BSDX ADD ACCESS GROUP ITEM
+"RTN","BSDX22",50,0)
+ ;Test Line:
+"RTN","BSDX22",51,0)
+ ;D ADDAGI^BSDX22(.RES,1,1)
+"RTN","BSDX22",52,0)
+ ;
+"RTN","BSDX22",53,0)
+ S X="ERROR^BSDX22",@^%ZOSF("TRAP")
+"RTN","BSDX22",54,0)
+ N BSDXI,BSDXIENS,BSDXMSG,BSDXFDA
+"RTN","BSDX22",55,0)
+ S BSDXI=0
+"RTN","BSDX22",56,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX22",57,0)
+ ;S ^BSDXTMP($J,0)="I00020ACCESSGROUPTYPEID^I00020ERRORID"_$C(30)
+"RTN","BSDX22",58,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPTYPEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX22",59,0)
+ I '+BSDXIEN D ERR(0,"BSDX22: Invalid null Access Group ID") Q
+"RTN","BSDX22",60,0)
+ I '+BSDXIEN1 D ERR(0,"BSDX22: Invalid null Access Type ID") Q
+"RTN","BSDX22",61,0)
+ I '$D(^BSDXAGP(BSDXIEN,0)) D ERR(0,"BSDX22: Invalid Access Group ID") Q
+"RTN","BSDX22",62,0)
+ I '$D(^BSDXTYPE(BSDXIEN1,0)) D ERR(0,"BSDX22: Invalid Access Type ID") Q
+"RTN","BSDX22",63,0)
+ I $D(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1)) D  Q
+"RTN","BSDX22",64,0)
+ . S BSDXIENS=$O(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1,0))
+"RTN","BSDX22",65,0)
+ . S ^BSDXTMP($J,BSDXI+1)=+BSDXIENS_"^"_$C(30)_$C(31)
+"RTN","BSDX22",66,0)
+ . Q
+"RTN","BSDX22",67,0)
+ ;
+"RTN","BSDX22",68,0)
+ S BSDXIENS="+1,"
+"RTN","BSDX22",69,0)
+ S BSDXFDA(9002018.39,BSDXIENS,.01)=BSDXIEN ;ACCESS GROUP ID
+"RTN","BSDX22",70,0)
+ S BSDXFDA(9002018.39,BSDXIENS,.02)=BSDXIEN1 ;ACCESS TYPE ID
+"RTN","BSDX22",71,0)
+ K BSDXIEN
+"RTN","BSDX22",72,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX22",73,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",74,0)
+ S ^BSDXTMP($J,BSDXI)=+$G(BSDXIEN(1))_"^"_$C(30)_$C(31)
+"RTN","BSDX22",75,0)
+ Q
+"RTN","BSDX22",76,0)
+ ;
+"RTN","BSDX22",77,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX22",78,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX22",79,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",80,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX22",81,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",82,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX22",83,0)
+ Q
+"RTN","BSDX22",84,0)
+ ;
+"RTN","BSDX22",85,0)
+ERROR ;
+"RTN","BSDX22",86,0)
+ D ^%ZTER
+"RTN","BSDX22",87,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX22",88,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",89,0)
+ D ERR(0,"BSDX22 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX22",90,0)
+ Q
+"RTN","BSDX23")
+0^21^B8488013
+"RTN","BSDX23",1,0)
+BSDX23 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX23",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX23",3,0)
+ ;
+"RTN","BSDX23",4,0)
+ ;
+"RTN","BSDX23",5,0)
+EVENT(BSDXEVENT,BSDXPARAM,BSDXSIP,BSDXSPT) ;EP
+"RTN","BSDX23",6,0)
+ ;Raise event to interested clients
+"RTN","BSDX23",7,0)
+ ;Clients are listed in ^BSDXTMP("EVENT",EVENT_NAME,IP,PORT)
+"RTN","BSDX23",8,0)
+ ;BSDXSIP and BSDXSPT represent the sender's IP and PORT.  
+"RTN","BSDX23",9,0)
+ ;The event will not be raised back to the sender if these are non-null
+"RTN","BSDX23",10,0)
+ ;
+"RTN","BSDX23",11,0)
+ Q:'$D(^BSDXTMP("EVENT",BSDXEVENT))
+"RTN","BSDX23",12,0)
+ S BSDXIP=0 F  S BSDXIP=$O(^BSDXTMP("EVENT",BSDXEVENT,BSDXIP)) Q:BSDXIP=""  D
+"RTN","BSDX23",13,0)
+ . S BSDXPORT=0 F  S BSDXPORT=$O(^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)) Q:'+BSDXPORT  D
+"RTN","BSDX23",14,0)
+ . . I BSDXIP=BSDXSIP Q  ;,BSDXPORT=BSDXSPT Q
+"RTN","BSDX23",15,0)
+ . . D CALL^%ZISTCP(BSDXIP,BSDXPORT,5)
+"RTN","BSDX23",16,0)
+ . . I POP K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT) Q
+"RTN","BSDX23",17,0)
+ . . ;U IO R X#3:5
+"RTN","BSDX23",18,0)
+ . . I X'="ACK" K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT) Q
+"RTN","BSDX23",19,0)
+ . . S BSDXPARAM=$S(BSDXPARAM="":"",1:U_BSDXPARAM)
+"RTN","BSDX23",20,0)
+ . . U IO W BSDXEVENT,BSDXPARAM,!
+"RTN","BSDX23",21,0)
+ . . D ^%ZISC
+"RTN","BSDX23",22,0)
+ . . Q
+"RTN","BSDX23",23,0)
+ . Q
+"RTN","BSDX23",24,0)
+ Q
+"RTN","BSDX23",25,0)
+ ;
+"RTN","BSDX23",26,0)
+EVERR(BSDXEVENT,BSDXIP,BSDXPORT) ;
+"RTN","BSDX23",27,0)
+ ;
+"RTN","BSDX23",28,0)
+ Q:$G(BSDXEVENT)=""
+"RTN","BSDX23",29,0)
+ Q:$G(BSDXIP)=""
+"RTN","BSDX23",30,0)
+ Q:$G(BSDXIP)=""
+"RTN","BSDX23",31,0)
+ K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)
+"RTN","BSDX23",32,0)
+ Q
+"RTN","BSDX23",33,0)
+ ;
+"RTN","BSDX23",34,0)
+REGET ;EP
+"RTN","BSDX23",35,0)
+ ;Error trap from REGEVNT
+"RTN","BSDX23",36,0)
+ ;
+"RTN","BSDX23",37,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX23",38,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",39,0)
+ D REGERR(BSDXI,99)
+"RTN","BSDX23",40,0)
+ Q
+"RTN","BSDX23",41,0)
+ ;
+"RTN","BSDX23",42,0)
+REGERR(BSDXI,BSDXERID) ;Error processing
+"RTN","BSDX23",43,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",44,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_$C(30)
+"RTN","BSDX23",45,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",46,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX23",47,0)
+ Q
+"RTN","BSDX23",48,0)
+ ;
+"RTN","BSDX23",49,0)
+ ;
+"RTN","BSDX23",50,0)
+REGEVNT(BSDXY,BSDXEVENT,BSDXIP,BSDXPORT) ;EP
+"RTN","BSDX23",51,0)
+ ;RPC Called by client to inform RPMS server of client's interest in BSDXEVENT
+"RTN","BSDX23",52,0)
+ ;Returns RECORDSET with field ERRORID.
+"RTN","BSDX23",53,0)
+ ;If everything ok then ERRORID = 0;
+"RTN","BSDX23",54,0)
+ ;
+"RTN","BSDX23",55,0)
+ N BSDXI
+"RTN","BSDX23",56,0)
+ S BSDXI=0
+"RTN","BSDX23",57,0)
+ S X="REGET^BSDX23",@^%ZOSF("TRAP")
+"RTN","BSDX23",58,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX23",59,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID"_$C(30)
+"RTN","BSDX23",60,0)
+ I '+BSDXPORT D REGERR(BSDXI,1) Q
+"RTN","BSDX23",61,0)
+ I BSDXIP="" D REGERR(BSDXI,2) Q
+"RTN","BSDX23",62,0)
+ S ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)=""
+"RTN","BSDX23",63,0)
+ ;
+"RTN","BSDX23",64,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",65,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)_$C(31)
+"RTN","BSDX23",66,0)
+ Q
+"RTN","BSDX23",67,0)
+ ;
+"RTN","BSDX23",68,0)
+UNREG(BSDXY,BSDXEVENT,BSDXIP,BSDXPORT) ;EP
+"RTN","BSDX23",69,0)
+ ;RPC Called by client to Unregister client's interest in BSDXEVENT
+"RTN","BSDX23",70,0)
+ ;Returns RECORDSET with field ERRORID.
+"RTN","BSDX23",71,0)
+ ;If everything ok then ERRORID = 0;
+"RTN","BSDX23",72,0)
+ ;
+"RTN","BSDX23",73,0)
+ N BSDXI
+"RTN","BSDX23",74,0)
+ S BSDXI=0
+"RTN","BSDX23",75,0)
+ S X="REGET^BSDX23",@^%ZOSF("TRAP")
+"RTN","BSDX23",76,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX23",77,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID"_$C(30)
+"RTN","BSDX23",78,0)
+ I '+BSDXPORT D REGERR(BSDXI,1) Q
+"RTN","BSDX23",79,0)
+ I BSDXIP="" D REGERR(BSDXI,2) Q
+"RTN","BSDX23",80,0)
+ K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)
+"RTN","BSDX23",81,0)
+ ;
+"RTN","BSDX23",82,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",83,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)_$C(31)
+"RTN","BSDX23",84,0)
+ Q
+"RTN","BSDX23",85,0)
+ ;
+"RTN","BSDX23",86,0)
+RAISEVNT(BSDXY,BSDXEVENT,BSDXPARAM,BSDXSIP,BSDXSPT) ;EP
+"RTN","BSDX23",87,0)
+ ;RPC Called to raise event BSDXEVENT with parameter BSDXPARAM
+"RTN","BSDX23",88,0)
+ ;BSDXSIP and BSDXSPT represent the sender's IP and PORT.
+"RTN","BSDX23",89,0)
+ ;If not null, these will prevent the event from being raised back
+"RTN","BSDX23",90,0)
+ ;to the sender.
+"RTN","BSDX23",91,0)
+ ;Returns a RECORDSET wit the field ERRORID.
+"RTN","BSDX23",92,0)
+ ;If everything ok then ERRORID = 0;
+"RTN","BSDX23",93,0)
+ ;
+"RTN","BSDX23",94,0)
+ N BSDXI
+"RTN","BSDX23",95,0)
+ S BSDXI=0
+"RTN","BSDX23",96,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX23",97,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID"_$C(30)
+"RTN","BSDX23",98,0)
+ S X="REGET^BSDX23",@^%ZOSF("TRAP")
+"RTN","BSDX23",99,0)
+ ;
+"RTN","BSDX23",100,0)
+ D EVENT(BSDXEVENT,BSDXPARAM,BSDXSIP,BSDXSPT)
+"RTN","BSDX23",101,0)
+ ;
+"RTN","BSDX23",102,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",103,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)_$C(31)
+"RTN","BSDX23",104,0)
+ Q
+"RTN","BSDX24")
+0^22^B13455014
+"RTN","BSDX24",1,0)
+BSDX24 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX24",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX24",3,0)
+ ;
+"RTN","BSDX24",4,0)
+ ;
+"RTN","BSDX24",5,0)
+ Q
+"RTN","BSDX24",6,0)
+CRCONTXT(RESULT,OPTION) ;EP
+"RTN","BSDX24",7,0)
+ ;Entry point for debugging XWBSEC
+"RTN","BSDX24",8,0)
+ ;
+"RTN","BSDX24",9,0)
+ ;D DEBUG^%Serenji("CRCONTXT^XWBSEC(.RESULT,OPTION)")
+"RTN","BSDX24",10,0)
+ ;;H .5
+"RTN","BSDX24",11,0)
+ ;;D CRCONTXT^XWBSEC(.RESULT,OPTION)
+"RTN","BSDX24",12,0)
+ ;;S BSDX="^BSDXTMP($J,"
+"RTN","BSDX24",13,0)
+ ;;S ^BSDXTMP($J,0)=RESULT
+"RTN","BSDX24",14,0)
+ ;;S RESULT=1
+"RTN","BSDX24",15,0)
+ Q
+"RTN","BSDX24",16,0)
+TEST0(BSDX) ;EP Delete user from 200
+"RTN","BSDX24",17,0)
+ S DIK="^VA(200,"
+"RTN","BSDX24",18,0)
+ S DA=BSDX
+"RTN","BSDX24",19,0)
+ D ^DIK
+"RTN","BSDX24",20,0)
+ ;
+"RTN","BSDX24",21,0)
+ Q
+"RTN","BSDX24",22,0)
+KILLM ;EP Delete BMXMENU entry
+"RTN","BSDX24",23,0)
+ S DIK="^DIC(19,"
+"RTN","BSDX24",24,0)
+ S DA=$O(^DIC(19,"B","BMXMENU",0))
+"RTN","BSDX24",25,0)
+ Q:'+DA
+"RTN","BSDX24",26,0)
+ D ^DIK
+"RTN","BSDX24",27,0)
+ Q
+"RTN","BSDX24",28,0)
+ ;
+"RTN","BSDX24",29,0)
+TEST1 ;EP Adding an entry to 200
+"RTN","BSDX24",30,0)
+ ;
+"RTN","BSDX24",31,0)
+ S BSDXFDA(200,"+1,",.01)="BMXNET,APPLICATION"
+"RTN","BSDX24",32,0)
+ K BSDXIEN,BSDXMSG
+"RTN","BSDX24",33,0)
+ S DIC(0)=""
+"RTN","BSDX24",34,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX24",35,0)
+ ;
+"RTN","BSDX24",36,0)
+ Q
+"RTN","BSDX24",37,0)
+TEST2 ;EP
+"RTN","BSDX24",38,0)
+ ;How to change the ACCESS CODE, VERIFY CODE, DATE VERIFY CODE LAST CHANGED field
+"RTN","BSDX24",39,0)
+ ;ACCESS CODE BSDXXX1^1_(a>yr}:3x3ja9\8vbH
+"RTN","BSDX24",40,0)
+ ;VERIFY CODE BSDXXX2^$;HOSs|:3w25lLD}Be=
+"RTN","BSDX24",41,0)
+ N BSDXFDA
+"RTN","BSDX24",42,0)
+ S BSDXFDA(200,"36,",2)="1_(a>yr}:3x3ja9\8vbH"
+"RTN","BSDX24",43,0)
+ S BSDXFDA(200,"36,",11)="$;HOSs|:3w25lLD}Be="
+"RTN","BSDX24",44,0)
+ S BSDXFDA(200,"36,",11.2)="88888,88888"
+"RTN","BSDX24",45,0)
+ S BSDXFDA(200,"36,",201)="BMXRPC"
+"RTN","BSDX24",46,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX24",47,0)
+ Q
+"RTN","BSDX24",48,0)
+ ;
+"RTN","BSDX24",49,0)
+ ;
+"RTN","BSDX24",50,0)
+SEARCHD(BSDXY,BSDXRES,BSDXSTRT,BSDXEND,BSDXTYPES,BSDXAMPM,BSDXWKDY) ;EP
+"RTN","BSDX24",51,0)
+ ;Entry point for debugging
+"RTN","BSDX24",52,0)
+ ;
+"RTN","BSDX24",53,0)
+ ;D DEBUG^%Serenji("SEARCH^BSDX24(.RES,""ROGERS,BUCK|FUNAKOSHI,GICHIN"","""","""","""","""","""")")
+"RTN","BSDX24",54,0)
+ ;D DEBUG^%Serenji("SEARCH^BSDX24(.BSDXY,BSDXRES,BSDXSTRT,BSDXEND,BSDXTYPES,BSDXAMPM,BSDXWKDY)")
+"RTN","BSDX24",55,0)
+ Q
+"RTN","BSDX24",56,0)
+ ;
+"RTN","BSDX24",57,0)
+SEARCH(BSDXY,BSDXRES,BSDXSTRT,BSDXEND,BSDXTYPES,BSDXAMPM,BSDXWKDY) ;EP
+"RTN","BSDX24",58,0)
+ ;Searches availability database for availability blocks between
+"RTN","BSDX24",59,0)
+ ;BSDXSTRT and BSDXEND for each of the resources in BSDXRES.
+"RTN","BSDX24",60,0)
+ ;The av blocks must be one of the types in BSDXTYPES, must be
+"RTN","BSDX24",61,0)
+ ;AM or PM depending on value in BSDXAMPM and
+"RTN","BSDX24",62,0)
+ ;must be on one of the weekdays listed in BSDXWKDY.
+"RTN","BSDX24",63,0)
+ ;
+"RTN","BSDX24",64,0)
+ ;Return recordset containing the start times of availability blocks
+"RTN","BSDX24",65,0)
+ ;meeting the search criteria.
+"RTN","BSDX24",66,0)
+ ;
+"RTN","BSDX24",67,0)
+ ;Variables:
+"RTN","BSDX24",68,0)
+ ;BSDXRES |-Delimited list of resource names
+"RTN","BSDX24",69,0)
+ ;BSDXSTRT FM-formatted beginning date of search
+"RTN","BSDX24",70,0)
+ ;BSDXEND FM-Formatted ending date of search
+"RTN","BSDX24",71,0)
+ ;BSDXTYPES |-Delimited list of access type IENs
+"RTN","BSDX24",72,0)
+ ;BSDXAMPM "AM" for am-only, "PM" for pm-only, "BOTH" for both
+"RTN","BSDX24",73,0)
+ ;BSDXWKDY "" if any weekday, else |-delimited list of weekdays
+"RTN","BSDX24",74,0)
+ ;
+"RTN","BSDX24",75,0)
+ ;NOTE: If BSDXEND="" Then:
+"RTN","BSDX24",76,0)
+ ; either ONE record is returned matching the first available block
+"RTN","BSDX24",77,0)
+ ; -or- NO record is returned indicating no available block exists
+"RTN","BSDX24",78,0)
+ ;
+"RTN","BSDX24",79,0)
+ ;Called by BSDX SEARCH AVAILABILITY
+"RTN","BSDX24",80,0)
+ ;Test Line:
+"RTN","BSDX24",81,0)
+ ;D SEARCH^BSDX24(.RES,"ROGERS,BUCK|FUNAKOSHI,GICHIN","","","","","") ZW RES
+"RTN","BSDX24",82,0)
+ ;
+"RTN","BSDX24",83,0)
+ ;
+"RTN","BSDX24",84,0)
+ S X=BSDXSTRT,%DT="X" D ^%DT S BSDXSTRT=$P(Y,".")
+"RTN","BSDX24",85,0)
+ S:+BSDXSTRT<0 BSDXSTRT=DT
+"RTN","BSDX24",86,0)
+ S X=BSDXEND,%DT="X" D ^%DT S BSDXEND=$P(Y,".")
+"RTN","BSDX24",87,0)
+ S:+BSDXEND<0 BSDXEND=9990101
+"RTN","BSDX24",88,0)
+ S BSDXEND=BSDXEND_".99"
+"RTN","BSDX24",89,0)
+ N BSDXRESN,BSDXRESD,BSDXDATE,BSDXI,BSDXABD,BSDXNOD,BSDXATD,BSDXATN
+"RTN","BSDX24",90,0)
+ N BSDXTYPE
+"RTN","BSDX24",91,0)
+ ;
+"RTN","BSDX24",92,0)
+ ;Set up access types array
+"RTN","BSDX24",93,0)
+ F BSDX=1:1:$L(BSDXTYPES,"|") D
+"RTN","BSDX24",94,0)
+ . S BSDXATD=$P(BSDXTYPES,"|",BSDX)
+"RTN","BSDX24",95,0)
+ . S:+BSDXATD BSDXTYPE(BSDXTYPD)=""
+"RTN","BSDX24",96,0)
+ ;
+"RTN","BSDX24",97,0)
+ S BSDXI=0
+"RTN","BSDX24",98,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX24",99,0)
+ S ^BSDXTMP($J,0)="T00030RESOURCENAME^D00030DATE^T00030ACCESSTYPE^T00030COMMENT"_$C(30)
+"RTN","BSDX24",100,0)
+ F BSDX=1:1:$L(BSDXRES,"|") S BSDXRESN=$P(BSDXRES,"|",BSDX) D
+"RTN","BSDX24",101,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX24",102,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX24",103,0)
+ . Q:'+BSDXRESD
+"RTN","BSDX24",104,0)
+ . Q:'$D(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX24",105,0)
+ . Q:'$D(^BSDXAB("ARSCT",BSDXRESD))
+"RTN","BSDX24",106,0)
+ . S BSDXDATE=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXSTRT))
+"RTN","BSDX24",107,0)
+ . Q:BSDXDATE=""
+"RTN","BSDX24",108,0)
+ . Q:BSDXDATE>BSDXEND
+"RTN","BSDX24",109,0)
+ . ;TODO: Screen for AMPM
+"RTN","BSDX24",110,0)
+ . ;TODO: Screen for Weekday
+"RTN","BSDX24",111,0)
+ . ;
+"RTN","BSDX24",112,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX24",113,0)
+ . S BSDXABD=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXDATE,0))
+"RTN","BSDX24",114,0)
+ . S BSDXNOD=$G(^BSDXAB(BSDXABD,0))
+"RTN","BSDX24",115,0)
+ . Q:BSDXNOD=""
+"RTN","BSDX24",116,0)
+ . S Y=$P(BSDXDATE,".")
+"RTN","BSDX24",117,0)
+ . D DD^%DT
+"RTN","BSDX24",118,0)
+ . S BSDXATD=$P(BSDXNOD,U,5) ;ACCESS TYPE POINTER
+"RTN","BSDX24",119,0)
+ . S BSDXATD=$G(^BSDXTYPE(+BSDXATD,0))
+"RTN","BSDX24",120,0)
+ . S BSDXATN=$P(BSDXATD,U)
+"RTN","BSDX24",121,0)
+ . I +BSDXATD,BSDXTYPES]"" Q:'$D(BSDXTYPES(BSDXATD))
+"RTN","BSDX24",122,0)
+ . ;TODO: Screen for TYPE ----DONE!
+"RTN","BSDX24",123,0)
+ . ;TODO: Comment
+"RTN","BSDX24",124,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXRESN_U_Y_U_BSDXATN_U_$C(30)
+"RTN","BSDX24",125,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX24",126,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX24",127,0)
+ Q
+"RTN","BSDX25")
+0^23^B21230952
+"RTN","BSDX25",1,0)
+BSDX25 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 1/6/11 1:57pm
+"RTN","BSDX25",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX25",3,0)
+    ;
+"RTN","BSDX25",4,0)
+    ; Change Log:
+"RTN","BSDX25",5,0)
+    ; 3110106: SMH -> Changed Check-in EP - Removed unused paramters. Will change C#
+"RTN","BSDX25",6,0)
+ ;
+"RTN","BSDX25",7,0)
+ ;
+"RTN","BSDX25",8,0)
+CHECKIND(BSDXY,BSDXAPTID,BSDXCDT,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG) ;EP
+"RTN","BSDX25",9,0)
+ ;Entry point for debugging
+"RTN","BSDX25",10,0)
+ ;
+"RTN","BSDX25",11,0)
+ ;I +$G(^BSDXDBUG("BREAK","CHECKIN")),+$G(^BSDXDBUG("BREAK"))=DUZ D DEBUG^%Serenji("CHECKIN^BSDX25(.BSDXY,BSDXAPTID,BSDXCDT,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG)",$P(^BSDXDBUG("BREAK"),U,2))
+"RTN","BSDX25",12,0)
+ ;E  G ENDBG
+"RTN","BSDX25",13,0)
+ Q
+"RTN","BSDX25",14,0)
+ ;
+"RTN","BSDX25",15,0)
+CHECKIN(BSDXY,BSDXAPTID,BSDXCDT) ; ,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG)	;EP Check in appointment
+"RTN","BSDX25",16,0)
+ ; Private to GUI; use BSDXAPI for general API to checkin patients
+"RTN","BSDX25",17,0)
+    ; Parameters:
+"RTN","BSDX25",18,0)
+    ; BSDXY: Global Out
+"RTN","BSDX25",19,0)
+    ; BSDXAPTID: Appointment ID in ^BSDXAPPT
+"RTN","BSDX25",20,0)
+    ; BSDXCDT: Checkin Date --> Changed
+"RTN","BSDX25",21,0)
+    ; BSDXCC: Clinic Stop IEN (not used)
+"RTN","BSDX25",22,0)
+    ; BSDXPRV: Provider IEN (not used)
+"RTN","BSDX25",23,0)
+    ; BSDXROU: Print Routing Slip? (not used)
+"RTN","BSDX25",24,0)
+    ; BSDXVCL: PCC+ Clinic IEN (not used)
+"RTN","BSDX25",25,0)
+    ; BSDXVFM: PCC+ Form IEN (not used)
+"RTN","BSDX25",26,0)
+    ; BSDXOG: PCC+ Outguide (true or false)
+"RTN","BSDX25",27,0)
+    ;
+"RTN","BSDX25",28,0)
+    ; Output:
+"RTN","BSDX25",29,0)
+    ; ADO.net table with 1 column ErrorID, 1 row result
+"RTN","BSDX25",30,0)
+    ; - 0 if all okay
+"RTN","BSDX25",31,0)
+    ; - Another number or text if not
+"RTN","BSDX25",32,0)
+ENDBG ;
+"RTN","BSDX25",33,0)
+ N BSDXNOD,BSDXPATID,BSDXSTART,DIK,DA,BSDXID,BSDXI,BSDXZ,BSDXIENS,BSDXVEN
+"RTN","BSDX25",34,0)
+ N BSDXNOEV
+"RTN","BSDX25",35,0)
+ S BSDXNOEV=1 ;Don't execute protocol
+"RTN","BSDX25",36,0)
+ ;
+"RTN","BSDX25",37,0)
+ D ^XBKVAR S X="ERROR^BSDX25",@^%ZOSF("TRAP")
+"RTN","BSDX25",38,0)
+ S BSDXI=0
+"RTN","BSDX25",39,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX25",40,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX25",41,0)
+ S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30)
+"RTN","BSDX25",42,0)
+ I '+BSDXAPTID D ERR("BSDX25: Invalid Appointment ID") Q
+"RTN","BSDX25",43,0)
+ I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR("BSDX08: Invalid Appointment ID") Q
+"RTN","BSDX25",44,0)
+ ; Remove Date formatting v.1.5. Client will send date as FM Date.
+"RTN","BSDX25",45,0)
+ ;S:BSDXCDT["@0000" BSDXCDT=$P(BSDXCDT,"@")
+"RTN","BSDX25",46,0)
+ ;S %DT="T",X=BSDXCDT D ^%DT S BSDXCDT=Y
+"RTN","BSDX25",47,0)
+    S BSDXCDT=+BSDXCDT  ; Strip off zeros if C# sends them
+"RTN","BSDX25",48,0)
+ I BSDXCDT=-1 D ERR(70) Q
+"RTN","BSDX25",49,0)
+ I BSDXCDT>$$NOW^XLFDT S BSDXCDT=$$NOW^XLFDT
+"RTN","BSDX25",50,0)
+ ;Checkin BSDX APPOINTMENT entry
+"RTN","BSDX25",51,0)
+ D BSDXCHK(BSDXAPTID,BSDXCDT)
+"RTN","BSDX25",52,0)
+ S BSDXNOD=^BSDXAPPT(BSDXAPTID,0)
+"RTN","BSDX25",53,0)
+ S BSDXPATID=$P(BSDXNOD,U,5)
+"RTN","BSDX25",54,0)
+ S BSDXSTART=$P(BSDXNOD,U)
+"RTN","BSDX25",55,0)
+ ;
+"RTN","BSDX25",56,0)
+ S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID
+"RTN","BSDX25",57,0)
+ I BSDXSC1]"",$D(^BSDXRES(BSDXSC1,0)) D  I +$G(BSDXZ) D ERR($P(BSDXZ,U,2)) Q
+"RTN","BSDX25",58,0)
+ . S BSDXNOD=^BSDXRES(BSDXSC1,0)
+"RTN","BSDX25",59,0)
+ . S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION
+"RTN","BSDX25",60,0)
+ . I BSDXSC1]"",$D(^SC(BSDXSC1,0)) D APCHK(.BSDXZ,BSDXSC1,BSDXPATID,BSDXCDT,BSDXSTART)
+"RTN","BSDX25",61,0)
+ ;
+"RTN","BSDX25",62,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",63,0)
+ ;S ^BSDXTMP($J,BSDXI)="-1"_$C(30)
+"RTN","BSDX25",64,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)
+"RTN","BSDX25",65,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",66,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX25",67,0)
+ Q
+"RTN","BSDX25",68,0)
+ ;
+"RTN","BSDX25",69,0)
+BSDXCHK(BSDXAPTID,BSDXCDT) ;
+"RTN","BSDX25",70,0)
+ ;
+"RTN","BSDX25",71,0)
+ S BSDXIENS=BSDXAPTID_","
+"RTN","BSDX25",72,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.03)=BSDXCDT
+"RTN","BSDX25",73,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX25",74,0)
+ Q
+"RTN","BSDX25",75,0)
+ ;
+"RTN","BSDX25",76,0)
+APCHK(BSDXZ,BSDXSC1,BSDXDFN,BSDXCDT,BSDXSTART)         ;
+"RTN","BSDX25",77,0)
+ ;Checkin appointment for patient BSDXDFN in clinic BSDXSC1
+"RTN","BSDX25",78,0)
+ ;at time BSDXSTART
+"RTN","BSDX25",79,0)
+ S BSDXZ=$$CHECKIN1^BSDXAPI(BSDXDFN,BSDXSC1,BSDXSTART)
+"RTN","BSDX25",80,0)
+ Q
+"RTN","BSDX25",81,0)
+ ;
+"RTN","BSDX25",82,0)
+CHKEVT(BSDXPAT,BSDXSTART,BSDXSC) ;EP Called by BSDX CHECKIN APPOINTMENT event
+"RTN","BSDX25",83,0)
+ ;when appointments CHECKIN via PIMS interface.
+"RTN","BSDX25",84,0)
+ ;Propagates CHECKIN to BSDXAPPT and raises refresh event to running GUI clients
+"RTN","BSDX25",85,0)
+ ;
+"RTN","BSDX25",86,0)
+ Q:+$G(BSDXNOEV)
+"RTN","BSDX25",87,0)
+ Q:'+$G(BSDXSC)
+"RTN","BSDX25",88,0)
+ N BSDXSTAT,BSDXFOUND,BSDXRES
+"RTN","BSDX25",89,0)
+ S BSDXSTAT=""
+"RTN","BSDX25",90,0)
+ S:$G(SDATA("AFTER","STATUS"))["CHECKED IN" BSDXSTAT=$P(SDATA("AFTER","STATUS"),"^",4)
+"RTN","BSDX25",91,0)
+ S BSDXFOUND=0
+"RTN","BSDX25",92,0)
+ I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$CHKEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX25",93,0)
+ I BSDXFOUND D CHKEVT3(BSDXRES) Q
+"RTN","BSDX25",94,0)
+ I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$CHKEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX25",95,0)
+ I BSDXFOUND D CHKEVT3(BSDXRES)
+"RTN","BSDX25",96,0)
+ Q
+"RTN","BSDX25",97,0)
+ ;
+"RTN","BSDX25",98,0)
+CHKEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT) ;
+"RTN","BSDX25",99,0)
+ ;Get appointment id in BSDXAPT
+"RTN","BSDX25",100,0)
+ ;If found, call BSDXNOS(BSDXAPPT) and return 1
+"RTN","BSDX25",101,0)
+ ;else return 0
+"RTN","BSDX25",102,0)
+ N BSDXFOUND,BSDXAPPT
+"RTN","BSDX25",103,0)
+ S BSDXFOUND=0
+"RTN","BSDX25",104,0)
+ Q:'+$G(BSDXRES) BSDXFOUND
+"RTN","BSDX25",105,0)
+ Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND
+"RTN","BSDX25",106,0)
+ S BSDXAPPT=0 F  S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT  D  Q:BSDXFOUND
+"RTN","BSDX25",107,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""
+"RTN","BSDX25",108,0)
+ . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q
+"RTN","BSDX25",109,0)
+ I BSDXFOUND,+$G(BSDXAPPT) D BSDXCHK(BSDXAPPT,BSDXSTAT)
+"RTN","BSDX25",110,0)
+ Q BSDXFOUND
+"RTN","BSDX25",111,0)
+ ;
+"RTN","BSDX25",112,0)
+CHKEVT3(BSDXRES) ;
+"RTN","BSDX25",113,0)
+ ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX25",114,0)
+ ;
+"RTN","BSDX25",115,0)
+ N BSDXRESN
+"RTN","BSDX25",116,0)
+ S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX25",117,0)
+ Q:BSDXRESN=""
+"RTN","BSDX25",118,0)
+ S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX25",119,0)
+ ;D EVENT^BSDX23("SCHEDULE-"_BSDXRESN,"","","")
+"RTN","BSDX25",120,0)
+ D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX25",121,0)
+ Q
+"RTN","BSDX25",122,0)
+ ;
+"RTN","BSDX25",123,0)
+ERROR ;
+"RTN","BSDX25",124,0)
+ D ERR("RPMS Error")
+"RTN","BSDX25",125,0)
+ Q
+"RTN","BSDX25",126,0)
+ ;
+"RTN","BSDX25",127,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX25",128,0)
+ I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX25",129,0)
+ E  S BSDXERR=ERRNO
+"RTN","BSDX25",130,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",131,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX25",132,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",133,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX25",134,0)
+ Q
+"RTN","BSDX26")
+0^24^B30714245
+"RTN","BSDX26",1,0)
+BSDX26  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:38pm
+"RTN","BSDX26",2,0)
+    ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX26",3,0)
+    ; Change History:
+"RTN","BSDX26",4,0)
+    ; 3101023 - UJO/SMH - Addition of restartable transaction; relocation of tx.
+"RTN","BSDX26",5,0)
+    ; --> Thanks to Zach Gonzalez and Rick Marshall
+"RTN","BSDX26",6,0)
+    ; 3101205 - UJO/SMH - Extensive refactoring.
+"RTN","BSDX26",7,0)
+    ;
+"RTN","BSDX26",8,0)
+    ; Error Reference:
+"RTN","BSDX26",9,0)
+    ; -1: Appt ID is not a number
+"RTN","BSDX26",10,0)
+    ; -2: Appt IEN is not in ^BSDXAPPT
+"RTN","BSDX26",11,0)
+    ; -3: FM Failure to file WP field in ^BSDXAPPT
+"RTN","BSDX26",12,0)
+    ;
+"RTN","BSDX26",13,0)
+EDITAPTD(BSDXY,BSDXAPTID,BSDXNOTE)  ;EP
+"RTN","BSDX26",14,0)
+    ;Entry point for debugging
+"RTN","BSDX26",15,0)
+    ;
+"RTN","BSDX26",16,0)
+    D DEBUG^%Serenji("EDITAPT^BSDX26(.BSDXY,BSDXAPTID,BSDXNOTE)")
+"RTN","BSDX26",17,0)
+    Q
+"RTN","BSDX26",18,0)
+UT ; Unit Tests
+"RTN","BSDX26",19,0)
+    ; Test 1: Make sure this damn thing works
+"RTN","BSDX26",20,0)
+    N ZZZ
+"RTN","BSDX26",21,0)
+    N %H S %H=$H
+"RTN","BSDX26",22,0)
+    N NOTE S NOTE="New Note "_%H
+"RTN","BSDX26",23,0)
+    D EDITAPT(.ZZZ,188,NOTE)
+"RTN","BSDX26",24,0)
+    I ^BSDXAPPT(188,1,1,0)'=NOTE W "ERROR",! B
+"RTN","BSDX26",25,0)
+    ; Test 2: Test Errors -1 and -2
+"RTN","BSDX26",26,0)
+    N ZZZ
+"RTN","BSDX26",27,0)
+    N NOTE S NOTE="Nothing important"
+"RTN","BSDX26",28,0)
+    D EDITAPT(.ZZZ,"BLAHBLAH",NOTE)
+"RTN","BSDX26",29,0)
+    I +^BSDXTMP($J,1)'=-1 W "ERROR IN -1",! B
+"RTN","BSDX26",30,0)
+    D EDITAPT(.ZZZ,298734322,NOTE)
+"RTN","BSDX26",31,0)
+    I +^BSDXTMP($J,1)'=-2 W "ERROR IN -2",! B
+"RTN","BSDX26",32,0)
+    ; Test 4: M Error
+"RTN","BSDX26",33,0)
+    N bsdxdie S bsdxdie=1
+"RTN","BSDX26",34,0)
+    D EDITAPT(.ZZZ,188,NOTE)
+"RTN","BSDX26",35,0)
+    I +^BSDXTMP($J,1)'=-100 W "ERROR IN -100",! B
+"RTN","BSDX26",36,0)
+    k bsdxdie
+"RTN","BSDX26",37,0)
+    ; Test 5: Trestart
+"RTN","BSDX26",38,0)
+    N bsdxrestart S bsdxrestart=1
+"RTN","BSDX26",39,0)
+    N %H S %H=$H
+"RTN","BSDX26",40,0)
+    N NOTE S NOTE="New Note "_%H
+"RTN","BSDX26",41,0)
+    D EDITAPT(.ZZZ,188,NOTE)
+"RTN","BSDX26",42,0)
+    I ^BSDXAPPT(188,1,1,0)'=NOTE W "ERROR in TRESTART",! B
+"RTN","BSDX26",43,0)
+    ; Test 6: for Hosp Location Update
+"RTN","BSDX26",44,0)
+    N DATE S DATE=$$NOW^XLFDT()
+"RTN","BSDX26",45,0)
+    S DATE=$E(DATE,1,12) ; Just get minutes b/c of HL file input transform
+"RTN","BSDX26",46,0)
+    D APPADD^BSDX07(.ZZZ,DATE,DATE+.001,3,"Dr Office",30,"Old Note",1)
+"RTN","BSDX26",47,0)
+    N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX26",48,0)
+    D EDITAPT(.ZZZ,APPID,"New Note")
+"RTN","BSDX26",49,0)
+    I ^BSDXAPPT(APTID,1,1,0)'="New Note" W "Error in HL Section",! B
+"RTN","BSDX26",50,0)
+    I $P(^SC(2,"S",DATE,1,1,0),U,4)'="New Note" W "Error in HL Section",! B
+"RTN","BSDX26",51,0)
+    QUIT
+"RTN","BSDX26",52,0)
+    ;
+"RTN","BSDX26",53,0)
+EDITAPT(BSDXY,BSDXAPTID,BSDXNOTE)   ;EP Edit appointment (only note text can be edited)
+"RTN","BSDX26",54,0)
+    ; Called by RPC: BSDX EDIT APPOINTMENT
+"RTN","BSDX26",55,0)
+    ;
+"RTN","BSDX26",56,0)
+    ; Edits Appointment Text in BSDX APPOINTMENT file & Hosp Location (44) file
+"RTN","BSDX26",57,0)
+    ;
+"RTN","BSDX26",58,0)
+    ; Parameters:
+"RTN","BSDX26",59,0)
+    ; - BSDXY: Global Return (RPC must be set to Global Array)
+"RTN","BSDX26",60,0)
+    ; - BSDXAPTID: Appointment IEN in BSDX APPOINTMENT
+"RTN","BSDX26",61,0)
+    ; - BSDXNOTE: New note
+"RTN","BSDX26",62,0)
+    ;
+"RTN","BSDX26",63,0)
+    ; Return:
+"RTN","BSDX26",64,0)
+    ; ADO.net Recordset having 1 field: ERRORID
+"RTN","BSDX26",65,0)
+    ; If Okay: -1; otherwise, positive integer with message
+"RTN","BSDX26",66,0)
+    ;
+"RTN","BSDX26",67,0)
+    ; Return Array; set Return and clear array
+"RTN","BSDX26",68,0)
+    S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX26",69,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX26",70,0)
+    ; ET
+"RTN","BSDX26",71,0)
+    N $ET S $ET="G ETRAP^BSDX26"
+"RTN","BSDX26",72,0)
+    ; Set up basic DUZ variables
+"RTN","BSDX26",73,0)
+    D ^XBKVAR
+"RTN","BSDX26",74,0)
+    ; Counter
+"RTN","BSDX26",75,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX26",76,0)
+    ; Header Node
+"RTN","BSDX26",77,0)
+    S ^BSDXTMP($J,BSDXI)="T00100ERRORID"_$C(30)
+"RTN","BSDX26",78,0)
+    ; Restartable txn for GT.M. Restored vars are Params + BSDXI.
+"RTN","BSDX26",79,0)
+    TSTART (BSDXY,BSDXAPTID,BSDXNOTE,BSDXI):T="BSDX EDIT APPOINTMENT^BSDX26"
+"RTN","BSDX26",80,0)
+    ;
+"RTN","BSDX26",81,0)
+    ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX26",82,0)
+    I $G(bsdxdie) S X=1/0
+"RTN","BSDX26",83,0)
+    ;;;test
+"RTN","BSDX26",84,0)
+    ;;;test for TRESTART
+"RTN","BSDX26",85,0)
+    I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX26",86,0)
+    ;;;test
+"RTN","BSDX26",87,0)
+    ;
+"RTN","BSDX26",88,0)
+    ; Validate Appointment ID
+"RTN","BSDX26",89,0)
+    I '+BSDXAPTID D ERR(BSDXI,"-1~BSDX26: Invalid Appointment ID") QUIT
+"RTN","BSDX26",90,0)
+    I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(BSDXI,"-2~BSDX26: Invalid Appointment ID") QUIT
+"RTN","BSDX26",91,0)
+    ; Put the WP in decendant fields from the root to file as a WP field
+"RTN","BSDX26",92,0)
+    S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX26",93,0)
+    I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX26",94,0)
+    N BSDXMSG ; Message in case of error in filing.
+"RTN","BSDX26",95,0)
+    I $D(BSDXNOTE(.5)) D
+"RTN","BSDX26",96,0)
+    . D WP^DIE(9002018.4,BSDXAPTID_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX26",97,0)
+    I $D(BSDXMSG) D ERR(BSDXI,"-3~BSDX26: Fileman failure to file data into 9002018.4") QUIT
+"RTN","BSDX26",98,0)
+    ;
+"RTN","BSDX26",99,0)
+    ; Now file in file 44:
+"RTN","BSDX26",100,0)
+    N PTIEN S PTIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".05","I") ; Patient IEN
+"RTN","BSDX26",101,0)
+    N HLIEN S HLIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".07:.04","I") ; HL Location IEN pointed to by Resource ID
+"RTN","BSDX26",102,0)
+    N DATE S DATE=+^BSDXAPPT(BSDXAPTID,0) ; Date of APPT
+"RTN","BSDX26",103,0)
+    N BSDXRES S BSDXRES=0 ; Result
+"RTN","BSDX26",104,0)
+    ; Update Note only if we have a linked hospital location.
+"RTN","BSDX26",105,0)
+    I HLIEN S BSDXRES=$$UPDATENOTE^BSDXAPI(PTIEN,HLIEN,DATE,BSDXNOTE(.5))
+"RTN","BSDX26",106,0)
+    ; If we get an error (denoted by -1 in BSDXRES), return error to client
+"RTN","BSDX26",107,0)
+    I BSDXRES<0 D ERR(BSDXI,"-4~BSDX26: BSDXAPI reports an error: "_BSDXRES) QUIT
+"RTN","BSDX26",108,0)
+    ;Return Recordset
+"RTN","BSDX26",109,0)
+    TCOMMIT
+"RTN","BSDX26",110,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",111,0)
+    S ^BSDXTMP($J,BSDXI)="-1"_$C(30)
+"RTN","BSDX26",112,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",113,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX26",114,0)
+    QUIT
+"RTN","BSDX26",115,0)
+    ;
+"RTN","BSDX26",116,0)
+ERR(BSDXI,BSDXERR)  ;Error processing
+"RTN","BSDX26",117,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",118,0)
+    S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX26",119,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX26",120,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX26",121,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",122,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX26",123,0)
+    QUIT
+"RTN","BSDX26",124,0)
+    ;
+"RTN","BSDX26",125,0)
+ETRAP   ;EP Error trap entry
+"RTN","BSDX26",126,0)
+    N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+"RTN","BSDX26",127,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX26",128,0)
+    D ^%ZTER
+"RTN","BSDX26",129,0)
+    S $EC=""
+"RTN","BSDX26",130,0)
+    I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX26",131,0)
+    D ERR(BSDXI,"-100~BSDX26 Error: "_$G(%ZTERZE))
+"RTN","BSDX26",132,0)
+    Q
+"RTN","BSDX27")
+0^25^B133007616
+"RTN","BSDX27",1,0)
+BSDX27  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 4:52pm
+"RTN","BSDX27",2,0)
+    ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX27",3,0)
+    ; 
+"RTN","BSDX27",4,0)
+    ; Change Log: July 15, 2010
+"RTN","BSDX27",5,0)
+    ; UJO/SMH - i18n: FM Dates passed into routine for Clinic Letters - CLDISP ta
+"RTN","BSDX27",6,0)
+    ; v 1.42 - 3101208 - SMH
+"RTN","BSDX27",7,0)
+    ; - Added check to skip cancelled appointments. Check was forgotten
+"RTN","BSDX27",8,0)
+    ;   in original code.
+"RTN","BSDX27",9,0)
+    ;   . N BSDXFLAGS S BSDXFLAGS=$P(BSDXNOD,U,2)  ; No show and Cancel Flags
+"RTN","BSDX27",10,0)
+    ;   . Q:BSDXFLAGS["C"  ; if appt is cancelled, quit
+"RTN","BSDX27",11,0)
+    ;
+"RTN","BSDX27",12,0)
+    Q
+"RTN","BSDX27",13,0)
+    ;
+"RTN","BSDX27",14,0)
+PADISPD(BSDXY,BSDXPAT)  ;EP
+"RTN","BSDX27",15,0)
+    ;Entry point for debugging
+"RTN","BSDX27",16,0)
+    ;
+"RTN","BSDX27",17,0)
+    ;D DEBUG^%Serenji("PADISP^BSDX27(.BSDXY,BSDXPAT)")
+"RTN","BSDX27",18,0)
+    Q
+"RTN","BSDX27",19,0)
+    ;
+"RTN","BSDX27",20,0)
+PADISP(BSDXY,BSDXPAT)   ;EP
+"RTN","BSDX27",21,0)
+    ;Return recordset of patient appointments used in listing
+"RTN","BSDX27",22,0)
+    ;a patient's appointments and generating patient letters.
+"RTN","BSDX27",23,0)
+    ;Called by rpc BSDX PATIENT APPT DISPLAY
+"RTN","BSDX27",24,0)
+    ;
+"RTN","BSDX27",25,0)
+    ; Sam's Notes:
+"RTN","BSDX27",26,0)
+    ; Relatively complex algorithm.
+"RTN","BSDX27",27,0)
+    ; 1. First, loop through ^DPT(DA,"S", and get all appointments. 
+"RTN","BSDX27",28,0)
+    ;   Exclude cancelled appts. Store in BSDXDPT array.
+"RTN","BSDX27",29,0)
+    ; 2. Go through ^BSDXAPPT("CPAT", (patient index) . 
+"RTN","BSDX27",30,0)
+    ;   Get the info from there and compar with BSDXDPT array. If 
+"RTN","BSDX27",31,0)
+    ;   they are the same, get all info, and rm entry from BSDXDPT array.
+"RTN","BSDX27",32,0)
+    ; 3. If there are any remaining entries in BSDXDPT (PIMS leftovers),
+"RTN","BSDX27",33,0)
+    ;   Get the data from file 2 and 44.
+"RTN","BSDX27",34,0)
+    ;
+"RTN","BSDX27",35,0)
+    N BSDXI,BSDXIEN,BSDXNOD,BSDXNAM,BSDXDOB,BSDXHRN,BSDXSEX,BSDXCNID,BSDXCNOD,BSDXMADE,BSDXCLRK,BSDXNOT,BSDXQ
+"RTN","BSDX27",36,0)
+    N BSDXSTRT
+"RTN","BSDX27",37,0)
+    N BSDXSTRE,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX27",38,0)
+    S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX27",39,0)
+    S BSDXI=0
+"RTN","BSDX27",40,0)
+    S ^BSDXTMP($J,BSDXI)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030ApptDate^T00030Clinic^T00030TypeStatus"
+"RTN","BSDX27",41,0)
+    S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE"_$C(30)
+"RTN","BSDX27",42,0)
+    S X="ERROR^BSDX27",@^%ZOSF("TRAP")
+"RTN","BSDX27",43,0)
+    ;Get patient info
+"RTN","BSDX27",44,0)
+    ;
+"RTN","BSDX27",45,0)
+    I '+BSDXPAT S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX27",46,0)
+    I '$D(^DPT(+BSDXPAT,0)) S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX27",47,0)
+    S BSDXNOD=$$PATINFO(BSDXPAT)
+"RTN","BSDX27",48,0)
+    S BSDXNAM=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX27",49,0)
+    S BSDXSEX=$P(BSDXNOD,U,2) ;SEX
+"RTN","BSDX27",50,0)
+    S BSDXDOB=$P(BSDXNOD,U,3) ;DOB
+"RTN","BSDX27",51,0)
+    S BSDXHRN=$P(BSDXNOD,U,4) ;Health Record Number for location DUZ(2)
+"RTN","BSDX27",52,0)
+    S BSDXSTRE=$P(BSDXNOD,U,5) ;Street
+"RTN","BSDX27",53,0)
+    S BSDXCITY=$P(BSDXNOD,U,6) ;City
+"RTN","BSDX27",54,0)
+    S BSDXST=$P(BSDXNOD,U,7) ;State
+"RTN","BSDX27",55,0)
+    S BSDXZIP=$P(BSDXNOD,U,8) ;zip
+"RTN","BSDX27",56,0)
+    S BSDXPHON=$P(BSDXNOD,U,9) ;homephone
+"RTN","BSDX27",57,0)
+    ;
+"RTN","BSDX27",58,0)
+    ;Organize ^DPT(BSDXPAT,"S," nodes
+"RTN","BSDX27",59,0)
+    ; into BSDXDPT(CLINIC,DATE)
+"RTN","BSDX27",60,0)
+    ;
+"RTN","BSDX27",61,0)
+    I $D(^DPT(BSDXPAT,"S")) S BSDXDT=0 F  S BSDXDT=$O(^DPT(BSDXPAT,"S",BSDXDT)) Q:'+BSDXDT  D
+"RTN","BSDX27",62,0)
+    . S BSDXNOD=$G(^DPT(BSDXPAT,"S",BSDXDT,0))
+"RTN","BSDX27",63,0)
+    . S BSDXCID=$P(BSDXNOD,U)
+"RTN","BSDX27",64,0)
+    . Q:'+BSDXCID
+"RTN","BSDX27",65,0)
+    . Q:'$D(^SC(BSDXCID,0))
+"RTN","BSDX27",66,0)
+    . N BSDXFLAGS S BSDXFLAGS=$P(BSDXNOD,U,2)  ; No show and Cancel Flags
+"RTN","BSDX27",67,0)
+    . Q:BSDXFLAGS["C"  ; if appt is cancelled, quit
+"RTN","BSDX27",68,0)
+    . S BSDXDPT(BSDXCID,BSDXDT)=BSDXNOD
+"RTN","BSDX27",69,0)
+    ;
+"RTN","BSDX27",70,0)
+    ;$O Through ^BSDX("CPAT",
+"RTN","BSDX27",71,0)
+    S BSDXIEN=0
+"RTN","BSDX27",72,0)
+    I $D(^BSDXAPPT("CPAT",BSDXPAT)) F  S BSDXIEN=$O(^BSDXAPPT("CPAT",BSDXPAT,BSDXIEN)) Q:'BSDXIEN  D
+"RTN","BSDX27",73,0)
+    . N BSDXNOD,BSDXAPT,BSDXCID,BSDXCNOD,BSDXCLN,BSDX44,BSDXDNOD,BSDXSTAT,BSDX,BSDXTYPE,BSDXLIN
+"RTN","BSDX27",74,0)
+    . S BSDXNOD=$G(^BSDXAPPT(BSDXIEN,0))
+"RTN","BSDX27",75,0)
+    . Q:BSDXNOD=""
+"RTN","BSDX27",76,0)
+    . Q:$P(BSDXNOD,U,12)]""  ;CANCELLED
+"RTN","BSDX27",77,0)
+    . S Y=$P(BSDXNOD,U)
+"RTN","BSDX27",78,0)
+    . Q:'+Y
+"RTN","BSDX27",79,0)
+    . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",80,0)
+    . S BSDXAPT=Y ;Appointment date time
+"RTN","BSDX27",81,0)
+    . S BSDXCLRK=$P(BSDXNOD,U,8) ;Appointment made by
+"RTN","BSDX27",82,0)
+    . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX27",83,0)
+    . S Y=$P(BSDXNOD,U,9) ;Date Appointment Made
+"RTN","BSDX27",84,0)
+    . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",85,0)
+    . S BSDXMADE=Y
+"RTN","BSDX27",86,0)
+    . ;NOTE
+"RTN","BSDX27",87,0)
+    . S BSDXNOT=""
+"RTN","BSDX27",88,0)
+    . I $D(^BSDXAPPT(BSDXIEN,1,0)) S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXIEN,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX27",89,0)
+    . . S BSDXLIN=$G(^BSDXAPPT(BSDXIEN,1,BSDXQ,0))
+"RTN","BSDX27",90,0)
+    . . S:(BSDXLIN'="")&($E(BSDXLIN,$L(BSDXLIN)-1,$L(BSDXLIN))'=" ") BSDXLIN=BSDXLIN_" "
+"RTN","BSDX27",91,0)
+    . . S BSDXNOT=BSDXNOT_BSDXLIN
+"RTN","BSDX27",92,0)
+    . ;Resource
+"RTN","BSDX27",93,0)
+    . S BSDXCID=$P(BSDXNOD,U,7) ;IEN of BSDX RESOURCE
+"RTN","BSDX27",94,0)
+    . Q:'+BSDXCID
+"RTN","BSDX27",95,0)
+    . Q:'$D(^BSDXRES(BSDXCID,0))
+"RTN","BSDX27",96,0)
+    . S BSDXCNOD=$G(^BSDXRES(BSDXCID,0)) ;BSDX RESOURCE node
+"RTN","BSDX27",97,0)
+    . Q:BSDXCNOD=""
+"RTN","BSDX27",98,0)
+    . S BSDXCLN=$P(BSDXCNOD,U) ;Text name of BSDX Resource
+"RTN","BSDX27",99,0)
+    . S BSDX44=$P(BSDXCNOD,U,4) ;File 44 pointer
+"RTN","BSDX27",100,0)
+    . ;If appt entry in ^DPT(PAT,"S" exists for this clinic, get the TYPE/STATUS info from
+"RTN","BSDX27",101,0)
+    . ;the BSDXDPT array and delete the BSDXDPT node
+"RTN","BSDX27",102,0)
+    . S BSDXTYPE=""
+"RTN","BSDX27",103,0)
+    . I +BSDX44,$D(BSDXDPT(BSDX44,$P(BSDXNOD,U))) D  ;BSDXNOD is the BSDX APPOINTMENT node
+"RTN","BSDX27",104,0)
+    . . S BSDXDNOD=BSDXDPT(BSDX44,$P(BSDXNOD,U)) ;BSDXDNOD is a copy of the ^DPT(PAT,"S" node
+"RTN","BSDX27",105,0)
+    . . S BSDXTYPE=$$STATUS(BSDXPAT,$P(BSDXNOD,U),BSDXDNOD) ;IHS/OIT/HMW 20050208 Added
+"RTN","BSDX27",106,0)
+    . . K BSDXDPT(BSDX44,$P(BSDXNOD,U))
+"RTN","BSDX27",107,0)
+    . S BSDXI=BSDXI+1
+"RTN","BSDX27",108,0)
+    . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXAPT_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_BSDXCID_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_$C(30)
+"RTN","BSDX27",109,0)
+    . Q
+"RTN","BSDX27",110,0)
+    ;
+"RTN","BSDX27",111,0)
+    ;Go through remaining BSDXDPT( entries
+"RTN","BSDX27",112,0)
+    I $D(BSDXDPT) S BSDX44=0 D
+"RTN","BSDX27",113,0)
+    . F  S BSDX44=$O(BSDXDPT(BSDX44)) Q:'+BSDX44  S BSDXDT=0 D
+"RTN","BSDX27",114,0)
+    . . F  S BSDXDT=$O(BSDXDPT(BSDX44,BSDXDT)) Q:'+BSDXDT  D
+"RTN","BSDX27",115,0)
+    . . . S BSDXDNOD=BSDXDPT(BSDX44,BSDXDT)
+"RTN","BSDX27",116,0)
+    . . . S Y=BSDXDT
+"RTN","BSDX27",117,0)
+    . . . Q:'+Y
+"RTN","BSDX27",118,0)
+    . . . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",119,0)
+    . . . S BSDXAPT=Y
+"RTN","BSDX27",120,0)
+    . . . S BSDXTYPE=$$STATUS(BSDXPAT,BSDXDT,BSDXDNOD) ;IHS/OIT/HMW 20050208 Added
+"RTN","BSDX27",121,0)
+    . . . S BSDXCLN=$P($G(^SC(BSDX44,0)),U)
+"RTN","BSDX27",122,0)
+    . . . S BSDXCLRK=$P(BSDXDNOD,U,18)
+"RTN","BSDX27",123,0)
+    . . . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX27",124,0)
+    . . . S Y=$P(BSDXDNOD,U,19)
+"RTN","BSDX27",125,0)
+    . . . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",126,0)
+    . . . S BSDXMADE=Y
+"RTN","BSDX27",127,0)
+    . . . S BSDXNOT=""
+"RTN","BSDX27",128,0)
+    . . . S BSDXI=BSDXI+1
+"RTN","BSDX27",129,0)
+    . . . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXAPT_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_$C(30)
+"RTN","BSDX27",130,0)
+    . . . K BSDXDPT(BSDX44,BSDXDT)
+"RTN","BSDX27",131,0)
+    ;
+"RTN","BSDX27",132,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",133,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX27",134,0)
+    Q
+"RTN","BSDX27",135,0)
+    ;
+"RTN","BSDX27",136,0)
+STATUS(PAT,DATE,NODE)   ; returns appt status
+"RTN","BSDX27",137,0)
+    ;IHS/OIT/HMW 20050208 Added from BSDDPA
+"RTN","BSDX27",138,0)
+    NEW TYP
+"RTN","BSDX27",139,0)
+    S TYP=$$APPTYP^BSDXAPI(PAT,DATE)    ;sched vs. walkin
+"RTN","BSDX27",140,0)
+    I $P(NODE,U,2)["C" Q TYP_" - CANCELLED"
+"RTN","BSDX27",141,0)
+    I $P(NODE,U,2)'="NT",$P(NODE,U,2)["N" Q TYP_" - NO SHOW"
+"RTN","BSDX27",142,0)
+    I $$CO^BSDXAPI(PAT,+NODE,DATE) Q TYP_" - CHECKED OUT"
+"RTN","BSDX27",143,0)
+    I $$CI^BSDXAPI(PAT,+NODE,DATE) Q TYP_" - CHECKED IN"
+"RTN","BSDX27",144,0)
+    Q TYP
+"RTN","BSDX27",145,0)
+    ;
+"RTN","BSDX27",146,0)
+ERROR   ;
+"RTN","BSDX27",147,0)
+    D ERR(BSDXI,"RPMS Error")
+"RTN","BSDX27",148,0)
+    Q
+"RTN","BSDX27",149,0)
+    ;
+"RTN","BSDX27",150,0)
+ERR(BSDXI,ERRNO,MSG)    ;Error processing
+"RTN","BSDX27",151,0)
+    S:'$D(BSDXI) BSDXI=999
+"RTN","BSDX27",152,0)
+    I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX27",153,0)
+    E  S BSDXERR=ERRNO
+"RTN","BSDX27",154,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",155,0)
+    S ^BSDXTMP($J,BSDXI)=MSG_"^^^^^^^^^^^^^^^"_$C(30)
+"RTN","BSDX27",156,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",157,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX27",158,0)
+    Q
+"RTN","BSDX27",159,0)
+PATINFO(BSDXPAT)    ;EP
+"RTN","BSDX27",160,0)
+    ;Intrisic Function returns NAME^SEX^DOB^HRN^STREET^CITY^STATE^ZIP^PHONE for patient ien BSDXPAT
+"RTN","BSDX27",161,0)
+    ;DOB is in external format
+"RTN","BSDX27",162,0)
+    ;HRN depends on existence of DUZ(2)
+"RTN","BSDX27",163,0)
+    ;
+"RTN","BSDX27",164,0)
+    N BSDXNOD,BSDXNAM,BSDXSEX,BSDXDOB,BSDXHRN,BSDXSTRT,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX27",165,0)
+    S BSDXNOD=^DPT(+BSDXPAT,0)
+"RTN","BSDX27",166,0)
+    S BSDXNAM=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX27",167,0)
+    S BSDXSEX=$P(BSDXNOD,U,2)
+"RTN","BSDX27",168,0)
+    S BSDXSEX=$S(BSDXSEX="F":"FEMALE",BSDXSEX="M":"MALE",1:"")
+"RTN","BSDX27",169,0)
+    S Y=$P(BSDXNOD,U,3) I Y]""  X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",170,0)
+    S BSDXDOB=Y ;DOB
+"RTN","BSDX27",171,0)
+    S BSDXHRN=""
+"RTN","BSDX27",172,0)
+    I $D(DUZ(2)) I DUZ(2)>0 S BSDXHRN=$P($G(^AUPNPAT(BSDXPAT,41,DUZ(2),0)),U,2) ;HRN
+"RTN","BSDX27",173,0)
+    ;
+"RTN","BSDX27",174,0)
+    S BSDXNOD=$G(^DPT(+BSDXPAT,.11))
+"RTN","BSDX27",175,0)
+    S (BSDXSTRT,BSDXCITY,BSDXST,BSDXZIP)=""
+"RTN","BSDX27",176,0)
+    I BSDXNOD]"" D
+"RTN","BSDX27",177,0)
+    . S BSDXSTRT=$E($P(BSDXNOD,U),1,50) ;STREET
+"RTN","BSDX27",178,0)
+    . S BSDXCITY=$P(BSDXNOD,U,4) ;CITY
+"RTN","BSDX27",179,0)
+    . S BSDXST=$P(BSDXNOD,U,5) ;STATE
+"RTN","BSDX27",180,0)
+    . I +BSDXST,$D(^DIC(5,+BSDXST,0)) S BSDXST=$P(^DIC(5,+BSDXST,0),U,2)
+"RTN","BSDX27",181,0)
+    . S BSDXZIP=$P(BSDXNOD,U,6) ;ZIP
+"RTN","BSDX27",182,0)
+    ;
+"RTN","BSDX27",183,0)
+    S BSDXNOD=$G(^DPT(+BSDXPAT,.13)) ;PHONE
+"RTN","BSDX27",184,0)
+    S BSDXPHON=$P(BSDXNOD,U)
+"RTN","BSDX27",185,0)
+    ;
+"RTN","BSDX27",186,0)
+    Q BSDXNAM_U_BSDXSEX_U_BSDXDOB_U_BSDXHRN_U_BSDXSTRT_U_BSDXCITY_U_BSDXST_U_BSDXZIP_U_BSDXPHON
+"RTN","BSDX27",187,0)
+    ;
+"RTN","BSDX27",188,0)
+CLDISPD(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX27",189,0)
+    ;Entry point for debugging
+"RTN","BSDX27",190,0)
+    ;
+"RTN","BSDX27",191,0)
+    ;D DEBUG^%Serenji("CLDISP^BSDX27(.BSDXY,BSDXCLST,BSDXBEG,BSDXEND)")
+"RTN","BSDX27",192,0)
+    Q
+"RTN","BSDX27",193,0)
+    ;
+"RTN","BSDX27",194,0)
+CLDISP(BSDXY,BSDXCLST,BSDXBEG,BSDXEND)  ;EP
+"RTN","BSDX27",195,0)
+    ;
+"RTN","BSDX27",196,0)
+    ;Return recordset of patient appointments
+"RTN","BSDX27",197,0)
+    ;between dates BSDXBEG and BSDXEND for each clinic in BSDXCLST.
+"RTN","BSDX27",198,0)
+    ;Used in listing a patient's appointments and generating patient letters.
+"RTN","BSDX27",199,0)
+    ;BSDXCLST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX27",200,0)
+    ;BSDXBEG and BSDXEND are in external date form.
+"RTN","BSDX27",201,0)
+    ;Called by BSDX CLINIC LETTERS
+"RTN","BSDX27",202,0)
+    ;
+"RTN","BSDX27",203,0)
+       ; July 10, 2010 -- to support i18n, we pass dates from client in
+"RTN","BSDX27",204,0)
+       ; locale-neutral Fileman format. No need to convert it.
+"RTN","BSDX27",205,0)
+    N BSDXI,BSDXNOD,BSDXNAM,BSDXDOB,BSDXHRN,BSDXSEX,BSDXCID,BSDXCNOD,BSDXDT
+"RTN","BSDX27",206,0)
+    N BSDXJ,BSDXAID,BSDXPAT,BSDXPNOD,BSDXCLN,BSDXCLRK,BSDXMADE,BSDXNOT,BSDXLIN
+"RTN","BSDX27",207,0)
+    N BSDXSTRT
+"RTN","BSDX27",208,0)
+    N BSDXSTRE,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX27",209,0)
+    S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX27",210,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX27",211,0)
+    S BSDXI=0
+"RTN","BSDX27",212,0)
+    S ^BSDXTMP($J,BSDXI)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030ApptDate^T00030Clinic^T00030TypeStatus"
+"RTN","BSDX27",213,0)
+    S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE"_$C(30)
+"RTN","BSDX27",214,0)
+    S X="ERROR^BSDX27",@^%ZOSF("TRAP")
+"RTN","BSDX27",215,0)
+    ;
+"RTN","BSDX27",216,0)
+    ;Convert beginning and ending dates
+"RTN","BSDX27",217,0)
+    ;
+"RTN","BSDX27",218,0)
+    S BSDXBEG=BSDXBEG-1,BSDXBEG=BSDXBEG_".9999"
+"RTN","BSDX27",219,0)
+    S BSDXEND=BSDXEND_".9999"
+"RTN","BSDX27",220,0)
+    I BSDXCLST="" D ERR(BSDXI,0,"Routine: BSDX27, Error: Null clinic list") Q
+"RTN","BSDX27",221,0)
+    ;
+"RTN","BSDX27",222,0)
+    ;For each clinic in BSDXCLST $O through ^BSDXAPPT("ARSRC",ResourceIEN,FMDate,ApptIEN)
+"RTN","BSDX27",223,0)
+    ;
+"RTN","BSDX27",224,0)
+    F BSDXJ=1:1:$L(BSDXCLST,"|")-1 S BSDXCID=$P(BSDXCLST,"|",BSDXJ) D
+"RTN","BSDX27",225,0)
+    . S BSDXCLN=$G(^BSDXRES(BSDXCID,0)) S BSDXCLN=$P(BSDXCLN,U) Q:BSDXCLN=""
+"RTN","BSDX27",226,0)
+    . S BSDXSTRT=BSDXBEG F  S BSDXSTRT=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT)) Q:'+BSDXSTRT  Q:BSDXSTRT>BSDXEND  D
+"RTN","BSDX27",227,0)
+    . . S BSDXAID=0 F  S BSDXAID=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT,BSDXAID)) Q:'+BSDXAID  D
+"RTN","BSDX27",228,0)
+    . . . S BSDXNOD=$G(^BSDXAPPT(BSDXAID,0))
+"RTN","BSDX27",229,0)
+    . . . Q:BSDXNOD=""
+"RTN","BSDX27",230,0)
+    . . . Q:$P(BSDXNOD,U,12)]""  ;CANCELLED
+"RTN","BSDX27",231,0)
+    . . . Q:$P(BSDXNOD,U,13)="y"  ;WALKIN
+"RTN","BSDX27",232,0)
+    . . . S Y=$P(BSDXNOD,U)
+"RTN","BSDX27",233,0)
+    . . . Q:'+Y
+"RTN","BSDX27",234,0)
+    . . . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",235,0)
+    . . . S BSDXAPT=Y ;Appointment date time
+"RTN","BSDX27",236,0)
+    . . . ;
+"RTN","BSDX27",237,0)
+    . . . ;NOTE
+"RTN","BSDX27",238,0)
+    . . . S BSDXNOT=""
+"RTN","BSDX27",239,0)
+    . . . I $D(^BSDXAPPT(BSDXAID,1,0)) S BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXAID,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX27",240,0)
+    . . . . S BSDXLIN=$G(^BSDXAPPT(BSDXAID,1,BSDXQ,0))
+"RTN","BSDX27",241,0)
+    . . . . S:(BSDXLIN'="")&($E(BSDXLIN,$L(BSDXLIN)-1,$L(BSDXLIN))'=" ") BSDXLIN=BSDXLIN_" "
+"RTN","BSDX27",242,0)
+    . . . . S BSDXNOT=BSDXNOT_BSDXLIN
+"RTN","BSDX27",243,0)
+    . . . ;
+"RTN","BSDX27",244,0)
+    . . . S BSDXPAT=$P(BSDXNOD,U,5)
+"RTN","BSDX27",245,0)
+    . . . S BSDXPNOD=$$PATINFO(BSDXPAT)
+"RTN","BSDX27",246,0)
+    . . . S BSDXNAM=$P(BSDXPNOD,U) ;NAME
+"RTN","BSDX27",247,0)
+    . . . S BSDXSEX=$P(BSDXPNOD,U,2) ;SEX
+"RTN","BSDX27",248,0)
+    . . . S BSDXDOB=$P(BSDXPNOD,U,3) ;DOB
+"RTN","BSDX27",249,0)
+    . . . S BSDXHRN=$P(BSDXPNOD,U,4) ;Health Record Number for location DUZ(2)
+"RTN","BSDX27",250,0)
+    . . . S BSDXSTRE=$P(BSDXPNOD,U,5) ;Street
+"RTN","BSDX27",251,0)
+    . . . S BSDXCITY=$P(BSDXPNOD,U,6) ;City
+"RTN","BSDX27",252,0)
+    . . . S BSDXST=$P(BSDXPNOD,U,7) ;State
+"RTN","BSDX27",253,0)
+    . . . S BSDXZIP=$P(BSDXPNOD,U,8) ;zip
+"RTN","BSDX27",254,0)
+    . . . S BSDXPHON=$P(BSDXPNOD,U,9) ;homephone
+"RTN","BSDX27",255,0)
+    . . . S BSDXTYPE="" ;Type/status doesn't exist for BSDX APPT clinics and it's not needed for clinic letters
+"RTN","BSDX27",256,0)
+    . . . S BSDXCLRK=$P(BSDXNOD,U,8)
+"RTN","BSDX27",257,0)
+    . . . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX27",258,0)
+    . . . S Y=$P(BSDXNOD,U,9)
+"RTN","BSDX27",259,0)
+    . . . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",260,0)
+    . . . S BSDXMADE=Y
+"RTN","BSDX27",261,0)
+    . . . S BSDXI=BSDXI+1
+"RTN","BSDX27",262,0)
+    . . . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXAPT_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_BSDXCID_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_$C(30)
+"RTN","BSDX27",263,0)
+    ;
+"RTN","BSDX27",264,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",265,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX27",266,0)
+    Q
+"RTN","BSDX28")
+0^26^B32389827
+"RTN","BSDX28",1,0)
+BSDX28 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/18/10 2:30pm
+"RTN","BSDX28",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX28",3,0)
+ ; 
+"RTN","BSDX28",4,0)
+    ; Change Log:
+"RTN","BSDX28",5,0)
+ ; HMW 3050721 Added test for inactivated record
+"RTN","BSDX28",6,0)
+    ; V1.3 WV/SMH 3100714 
+"RTN","BSDX28",7,0)
+    ; - add PID search
+"RTN","BSDX28",8,0)
+    ; - return PID instead of SSN (change header and logic)
+"RTN","BSDX28",9,0)
+    ; - Change Error trap to new style.
+"RTN","BSDX28",10,0)
+ ;
+"RTN","BSDX28",11,0)
+PTLOOKRS(BSDXY,BSDXP,BSDXC)  ;EP Patient Lookup
+"RTN","BSDX28",12,0)
+ ;
+"RTN","BSDX28",13,0)
+ ;Find up to BSDXC patients matching BSDXP*
+"RTN","BSDX28",14,0)
+ ;Supports DOB Lookup, Primary Long ID lookup
+"RTN","BSDX28",15,0)
+ ;
+"RTN","BSDX28",16,0)
+ N $ET S $ET="G ERROR^BSDX28"
+"RTN","BSDX28",17,0)
+    ; rm ctrl chars
+"RTN","BSDX28",18,0)
+ S BSDXP=$TR(BSDXP,$C(13),"")
+"RTN","BSDX28",19,0)
+ S BSDXP=$TR(BSDXP,$C(10),"")
+"RTN","BSDX28",20,0)
+ S BSDXP=$TR(BSDXP,$C(9),"")
+"RTN","BSDX28",21,0)
+    ; num of pts to find
+"RTN","BSDX28",22,0)
+ S:BSDXC="" BSDXC=10
+"RTN","BSDX28",23,0)
+ N BSDXHRN,BSDXZ,BSDXDLIM,BSDXRET,BSDXDPT,BSDXRET,BSDXIEN,BSDXFILE
+"RTN","BSDX28",24,0)
+ N BSDXIENS,BSDXFIELDS,BSDXFLAGS,BSDXVALUE,BSDXNUMBER,BSDXINDEXES,BSDXSCREEN
+"RTN","BSDX28",25,0)
+ N BSDXTARG,BSDXMSG,BSDXRSLT
+"RTN","BSDX28",26,0)
+ S BSDXDLIM="^"
+"RTN","BSDX28",27,0)
+ S BSDXRET="T00030NAME^T00030HRN^T00030PID^D00030DOB^T00030IEN"_$C(30)
+"RTN","BSDX28",28,0)
+ I '+$G(DUZ) S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",29,0)
+ I '$D(DUZ(2)) S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",30,0)
+ 
+"RTN","BSDX28",31,0)
+PID ;PID Lookup
+"RTN","BSDX28",32,0)
+    ; If this ID exists, go get it. If "UJOPID" index doesn't exist,
+"RTN","BSDX28",33,0)
+    ; won't work anyways.
+"RTN","BSDX28",34,0)
+    I $D(^DPT("UJOPID",BSDXP)) DO  SET BSDXY=BSDXRET_$C(31) QUIT
+"RTN","BSDX28",35,0)
+    . S BSDXIEN=$O(^DPT("UJOPID",BSDXP,""))
+"RTN","BSDX28",36,0)
+    . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",37,0)
+    . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",38,0)
+    . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",39,0)
+    . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",40,0)
+    . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",41,0)
+    . ; Inactivated Chart get an *
+"RTN","BSDX28",42,0)
+    . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q
+"RTN","BSDX28",43,0)
+    . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",44,0)
+    . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",45,0)
+    . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",46,0)
+    . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",47,0)
+    . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",48,0)
+    . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",49,0)
+ ;
+"RTN","BSDX28",50,0)
+DOB ;DOB Lookup
+"RTN","BSDX28",51,0)
+ I +DUZ(2),((BSDXP?1.2N1"/"1.2N1"/"1.4N)!(BSDXP?1.2N1" "1.2N1" "1.4N)!(BSDXP?1.2N1"-"1.2N1"-"1.4N)) D  S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",52,0)
+ . S X=BSDXP S %DT="P" D ^%DT S BSDXP=Y Q:'+Y
+"RTN","BSDX28",53,0)
+ . Q:'$D(^DPT("ADOB",BSDXP))
+"RTN","BSDX28",54,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^DPT("ADOB",BSDXP,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX28",55,0)
+ . . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",56,0)
+ . . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",57,0)
+ . . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",58,0)
+ . . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",59,0)
+ . . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",60,0)
+ . . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",61,0)
+ . . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",62,0)
+    . . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",63,0)
+ . . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",64,0)
+ . . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",65,0)
+ . . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",66,0)
+ . . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",67,0)
+ . . Q
+"RTN","BSDX28",68,0)
+ . Q
+"RTN","BSDX28",69,0)
+ ;
+"RTN","BSDX28",70,0)
+CHART 
+"RTN","BSDX28",71,0)
+    ;Chart# Lookup
+"RTN","BSDX28",72,0)
+ I +DUZ(2),BSDXP]"",$D(^AUPNPAT("D",BSDXP)) D  S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",73,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^AUPNPAT("D",BSDXP,BSDXIEN)) Q:'+BSDXIEN  I $D(^AUPNPAT("D",BSDXP,BSDXIEN,DUZ(2))) D  Q
+"RTN","BSDX28",74,0)
+ . . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",75,0)
+ . . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",76,0)
+ . . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",77,0)
+ . . S BSDXHRN=BSDXP ;CHART
+"RTN","BSDX28",78,0)
+ . . I $D(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),$P(^(0),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",79,0)
+ . . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",80,0)
+    . . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",81,0)
+ . . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",82,0)
+ . . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",83,0)
+ . . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",84,0)
+ . . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",85,0)
+ . . Q
+"RTN","BSDX28",86,0)
+ . Q
+"RTN","BSDX28",87,0)
+    ;
+"RTN","BSDX28",88,0)
+SSN ;SSN Lookup
+"RTN","BSDX28",89,0)
+ I (BSDXP?9N)!(BSDXP?3N1"-"2N1"-"4N),$D(^DPT("SSN",BSDXP)) D  S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",90,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^DPT("SSN",BSDXP,BSDXIEN)) Q:'+BSDXIEN  D  Q
+"RTN","BSDX28",91,0)
+ . . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",92,0)
+ . . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",93,0)
+ . . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",94,0)
+ . . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",95,0)
+ . . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",96,0)
+ . . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",97,0)
+ . . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",98,0)
+    . . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",99,0)
+ . . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",100,0)
+ . . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",101,0)
+ . . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",102,0)
+ . . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",103,0)
+ . . Q
+"RTN","BSDX28",104,0)
+ . Q
+"RTN","BSDX28",105,0)
+ ;
+"RTN","BSDX28",106,0)
+ S BSDXFILE=9000001
+"RTN","BSDX28",107,0)
+ S BSDXIENS=""
+"RTN","BSDX28",108,0)
+ S BSDXFIELDS=".01"
+"RTN","BSDX28",109,0)
+ S BSDXFLAGS="M"
+"RTN","BSDX28",110,0)
+ S BSDXVALUE=BSDXP
+"RTN","BSDX28",111,0)
+ S BSDXNUMBER=BSDXC
+"RTN","BSDX28",112,0)
+ S BSDXINDEXES=""
+"RTN","BSDX28",113,0)
+ S BSDXSCREEN=$S(+DUZ(2):"I $D(^AUPNPAT(Y,41,DUZ(2),0))",1:"")
+"RTN","BSDX28",114,0)
+ S BSDXIDEN=""
+"RTN","BSDX28",115,0)
+ S BSDXTARG="BSDXRSLT"
+"RTN","BSDX28",116,0)
+ S BSDXMSG=""
+"RTN","BSDX28",117,0)
+ D FIND^DIC(BSDXFILE,BSDXIENS,BSDXFIELDS,BSDXFLAGS,BSDXVALUE,BSDXNUMBER,BSDXINDEXES,BSDXSCREEN,BSDXIDEN,BSDXTARG,BSDXMSG)
+"RTN","BSDX28",118,0)
+ I '+$G(BSDXRSLT("DILIST",0)) S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",119,0)
+ N BSDXCNT S BSDXCNT=2
+"RTN","BSDX28",120,0)
+ F BSDXX=1:1:$P(BSDXRSLT("DILIST",0),U) D
+"RTN","BSDX28",121,0)
+ . S BSDXIEN=BSDXRSLT("DILIST",2,BSDXX)
+"RTN","BSDX28",122,0)
+ . S BSDXZ=BSDXRSLT("DILIST","ID",BSDXX,.01) ;NAME
+"RTN","BSDX28",123,0)
+ . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",124,0)
+ . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",125,0)
+ . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",126,0)
+ . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",127,0)
+ . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",128,0)
+    . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",129,0)
+ . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",130,0)
+ . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",131,0)
+ . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",132,0)
+ . S $P(BSDXRET,$C(30),BSDXCNT)=BSDXZ
+"RTN","BSDX28",133,0)
+ . S BSDXCNT=BSDXCNT+1
+"RTN","BSDX28",134,0)
+ . Q
+"RTN","BSDX28",135,0)
+ S BSDXY=BSDXRET_$C(30)_$C(31)
+"RTN","BSDX28",136,0)
+ Q
+"RTN","BSDX28",137,0)
+ ;
+"RTN","BSDX28",138,0)
+ERROR ;
+"RTN","BSDX28",139,0)
+ D ERR("RPMS Error")
+"RTN","BSDX28",140,0)
+ Q
+"RTN","BSDX28",141,0)
+ ;
+"RTN","BSDX28",142,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX28",143,0)
+ S BSDXRET="T00030NAME^T00030HRN^T00030SSN^D00030DOB^T00030IEN"_$C(30)_"^^^^"_$C(30)_$C(31)
+"RTN","BSDX28",144,0)
+ Q
+"RTN","BSDX29")
+0^27^B51424449
+"RTN","BSDX29",1,0)
+BSDX29 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:39pm
+"RTN","BSDX29",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX29",3,0)
+ ; 
+"RTN","BSDX29",4,0)
+ ; Change Log:
+"RTN","BSDX29",5,0)
+ ; v1.3 by WV/SMH on 3100713
+"RTN","BSDX29",6,0)
+ ; - Beginning and Ending dates passed as FM Dates
+"RTN","BSDX29",7,0)
+    ; v1.42 by WV/SMH on 3101023
+"RTN","BSDX29",8,0)
+    ; - Transaction moved; now restartable too.
+"RTN","BSDX29",9,0)
+    ; --> Thanks to Zach Gonzalez and Rick Marshall.
+"RTN","BSDX29",10,0)
+    ; - Refactoring of major portions of routine
+"RTN","BSDX29",11,0)
+ ;
+"RTN","BSDX29",12,0)
+BSDXCPD(BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX29",13,0)
+ ;Entry point for debugging
+"RTN","BSDX29",14,0)
+ ;
+"RTN","BSDX29",15,0)
+ D DEBUG^%Serenji("BSDXCP^BSDX29(.BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND)")
+"RTN","BSDX29",16,0)
+ Q
+"RTN","BSDX29",17,0)
+ ;
+"RTN","BSDX29",18,0)
+BSDXCP(BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX29",19,0)
+ ;Copy appointments from HOSPITAL LOCATION entry BSDX44 to BSDX RESOURCE entry BSDXRES
+"RTN","BSDX29",20,0)
+ ;Beginning with appointments on day BSDXBEG and ending on BSDXEND, inclusive
+"RTN","BSDX29",21,0)
+    ;Called by RPC: BSDX COPY APPOINTMENTS
+"RTN","BSDX29",22,0)
+ ;
+"RTN","BSDX29",23,0)
+    ; Parameters:
+"RTN","BSDX29",24,0)
+    ; - BSDXY: Global Return
+"RTN","BSDX29",25,0)
+    ; - BSDXRES: BSDX RESOURCE to copy appointments to
+"RTN","BSDX29",26,0)
+    ; - BSDX44: Hospital Location IEN to copy appointments from
+"RTN","BSDX29",27,0)
+    ; - BSDXBEG: Beginning Date in FM Format
+"RTN","BSDX29",28,0)
+    ; - BSDXEND: End Date in FM Format
+"RTN","BSDX29",29,0)
+    ;
+"RTN","BSDX29",30,0)
+ ;Returns ADO Recordset containing TASK_NUMBER and ERRORID
+"RTN","BSDX29",31,0)
+ ;
+"RTN","BSDX29",32,0)
+    ; Return Array
+"RTN","BSDX29",33,0)
+ S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX29",34,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX29",35,0)
+    ; $ET
+"RTN","BSDX29",36,0)
+    N $ET S $ET="G ETRAP^BSDX29"
+"RTN","BSDX29",37,0)
+ ; Counter
+"RTN","BSDX29",38,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX29",39,0)
+    ; Header Node
+"RTN","BSDX29",40,0)
+ S ^BSDXTMP($J,0)="T00010TASK_NUMBER^T00100ERRORID"_$C(30)
+"RTN","BSDX29",41,0)
+ ;
+"RTN","BSDX29",42,0)
+    ; Make dates inclusive; add 1 to FM dates
+"RTN","BSDX29",43,0)
+    S BSDXBEG=BSDXBEG-1
+"RTN","BSDX29",44,0)
+ S BSDXEND=BSDXEND+1
+"RTN","BSDX29",45,0)
+ ;
+"RTN","BSDX29",46,0)
+    ; Taskman variables
+"RTN","BSDX29",47,0)
+    N ZTSK,ZTRTN,ZTDTH,ZTDESC,ZTSAVE 
+"RTN","BSDX29",48,0)
+ ; Task Load
+"RTN","BSDX29",49,0)
+ S ZTRTN="ZTM^BSDX29",ZTDTH=$H,ZTDESC="COPY PATIENT APPTS"
+"RTN","BSDX29",50,0)
+ S ZTSAVE("BSDXBEG")="",ZTSAVE("BSDXEND")="",ZTSAVE("BSDX44")="",ZTSAVE("BSDXRES")=""
+"RTN","BSDX29",51,0)
+ D ^%ZTLOAD
+"RTN","BSDX29",52,0)
+ ; Set up return ADO.net dataset
+"RTN","BSDX29",53,0)
+ N BSDXST S BSDXST=$S($G(ZTSK)>0:"OK",1:"Unable to create task.")
+"RTN","BSDX29",54,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",55,0)
+ S ^BSDXTMP($J,BSDXI)=$G(ZTSK)_"^"_BSDXST_$C(30)_$C(31)
+"RTN","BSDX29",56,0)
+ QUIT
+"RTN","BSDX29",57,0)
+ ;
+"RTN","BSDX29",58,0)
+ZTMD ;EP - Debug entry point
+"RTN","BSDX29",59,0)
+ ;D DEBUG^%Serenji("ZTM^BSDX29")
+"RTN","BSDX29",60,0)
+ Q
+"RTN","BSDX29",61,0)
+ ;
+"RTN","BSDX29",62,0)
+ZTM ;EP - Taskman entry point
+"RTN","BSDX29",63,0)
+    ; Variables set up in ZTSAVE above
+"RTN","BSDX29",64,0)
+    ;
+"RTN","BSDX29",65,0)
+ Q:'$D(ZTSK)
+"RTN","BSDX29",66,0)
+    ; $ET
+"RTN","BSDX29",67,0)
+    N $ET S $ET="G ZTMERR^BSDX29"
+"RTN","BSDX29",68,0)
+ ; Txn
+"RTN","BSDX29",69,0)
+    TSTART (BSDXBEG,BSDXEND,BSDX44,BSDXRES):T="BSDX COPY APPOINTMENT^BSDX29"
+"RTN","BSDX29",70,0)
+ ;$O through ^SC(BSDX44,"S",
+"RTN","BSDX29",71,0)
+ N BSDXCNT S BSDXCNT=0  ; Count of Copied Appointments
+"RTN","BSDX29",72,0)
+    N BSDXQUIT S BSDXQUIT=0  ; Quit Flag to be retrieved from an external proc
+"RTN","BSDX29",73,0)
+ ; Set Count
+"RTN","BSDX29",74,0)
+    S ^BSDXTMP("BSDXCOPY",ZTSK)=BSDXCNT
+"RTN","BSDX29",75,0)
+ ; Loop through dates here.
+"RTN","BSDX29",76,0)
+    F  S BSDXBEG=$O(^SC(BSDX44,"S",BSDXBEG)) Q:'+BSDXBEG  Q:BSDXBEG>BSDXEND  Q:BSDXQUIT  D
+"RTN","BSDX29",77,0)
+    . ; Loop through Entries in each date in the subsubfile.
+"RTN","BSDX29",78,0)
+    . ; Quit if we are at the end or if a remote process requests a quit.
+"RTN","BSDX29",79,0)
+    . N BSDXIEN S BSDXIEN=0
+"RTN","BSDX29",80,0)
+ . F  S BSDXIEN=$O(^SC(BSDX44,"S",BSDXBEG,1,BSDXIEN)) Q:'+BSDXIEN  Q:BSDXQUIT  D
+"RTN","BSDX29",81,0)
+ . . N BSDXNOD S BSDXNOD=$G(^SC(BSDX44,"S",BSDXBEG,1,BSDXIEN,0)) ; Node
+"RTN","BSDX29",82,0)
+ . . Q:'+BSDXNOD  ; Quit if no node
+"RTN","BSDX29",83,0)
+ . . N BSDXCAN S BSDXCAN=$P(BSDXNOD,U,9) ; Cancel flag
+"RTN","BSDX29",84,0)
+ . . Q:BSDXCAN="C"  ; Quit if appt cancelled
+"RTN","BSDX29",85,0)
+    . . N BSDXPAT S BSDXPAT=$P(BSDXNOD,U) ; Patient
+"RTN","BSDX29",86,0)
+    . . N BSDXLEN S BSDXLEN=$P(BSDXNOD,U,2) ;duration in minutes
+"RTN","BSDX29",87,0)
+ . . N BSDXCLRK S BSDXCLRK=$P(BSDXNOD,U,6) ;appt made by (clerk)
+"RTN","BSDX29",88,0)
+ . . N BSDXMADE S BSDXMADE=$P(BSDXNOD,U,7) ;date appt made
+"RTN","BSDX29",89,0)
+ . . N BSDXNOTE S BSDXNOTE=$P(BSDXNOD,U,4) ;'OTHER' field contains note
+"RTN","BSDX29",90,0)
+ . . S BSDXCNT=BSDXCNT+$$XFER(BSDXRES,BSDXBEG,BSDXPAT,BSDXLEN,BSDXCLRK,BSDXMADE,BSDXNOTE)
+"RTN","BSDX29",91,0)
+ . . I +BSDXCNT,BSDXCNT#10=0 S ^BSDXTMP("BSDXCOPY",ZTSK)=BSDXCNT_" records copied." ;every 10th record
+"RTN","BSDX29",92,0)
+ . . I $D(^BSDXTMP("BSDXCOPY",ZTSK,"CANCEL")) S BSDXQUIT=1 ;Check for cancel flag
+"RTN","BSDX29",93,0)
+ . . Q
+"RTN","BSDX29",94,0)
+ . Q
+"RTN","BSDX29",95,0)
+ I 'BSDXQUIT TCOMMIT
+"RTN","BSDX29",96,0)
+ E  TROLLBACK
+"RTN","BSDX29",97,0)
+ S ^BSDXTMP("BSDXCOPY",ZTSK)=$S(BSDXQUIT:"Cancelled.  No records copied.",1:"Finished.  "_BSDXCNT_" records copied.")
+"RTN","BSDX29",98,0)
+ Q
+"RTN","BSDX29",99,0)
+ ;
+"RTN","BSDX29",100,0)
+ZTMERR ; For now, error from TM is only in trap; not returned to client.
+"RTN","BSDX29",101,0)
+ N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+"RTN","BSDX29",102,0)
+    ; Rollback before logging the error
+"RTN","BSDX29",103,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX29",104,0)
+ D ^%ZTER
+"RTN","BSDX29",105,0)
+    S $EC="" ; Clear Error
+"RTN","BSDX29",106,0)
+ QUIT
+"RTN","BSDX29",107,0)
+ ;
+"RTN","BSDX29",108,0)
+XFER(BSDXRES,BSDXBEG,BSDXPAT,BSDXLEN,BSDXCLRK,BSDXMADE,BSDXNOTE) ;EP
+"RTN","BSDX29",109,0)
+ ;
+"RTN","BSDX29",110,0)
+ ;Copy record to BSDX APPOINTMENT file
+"RTN","BSDX29",111,0)
+ ;Return 1 if record copied, otherwise 0
+"RTN","BSDX29",112,0)
+ ;
+"RTN","BSDX29",113,0)
+ ;$O Thru ^BSDXAPPT to determine if this appt already added
+"RTN","BSDX29",114,0)
+ N BSDXEND,BSDXIEN,BSDXFND,BSDXPAT2
+"RTN","BSDX29",115,0)
+ S BSDXIEN=0,BSDXFND=0
+"RTN","BSDX29",116,0)
+ F  S BSDXIEN=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXBEG,BSDXIEN)) Q:'+BSDXIEN  D  Q:BSDXFND
+"RTN","BSDX29",117,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXIEN,0))
+"RTN","BSDX29",118,0)
+ . Q:'+BSDXNOD
+"RTN","BSDX29",119,0)
+ . S BSDXPAT2=$P(BSDXNOD,U,5)
+"RTN","BSDX29",120,0)
+ . S BSDXFND=0
+"RTN","BSDX29",121,0)
+ . I BSDXPAT2=BSDXPAT S BSDXFND=1
+"RTN","BSDX29",122,0)
+ . Q
+"RTN","BSDX29",123,0)
+ Q:BSDXFND 0
+"RTN","BSDX29",124,0)
+ ;
+"RTN","BSDX29",125,0)
+ ;Add to BSDX APPOINTMENT
+"RTN","BSDX29",126,0)
+ S BSDXEND=BSDXBEG
+"RTN","BSDX29",127,0)
+ ;Calculate ending time from beginning time and duration.
+"RTN","BSDX29",128,0)
+ S BSDXEND=$$ADDMIN(BSDXBEG,BSDXLEN)
+"RTN","BSDX29",129,0)
+ S BSDXIENS="+1,"
+"RTN","BSDX29",130,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.01)=BSDXBEG
+"RTN","BSDX29",131,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.02)=BSDXEND
+"RTN","BSDX29",132,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.05)=BSDXPAT
+"RTN","BSDX29",133,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.07)=BSDXRES
+"RTN","BSDX29",134,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.08)=BSDXCLRK
+"RTN","BSDX29",135,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.09)=BSDXMADE
+"RTN","BSDX29",136,0)
+ ;
+"RTN","BSDX29",137,0)
+ K BSDXIEN
+"RTN","BSDX29",138,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX29",139,0)
+ S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX29",140,0)
+ I '+BSDXIEN Q 0
+"RTN","BSDX29",141,0)
+ ;
+"RTN","BSDX29",142,0)
+ ;Add WP field
+"RTN","BSDX29",143,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE="" D
+"RTN","BSDX29",144,0)
+ . D WP^DIE(9002018.4,BSDXIEN_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX29",145,0)
+ ;
+"RTN","BSDX29",146,0)
+ Q 1
+"RTN","BSDX29",147,0)
+ ;
+"RTN","BSDX29",148,0)
+ERR(BSDXI,BSDXCNT,BSDXERR) ;Error processing
+"RTN","BSDX29",149,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",150,0)
+    S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX29",151,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_BSDXERR_$C(30)
+"RTN","BSDX29",152,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",153,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX29",154,0)
+ Q
+"RTN","BSDX29",155,0)
+ ;
+"RTN","BSDX29",156,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX29",157,0)
+ ; No Txn here. So don't rollback anything
+"RTN","BSDX29",158,0)
+    N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+"RTN","BSDX29",159,0)
+    D ^%ZTER
+"RTN","BSDX29",160,0)
+    S $EC="" ; Clear error
+"RTN","BSDX29",161,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX29",162,0)
+ D ERR(BSDXI,$G(BSDXCNT),"~100~BSDX29, Error: "_$G(%ZTERZE))
+"RTN","BSDX29",163,0)
+ Q
+"RTN","BSDX29",164,0)
+ ;
+"RTN","BSDX29",165,0)
+CPSTAT(BSDXY,BSDXTSK) ;EP - Note: As of Dec 6 2010: Inactive Code
+"RTN","BSDX29",166,0)
+ ;Return status (copied record count) of tasked job having ZTSK=BSDXTSK
+"RTN","BSDX29",167,0)
+ ;
+"RTN","BSDX29",168,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX29",169,0)
+ N BSDXI,BSDXCNT
+"RTN","BSDX29",170,0)
+ S BSDXI=0
+"RTN","BSDX29",171,0)
+ S X="ETRAP^BSDX29",@^%ZOSF("TRAP")
+"RTN","BSDX29",172,0)
+ S ^BSDXTMP($J,0)="T00020RECORD_COUNT^T00020ERRORID"_$C(30)
+"RTN","BSDX29",173,0)
+ S BSDXCNT=$G(^BSDXTMP("BSDXCOPY",BSDXTSK))
+"RTN","BSDX29",174,0)
+ I BSDXCNT["Finished" K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",175,0)
+ I BSDXCNT["Cancelled" K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",176,0)
+ ;I $D(^BSDXTMP("BSDXCOPY",BSDXTSK,"CANCEL")) K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",177,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",178,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_"OK"_$C(30)_$C(31)
+"RTN","BSDX29",179,0)
+ Q
+"RTN","BSDX29",180,0)
+ ;
+"RTN","BSDX29",181,0)
+CPCANC(BSDXY,BSDXTSK) ;EP Note: As of Dec 6 2010: Inactive code.
+"RTN","BSDX29",182,0)
+ ;Signal tasked job having ZTSK=BSDXTSK to cancel
+"RTN","BSDX29",183,0)
+ ;Returns current record count of copy process
+"RTN","BSDX29",184,0)
+ ;
+"RTN","BSDX29",185,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX29",186,0)
+ N BSDXI,BSDXCNT
+"RTN","BSDX29",187,0)
+ S BSDXI=0
+"RTN","BSDX29",188,0)
+ S X="ETRAP^BSDX29",@^%ZOSF("TRAP")
+"RTN","BSDX29",189,0)
+ S ^BSDXTMP($J,0)="T00020RECORD_COUNT^T00020ERRORID"_$C(30)
+"RTN","BSDX29",190,0)
+ S BSDXCNT=$G(^BSDXTMP("BSDXCOPY",BSDXTSK))
+"RTN","BSDX29",191,0)
+ I BSDXCNT["FINISHED" K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",192,0)
+ E  S ^BSDXTMP("BSDXCOPY",BSDXTSK,"CANCEL")=""
+"RTN","BSDX29",193,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",194,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_"OK"_$C(30)_$C(31)
+"RTN","BSDX29",195,0)
+ Q
+"RTN","BSDX29",196,0)
+ ;
+"RTN","BSDX29",197,0)
+ADDMIN(BSDXSTRT,BSDXLEN) ;
+"RTN","BSDX29",198,0)
+ ;
+"RTN","BSDX29",199,0)
+ ;Add BSDXLEN minutes to time BSDXSTRT and return end time
+"RTN","BSDX29",200,0)
+ N BSDXEND,BSDXH,BSDXM,BSDXSTIM,BSDXETIM
+"RTN","BSDX29",201,0)
+ S BSDXEND=$P(BSDXSTRT,".")
+"RTN","BSDX29",202,0)
+ ;
+"RTN","BSDX29",203,0)
+ ;Convert start time to minutes past midnight
+"RTN","BSDX29",204,0)
+ S BSDXSTIM=$P(BSDXSTRT,".",2)
+"RTN","BSDX29",205,0)
+ S BSDXSTIM=BSDXSTIM_"0000"
+"RTN","BSDX29",206,0)
+ S BSDXSTIM=$E(BSDXSTIM,1,4)
+"RTN","BSDX29",207,0)
+ S BSDXH=$E(BSDXSTIM,1,2)
+"RTN","BSDX29",208,0)
+ S BSDXH=BSDXH*60
+"RTN","BSDX29",209,0)
+ S BSDXH=BSDXH+$E(BSDXSTIM,3,4)
+"RTN","BSDX29",210,0)
+ ;
+"RTN","BSDX29",211,0)
+ ;Add duration to find minutes past midnight of end time
+"RTN","BSDX29",212,0)
+ S BSDXETIM=BSDXH+BSDXLEN
+"RTN","BSDX29",213,0)
+ ;
+"RTN","BSDX29",214,0)
+ ;Convert back to a time
+"RTN","BSDX29",215,0)
+ S BSDXH=BSDXETIM\60
+"RTN","BSDX29",216,0)
+ S BSDXH="00"_BSDXH
+"RTN","BSDX29",217,0)
+ S BSDXH=$E(BSDXH,$L(BSDXH)-1,$L(BSDXH))
+"RTN","BSDX29",218,0)
+ S BSDXM=BSDXETIM#60
+"RTN","BSDX29",219,0)
+ S BSDXM="00"_BSDXM
+"RTN","BSDX29",220,0)
+ S BSDXM=$E(BSDXM,$L(BSDXM)-1,$L(BSDXM))
+"RTN","BSDX29",221,0)
+ S BSDXETIM=BSDXH_BSDXM
+"RTN","BSDX29",222,0)
+ I BSDXETIM>2400 S BSDXETIM=2400
+"RTN","BSDX29",223,0)
+ S $P(BSDXEND,".",2)=BSDXETIM
+"RTN","BSDX29",224,0)
+ Q BSDXEND
+"RTN","BSDX2E")
+0^^B27292304
+"RTN","BSDX2E",1,0)
+BSDX2E ;IHS/OIT/MJL - ENVIRONMENT CHECK FOR WINDOWS SCHEDULING [7/18/10 4:30pm]
+"RTN","BSDX2E",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX2E",3,0)
+ ;
+"RTN","BSDX2E",4,0)
+ S LINE="",$P(LINE,"*",81)=""
+"RTN","BSDX2E",5,0)
+ S XPDNOQUE="NO QUE"  ;NO QUEUING ALLOWED
+"RTN","BSDX2E",6,0)
+ S XPDABORT=0
+"RTN","BSDX2E",7,0)
+ I '$G(DUZ) D SORRY("DUZ UNDEFINED OR 0") Q
+"RTN","BSDX2E",8,0)
+ ;
+"RTN","BSDX2E",9,0)
+ I '$L($G(DUZ(0))) D SORRY("DUZ(0) UNDEFINED OR NULL") Q
+"RTN","BSDX2E",10,0)
+ ;
+"RTN","BSDX2E",11,0)
+ D HOME^%ZIS,DT^DICRW
+"RTN","BSDX2E",12,0)
+ S X=$P($G(^VA(200,DUZ,0)),U)
+"RTN","BSDX2E",13,0)
+ I $G(X)="" W !,$$C^XBFUNC("Who are you????") D SORRY("Unknown User") Q
+"RTN","BSDX2E",14,0)
+ ;
+"RTN","BSDX2E",15,0)
+VERSION ;
+"RTN","BSDX2E",16,0)
+ W !,$$C^XBFUNC("Hello, "_$P(X,",",2)_" "_$P(X,","))
+"RTN","BSDX2E",17,0)
+ W !!,$$C^XBFUNC("Checking Environment for Install of Version "_$P($T(+2),";",3)_" of "_$P($T(+2),";",4)_".")
+"RTN","BSDX2E",18,0)
+ ;
+"RTN","BSDX2E",19,0)
+ Q:'$$VERCHK("VA FILEMAN",22)
+"RTN","BSDX2E",20,0)
+ Q:'$$VERCHK("KERNEL",8)
+"RTN","BSDX2E",21,0)
+ Q:'$$VERCHK("XB",3)
+"RTN","BSDX2E",22,0)
+ ;Is the PIMS requirement present?
+"RTN","BSDX2E",23,0)
+ Q:'$$VERCHK("SD",5.3)
+"RTN","BSDX2E",24,0)
+ ; Q:'$$PATCHCK("PIMS*5.3*1003") D
+"RTN","BSDX2E",25,0)
+ Q:'$$VERCHK("BMX",2)
+"RTN","BSDX2E",26,0)
+ ;
+"RTN","BSDX2E",27,0)
+OTHER ;
+"RTN","BSDX2E",28,0)
+ ;Other checks
+"RTN","BSDX2E",29,0)
+ ;
+"RTN","BSDX2E",30,0)
+ENVOK ; If this is just an environ check, end here.
+"RTN","BSDX2E",31,0)
+ W !!,$$C^XBFUNC("ENVIRONMENT OK.")
+"RTN","BSDX2E",32,0)
+ ;
+"RTN","BSDX2E",33,0)
+ ; The following line prevents the "Disable Options..." and "Move
+"RTN","BSDX2E",34,0)
+ ; Routines..." questions from being asked during the install.
+"RTN","BSDX2E",35,0)
+ I $G(XPDENV)=1 S (XPDDIQ("XPZ1"),XPDDIQ("XPZ2"))=0
+"RTN","BSDX2E",36,0)
+ ;
+"RTN","BSDX2E",37,0)
+ ;
+"RTN","BSDX2E",38,0)
+ ;VERIFY BACKUPS HAVE BEEN DONE
+"RTN","BSDX2E",39,0)
+ ;W !!
+"RTN","BSDX2E",40,0)
+ ;S DIR(0)="Y"
+"RTN","BSDX2E",41,0)
+ ;S DIR("B")="NO"
+"RTN","BSDX2E",42,0)
+ ;S DIR("A")="Has a SUCCESSFUL system backup been performed??"
+"RTN","BSDX2E",43,0)
+ ;D ^DIR
+"RTN","BSDX2E",44,0)
+ ;I $D(DIRUT)!($G(Y)=0) S XPDABORT=1 S XPX="BACKUP" D SORRY Q
+"RTN","BSDX2E",45,0)
+ ;S ^TMP("BPCPRE",$J,"BACKUPS CONFIRMED BY "_DUZ)=$H
+"RTN","BSDX2E",46,0)
+ ;
+"RTN","BSDX2E",47,0)
+ Q
+"RTN","BSDX2E",48,0)
+ ;
+"RTN","BSDX2E",49,0)
+VERCHK(XPXPKG,XVRMIN) ;
+"RTN","BSDX2E",50,0)
+ S X=$$VERSION^XPDUTL(XPXPKG)
+"RTN","BSDX2E",51,0)
+ W !!,$$C^XBFUNC("Need at least "_XPXPKG_" "_XVRMIN_"....."_XPXPKG_" "_$S(X'="":X,1:"Is Not")_" Present")
+"RTN","BSDX2E",52,0)
+ I X<XVRMIN  D SORRY(XPXPKG_" "_XVRMIN_" Is Not Installed") Q 0
+"RTN","BSDX2E",53,0)
+ Q 1
+"RTN","BSDX2E",54,0)
+ ;
+"RTN","BSDX2E",55,0)
+PATCHCK(XPXPCH) ;
+"RTN","BSDX2E",56,0)
+ S X=$$PATCH^XPDUTL(XPXPCH)
+"RTN","BSDX2E",57,0)
+ W !!,$$C^XBFUNC("Need "_XPXPCH_"....."_XPXPCH_" "_$S(X:"Is",1:"Is Not")_" Present")
+"RTN","BSDX2E",58,0)
+ Q X
+"RTN","BSDX2E",59,0)
+ ;
+"RTN","BSDX2E",60,0)
+V0200 ;EP Version 1.3 PostInit
+"RTN","BSDX2E",61,0)
+ ;Add Protocol items to SDAM APPOINTMENT EVENTS protocol
+"RTN","BSDX2E",62,0)
+    ;Remove protocols known to cause problems from SDAM APPOINTMENT EVENTS
+"RTN","BSDX2E",63,0)
+ ;
+"RTN","BSDX2E",64,0)
+ N BSDXDA,BSDXFDA,BSDXDA1,BSDXSEQ,BSDXDAT,BSDXNOD,BSDXIEN,BSDXMSG
+"RTN","BSDX2E",65,0)
+    ;
+"RTN","BSDX2E",66,0)
+    ; 1st, add the BSDX event protocols
+"RTN","BSDX2E",67,0)
+    ; Get SDAM APPOINTMENT EVENTS IEN in 101
+"RTN","BSDX2E",68,0)
+ S BSDXDA=$O(^ORD(101,"B","SDAM APPOINTMENT EVENTS",0))
+"RTN","BSDX2E",69,0)
+ Q:'+BSDXDA
+"RTN","BSDX2E",70,0)
+    ; Add each of those protocols unless they already exist.
+"RTN","BSDX2E",71,0)
+ S BSDXDAT="BSDX ADD APPOINTMENT;10.2^BSDX CANCEL APPOINTMENT;10.4^BSDX CHECKIN APPOINTMENT;10.6^BSDX NOSHOW APPOINTMENT;10.8"
+"RTN","BSDX2E",72,0)
+    ; For each
+"RTN","BSDX2E",73,0)
+    F J=1:1:$L(BSDXDAT,U) D
+"RTN","BSDX2E",74,0)
+ . K BSDXIEN,BSDXMSG,BSDXFDA
+"RTN","BSDX2E",75,0)
+    . ; Get Item
+"RTN","BSDX2E",76,0)
+ . S BSDXNOD=$P(BSDXDAT,U,J)
+"RTN","BSDX2E",77,0)
+ . ; Get Item Name (BSDX ADD APPOINTMENT)
+"RTN","BSDX2E",78,0)
+    . S BSDXDA1=$P(BSDXNOD,";")
+"RTN","BSDX2E",79,0)
+    . ; Get Item Sequence (10.2)
+"RTN","BSDX2E",80,0)
+ . S BSDXSEQ=$P(BSDXNOD,";",2)
+"RTN","BSDX2E",81,0)
+    . ; Get Item Reference (Item is already in the protocol file)
+"RTN","BSDX2E",82,0)
+ . S BSDXDA1=$O(^ORD(101,"B",BSDXDA1,0))
+"RTN","BSDX2E",83,0)
+    . ; Quit if not found
+"RTN","BSDX2E",84,0)
+ . Q:'+BSDXDA1
+"RTN","BSDX2E",85,0)
+    . ; Quit if already exists in the SDAM protocol
+"RTN","BSDX2E",86,0)
+ . Q:$D(^ORD(101,BSDXDA,10,"B",BSDXDA1))
+"RTN","BSDX2E",87,0)
+    . ; Go ahead and save it.
+"RTN","BSDX2E",88,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",",".01")=BSDXDA1
+"RTN","BSDX2E",89,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",","3")=BSDXSEQ
+"RTN","BSDX2E",90,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX2E",91,0)
+    . ; Error message
+"RTN","BSDX2E",92,0)
+    . I $D(BSDXMSG) W $C(7),"Error: ",BSDXMSG("DIERR",1,"TEXT",1)
+"RTN","BSDX2E",93,0)
+    ;
+"RTN","BSDX2E",94,0)
+    ; Remove nassssty protocols ORU PATIENT MOVMT and DVBA C&P SCHD EVENT
+"RTN","BSDX2E",95,0)
+    ; SDAM APPOINTMENT EVENTS IENS for use in FIND1^DIC
+"RTN","BSDX2E",96,0)
+    N SDEVTIENS S SDEVTIENS=","_BSDXDA_","
+"RTN","BSDX2E",97,0)
+    ; Subfile entry for ORU...
+"RTN","BSDX2E",98,0)
+    N ORUIEN S ORUIEN=$$FIND1^DIC(101.01,SDEVTIENS,"","ORU PATIENT MOVMT")
+"RTN","BSDX2E",99,0)
+    ; Subfile entry for DVBA...
+"RTN","BSDX2E",100,0)
+    N DVBAIEN S DVBAIEN=$$FIND1^DIC(101.01,SDEVTIENS,"","DVBA C&P SCHD EVENT")
+"RTN","BSDX2E",101,0)
+    ; Deletion code
+"RTN","BSDX2E",102,0)
+    N BSDXFDA,BSDXMSG
+"RTN","BSDX2E",103,0)
+    S:ORUIEN>0 BSDXFDA(101.01,ORUIEN_SDEVTIENS,.01)="@"
+"RTN","BSDX2E",104,0)
+    S:DVBAIEN>0 BSDXFDA(101.01,DVBAIEN_SDEVTIENS,.01)="@"
+"RTN","BSDX2E",105,0)
+    D:$D(BSDXFDA) FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX2E",106,0)
+    ; If error
+"RTN","BSDX2E",107,0)
+    I $D(BSDXMSG) W $C(7),"Error: ",BSDXMSG("DIERR",1,"TEXT",1)
+"RTN","BSDX2E",108,0)
+ QUIT
+"RTN","BSDX2E",109,0)
+ ;
+"RTN","BSDX2E",110,0)
+SORRY(XPX) ;
+"RTN","BSDX2E",111,0)
+ K DIFQ
+"RTN","BSDX2E",112,0)
+ S XPDABORT=1
+"RTN","BSDX2E",113,0)
+ W !,$$C^XBFUNC($P($T(+2),";",3)_" of "_$P($T(+2),";",4)_" Cannot Be Installed!")
+"RTN","BSDX2E",114,0)
+ W !,$$C^XBFUNC("Reason: "_XPX_".")
+"RTN","BSDX2E",115,0)
+ W *7,!!!,$$C^XBFUNC("Sorry....something is wrong with your environment")
+"RTN","BSDX2E",116,0)
+ W !,$$C^XBFUNC("Aborting "_XPDNM_" install!")
+"RTN","BSDX2E",117,0)
+ W !,$$C^XBFUNC("Correct error and reinstall otherwise")
+"RTN","BSDX2E",118,0)
+ W !,$$C^XBFUNC("please print/capture this screen and notify")
+"RTN","BSDX2E",119,0)
+ W !,$$C^XBFUNC("technical support")
+"RTN","BSDX2E",120,0)
+ W !!,LINE
+"RTN","BSDX2E",121,0)
+ D BMES^XPDUTL("Sorry....something is wrong with your environment")
+"RTN","BSDX2E",122,0)
+ D BMES^XPDUTL("Enviroment ERROR "_$G(XPX))
+"RTN","BSDX2E",123,0)
+ D BMES^XPDUTL("Aborting "_XPDNM_" install!")
+"RTN","BSDX2E",124,0)
+ D BMES^XPDUTL("Correct error and reinstall otherwise")
+"RTN","BSDX2E",125,0)
+ D BMES^XPDUTL("please print/capture this screen and notify")
+"RTN","BSDX2E",126,0)
+ D BMES^XPDUTL("technical support")
+"RTN","BSDX2E",127,0)
+ Q
+"RTN","BSDX2E",128,0)
+ ;
+"RTN","BSDX30")
+0^28^B6616255
+"RTN","BSDX30",1,0)
+BSDX30 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; [ 09/12/2007  1:54 PM ]
+"RTN","BSDX30",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX30",3,0)
+ ;
+"RTN","BSDX30",4,0)
+ ;
+"RTN","BSDX30",5,0)
+SPACED(BSDXY,BSDXDIC,BSDXVAL) ;EP
+"RTN","BSDX30",6,0)
+ ;Entry point for debugging
+"RTN","BSDX30",7,0)
+ ;
+"RTN","BSDX30",8,0)
+ D DEBUG^%Serenji("SPACE^BSDX30(.BSDXY,BSDXDIC,BSDXVAL)")
+"RTN","BSDX30",9,0)
+ Q
+"RTN","BSDX30",10,0)
+ ;
+"RTN","BSDX30",11,0)
+SPACE(BSDXY,BSDXDIC,BSDXVAL) ;EP
+"RTN","BSDX30",12,0)
+ ;Update ^DISV with most recent lookup value BSDXVAL from file BSDXDIC
+"RTN","BSDX30",13,0)
+ ;BSDXDIC is the data global in the form GLOBAL(
+"RTN","BSDX30",14,0)
+ ;BSDXVAL is the entry number (IEN) in the file
+"RTN","BSDX30",15,0)
+ ;
+"RTN","BSDX30",16,0)
+ ;Return Status = 1 if success, 0 if fail
+"RTN","BSDX30",17,0)
+ ;
+"RTN","BSDX30",18,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX30",19,0)
+ N BSDX1,BSDXRES
+"RTN","BSDX30",20,0)
+ S BSDXI=0
+"RTN","BSDX30",21,0)
+ S X="ETRAP^BSDX30",@^%ZOSF("TRAP")
+"RTN","BSDX30",22,0)
+ I (BSDXDIC="")!('+$G(BSDXVAL)) D ERR(BSDXI+1,99) Q
+"RTN","BSDX30",23,0)
+ S BSDXDIC="^"_BSDXDIC
+"RTN","BSDX30",24,0)
+ S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30)
+"RTN","BSDX30",25,0)
+ ;Note:  Naked reference below is immediately preceded
+"RTN","BSDX30",26,0)
+ ;by the full global reference per SAC 2.2.2.8
+"RTN","BSDX30",27,0)
+ I $D(@(BSDXDIC_"BSDXVAL,0)")),'$D(^(-9)) D
+"RTN","BSDX30",28,0)
+ . S ^DISV(DUZ,BSDXDIC)=BSDXVAL
+"RTN","BSDX30",29,0)
+ . S BSDXRES=1
+"RTN","BSDX30",30,0)
+ E  S BSDXRES=0
+"RTN","BSDX30",31,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",32,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXRES_$C(30)_$C(31)
+"RTN","BSDX30",33,0)
+ Q
+"RTN","BSDX30",34,0)
+ ;
+"RTN","BSDX30",35,0)
+ERR(BSDXI,BSDXERR) ;Error processing
+"RTN","BSDX30",36,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",37,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX30",38,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",39,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX30",40,0)
+ Q
+"RTN","BSDX30",41,0)
+ ;
+"RTN","BSDX30",42,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX30",43,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX30",44,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",45,0)
+ D ERR(99,0)
+"RTN","BSDX30",46,0)
+ Q
+"RTN","BSDX30",47,0)
+ ;
+"RTN","BSDX30",48,0)
+EHRPTD(BSDXY,BSDXWID,BSDXDFN) ;
+"RTN","BSDX30",49,0)
+ ;
+"RTN","BSDX30",50,0)
+ D DEBUG^%Serenji("EHRPT^BSDX30(.BSDXY,BSDXWID,BSDXDFN)")
+"RTN","BSDX30",51,0)
+ Q
+"RTN","BSDX30",52,0)
+ ;
+"RTN","BSDX30",53,0)
+EHRPT(BSDXY,BSDXWID,BSDXDFN) ;
+"RTN","BSDX30",54,0)
+ ;
+"RTN","BSDX30",55,0)
+ ;Return Status = 1 if success, 0 if error
+"RTN","BSDX30",56,0)
+ ;
+"RTN","BSDX30",57,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX30",58,0)
+ N BSDX1,BSDXRES
+"RTN","BSDX30",59,0)
+ S BSDXI=0,BSDXRES=1
+"RTN","BSDX30",60,0)
+ S X="ETRAP^BSDX30",@^%ZOSF("TRAP")
+"RTN","BSDX30",61,0)
+ S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30)
+"RTN","BSDX30",62,0)
+ I '+BSDXDFN D ERR(BSDXI+1,0) Q
+"RTN","BSDX30",63,0)
+ ;
+"RTN","BSDX30",64,0)
+ D PEVENT(BSDXWID,BSDXDFN) ;Raise patient selected event
+"RTN","BSDX30",65,0)
+ ;
+"RTN","BSDX30",66,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",67,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXRES_$C(30)_$C(31)
+"RTN","BSDX30",68,0)
+ Q
+"RTN","BSDX30",69,0)
+ ;
+"RTN","BSDX30",70,0)
+PEVENT(BSDXWID,DFN) ;EP - Raise patient selection event to EHR
+"RTN","BSDX30",71,0)
+ ;
+"RTN","BSDX30",72,0)
+ ;Change patient context to patient DFN
+"RTN","BSDX30",73,0)
+ ;on all EHR client sessions associated with user DUZ
+"RTN","BSDX30",74,0)
+ ;and workstation BSDXWID.
+"RTN","BSDX30",75,0)
+ ;
+"RTN","BSDX30",76,0)
+ ;If BSDXWID is "", the context change is sent to
+"RTN","BSDX30",77,0)
+ ;all EHR client sessions belonging to user DUZ.
+"RTN","BSDX30",78,0)
+ ;
+"RTN","BSDX30",79,0)
+ Q:'$G(DUZ)
+"RTN","BSDX30",80,0)
+ ;N X
+"RTN","BSDX30",81,0)
+ ;S X="CIANBUTL" X ^%ZOSF("TEST") Q:'$T
+"RTN","BSDX30",82,0)
+ ;S X="CIANBEVT" X ^%ZOSF("TEST") Q:'$T
+"RTN","BSDX30",83,0)
+ N UID,BRET
+"RTN","BSDX30",84,0)
+ S BRET=0,UID=0
+"RTN","BSDX30",85,0)
+ F  S BRET=$$NXTUID^CIANBUTL(.UID,1) Q:'UID  D
+"RTN","BSDX30",86,0)
+ . Q:DUZ'=$$GETVAR^CIANBUTL("DUZ",,,UID)
+"RTN","BSDX30",87,0)
+ . I BSDXWID'="" Q:BSDXWID'=$TR($$GETVAR^CIANBUTL("WID",,,UID),"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
+"RTN","BSDX30",88,0)
+ . D QUEUE^CIANBEVT("CONTEXT.PATIENT",+DFN,UID)
+"RTN","BSDX30",89,0)
+ Q
+"RTN","BSDX31")
+0^29^B67823338
+"RTN","BSDX31",1,0)
+BSDX31  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:39pm
+"RTN","BSDX31",2,0)
+    ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX31",3,0)
+    ; Change Log:
+"RTN","BSDX31",4,0)
+    ; v1.42 Oct 23 2010 WV/SMH
+"RTN","BSDX31",5,0)
+    ; - Change transaction to restartable. Thanks to Zach Gonzalez
+"RTN","BSDX31",6,0)
+    ; --> and Rick Marshall for their help.
+"RTN","BSDX31",7,0)
+    ; v1.42 Dec 6 2010: Extensive refactoring
+"RTN","BSDX31",8,0)
+    ; 
+"RTN","BSDX31",9,0)
+    ; Error Reference:
+"RTN","BSDX31",10,0)
+    ; -1: zero or null Appt ID
+"RTN","BSDX31",11,0)
+    ; -2: Invalid APPT ID (doesn't exist in ^BSDXAPPT)
+"RTN","BSDX31",12,0)
+    ; -3: No-show flag is invalid
+"RTN","BSDX31",13,0)
+    ; -4: Filing of No-show in ^BSDXAPPT failed
+"RTN","BSDX31",14,0)
+    ; -5: Filing of No-show in ^DPT failed (BSDXAPI error)
+"RTN","BSDX31",15,0)
+    ; -100: M Error
+"RTN","BSDX31",16,0)
+    ;
+"RTN","BSDX31",17,0)
+    ;
+"RTN","BSDX31",18,0)
+NOSHOWD(BSDXY,BSDXAPTID,BSDXNS) ;EP
+"RTN","BSDX31",19,0)
+    ;Entry point for debugging
+"RTN","BSDX31",20,0)
+    ;
+"RTN","BSDX31",21,0)
+    D DEBUG^%Serenji("NOSHOW^BSDX31(.BSDXY,BSDXAPTID,BSDXNS)")
+"RTN","BSDX31",22,0)
+    Q
+"RTN","BSDX31",23,0)
+    ;
+"RTN","BSDX31",24,0)
+UT ; Unit Tests
+"RTN","BSDX31",25,0)
+    ; Test 1: Sanity Check
+"RTN","BSDX31",26,0)
+    N ZZZ ; Garbage return variable
+"RTN","BSDX31",27,0)
+    N DATE S DATE=$$NOW^XLFDT()
+"RTN","BSDX31",28,0)
+    S DATE=$E(DATE,1,12) ; Just get minutes b/c of HL file input transform
+"RTN","BSDX31",29,0)
+    D APPADD^BSDX07(.ZZZ,DATE,DATE+.0001,3,"Dr Office",30,"Old Note",1)
+"RTN","BSDX31",30,0)
+    N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX31",31,0)
+    D NOSHOW(.ZZZ,APPID,1)
+"RTN","BSDX31",32,0)
+    I $P(^BSDXAPPT(APPID,0),U,10)'=1 W "ERROR T1",! B
+"RTN","BSDX31",33,0)
+    I $P(^DPT(3,"S",DATE,0),U,2)'="N" W "ERROR T1",! B
+"RTN","BSDX31",34,0)
+    ; Test 2: Undo noshow
+"RTN","BSDX31",35,0)
+    D NOSHOW(.ZZZ,APPID,0)
+"RTN","BSDX31",36,0)
+    I $P(^BSDXAPPT(APPID,0),U,10)'="0" W "ERROR T2",! B
+"RTN","BSDX31",37,0)
+    I $P(^DPT(3,"S",DATE,0),U,2)'="" W "ERROR T2",! B
+"RTN","BSDX31",38,0)
+    ; Test 3: -1
+"RTN","BSDX31",39,0)
+    D NOSHOW(.ZZZ,"",0)
+"RTN","BSDX31",40,0)
+    I $P(^BSDXTMP($J,1),U)'=-1 W "ERROR T3",! B
+"RTN","BSDX31",41,0)
+    ; Test 4: -2
+"RTN","BSDX31",42,0)
+    D NOSHOW(.ZZZ,2938748233,0)
+"RTN","BSDX31",43,0)
+    I $P(^BSDXTMP($J,1),U)'=-2 W "ERROR T4",! B
+"RTN","BSDX31",44,0)
+    ; Test 5: -3
+"RTN","BSDX31",45,0)
+    D NOSHOW(.ZZZ,APPID,3)
+"RTN","BSDX31",46,0)
+    I $P(^BSDXTMP($J,1),U)'=-3 W "ERROR T5",! B
+"RTN","BSDX31",47,0)
+    ; Test 6: Mumps error (-100)
+"RTN","BSDX31",48,0)
+    s bsdxdie=1
+"RTN","BSDX31",49,0)
+    D NOSHOW(.ZZZ,APPID,1)
+"RTN","BSDX31",50,0)
+    I $P(^BSDXTMP($J,1),U)'=-100 W "ERROR T6",! B
+"RTN","BSDX31",51,0)
+    k bsdxdie
+"RTN","BSDX31",52,0)
+    ; Test 7: Restartable transaction
+"RTN","BSDX31",53,0)
+    s bsdxrestart=1
+"RTN","BSDX31",54,0)
+    D NOSHOW(.ZZZ,APPID,1)
+"RTN","BSDX31",55,0)
+    I $P(^BSDXAPPT(APPID,0),U,10)'=1 W "ERROR T7",! B
+"RTN","BSDX31",56,0)
+    QUIT
+"RTN","BSDX31",57,0)
+NOSHOW(BSDXY,BSDXAPTID,BSDXNS)         ;EP - No show a patient
+"RTN","BSDX31",58,0)
+    ; Called by RPC: BSDX NOSHOW
+"RTN","BSDX31",59,0)
+    ; Sets appointment noshow flag in BSDX APPOINTMENT file and "S" node in File 2
+"RTN","BSDX31",60,0)
+    ;
+"RTN","BSDX31",61,0)
+    ; Parameters:
+"RTN","BSDX31",62,0)
+    ; BSDXY: Global Return
+"RTN","BSDX31",63,0)
+    ; BSDXAPTID is entry number in BSDX APPOINTMENT file
+"RTN","BSDX31",64,0)
+    ; BSDXNS = 1: NOSHOW, 0: CANCEL NOSHO
+"RTN","BSDX31",65,0)
+    ; 
+"RTN","BSDX31",66,0)
+    ; Returns ADO.net record set with fields
+"RTN","BSDX31",67,0)
+    ; - ERRORID; ERRORTEXT
+"RTN","BSDX31",68,0)
+    ; ERRORID of 1 is okay
+"RTN","BSDX31",69,0)
+    ; Anything else is an error.
+"RTN","BSDX31",70,0)
+    ;
+"RTN","BSDX31",71,0)
+    ; Return Array; set and clear
+"RTN","BSDX31",72,0)
+    S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX31",73,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX31",74,0)
+    ; $ET
+"RTN","BSDX31",75,0)
+    N $ET S $ET="G ETRAP^BSDX31"
+"RTN","BSDX31",76,0)
+    ; Basline vars
+"RTN","BSDX31",77,0)
+    D ^XBKVAR  ; Set up baseline variables (DUZ, DUZ(2)) if they don't exist
+"RTN","BSDX31",78,0)
+    ; Counter
+"RTN","BSDX31",79,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX31",80,0)
+    ; Header Node
+"RTN","BSDX31",81,0)
+    S ^BSDXTMP($J,BSDXI)="I00100ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX31",82,0)
+    ; Begin transaction
+"RTN","BSDX31",83,0)
+    TSTART (BSDXI,BSDXY,BSDXAPTID,BSDXNS):T="BSDX NOSHOW CANCEL^BSDX29"
+"RTN","BSDX31",84,0)
+    ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX31",85,0)
+    I $G(bsdxdie) S X=1/0
+"RTN","BSDX31",86,0)
+    ;;;TEST
+"RTN","BSDX31",87,0)
+    ;;;test for TRESTART
+"RTN","BSDX31",88,0)
+    I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX31",89,0)
+    ;;;test
+"RTN","BSDX31",90,0)
+    ; Turn off SDAM APPT PROTOCOL BSDX Entries
+"RTN","BSDX31",91,0)
+    N BSDXNOEV S BSDXNOEV=1 ;Don't execute protocol
+"RTN","BSDX31",92,0)
+    ; Appointment ID check
+"RTN","BSDX31",93,0)
+    I '+BSDXAPTID D ERR(-1,"BSDX31: Invalid Appointment ID") Q
+"RTN","BSDX31",94,0)
+    I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(-2,"BSDX31: Invalid Appointment ID") Q
+"RTN","BSDX31",95,0)
+    ; Noshow value check - Must be 1 or 0
+"RTN","BSDX31",96,0)
+    S BSDXNS=+BSDXNS
+"RTN","BSDX31",97,0)
+    I BSDXNS'=1&(BSDXNS'=0) D ERR(-3,"BSDX31: Invalid No Show value") Q
+"RTN","BSDX31",98,0)
+    ; Get Some data
+"RTN","BSDX31",99,0)
+    N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPTID,0) ; Node
+"RTN","BSDX31",100,0)
+    N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) ; DFN
+"RTN","BSDX31",101,0)
+    N BSDXSTART S BSDXSTART=$P(BSDXNOD,U)  ; Start Date/Time
+"RTN","BSDX31",102,0)
+    ; Edit BSDX APPOINTMENT entry
+"RTN","BSDX31",103,0)
+    N BSDXMSG  ; 
+"RTN","BSDX31",104,0)
+    D BSDXNOS(BSDXAPTID,BSDXNS,.BSDXMSG)  ;Edit BSDX APPOINTMENT entry NOSHOW field 
+"RTN","BSDX31",105,0)
+    I $D(BSDXMSG("DIERR")) S BSDXMSG=$G(BSDXMSG("DIERR",1,"TEXT",1)) D ERR(-4,"BSDX31: "_BSDXMSG) Q
+"RTN","BSDX31",106,0)
+    ; Edit File 2 "S" node entry
+"RTN","BSDX31",107,0)
+    N BSDXZ,BSDXERR ; Error variables to control looping
+"RTN","BSDX31",108,0)
+    S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID
+"RTN","BSDX31",109,0)
+    ; If Resource ID exists, and HL exists (means that Resource is linked), No show in File 2
+"RTN","BSDX31",110,0)
+    I BSDXSC1]"",$D(^BSDXRES(BSDXSC1,0)) D  I $G(BSDXZ)]"" S BSDXERR="BSDX31: APNOSHO Returned: "_BSDXZ D ERR(-5,BSDXERR) Q
+"RTN","BSDX31",111,0)
+    . S BSDXNOD=^BSDXRES(BSDXSC1,0)
+"RTN","BSDX31",112,0)
+    . S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION
+"RTN","BSDX31",113,0)
+    . I BSDXSC1]"",$D(^SC(BSDXSC1,0)) D APNOSHO(.BSDXZ,BSDXSC1,BSDXPATID,BSDXSTART,BSDXNS)
+"RTN","BSDX31",114,0)
+    ;
+"RTN","BSDX31",115,0)
+    TCOMMIT
+"RTN","BSDX31",116,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",117,0)
+    S ^BSDXTMP($J,BSDXI)="1^"_$C(30) ; 1 means everything okay
+"RTN","BSDX31",118,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",119,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX31",120,0)
+    QUIT
+"RTN","BSDX31",121,0)
+    ;
+"RTN","BSDX31",122,0)
+APNOSHO(BSDXZ,BSDXSC1,BSDXDFN,BSDXSD,BSDXNS)            ;
+"RTN","BSDX31",123,0)
+    ; update file 2 info
+"RTN","BSDX31",124,0)
+    ;Set noshow for patient BSDXDFN in clinic BSDXSC1
+"RTN","BSDX31",125,0)
+    ;at time BSDXSD
+"RTN","BSDX31",126,0)
+    N BSDXC,%H,BSDXCDT,BSDXIEN
+"RTN","BSDX31",127,0)
+    N BSDXIENS,BSDXFDA,BSDXMSG
+"RTN","BSDX31",128,0)
+    S %H=$H D YMD^%DTC
+"RTN","BSDX31",129,0)
+    S BSDXCDT=X+%
+"RTN","BSDX31",130,0)
+    ;
+"RTN","BSDX31",131,0)
+    S BSDXIENS=BSDXSD_","_BSDXDFN_","
+"RTN","BSDX31",132,0)
+    I +BSDXNS D
+"RTN","BSDX31",133,0)
+    . S BSDXFDA(2.98,BSDXIENS,3)="N"
+"RTN","BSDX31",134,0)
+    . S BSDXFDA(2.98,BSDXIENS,14)=DUZ
+"RTN","BSDX31",135,0)
+    . S BSDXFDA(2.98,BSDXIENS,15)=BSDXCDT
+"RTN","BSDX31",136,0)
+    E  D
+"RTN","BSDX31",137,0)
+    . S BSDXFDA(2.98,BSDXIENS,3)=""
+"RTN","BSDX31",138,0)
+    . S BSDXFDA(2.98,BSDXIENS,14)=""
+"RTN","BSDX31",139,0)
+    . S BSDXFDA(2.98,BSDXIENS,15)=""
+"RTN","BSDX31",140,0)
+    K BSDXIEN
+"RTN","BSDX31",141,0)
+    D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX31",142,0)
+    S BSDXZ=$G(BSDXMSG("DIERR",1,"TEXT",1))
+"RTN","BSDX31",143,0)
+    Q
+"RTN","BSDX31",144,0)
+    ;
+"RTN","BSDX31",145,0)
+BSDXNOS(BSDXAPTID,BSDXNS,BSDXMSG)   ;
+"RTN","BSDX31",146,0)
+    ;
+"RTN","BSDX31",147,0)
+    N BSDXFDA,BSDXIENS
+"RTN","BSDX31",148,0)
+    S BSDXIENS=BSDXAPTID_","
+"RTN","BSDX31",149,0)
+    S BSDXFDA(9002018.4,BSDXIENS,.1)=BSDXNS ;NOSHOW
+"RTN","BSDX31",150,0)
+    D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX31",151,0)
+    QUIT
+"RTN","BSDX31",152,0)
+    ;
+"RTN","BSDX31",153,0)
+NOSEVT(BSDXPAT,BSDXSTART,BSDXSC)    ;EP Called by BSDX NOSHOW APPOINTMENT event
+"RTN","BSDX31",154,0)
+    ;when appointments NOSHOW via PIMS interface.
+"RTN","BSDX31",155,0)
+    ;Propagates NOSHOW to BSDXAPPT and raises refresh event to running GUI clients
+"RTN","BSDX31",156,0)
+    ;
+"RTN","BSDX31",157,0)
+    Q:+$G(BSDXNOEV)
+"RTN","BSDX31",158,0)
+    Q:'+$G(BSDXSC)
+"RTN","BSDX31",159,0)
+    Q:$G(SDATA("AFTER","STATUS"))["AUTO RE-BOOK"
+"RTN","BSDX31",160,0)
+    N BSDXSTAT,BSDXFOUND,BSDXRES
+"RTN","BSDX31",161,0)
+    S BSDXSTAT=1
+"RTN","BSDX31",162,0)
+    S:$G(SDATA("BEFORE","STATUS"))["NO-SHOW" BSDXSTAT=0
+"RTN","BSDX31",163,0)
+    S BSDXFOUND=0
+"RTN","BSDX31",164,0)
+    I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX31",165,0)
+    I BSDXFOUND D NOSEVT3(BSDXRES) Q
+"RTN","BSDX31",166,0)
+    I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX31",167,0)
+    I BSDXFOUND D NOSEVT3(BSDXRES)
+"RTN","BSDX31",168,0)
+    Q
+"RTN","BSDX31",169,0)
+    ;
+"RTN","BSDX31",170,0)
+NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT) ;
+"RTN","BSDX31",171,0)
+    ;Get appointment id in BSDXAPT
+"RTN","BSDX31",172,0)
+    ;If found, call BSDXNOS(BSDXAPPT) and return 1
+"RTN","BSDX31",173,0)
+    ;else return 0
+"RTN","BSDX31",174,0)
+    N BSDXFOUND,BSDXAPPT
+"RTN","BSDX31",175,0)
+    S BSDXFOUND=0
+"RTN","BSDX31",176,0)
+    Q:'+$G(BSDXRES) BSDXFOUND
+"RTN","BSDX31",177,0)
+    Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND
+"RTN","BSDX31",178,0)
+    S BSDXAPPT=0 F  S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT  D  Q:BSDXFOUND
+"RTN","BSDX31",179,0)
+    . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""
+"RTN","BSDX31",180,0)
+    . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q
+"RTN","BSDX31",181,0)
+    I BSDXFOUND,+$G(BSDXAPPT) D BSDXNOS(BSDXAPPT,BSDXSTAT)
+"RTN","BSDX31",182,0)
+    Q BSDXFOUND
+"RTN","BSDX31",183,0)
+    ;
+"RTN","BSDX31",184,0)
+NOSEVT3(BSDXRES)    ;
+"RTN","BSDX31",185,0)
+    ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX31",186,0)
+    ;
+"RTN","BSDX31",187,0)
+    N BSDXRESN
+"RTN","BSDX31",188,0)
+    S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX31",189,0)
+    Q:BSDXRESN=""
+"RTN","BSDX31",190,0)
+    S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX31",191,0)
+    D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX31",192,0)
+    Q
+"RTN","BSDX31",193,0)
+    ;
+"RTN","BSDX31",194,0)
+    ;
+"RTN","BSDX31",195,0)
+ERR(BSDXERID,ERRTXT)    ;Error processing
+"RTN","BSDX31",196,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",197,0)
+    S ERRTXT=$TR(ERRTXT,"^","~")
+"RTN","BSDX31",198,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX31",199,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX31",200,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",201,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX31",202,0)
+    QUIT
+"RTN","BSDX31",203,0)
+    ;
+"RTN","BSDX31",204,0)
+ETRAP   ;EP Error trap entry
+"RTN","BSDX31",205,0)
+    N $ET S $ET="D ^%ZTER HALT"  ; Emergency Error Trap
+"RTN","BSDX31",206,0)
+    ; Rollback, otherwise ^XTER will be empty from future rollback
+"RTN","BSDX31",207,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX31",208,0)
+    D ^%ZTER
+"RTN","BSDX31",209,0)
+    S $EC="" ; Clear Error
+"RTN","BSDX31",210,0)
+    ; Send to client
+"RTN","BSDX31",211,0)
+    I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX31",212,0)
+    D ERR(-100,"BSDX31 Error: "_$G(%ZTERZE))
+"RTN","BSDX31",213,0)
+    QUIT
+"RTN","BSDX31",214,0)
+    ;
+"RTN","BSDX31",215,0)
+IMHERE(BSDXRES) ;EP
+"RTN","BSDX31",216,0)
+    ;Entry point for BSDX IM HERE remote procedure
+"RTN","BSDX31",217,0)
+    S BSDXRES=1
+"RTN","BSDX31",218,0)
+    Q
+"RTN","BSDX31",219,0)
+    ;
+"RTN","BSDX32")
+0^30^B17196738
+"RTN","BSDX32",1,0)
+BSDX32 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 9/29/10 10:21am
+"RTN","BSDX32",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX32",3,0)
+ ;
+"RTN","BSDX32",4,0)
+ ;
+"RTN","BSDX32",5,0)
+ERROR ;
+"RTN","BSDX32",6,0)
+ D ERR("RPMS Error")
+"RTN","BSDX32",7,0)
+ Q
+"RTN","BSDX32",8,0)
+ ;
+"RTN","BSDX32",9,0)
+ERR(BSDXERR) ;Error processing
+"RTN","BSDX32",10,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX32",11,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX32",12,0)
+ Q
+"RTN","BSDX32",13,0)
+ ;
+"RTN","BSDX32",14,0)
+HOSPLOCD(BSDXY) ;EP Debugging entry point
+"RTN","BSDX32",15,0)
+ ;
+"RTN","BSDX32",16,0)
+ ;D DEBUG^%Serenji("HOSPLOC^BSDX32(.BSDXY)")
+"RTN","BSDX32",17,0)
+ ;
+"RTN","BSDX32",18,0)
+ Q
+"RTN","BSDX32",19,0)
+ ;
+"RTN","BSDX32",20,0)
+HOSPLOC(BSDXY) ;EP
+"RTN","BSDX32",21,0)
+ ;Called by BSDX HOSPITAL LOCATION
+"RTN","BSDX32",22,0)
+    ;Returns all hospital locations that are active 
+"RTN","BSDX32",23,0)
+ ;
+"RTN","BSDX32",24,0)
+ N BSDXI,BSDXIEN,BSDXNOD,BSDXNAM,BSDXINA,BSDXREA,BSDXSCOD
+"RTN","BSDX32",25,0)
+ D ^XBKVAR S X="ERROR^BSDX32",@^%ZOSF("TRAP")
+"RTN","BSDX32",26,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX32",27,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX32",28,0)
+ S BSDXI=0
+"RTN","BSDX32",29,0)
+ ;"SELECT BSDXIEN 'HOSPITAL_LOCATION_ID', NAME 'HOSPITAL_LOCATION', DEFAULT_PROVIDER, STOP_CODE_NUMBER, INACTIVATE_DATE, REACTIVATE_DATE FROM HOSPITAL_LOCATION";
+"RTN","BSDX32",30,0)
+ S ^BSDXTMP($J,BSDXI)="I00020HOSPITAL_LOCATION_ID^T00040HOSPITAL_LOCATION^T00030DEFAULT_PROVIDER^T00030STOP_CODE_NUMBER^D00020INACTIVATE_DATE^D00020REACTIVATE_DATE"_$C(30)
+"RTN","BSDX32",31,0)
+ ;
+"RTN","BSDX32",32,0)
+ S BSDXNAM="" F  S BSDXNAM=$O(^SC("B",BSDXNAM)) Q:BSDXNAM=""  D
+"RTN","BSDX32",33,0)
+ . S BSDXIEN=$O(^SC("B",BSDXNAM,0))
+"RTN","BSDX32",34,0)
+ . Q:'+BSDXIEN>0
+"RTN","BSDX32",35,0)
+ . Q:'$D(^SC(+BSDXIEN,0))
+"RTN","BSDX32",36,0)
+    . ;Q:'$$INDIV^BSDX01(+BSDXIEN)  ; if not in the same division, quit
+"RTN","BSDX32",37,0)
+ . S BSDXINA=$$GET1^DIQ(44,BSDXIEN_",",2505) ;INACTIVATE
+"RTN","BSDX32",38,0)
+ . S BSDXREA=$$GET1^DIQ(44,BSDXIEN_",",2506) ;REACTIVATE
+"RTN","BSDX32",39,0)
+ . I BSDXINA]""&(BSDXREA="") Q  ;Clinic is inactivated and has no reactivate date
+"RTN","BSDX32",40,0)
+ . S BSDXNOD=^SC(BSDXIEN,0)
+"RTN","BSDX32",41,0)
+ . S BSDXNAM=$P(BSDXNOD,U)
+"RTN","BSDX32",42,0)
+ . S BSDXSCOD=$$GET1^DIQ(44,BSDXIEN_",",8) ;STOP CODE
+"RTN","BSDX32",43,0)
+ . ;Calculate default provider
+"RTN","BSDX32",44,0)
+ . S BSDXPRV=""
+"RTN","BSDX32",45,0)
+ . I $D(^SC(BSDXIEN,"PR")) D
+"RTN","BSDX32",46,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^SC(BSDXIEN,"PR",BSDXIEN1)) Q:'+BSDXIEN1  Q:BSDXPRV]""  D
+"RTN","BSDX32",47,0)
+ . . . S BSDXNOD1=$G(^SC(BSDXIEN,"PR",BSDXIEN1,0))
+"RTN","BSDX32",48,0)
+ . . . S:$P(BSDXNOD1,U,2)="1" BSDXPRV=$$GET1^DIQ(200,$P(BSDXNOD1,U),.01)
+"RTN","BSDX32",49,0)
+ . . . Q
+"RTN","BSDX32",50,0)
+ . . Q
+"RTN","BSDX32",51,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX32",52,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXNAM_U_BSDXPRV_U_BSDXSCOD_U_BSDXINA_U_BSDXREA_$C(30)
+"RTN","BSDX32",53,0)
+ . Q
+"RTN","BSDX32",54,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX32",55,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX32",56,0)
+ Q
+"RTN","BSDX32",57,0)
+ ;
+"RTN","BSDX32",58,0)
+CLNSETD(BSDXY) ;EP Debugging entry point
+"RTN","BSDX32",59,0)
+ ;
+"RTN","BSDX32",60,0)
+ ;D DEBUG^%Serenji("CLNSET^BSDX32(.BSDXY)")
+"RTN","BSDX32",61,0)
+ ;
+"RTN","BSDX32",62,0)
+ Q
+"RTN","BSDX32",63,0)
+ ;
+"RTN","BSDX32",64,0)
+CLNSET(BSDXY) ;EP
+"RTN","BSDX32",65,0)
+ ;Called by BSDX CLINIC SETUP
+"RTN","BSDX32",66,0)
+ ;Returns CLINIC SETUP file entries for clinics which
+"RTN","BSDX32",67,0)
+ ;are active in ^SC
+"RTN","BSDX32",68,0)
+ N BSDXI,BSDXIEN,BSDXNOD,BSDXNAM,BSDXINA,BSDXREA
+"RTN","BSDX32",69,0)
+ N BSDXCRV,BSDXVSC,BSDXMULT,BSDXREQ,BSDXPCC
+"RTN","BSDX32",70,0)
+ D ^XBKVAR S X="ERROR^BSDX32",@^%ZOSF("TRAP")
+"RTN","BSDX32",71,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX32",72,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX32",73,0)
+ S BSDXI=0
+"RTN","BSDX32",74,0)
+ ;SELECT BMXIEN 'HOSPITAL_LOCATION_ID', CLINIC_NAME 'HOSPITAL_LOCATION', CREATE_VISIT_AT_CHECK-IN? 'CREATE_VISIT', VISIT_SERVICE_CATEGORY,  MULTIPLE_CLINIC_CODES_USED?, VISIT_PROVIDER_REQUIRED,
+"RTN","BSDX32",75,0)
+ ;GENERATE_PCCPLUS_FORMS? FROM CLINIC_SETUP_PARAMETERS
+"RTN","BSDX32",76,0)
+ S ^BSDXTMP($J,BSDXI)="I00020HOSPITAL_LOCATION_ID^T00040HOSPITAL_LOCATION^T00030CREATE_VISIT^T00030VISIT_SERVICE_CATEGORY^T00030MULTIPLE_CLINIC_CODES_USED?^T00030VISIT_PROVIDER_REQUIRED^T00030GENERATE_PCCPLUS_FORMS?"_$C(30)
+"RTN","BSDX32",77,0)
+ ;
+"RTN","BSDX32",78,0)
+ S BSDXIEN=0 F  S BSDXIEN=$O(^BSDSC(BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX32",79,0)
+ . Q:'$D(^SC(+BSDXIEN,0))
+"RTN","BSDX32",80,0)
+ . Q:'$D(^BSDSC(+BSDXIEN,0))
+"RTN","BSDX32",81,0)
+ . S BSDXINA=$$GET1^DIQ(44,BSDXIEN_",",2505) ;INACTIVATE
+"RTN","BSDX32",82,0)
+ . S BSDXREA=$$GET1^DIQ(44,BSDXIEN_",",2506) ;REACTIVATE
+"RTN","BSDX32",83,0)
+ . I BSDXINA]""&(BSDXREA="") Q  ;Clinic is inactivated and has no reactivate date
+"RTN","BSDX32",84,0)
+ . S BSDXNOD=^BSDSC(BSDXIEN,0)
+"RTN","BSDX32",85,0)
+ . S BSDXNAM=$$GET1^DIQ(44,BSDXIEN_",",.01)
+"RTN","BSDX32",86,0)
+ . S BSDXCRV=$$GET1^DIQ(9009017.2,BSDXIEN_",",.09)
+"RTN","BSDX32",87,0)
+ . S BSDXVSC=$$GET1^DIQ(9009017.2,BSDXIEN_",",.12)
+"RTN","BSDX32",88,0)
+ . S BSDXMULT=$$GET1^DIQ(9009017.2,BSDXIEN_",",.13)
+"RTN","BSDX32",89,0)
+ . S BSDXREQ=$$GET1^DIQ(9009017.2,BSDXIEN_",",.14)
+"RTN","BSDX32",90,0)
+ . S BSDXPCC=$$GET1^DIQ(9009017.2,BSDXIEN_",",.15)
+"RTN","BSDX32",91,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX32",92,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXNAM_U_BSDXCRV_U_BSDXVSC_U_BSDXMULT_U_BSDXREQ_U_BSDXPCC_$C(30)
+"RTN","BSDX32",93,0)
+ . Q
+"RTN","BSDX32",94,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX32",95,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX32",96,0)
+ Q
+"RTN","BSDX33")
+0^31^B14923306
+"RTN","BSDX33",1,0)
+BSDX33 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 12:33pm
+"RTN","BSDX33",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX33",3,0)
+    ; Mods by WV/STAR
+"RTN","BSDX33",4,0)
+    ;
+"RTN","BSDX33",5,0)
+    ; Change Log:
+"RTN","BSDX33",6,0)
+    ; July 13, 2010
+"RTN","BSDX33",7,0)
+    ; v 1.3 adds fixes Rebooking behavior in application (see RBNEXT)
+"RTN","BSDX33",8,0)
+    ; also adds i18 support - Dates passed in FM format from application
+"RTN","BSDX33",9,0)
+    ; in tag SETRBK and RBNEXT
+"RTN","BSDX33",10,0)
+ ;
+"RTN","BSDX33",11,0)
+ ;
+"RTN","BSDX33",12,0)
+ Q
+"RTN","BSDX33",13,0)
+RBNEXTD(BSDXY,BSDXDATE,BSDXRES,BSDXTPID) ;EP
+"RTN","BSDX33",14,0)
+ ;Entry point for debugging
+"RTN","BSDX33",15,0)
+ ;
+"RTN","BSDX33",16,0)
+ ;D DEBUG^%Serenji("RBNEXT^BSDX33(.BSDXY,BSDXDATE,BSDXRES,BSDXTPID)")
+"RTN","BSDX33",17,0)
+ Q
+"RTN","BSDX33",18,0)
+ ;
+"RTN","BSDX33",19,0)
+RBNEXT(BSDXY,BSDXDATE,BSDXRES,BSDXTPID) ;EP
+"RTN","BSDX33",20,0)
+ ;Called by BSDX REBOOK NEXT BLOCK to find
+"RTN","BSDX33",21,0)
+ ;the next ACCESS BLOCK in resource BSDXRES after BSDXDATE
+"RTN","BSDX33",22,0)
+ ;Returns 1 in ERRORID and date in NEXTBLOCK if a block was found or NULL in NEXTBLOCK of no date found
+"RTN","BSDX33",23,0)
+ ;Otherwise, returns 0 and error message in ERRORTEXT
+"RTN","BSDX33",24,0)
+ ;If BSDXTPID = 0 then any access type match
+"RTN","BSDX33",25,0)
+ ;
+"RTN","BSDX33",26,0)
+ S X="ERROR2^BSDX33",@^%ZOSF("TRAP")
+"RTN","BSDX33",27,0)
+ N BSDXI,BSDXIENS,%DT,BSDXMSG,Y,BSDXRESD,BSDXFND,BSDXIEN,BSDXNOD,BSDXATID
+"RTN","BSDX33",28,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX33",29,0)
+ S BSDXI=0
+"RTN","BSDX33",30,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ERRORID^D00010NEXTBLOCK^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX33",31,0)
+ ;
+"RTN","BSDX33",32,0)
+ I BSDXRES="" D ERR2("BSDX REBOOK NEXT BLOCK: Invalid resource name") Q
+"RTN","BSDX33",33,0)
+ I '$D(^BSDXRES("B",BSDXRES)) D ERR2("BSDX REBOOK NEXT BLOCK: Invalid resource name") Q
+"RTN","BSDX33",34,0)
+ S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0))
+"RTN","BSDX33",35,0)
+ I '+BSDXRESD D ERR2("BSDX REBOOK NEXT BLOCK: Invalid resource name") Q
+"RTN","BSDX33",36,0)
+ ;
+"RTN","BSDX33",37,0)
+    ; i18n fix
+"RTN","BSDX33",38,0)
+    ; S X=BSDXDATE,%DT="XT" D ^%DT
+"RTN","BSDX33",39,0)
+ ; I Y=-1 D ERR2(1,"BSDX REBOOK NEXT BLOCK: Invalid datetime") Q
+"RTN","BSDX33",40,0)
+ ;
+"RTN","BSDX33",41,0)
+    ; S BSDXDATE=$P(Y,".")
+"RTN","BSDX33",42,0)
+ ;
+"RTN","BSDX33",43,0)
+ S BSDXFND=0
+"RTN","BSDX33",44,0)
+ F  S BSDXDATE=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXDATE)) Q:'+BSDXDATE  D  Q:BSDXFND
+"RTN","BSDX33",45,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXDATE,BSDXIEN)) Q:'+BSDXIEN  D  Q:BSDXFND
+"RTN","BSDX33",46,0)
+ . . Q:'$D(^BSDXAB(BSDXIEN,0))
+"RTN","BSDX33",47,0)
+ . . S BSDXNOD=^BSDXAB(BSDXIEN,0)
+"RTN","BSDX33",48,0)
+ . . Q:+$P(BSDXNOD,U,4)=0  ;Slots
+"RTN","BSDX33",49,0)
+ . . S BSDXATID=$P(BSDXNOD,U,5)
+"RTN","BSDX33",50,0)
+ . . I BSDXTPID=0!(BSDXATID=BSDXTPID) S BSDXFND=$P(BSDXNOD,U,2) Q
+"RTN","BSDX33",51,0)
+ ;
+"RTN","BSDX33",52,0)
+ I BSDXFND=0 S BSDXFND=""
+"RTN","BSDX33",53,0)
+ E  S Y=BSDXFND X ^DD("DD") S BSDXFND=Y
+"RTN","BSDX33",54,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",55,0)
+    ;//smh - bug (V 1.3): Need to replace @ in FM date for C# to recognize it
+"RTN","BSDX33",56,0)
+    S BSDXFND=$TR(BSDXFND,"@"," ")
+"RTN","BSDX33",57,0)
+    ;//smh end fix
+"RTN","BSDX33",58,0)
+ S ^BSDXTMP($J,BSDXI)="1^"_BSDXFND_"^"_$C(30)_$C(31)
+"RTN","BSDX33",59,0)
+ Q
+"RTN","BSDX33",60,0)
+SETRBKD(BSDXY,BSDXAPPT,BSDXDATE) ;EP
+"RTN","BSDX33",61,0)
+ ;Entry point for debugging
+"RTN","BSDX33",62,0)
+ ;
+"RTN","BSDX33",63,0)
+ ;D DEBUG^%Serenji("SETRBK^BSDX33(.BSDXY,BSDXAPPT,BSDXDATE)")
+"RTN","BSDX33",64,0)
+ Q
+"RTN","BSDX33",65,0)
+ ;
+"RTN","BSDX33",66,0)
+SETRBK(BSDXY,BSDXAPPT,BSDXDATE) ;EP
+"RTN","BSDX33",67,0)
+ ;
+"RTN","BSDX33",68,0)
+ ;Sets rebook date into appointment
+"RTN","BSDX33",69,0)
+ ;BSDXAPPT - Appointment ID
+"RTN","BSDX33",70,0)
+ ;BSDXDATE - Rebook Datetime in internal format
+"RTN","BSDX33",71,0)
+ ;Called by BSDX REBOOK SET
+"RTN","BSDX33",72,0)
+ ;
+"RTN","BSDX33",73,0)
+ ;ErrorID:
+"RTN","BSDX33",74,0)
+ ; 0 if a problem.  Message in ERRORTEXT
+"RTN","BSDX33",75,0)
+ ; 1 if OK
+"RTN","BSDX33",76,0)
+ ;
+"RTN","BSDX33",77,0)
+ S X="ERROR^BSDX33",@^%ZOSF("TRAP")
+"RTN","BSDX33",78,0)
+ N BSDXI,BSDXIENS,%DT,BSDXMSG,Y
+"RTN","BSDX33",79,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX33",80,0)
+ S BSDXI=0
+"RTN","BSDX33",81,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX33",82,0)
+ ;
+"RTN","BSDX33",83,0)
+ I '+BSDXAPPT
+"RTN","BSDX33",84,0)
+ I '$D(^BSDXAPPT(BSDXAPPT,0)) D ERR(1,"BSDX REBOOK SET: Invalid appointment ID") Q
+"RTN","BSDX33",85,0)
+ ; i18n (v 1.3)
+"RTN","BSDX33",86,0)
+    ;S X=BSDXDATE,%DT="XT" D ^%DT
+"RTN","BSDX33",87,0)
+ ;I Y=-1 D ERR(1,"BSDX REBOOK SET: Invalid rebook datetime") Q
+"RTN","BSDX33",88,0)
+ ;S BSDXDATE=Y
+"RTN","BSDX33",89,0)
+ S BSDXIENS=BSDXAPPT_","
+"RTN","BSDX33",90,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.11)=+BSDXDATE
+"RTN","BSDX33",91,0)
+ ;
+"RTN","BSDX33",92,0)
+ K BSDXMSG
+"RTN","BSDX33",93,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX33",94,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",95,0)
+ S ^BSDXTMP($J,BSDXI)="1^"_$C(31)
+"RTN","BSDX33",96,0)
+ ;
+"RTN","BSDX33",97,0)
+ Q
+"RTN","BSDX33",98,0)
+ ;
+"RTN","BSDX33",99,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX33",100,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX33",101,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",102,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX33",103,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",104,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX33",105,0)
+ Q
+"RTN","BSDX33",106,0)
+ ;
+"RTN","BSDX33",107,0)
+ERROR ;
+"RTN","BSDX33",108,0)
+ D ^%ZTER
+"RTN","BSDX33",109,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX33",110,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",111,0)
+ D ERR(0,"BSDX33 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX33",112,0)
+ Q
+"RTN","BSDX33",113,0)
+ ;
+"RTN","BSDX33",114,0)
+ERR2(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX33",115,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX33",116,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",117,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^^"_ERRTXT_$C(30)
+"RTN","BSDX33",118,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",119,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX33",120,0)
+ Q
+"RTN","BSDX33",121,0)
+ ;
+"RTN","BSDX33",122,0)
+ERROR2 ;
+"RTN","BSDX33",123,0)
+ D ^%ZTER
+"RTN","BSDX33",124,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX33",125,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",126,0)
+ D ERR2(0,"BSDX33 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX33",127,0)
+ Q
+"RTN","BSDX34")
+0^32^B43182525
+"RTN","BSDX34",1,0)
+BSDX34 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 12:37pm
+"RTN","BSDX34",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX34",3,0)
+    ;
+"RTN","BSDX34",4,0)
+    ; Change Log:
+"RTN","BSDX34",5,0)
+    ; July 10 2010: 
+"RTN","BSDX34",6,0)
+ ; CANCLIN AND RBCLIN: Dates passed in FM format for i18n
+"RTN","BSDX34",7,0)
+ ;
+"RTN","BSDX34",8,0)
+ Q
+"RTN","BSDX34",9,0)
+ ;
+"RTN","BSDX34",10,0)
+RBCLIND(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX34",11,0)
+ ;Entry point for debugging
+"RTN","BSDX34",12,0)
+ ;
+"RTN","BSDX34",13,0)
+ ;D DEBUG^%Serenji("RBCLIN^BSDX34(.BSDXY,BSDXCLST,BSDXBEG,BSDXEND)")
+"RTN","BSDX34",14,0)
+ Q
+"RTN","BSDX34",15,0)
+ ;
+"RTN","BSDX34",16,0)
+RBERR ;
+"RTN","BSDX34",17,0)
+ ;Called from RBCLIN on error to set up header
+"RTN","BSDX34",18,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX34",19,0)
+ S ^BSDXTMP($J,0)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030NewApptDate^T00030Clinic^T00030TypeStatus^I00010RESOURCEID"
+"RTN","BSDX34",20,0)
+ S ^BSDXTMP($J,0)=^(0)_"^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE^D00030OldApptDate"_$C(30)
+"RTN","BSDX34",21,0)
+ D ERR(999)
+"RTN","BSDX34",22,0)
+ Q
+"RTN","BSDX34",23,0)
+ ;
+"RTN","BSDX34",24,0)
+CANCLIN(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX34",25,0)
+ ;
+"RTN","BSDX34",26,0)
+ ;Return recordset of CANCELLED patient appointments
+"RTN","BSDX34",27,0)
+ ;between dates BSDXBEG and BSDXEND for each clinic in BSDXCLST.
+"RTN","BSDX34",28,0)
+ ;Used in generating cancellation letters for a clinic
+"RTN","BSDX34",29,0)
+ ;BSDXCLST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX34",30,0)
+    ;v 1.3 BSDXBEG and BSDXEND are in fm format
+"RTN","BSDX34",31,0)
+ ;Called by BSDX CANCEL CLINIC LIST
+"RTN","BSDX34",32,0)
+ N BSDXCAN
+"RTN","BSDX34",33,0)
+ S BSDXCAN=1
+"RTN","BSDX34",34,0)
+ D RBCLIN(.BSDXY,BSDXCLST,BSDXBEG,BSDXEND)
+"RTN","BSDX34",35,0)
+ ;
+"RTN","BSDX34",36,0)
+ Q
+"RTN","BSDX34",37,0)
+ ;
+"RTN","BSDX34",38,0)
+RBCLIN(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX34",39,0)
+ ;
+"RTN","BSDX34",40,0)
+ ;Return recordset of rebooked patient appointments
+"RTN","BSDX34",41,0)
+ ;between dates BSDXBEG and BSDXEND for each clinic in BSDXCLST.
+"RTN","BSDX34",42,0)
+ ;Used in generating rebook letters for a clinic
+"RTN","BSDX34",43,0)
+ ;BSDXCLST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX34",44,0)
+ ;Called by BSDX REBOOK CLINIC LIST and BSDX CANCEL CLINIC LIST via entry point CANCLIN above
+"RTN","BSDX34",45,0)
+ ;Jul 11 2010 (smh):
+"RTN","BSDX34",46,0)
+    ;for i18n, pass BSDXBEG and BSDXEND in FM format.
+"RTN","BSDX34",47,0)
+ ;
+"RTN","BSDX34",48,0)
+ S X="RBERR^BSDX34",@^%ZOSF("TRAP")
+"RTN","BSDX34",49,0)
+ ;
+"RTN","BSDX34",50,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX34",51,0)
+ N %DT,Y,BSDXJ,BSDXCID,BSDXCLN,BSDXSTRT,BSDXAID,BSDXNOD,BSDXLIST,BSDX,BSDY
+"RTN","BSDX34",52,0)
+ ;Convert beginning and ending dates
+"RTN","BSDX34",53,0)
+ ;TODO: Validation of date to make sure it's a right FM Date
+"RTN","BSDX34",54,0)
+    S BSDXBEG=$P(BSDXBEG,".")
+"RTN","BSDX34",55,0)
+    S BSDXEND=$P(BSDXEND,".")
+"RTN","BSDX34",56,0)
+ S BSDXBEG=BSDXBEG-1,BSDXBEG=BSDXBEG_".9999"
+"RTN","BSDX34",57,0)
+ S BSDXEND=BSDXEND_".9999"
+"RTN","BSDX34",58,0)
+    ;
+"RTN","BSDX34",59,0)
+ I BSDXCLST="" D RBERR Q
+"RTN","BSDX34",60,0)
+ ;
+"RTN","BSDX34",61,0)
+ ;
+"RTN","BSDX34",62,0)
+ ;If BSDXCLST is a list of resource NAMES, look up each name and convert to IEN
+"RTN","BSDX34",63,0)
+ F BSDXJ=1:1:$L(BSDXCLST,"|")-1 S BSDX=$P(BSDXCLST,"|",BSDXJ) D  S $P(BSDXCLST,"|",BSDXJ)=BSDY
+"RTN","BSDX34",64,0)
+ . S BSDY=""
+"RTN","BSDX34",65,0)
+ . I BSDX]"",$D(^BSDXRES(BSDX,0)) S BSDY=BSDX Q
+"RTN","BSDX34",66,0)
+ . I BSDX]"",$D(^BSDXRES("B",BSDX)) S BSDY=$O(^BSDXRES("B",BSDX,0)) Q
+"RTN","BSDX34",67,0)
+ . Q
+"RTN","BSDX34",68,0)
+ ;
+"RTN","BSDX34",69,0)
+ ;For each clinic in BSDXCLST $O through ^BSDXAPPT("ARSRC",ResourceIEN,FMDate,ApptIEN)
+"RTN","BSDX34",70,0)
+ ;
+"RTN","BSDX34",71,0)
+ S BSDXLIST=""
+"RTN","BSDX34",72,0)
+ F BSDXJ=1:1:$L(BSDXCLST,"|")-1 S BSDXCID=$P(BSDXCLST,"|",BSDXJ) D:+BSDXCID
+"RTN","BSDX34",73,0)
+ . S BSDXCLN=$G(^BSDXRES(BSDXCID,0)) S BSDXCLN=$P(BSDXCLN,U) Q:BSDXCLN=""
+"RTN","BSDX34",74,0)
+ . S BSDXSTRT=BSDXBEG F  S BSDXSTRT=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT)) Q:'+BSDXSTRT  Q:BSDXSTRT>BSDXEND  D
+"RTN","BSDX34",75,0)
+ . . S BSDXAID=0 F  S BSDXAID=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT,BSDXAID)) Q:'+BSDXAID  D
+"RTN","BSDX34",76,0)
+ . . . S BSDXNOD=$G(^BSDXAPPT(BSDXAID,0))
+"RTN","BSDX34",77,0)
+ . . . I $D(BSDXCAN) D  Q
+"RTN","BSDX34",78,0)
+ . . . . I $P(BSDXNOD,U,12) S BSDXLIST=BSDXLIST_BSDXAID_"|" ;Cancelled appt
+"RTN","BSDX34",79,0)
+ . . . I $P(BSDXNOD,U,11) S BSDXLIST=BSDXLIST_BSDXAID_"|" ;Rebooked appt
+"RTN","BSDX34",80,0)
+ D RBLETT(.BSDXY,BSDXLIST)
+"RTN","BSDX34",81,0)
+ Q
+"RTN","BSDX34",82,0)
+ ;
+"RTN","BSDX34",83,0)
+RBLETTD(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX34",84,0)
+ ;Entry point for debugging
+"RTN","BSDX34",85,0)
+ ;
+"RTN","BSDX34",86,0)
+ ;D DEBUG^%Serenji("RBLETT^BSDX34(.BSDXY,BSDXLIST)")
+"RTN","BSDX34",87,0)
+ Q
+"RTN","BSDX34",88,0)
+ ;
+"RTN","BSDX34",89,0)
+RBLETT(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX34",90,0)
+ ;Return recordset of patient appointments used in listing
+"RTN","BSDX34",91,0)
+ ;REBOOKED appointments for a list of appointmentIDs.
+"RTN","BSDX34",92,0)
+ ;Called by rpc BSDX REBOOK LIST
+"RTN","BSDX34",93,0)
+ ;BSDXLIST is a |-delimited list of BSDX APPOINTMENT iens (the last |-piece is null)
+"RTN","BSDX34",94,0)
+ ;
+"RTN","BSDX34",95,0)
+ N BSDXI,BSDXIEN,BSDXNOD,BSDXCNID,BSDXCNOD,BSDXMADE,BSDXCLRK,BSDXNOT,BSDXQ,BSDX
+"RTN","BSDX34",96,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX34",97,0)
+ S BSDXI=0
+"RTN","BSDX34",98,0)
+ S ^BSDXTMP($J,BSDXI)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030NewApptDate^T00030Clinic^T00030TypeStatus"
+"RTN","BSDX34",99,0)
+ S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE^D00030OldApptDate"_$C(30)
+"RTN","BSDX34",100,0)
+ S X="ERROR^BSDX34",@^%ZOSF("TRAP")
+"RTN","BSDX34",101,0)
+ ;
+"RTN","BSDX34",102,0)
+ ;Iterate through BSDXLIST
+"RTN","BSDX34",103,0)
+ S BSDXIEN=0
+"RTN","BSDX34",104,0)
+ F BSDX=1:1:$L(BSDXLIST,"|")-1 S BSDXIEN=$P(BSDXLIST,"|",BSDX) D
+"RTN","BSDX34",105,0)
+ . N BSDXNOD,BSDXAPT,BSDXCID,BSDXCNOD,BSDXCLN,BSDX44,BSDXDNOD,BSDXSTAT,BSDX,BSDXTYPE,BSDXLIN,BSDXPAT
+"RTN","BSDX34",106,0)
+ . N BSDXSTRE,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX34",107,0)
+ . N BSDXNAM,BSDXDOB,BSDXHRN,BSDXSEX
+"RTN","BSDX34",108,0)
+ . N BSDXREBK
+"RTN","BSDX34",109,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXIEN,0))
+"RTN","BSDX34",110,0)
+ . Q:BSDXNOD=""
+"RTN","BSDX34",111,0)
+ . S BSDXPAT=$P(BSDXNOD,U,5) ;PATIENT ien
+"RTN","BSDX34",112,0)
+ . Q:'+BSDXPAT
+"RTN","BSDX34",113,0)
+ . Q:'$D(^DPT(BSDXPAT))
+"RTN","BSDX34",114,0)
+ . D PINFO(BSDXPAT)
+"RTN","BSDX34",115,0)
+ . S Y=$P(BSDXNOD,U)
+"RTN","BSDX34",116,0)
+ . Q:'+Y
+"RTN","BSDX34",117,0)
+ . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX34",118,0)
+ . S BSDXAPT=Y ;Appointment date time
+"RTN","BSDX34",119,0)
+ . S BSDXREBK=""
+"RTN","BSDX34",120,0)
+ . S Y=$P(BSDXNOD,U,11)
+"RTN","BSDX34",121,0)
+ . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ") S BSDXREBK=Y ;Rebook date time
+"RTN","BSDX34",122,0)
+ . S BSDXCLRK=$P(BSDXNOD,U,8) ;Appointment made by
+"RTN","BSDX34",123,0)
+ . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX34",124,0)
+ . S Y=$P(BSDXNOD,U,9) ;Date Appointment Made
+"RTN","BSDX34",125,0)
+ . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX34",126,0)
+ . S BSDXMADE=Y
+"RTN","BSDX34",127,0)
+ . ;NOTE
+"RTN","BSDX34",128,0)
+ . S BSDXNOT=""
+"RTN","BSDX34",129,0)
+ . I $D(^BSDXAPPT(BSDXIEN,1,0)) S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXIEN,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX34",130,0)
+ . . S BSDXLIN=$G(^BSDXAPPT(BSDXIEN,1,BSDXQ,0))
+"RTN","BSDX34",131,0)
+ . . S:(BSDXLIN'="")&($E(BSDXLIN,$L(BSDXLIN)-1,$L(BSDXLIN))'=" ") BSDXLIN=BSDXLIN_" "
+"RTN","BSDX34",132,0)
+ . . S BSDXNOT=BSDXNOT_BSDXLIN
+"RTN","BSDX34",133,0)
+ . ;Resource
+"RTN","BSDX34",134,0)
+ . S BSDXCID=$P(BSDXNOD,U,7) ;IEN of BSDX RESOURCE
+"RTN","BSDX34",135,0)
+ . Q:'+BSDXCID
+"RTN","BSDX34",136,0)
+ . Q:'$D(^BSDXRES(BSDXCID,0))
+"RTN","BSDX34",137,0)
+ . S BSDXCNOD=$G(^BSDXRES(BSDXCID,0)) ;BSDX RESOURCE node
+"RTN","BSDX34",138,0)
+ . Q:BSDXCNOD=""
+"RTN","BSDX34",139,0)
+ . S BSDXCLN=$P(BSDXCNOD,U) ;Text name of BSDX Resource
+"RTN","BSDX34",140,0)
+ . S BSDXTYPE="" ;Unused in this recordset
+"RTN","BSDX34",141,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX34",142,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXREBK_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_BSDXCID_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_"^"_BSDXAPT_$C(30)
+"RTN","BSDX34",143,0)
+ . Q
+"RTN","BSDX34",144,0)
+ ;
+"RTN","BSDX34",145,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX34",146,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX34",147,0)
+ Q
+"RTN","BSDX34",148,0)
+ ;
+"RTN","BSDX34",149,0)
+PINFO(BSDXPAT) ;
+"RTN","BSDX34",150,0)
+ ;Get patient info
+"RTN","BSDX34",151,0)
+ N BSDXNOD
+"RTN","BSDX34",152,0)
+ S BSDXNOD=$$PATINFO^BSDX27(BSDXPAT)
+"RTN","BSDX34",153,0)
+ S BSDXNAM=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX34",154,0)
+ S BSDXSEX=$P(BSDXNOD,U,2) ;SEX
+"RTN","BSDX34",155,0)
+ S BSDXDOB=$P(BSDXNOD,U,3) ;DOB
+"RTN","BSDX34",156,0)
+ S BSDXHRN=$P(BSDXNOD,U,4) ;Health Record Number for location DUZ(2)
+"RTN","BSDX34",157,0)
+ S BSDXSTRE=$P(BSDXNOD,U,5) ;Street
+"RTN","BSDX34",158,0)
+ S BSDXCITY=$P(BSDXNOD,U,6) ;City
+"RTN","BSDX34",159,0)
+ S BSDXST=$P(BSDXNOD,U,7) ;State
+"RTN","BSDX34",160,0)
+ S BSDXZIP=$P(BSDXNOD,U,8) ;zip
+"RTN","BSDX34",161,0)
+ S BSDXPHON=$P(BSDXNOD,U,9) ;homephone
+"RTN","BSDX34",162,0)
+ Q
+"RTN","BSDX34",163,0)
+ ;
+"RTN","BSDX34",164,0)
+ERROR ;
+"RTN","BSDX34",165,0)
+ D ERR("RPMS Error")
+"RTN","BSDX34",166,0)
+ Q
+"RTN","BSDX34",167,0)
+ ;
+"RTN","BSDX34",168,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX34",169,0)
+ S:'$D(BSDXI) BSDXI=999
+"RTN","BSDX34",170,0)
+ I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX34",171,0)
+ E  S BSDXERR=ERRNO
+"RTN","BSDX34",172,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX34",173,0)
+ S ^BSDXTMP($J,BSDXI)="^^^^^^^^^^^^^^^^"_$C(30)
+"RTN","BSDX34",174,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX34",175,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX34",176,0)
+ Q
+"RTN","BSDX35")
+0^33^B8147998
+"RTN","BSDX35",1,0)
+BSDX35 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX35",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDX35",3,0)
+ ;
+"RTN","BSDX35",4,0)
+ ;
+"RTN","BSDX35",5,0)
+ Q
+"RTN","BSDX35",6,0)
+ ;
+"RTN","BSDX35",7,0)
+RSRCLTRD(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX35",8,0)
+ ;Entry point for debugging
+"RTN","BSDX35",9,0)
+ ;
+"RTN","BSDX35",10,0)
+ ;D DEBUG^%Serenji("RSRCLTR^BSDX35(.BSDXY,BSDXLIST)")
+"RTN","BSDX35",11,0)
+ Q
+"RTN","BSDX35",12,0)
+ ;
+"RTN","BSDX35",13,0)
+RSRCLTR(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX35",14,0)
+ ;
+"RTN","BSDX35",15,0)
+ ;Return recordset of RESOURCES and associated LETTERS
+"RTN","BSDX35",16,0)
+ ;Used in generating rebook letters for a clinic
+"RTN","BSDX35",17,0)
+ ;BSDXLIST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX35",18,0)
+ ;Called by BSDX RESOURCE LETTERS
+"RTN","BSDX35",19,0)
+ ;
+"RTN","BSDX35",20,0)
+ ;
+"RTN","BSDX35",21,0)
+ S X="ERROR^BSDX35",@^%ZOSF("TRAP")
+"RTN","BSDX35",22,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX35",23,0)
+ N BSDXIEN,BSDX,BSDXLTR,BSDXNOS,BSDXCAN,BSDXIEN1
+"RTN","BSDX35",24,0)
+ S BSDXI=0
+"RTN","BSDX35",25,0)
+ S ^BSDXTMP($J,BSDXI)="I00010RESOURCEID^T00030RESOURCE_NAME^T00030LETTER_TEXT^T00030NO_SHOW_LETTER^T00030CLINIC_CANCELLATION_LETTER"_$C(30)
+"RTN","BSDX35",26,0)
+ ;
+"RTN","BSDX35",27,0)
+ ;
+"RTN","BSDX35",28,0)
+ ;If BSDXLIST is a list of resource NAMES, look up each name and convert to IEN
+"RTN","BSDX35",29,0)
+ F BSDXJ=1:1:$L(BSDXLIST,"|")-1 S BSDX=$P(BSDXLIST,"|",BSDXJ) D  S $P(BSDXLIST,"|",BSDXJ)=BSDY
+"RTN","BSDX35",30,0)
+ . S BSDY=""
+"RTN","BSDX35",31,0)
+ . I BSDX]"",$D(^BSDXRES(BSDX,0)) S BSDY=BSDX Q
+"RTN","BSDX35",32,0)
+ . I BSDX]"",$D(^BSDXRES("B",BSDX)) S BSDY=$O(^BSDXRES("B",BSDX,0)) Q
+"RTN","BSDX35",33,0)
+ . Q
+"RTN","BSDX35",34,0)
+ ;
+"RTN","BSDX35",35,0)
+ ;Get letter text from wp fields
+"RTN","BSDX35",36,0)
+ S BSDXIEN=0
+"RTN","BSDX35",37,0)
+ F BSDX=1:1:$L(BSDXLIST,"|")-1 S BSDXIEN=$P(BSDXLIST,"|",BSDX) D
+"RTN","BSDX35",38,0)
+ . Q:'$D(^BSDXRES(BSDXIEN))
+"RTN","BSDX35",39,0)
+ . S BSDXNAM=$P(^BSDXRES(BSDXIEN,0),U)
+"RTN","BSDX35",40,0)
+ . S BSDXLTR=""
+"RTN","BSDX35",41,0)
+ . I $D(^BSDXRES(BSDXIEN,1)) D
+"RTN","BSDX35",42,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXRES(BSDXIEN,1,BSDXIEN1)) Q:'+BSDXIEN1  D
+"RTN","BSDX35",43,0)
+ . . . S BSDXLTR=BSDXLTR_$G(^BSDXRES(BSDXIEN,1,BSDXIEN1,0))
+"RTN","BSDX35",44,0)
+ . . . S BSDXLTR=BSDXLTR_$C(13)_$C(10)
+"RTN","BSDX35",45,0)
+ . S BSDXNOS=""
+"RTN","BSDX35",46,0)
+ . I $D(^BSDXRES(BSDXIEN,12)) D
+"RTN","BSDX35",47,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXRES(BSDXIEN,12,BSDXIEN1)) Q:'+BSDXIEN1  D
+"RTN","BSDX35",48,0)
+ . . . S BSDXNOS=BSDXNOS_$G(^BSDXRES(BSDXIEN,12,BSDXIEN1,0))
+"RTN","BSDX35",49,0)
+ . . . S BSDXNOS=BSDXNOS_$C(13)_$C(10)
+"RTN","BSDX35",50,0)
+ . S BSDXCAN=""
+"RTN","BSDX35",51,0)
+ . I $D(^BSDXRES(BSDXIEN,13)) D
+"RTN","BSDX35",52,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXRES(BSDXIEN,13,BSDXIEN1)) Q:'+BSDXIEN1  D
+"RTN","BSDX35",53,0)
+ . . . S BSDXCAN=BSDXCAN_$G(^BSDXRES(BSDXIEN,13,BSDXIEN1,0))
+"RTN","BSDX35",54,0)
+ . . . S BSDXCAN=BSDXCAN_$C(13)_$C(10)
+"RTN","BSDX35",55,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX35",56,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXNAM_U_BSDXLTR_U_BSDXNOS_U_BSDXCAN_$C(30)
+"RTN","BSDX35",57,0)
+ ;
+"RTN","BSDX35",58,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX35",59,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX35",60,0)
+ Q
+"RTN","BSDX35",61,0)
+ ;
+"RTN","BSDX35",62,0)
+ERROR ;
+"RTN","BSDX35",63,0)
+ D ERR("RPMS Error")
+"RTN","BSDX35",64,0)
+ Q
+"RTN","BSDX35",65,0)
+ ;
+"RTN","BSDX35",66,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX35",67,0)
+ S:'$D(BSDXI) BSDXI=999
+"RTN","BSDX35",68,0)
+ I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX35",69,0)
+ E  S BSDXERR=ERRNO
+"RTN","BSDX35",70,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX35",71,0)
+ S ^BSDXTMP($J,BSDXI)="^^^^"_$C(30)
+"RTN","BSDX35",72,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX35",73,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX35",74,0)
+ Q
+"RTN","BSDXAPI")
+0^35^B148584022
+"RTN","BSDXAPI",1,0)
+BSDXAPI ; IHS/ANMC/LJF - SCHEDULING APIs ; 1/26/11 11:47am
+"RTN","BSDXAPI",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDXAPI",3,0)
+ ;Orignal routine is BSDAPI by IHS/LJF, HMW, and MAW
+"RTN","BSDXAPI",4,0)
+ ;local mods (many) by WV/SMH
+"RTN","BSDXAPI",5,0)
+ ;Move to BSDX namespace as BSDXAPI from BSDAPI by WV/SMH
+"RTN","BSDXAPI",6,0)
+ ; Change History:
+"RTN","BSDXAPI",7,0)
+ ; 2010-11-5: (1.42)
+"RTN","BSDXAPI",8,0)
+ ; - Fixed errors having to do uncanceling patient appointments if it was a patient cancelled appointment.
+"RTN","BSDXAPI",9,0)
+ ; - Use new style Fileman API for storing appointments in file 44 in $$MAKE due to problems with legacy API.
+"RTN","BSDXAPI",10,0)
+ ; 2010-11-12: (1.42)
+"RTN","BSDXAPI",11,0)
+ ; - Changed ="C" to ["C" in SCIEN. Cancelled appointments can be "PC" as well. 
+"RTN","BSDXAPI",12,0)
+ ; 2010-12-5 (1.42)
+"RTN","BSDXAPI",13,0)
+ ; Added an entry point to update the patient note in file 44.
+"RTN","BSDXAPI",14,0)
+ ; 2010-12-6 (1.42)
+"RTN","BSDXAPI",15,0)
+ ; MAKE1 incorrectly put info field in BSDR("INFO") rather than BSDR("OI")
+"RTN","BSDXAPI",16,0)
+ ; 2010-12-8 (1.42)
+"RTN","BSDXAPI",17,0)
+ ; Removed restriction on max appt length. Even though this restriction
+"RTN","BSDXAPI",18,0)
+ ; exists in fileman (120 minutes), PIMS ignores it. Therefore, I 
+"RTN","BSDXAPI",19,0)
+ ; will ignore it here too.
+"RTN","BSDXAPI",20,0)
+ ; 2011-01-25 (v.1.5)
+"RTN","BSDXAPI",21,0)
+ ; Added entry point $$RMCI to remove checked in appointments.
+"RTN","BSDXAPI",22,0)
+ ; In $$CANCEL, if the appointment is checked in, delete check-in rather than
+"RTN","BSDXAPI",23,0)
+ ;  spitting an error message to the user saying 'Delete the check-in'
+"RTN","BSDXAPI",24,0)
+ ; Changed all lines that look like this:
+"RTN","BSDXAPI",25,0)
+ ;  I $G(BSDR("ADT"))'?7N1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",26,0)
+ ; to:
+"RTN","BSDXAPI",27,0)
+ ;  I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",28,0)
+ ; to allow for date at midnight which does not have a dot at the end.
+"RTN","BSDXAPI",29,0)
+ ; 2011-01-26 (v.1.5)
+"RTN","BSDXAPI",30,0)
+ ; More user friendly message if patient already has appointment in $$MAKE:
+"RTN","BSDXAPI",31,0)
+ ;  Spits out pt name and user friendly date.
+"RTN","BSDXAPI",32,0)
+ ;  
+"RTN","BSDXAPI",33,0)
+ ;
+"RTN","BSDXAPI",34,0)
+MAKE1(DFN,CLIN,TYP,DATE,LEN,INFO) ; Simplified PEP w/ parameters for $$MAKE - making appointment
+"RTN","BSDXAPI",35,0)
+ ; Call like this for DFN 23435 having an appointment at Hospital Location 33
+"RTN","BSDXAPI",36,0)
+ ; have 3 (scheduled) or 4 (walkin) appt at Dec 20, 2009 @ 10:11:59 for 30 minutes appt
+"RTN","BSDXAPI",37,0)
+ ; for Baby foxes hallucinations.
+"RTN","BSDXAPI",38,0)
+ ; S RESULT=$$MAKE1^BSDXAPI(23435,33,(3 or 4),3091220.221159,30,"I see Baby foxes")
+"RTN","BSDXAPI",39,0)
+ S BSDR("PAT")=DFN       ;DFN
+"RTN","BSDXAPI",40,0)
+ S BSDR("CLN")=CLIN      ;Hosp Loc IEN
+"RTN","BSDXAPI",41,0)
+ S BSDR("TYP")=TYP       ;3 sched or 4 walkin
+"RTN","BSDXAPI",42,0)
+ S BSDR("ADT")=DATE      ;Appointment date in FM format
+"RTN","BSDXAPI",43,0)
+ S BSDR("LEN")=LEN       ;Appt len upto 240 (min)
+"RTN","BSDXAPI",44,0)
+ S BSDR("OI")=INFO     ;Reason for appt - up to 150 char
+"RTN","BSDXAPI",45,0)
+ S BSDR("USR")=DUZ       ;Person who made appt - current user
+"RTN","BSDXAPI",46,0)
+ Q $$MAKE(.BSDR)
+"RTN","BSDXAPI",47,0)
+ ;
+"RTN","BSDXAPI",48,0)
+MAKE(BSDR) ;PEP; call to store appt made
+"RTN","BSDXAPI",49,0)
+ ;
+"RTN","BSDXAPI",50,0)
+ ; Make call using: S ERR=$$MAKE^BSDXAPI(.ARRAY)
+"RTN","BSDXAPI",51,0)
+ ;
+"RTN","BSDXAPI",52,0)
+ ; Input Array -
+"RTN","BSDXAPI",53,0)
+ ; BSDR("PAT") = ien of patient in file 2
+"RTN","BSDXAPI",54,0)
+ ; BSDR("CLN") = ien of clinic in file 44
+"RTN","BSDXAPI",55,0)
+ ; BSDR("TYP") = 3 for scheduled appts, 4 for walkins
+"RTN","BSDXAPI",56,0)
+ ; BSDR("ADT") = appointment date and time
+"RTN","BSDXAPI",57,0)
+ ; BSDR("LEN") = appointment length in minutes (*1.42 limit removed)
+"RTN","BSDXAPI",58,0)
+ ; BSDR("OI")  = reason for appt - up to 150 characters
+"RTN","BSDXAPI",59,0)
+ ; BSDR("USR") = user who made appt
+"RTN","BSDXAPI",60,0)
+ ;
+"RTN","BSDXAPI",61,0)
+ ;Output: error status and message
+"RTN","BSDXAPI",62,0)
+ ;   = 0 or null:  everything okay
+"RTN","BSDXAPI",63,0)
+ ;   = 1^message:  error and reason
+"RTN","BSDXAPI",64,0)
+ ;
+"RTN","BSDXAPI",65,0)
+ I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT"))
+"RTN","BSDXAPI",66,0)
+ I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN"))
+"RTN","BSDXAPI",67,0)
+ I ($G(BSDR("TYP"))<3)!($G(BSDR("TYP"))>4) Q 1_U_"Appt Type error: "_$G(BSDR("TYP"))
+"RTN","BSDXAPI",68,0)
+ I $G(BSDR("ADT")) S BSDR("ADT")=+$E(BSDR("ADT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",69,0)
+ I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",70,0)
+ ;
+"RTN","BSDXAPI",71,0)
+ ;I ($G(BSDR("LEN"))<5)!($G(BSDR("LEN"))>240) Q 1_U_"Appt Length error: "_$G(BSDR("LEN")) ; v 1.42 - no check on length is done anymore. see top comments for details.
+"RTN","BSDXAPI",72,0)
+ I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Made Appt Error: "_$G(BSDR("USR"))
+"RTN","BSDXAPI",73,0)
+ ;I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)'["C" Q 1_U_"Patient "_BSDR("PAT")_" already has appt at "_BSDR("ADT") ; v.1.5 more user friendly err msg
+"RTN","BSDXAPI",74,0)
+ ;
+"RTN","BSDXAPI",75,0)
+ ; Following block to give an error message to user if there is already an appointment for patient. More verbose than others.
+"RTN","BSDXAPI",76,0)
+ N BSDXERR ; place to store error message
+"RTN","BSDXAPI",77,0)
+ I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)'["C" DO  QUIT BSDXERR  ; If there's an appt in the "S" node of file 2 and it's not cancelled
+"RTN","BSDXAPI",78,0)
+ . S BSDXERR=1_U_"Patient "_$P(^DPT(BSDR("PAT"),0),U)_" ("_BSDR("PAT")_") "
+"RTN","BSDXAPI",79,0)
+ . S BSDXERR=BSDXERR_"already has appt at "_$$FMTE^XLFDT(BSDR("ADT"))
+"RTN","BSDXAPI",80,0)
+ . N BSDXSCIEN S BSDXSCIEN=$P(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0),U)  ; Clinic IEN in ^SC (0 piece of 0 node of "S" multiple in file 2)
+"RTN","BSDXAPI",81,0)
+ . N BSDXSCNAM S BSDXSCNAM=$P(^SC(BSDXSCIEN,0),U) ; PIMS Name of Clinic
+"RTN","BSDXAPI",82,0)
+ . S BSDXERR=BSDXERR_$C(13,10)_"PIMS clinic: "_BSDXSCNAM ; tell the user of the PIMS clinic
+"RTN","BSDXAPI",83,0)
+ . I $D(^BSDXRES("ALOC",BSDXSCIEN)) DO  ; if the Clinic is linked to a BSDX Resource (we find out using the index ALOC in the BSDX RESOURCE file)
+"RTN","BSDXAPI",84,0)
+ . . N BSDXRESIEN S BSDXRESIEN=$O(^BSDXRES("ALOC",BSDXSCIEN,""))
+"RTN","BSDXAPI",85,0)
+ . . QUIT:'BSDXRESIEN  ; Safeguard if index is corrupt
+"RTN","BSDXAPI",86,0)
+ . . N BSDXRESNAM S BSDXRESNAM=$P(^BSDXRES(BSDXRESIEN,0),U)
+"RTN","BSDXAPI",87,0)
+ . . S BSDXERR=BSDXERR_$C(13,10)_"Scheduling GUI clinic: "_BSDXRESNAM ; tell the user of the BSDX clinic
+"RTN","BSDXAPI",88,0)
+ ;
+"RTN","BSDXAPI",89,0)
+ NEW DIC,DA,Y,X,DD,DO,DLAYGO
+"RTN","BSDXAPI",90,0)
+ ;
+"RTN","BSDXAPI",91,0)
+ I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)["C" D
+"RTN","BSDXAPI",92,0)
+ . ; "un-cancel" existing appt in file 2
+"RTN","BSDXAPI",93,0)
+ . N BSDXFDA,BSDXIENS,BSDXMSG
+"RTN","BSDXAPI",94,0)
+ . S BSDXIENS=BSDR("ADT")_","_BSDR("PAT")_","
+"RTN","BSDXAPI",95,0)
+ . S BSDXFDA(2.98,BSDXIENS,".01")=BSDR("CLN")
+"RTN","BSDXAPI",96,0)
+ . S BSDXFDA(2.98,BSDXIENS,"3")=""
+"RTN","BSDXAPI",97,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9")=BSDR("TYP")
+"RTN","BSDXAPI",98,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9.5")=9
+"RTN","BSDXAPI",99,0)
+ . S BSDXFDA(2.98,BSDXIENS,"14")=""
+"RTN","BSDXAPI",100,0)
+ . S BSDXFDA(2.98,BSDXIENS,"15")=""
+"RTN","BSDXAPI",101,0)
+ . S BSDXFDA(2.98,BSDXIENS,"16")=""
+"RTN","BSDXAPI",102,0)
+ . S BSDXFDA(2.98,BSDXIENS,"19")=""
+"RTN","BSDXAPI",103,0)
+ . S BSDXFDA(2.98,BSDXIENS,"20")=$$NOW^XLFDT
+"RTN","BSDXAPI",104,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDXAPI",105,0)
+ . N BSDXTEMP S BSDXTEMP=$G(BSDXMSG)
+"RTN","BSDXAPI",106,0)
+ E  D  I $G(BSDXERR(1)) Q 1_U_"FileMan add to DPT error: Patient="_BSDR("PAT")_" Appt="_BSDR("ADT")  
+"RTN","BSDXAPI",107,0)
+ . N BSDXFDA,BSDXIENS,BSDXMSG
+"RTN","BSDXAPI",108,0)
+ . S BSDXIENS="?+2,"_BSDR("PAT")_","
+"RTN","BSDXAPI",109,0)
+ . S BSDXIENS(2)=BSDR("ADT")
+"RTN","BSDXAPI",110,0)
+ . S BSDXFDA(2.98,BSDXIENS,.01)=BSDR("CLN")
+"RTN","BSDXAPI",111,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9")=BSDR("TYP")
+"RTN","BSDXAPI",112,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9.5")=9
+"RTN","BSDXAPI",113,0)
+ . S BSDXFDA(2.98,BSDXIENS,"20")=$$NOW^XLFDT
+"RTN","BSDXAPI",114,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIENS","BSDXERR(1)")
+"RTN","BSDXAPI",115,0)
+ ; add appt to file 44
+"RTN","BSDXAPI",116,0)
+ K DIC,DA,X,Y,DLAYGO,DD,DO
+"RTN","BSDXAPI",117,0)
+ I '$D(^SC(BSDR("CLN"),"S",0)) S ^SC(BSDR("CLN"),"S",0)="^44.001DA^^"
+"RTN","BSDXAPI",118,0)
+ I '$D(^SC(BSDR("CLN"),"S",BSDR("ADT"),0)) D  I Y<1 Q 1_U_"Error adding date to file 44: Clinic="_BSDR("CLN")_" Date="_BSDR("ADT")
+"RTN","BSDXAPI",119,0)
+ . S DIC="^SC("_BSDR("CLN")_",""S"",",DA(1)=BSDR("CLN"),(X,DINUM)=BSDR("ADT")
+"RTN","BSDXAPI",120,0)
+ . S DIC("P")="44.001DA",DIC(0)="L",DLAYGO=44.001
+"RTN","BSDXAPI",121,0)
+ . S Y=1 I '$D(@(DIC_X_")")) D FILE^DICN
+"RTN","BSDXAPI",122,0)
+ ;
+"RTN","BSDXAPI",123,0)
+ ; Sep 28 2010: Changed old style API to new style API. Keep for reference //smh
+"RTN","BSDXAPI",124,0)
+ ;K DIC,DA,X,Y,DLAYGO,DD,DO,DINUM
+"RTN","BSDXAPI",125,0)
+ ;S DIC="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"
+"RTN","BSDXAPI",126,0)
+ ;S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),X=BSDR("PAT")
+"RTN","BSDXAPI",127,0)
+ ;S DIC("DR")="1///"_BSDR("LEN")_";3///"_$E($G(BSDR("OI")),1,150)_";7///`"_BSDR("USR")_";8///"_$P($$NOW^XLFDT,".")
+"RTN","BSDXAPI",128,0)
+ ;S DIC("P")="44.003PA",DIC(0)="L",DLAYGO=44.003
+"RTN","BSDXAPI",129,0)
+ ;D FILE^DICN
+"RTN","BSDXAPI",130,0)
+ ;
+"RTN","BSDXAPI",131,0)
+ N BSDXIENS S BSDXIENS="?+1,"_BSDR("ADT")_","_BSDR("CLN")_","
+"RTN","BSDXAPI",132,0)
+ N BSDXFDA
+"RTN","BSDXAPI",133,0)
+ S BSDXFDA(44.003,BSDXIENS,.01)=BSDR("PAT")
+"RTN","BSDXAPI",134,0)
+ S BSDXFDA(44.003,BSDXIENS,1)=BSDR("LEN")
+"RTN","BSDXAPI",135,0)
+ S BSDXFDA(44.003,BSDXIENS,3)=$E($G(BSDR("OI")),1,150)
+"RTN","BSDXAPI",136,0)
+ S BSDXFDA(44.003,BSDXIENS,7)=BSDR("USR")
+"RTN","BSDXAPI",137,0)
+ S BSDXFDA(44.003,BSDXIENS,8)=$P($$NOW^XLFDT,".")
+"RTN","BSDXAPI",138,0)
+ N BSDXERR
+"RTN","BSDXAPI",139,0)
+ D UPDATE^DIE("","BSDXFDA","","BSDXERR")
+"RTN","BSDXAPI",140,0)
+ ;
+"RTN","BSDXAPI",141,0)
+ I $D(BSDXERR) Q 1_U_"Error adding appt to file 44: Clinic="_BSDR("CLN")_" Date="_BSDR("ADT")_" Patient="_BSDR("PAT")_" Error: "_BSDXERR("DIERR",1,"TEXT",1)
+"RTN","BSDXAPI",142,0)
+ ;
+"RTN","BSDXAPI",143,0)
+ ; call event driver
+"RTN","BSDXAPI",144,0)
+ NEW DFN,SDT,SDCL,SDDA,SDMODE
+"RTN","BSDXAPI",145,0)
+ S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2
+"RTN","BSDXAPI",146,0)
+ S SDDA=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",147,0)
+ D MAKE^SDAMEVT(DFN,SDT,SDCL,SDDA,SDMODE)
+"RTN","BSDXAPI",148,0)
+ Q 0
+"RTN","BSDXAPI",149,0)
+ ;
+"RTN","BSDXAPI",150,0)
+CHECKIN1(DFN,CLIN,APDATE) ; Simplified PEP w/ parameters for $$CHECKIN - Checking in
+"RTN","BSDXAPI",151,0)
+ ; Call like this for DFN 23435 checking in now at Hospital Location 33
+"RTN","BSDXAPI",152,0)
+ ; for appt at Dec 20, 2009 @ 10:11:59 
+"RTN","BSDXAPI",153,0)
+ ; S RESULT=$$CHECKIN1^BSDXAPI(23435,33,3091220.221159)
+"RTN","BSDXAPI",154,0)
+ S BSDR("PAT")=DFN          ;DFN
+"RTN","BSDXAPI",155,0)
+ S BSDR("CLN")=CLIN         ;Hosp Loc IEN
+"RTN","BSDXAPI",156,0)
+ S BSDR("ADT")=APDATE       ;Appt Date
+"RTN","BSDXAPI",157,0)
+ S BSDR("CDT")=$$NOW^XLFDT  ;Check-in date defaults to now
+"RTN","BSDXAPI",158,0)
+ S BSDR("USR")=DUZ          ;Check-in user defaults to current
+"RTN","BSDXAPI",159,0)
+ Q $$CHECKIN(.BSDR)
+"RTN","BSDXAPI",160,0)
+ ;
+"RTN","BSDXAPI",161,0)
+CHECKIN(BSDR) ;EP; call to add checkin info to appt; IHS/ITSC/LJF 12/23/2004 PATCH 1002
+"RTN","BSDXAPI",162,0)
+ ;
+"RTN","BSDXAPI",163,0)
+ ; Make call by using:  S ERR=$$CHECKIN^BSDXAPI(.ARRAY)
+"RTN","BSDXAPI",164,0)
+ ;
+"RTN","BSDXAPI",165,0)
+ ; Input array -
+"RTN","BSDXAPI",166,0)
+ ;  BSDR("PAT") = ien of patient in file 2
+"RTN","BSDXAPI",167,0)
+ ;  BSDR("CLN") = ien of clinic in file 44
+"RTN","BSDXAPI",168,0)
+ ;  BSDR("ADT") = appt date/time
+"RTN","BSDXAPI",169,0)
+ ;  BSDR("CDT") = checkin date/time
+"RTN","BSDXAPI",170,0)
+ ;  BSDR("USR") = checkin user
+"RTN","BSDXAPI",171,0)
+ ;
+"RTN","BSDXAPI",172,0)
+ ; Output value -
+"RTN","BSDXAPI",173,0)
+ ;              = 0 means everything worked
+"RTN","BSDXAPI",174,0)
+ ;              = 1^message means error with reason message
+"RTN","BSDXAPI",175,0)
+ ;
+"RTN","BSDXAPI",176,0)
+ I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT"))
+"RTN","BSDXAPI",177,0)
+ I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN"))
+"RTN","BSDXAPI",178,0)
+ I $G(BSDR("ADT")) S BSDR("ADT")=+$E(BSDR("ADT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",179,0)
+ I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",180,0)
+ I $G(BSDR("CDT")) S BSDR("CDT")=+$E(BSDR("CDT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",181,0)
+ I $G(BSDR("CDT"))'?7N.1".".4N Q 1_U_"Checkin Date/Time error: "_$G(BSDR("CDT"))
+"RTN","BSDXAPI",182,0)
+ I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Made Appt Error: "_$G(BSDR("USR"))
+"RTN","BSDXAPI",183,0)
+ ;
+"RTN","BSDXAPI",184,0)
+ ; find ien for appt in file 44
+"RTN","BSDXAPI",185,0)
+ NEW IEN,DIE,DA,DR
+"RTN","BSDXAPI",186,0)
+ S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",187,0)
+ I 'IEN Q 1_U_"Error trying to find appointment for checkin: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT")
+"RTN","BSDXAPI",188,0)
+ ;
+"RTN","BSDXAPI",189,0)
+ ; remember before status
+"RTN","BSDXAPI",190,0)
+ NEW SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL
+"RTN","BSDXAPI",191,0)
+ S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2,SDDA=IEN
+"RTN","BSDXAPI",192,0)
+ S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",193,0)
+ D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+"RTN","BSDXAPI",194,0)
+ ;
+"RTN","BSDXAPI",195,0)
+ ; set checkin
+"RTN","BSDXAPI",196,0)
+ S DIE="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"
+"RTN","BSDXAPI",197,0)
+ S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),DA=IEN
+"RTN","BSDXAPI",198,0)
+ S DR="309///"_BSDR("CDT")_";302///`"_BSDR("USR")_";305///"_$$NOW^XLFDT
+"RTN","BSDXAPI",199,0)
+ D ^DIE
+"RTN","BSDXAPI",200,0)
+ ;
+"RTN","BSDXAPI",201,0)
+ ; set after status
+"RTN","BSDXAPI",202,0)
+ S SDDA=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",203,0)
+ S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",204,0)
+ D AFTER^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+"RTN","BSDXAPI",205,0)
+ ;
+"RTN","BSDXAPI",206,0)
+ ; call event driver
+"RTN","BSDXAPI",207,0)
+ D EVT^SDAMEVT(.SDATA,4,SDMODE,SDCIHDL)
+"RTN","BSDXAPI",208,0)
+ Q 0
+"RTN","BSDXAPI",209,0)
+ ;
+"RTN","BSDXAPI",210,0)
+CANCEL1(DFN,CLIN,TYP,APDATE,REASON,INFO) ; PEP w/ parameters for $$CANCEL - cancelling appointment
+"RTN","BSDXAPI",211,0)
+ ; Call like this for DFN 23435 cancelling an appointment at Hospital Location 33,
+"RTN","BSDXAPI",212,0)
+ ; cancellation initiated by patient ("PC" rather than clinic "C"),
+"RTN","BSDXAPI",213,0)
+ ; cancelling appt at Dec 20, 2009 @ 10:11:59 because of reason 1 in file 409.2 IEN (weather)
+"RTN","BSDXAPI",214,0)
+ ; because foxes come out during bad weather.
+"RTN","BSDXAPI",215,0)
+ ; S RESULT=$$CANCEL1^BSDXAPI(23435,33,"PC",3091220.221159,1,"Afraid of foxes")
+"RTN","BSDXAPI",216,0)
+ S BSDR("PAT")=DFN
+"RTN","BSDXAPI",217,0)
+ S BSDR("CLN")=CLIN
+"RTN","BSDXAPI",218,0)
+ S BSDR("TYP")=TYP
+"RTN","BSDXAPI",219,0)
+ S BSDR("ADT")=APDATE
+"RTN","BSDXAPI",220,0)
+ S BSDR("CDT")=$$NOW^XLFDT
+"RTN","BSDXAPI",221,0)
+ S BSDR("USR")=DUZ
+"RTN","BSDXAPI",222,0)
+ S BSDR("CR")=REASON
+"RTN","BSDXAPI",223,0)
+ S BSDR("NOT")=INFO
+"RTN","BSDXAPI",224,0)
+ Q $$CANCEL(.BSDR)
+"RTN","BSDXAPI",225,0)
+ ;
+"RTN","BSDXAPI",226,0)
+CANCEL(BSDR) ;PEP; called to cancel appt
+"RTN","BSDXAPI",227,0)
+ ;
+"RTN","BSDXAPI",228,0)
+ ; Make call using: S ERR=$$CANCEL^BSDXAPI(.ARRAY)
+"RTN","BSDXAPI",229,0)
+ ;
+"RTN","BSDXAPI",230,0)
+ ; Input Array -
+"RTN","BSDXAPI",231,0)
+ ; BSDR("PAT") = ien of patient in file 2
+"RTN","BSDXAPI",232,0)
+ ; BSDR("CLN") = ien of clinic in file 44
+"RTN","BSDXAPI",233,0)
+ ; BSDR("TYP") = C for canceled by clinic; PC for patient canceled
+"RTN","BSDXAPI",234,0)
+ ; BSDR("ADT") = appointment date and time
+"RTN","BSDXAPI",235,0)
+ ; BSDR("CDT") = cancel date and time
+"RTN","BSDXAPI",236,0)
+ ; BSDR("USR") = user who canceled appt
+"RTN","BSDXAPI",237,0)
+ ; BSDR("CR")  = cancel reason - pointer to file 409.2
+"RTN","BSDXAPI",238,0)
+ ; BSDR("NOT") = cancel remarks - optional notes to 160 characters
+"RTN","BSDXAPI",239,0)
+ ;
+"RTN","BSDXAPI",240,0)
+ ;Output: error status and message
+"RTN","BSDXAPI",241,0)
+ ;   = 0 or null:  everything okay
+"RTN","BSDXAPI",242,0)
+ ;   = 1^message:  error and reason
+"RTN","BSDXAPI",243,0)
+ ;
+"RTN","BSDXAPI",244,0)
+ I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT"))
+"RTN","BSDXAPI",245,0)
+ I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN"))
+"RTN","BSDXAPI",246,0)
+ I ($G(BSDR("TYP"))'="C"),($G(BSDR("TYP"))'="PC") Q 1_U_"Cancel Status error: "_$G(BSDR("TYP"))
+"RTN","BSDXAPI",247,0)
+ I $G(BSDR("ADT")) S BSDR("ADT")=+$E(BSDR("ADT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",248,0)
+ I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",249,0)
+ I $G(BSDR("CDT")) S BSDR("CDT")=+$E(BSDR("CDT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",250,0)
+ I $G(BSDR("CDT"))'?7N.1".".4N Q 1_U_"Cancel Date/Time error: "_$G(BSDR("CDT"))
+"RTN","BSDXAPI",251,0)
+ I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Canceled Appt Error: "_$G(BSDR("USR"))
+"RTN","BSDXAPI",252,0)
+ I '$D(^SD(409.2,+$G(BSDR("CR")))) Q 1_U_"Cancel Reason error: "_$G(BSDR("CR"))
+"RTN","BSDXAPI",253,0)
+ ;
+"RTN","BSDXAPI",254,0)
+ NEW IEN,DIE,DA,DR
+"RTN","BSDXAPI",255,0)
+ S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",256,0)
+ I 'IEN Q 1_U_"Error trying to find appointment for cancel: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT")
+"RTN","BSDXAPI",257,0)
+ ;
+"RTN","BSDXAPI",258,0)
+ ; BSDX 1.5 3110125
+"RTN","BSDXAPI",259,0)
+ ; UJO/SMH - Add ability to remove check-in if the patient is checked in
+"RTN","BSDXAPI",260,0)
+ ; I $$CI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"),IEN) Q 1_U_"Patient already checked in; cannot cancel until checkin deleted: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT")
+"RTN","BSDXAPI",261,0)
+ ; Remove check-in if the patient is checked in.
+"RTN","BSDXAPI",262,0)
+ N BSDXRESULT S BSDXRESULT=0 ; Result; should be zero if success; -1 + message if failure
+"RTN","BSDXAPI",263,0)
+ I $$CI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"),IEN) SET BSDXRESULT=$$RMCI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",264,0)
+ I BSDXRESULT Q BSDXRESULT
+"RTN","BSDXAPI",265,0)
+ ;
+"RTN","BSDXAPI",266,0)
+ ; remember before status
+"RTN","BSDXAPI",267,0)
+ NEW SDATA,DFN,SDT,SDCL,SDDA,SDCPHDL
+"RTN","BSDXAPI",268,0)
+ S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2,SDDA=IEN
+"RTN","BSDXAPI",269,0)
+ S SDCPHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",270,0)
+ D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCPHDL)
+"RTN","BSDXAPI",271,0)
+ ;
+"RTN","BSDXAPI",272,0)
+ ; get user who made appt and date appt made from ^SC
+"RTN","BSDXAPI",273,0)
+ ;    because data in ^SC will be deleted
+"RTN","BSDXAPI",274,0)
+ NEW USER,DATE
+"RTN","BSDXAPI",275,0)
+ S USER=$P($G(^SC(SDCL,"S",SDT,1,IEN,0)),U,6)
+"RTN","BSDXAPI",276,0)
+ S DATE=$P($G(^SC(SDCL,"S",SDT,1,IEN,0)),U,7)
+"RTN","BSDXAPI",277,0)
+ ;
+"RTN","BSDXAPI",278,0)
+ ; update file 2 info
+"RTN","BSDXAPI",279,0)
+ NEW DIE,DA,DR
+"RTN","BSDXAPI",280,0)
+ S DIE="^DPT("_DFN_",""S"",",DA(1)=DFN,DA=SDT
+"RTN","BSDXAPI",281,0)
+ S DR="3///"_BSDR("TYP")_";14///`"_BSDR("USR")_";15///"_BSDR("CDT")_";16///`"_BSDR("CR")_";19///`"_USER_";20///"_DATE
+"RTN","BSDXAPI",282,0)
+ S:$G(BSDR("NOT"))]"" DR=DR_";17///"_$E(BSDR("NOT"),1,160)
+"RTN","BSDXAPI",283,0)
+ D ^DIE
+"RTN","BSDXAPI",284,0)
+ ;
+"RTN","BSDXAPI",285,0)
+ ; delete data in ^SC
+"RTN","BSDXAPI",286,0)
+ NEW DIK,DA
+"RTN","BSDXAPI",287,0)
+ S DIK="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"
+"RTN","BSDXAPI",288,0)
+ S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),DA=IEN
+"RTN","BSDXAPI",289,0)
+ D ^DIK
+"RTN","BSDXAPI",290,0)
+ ;
+"RTN","BSDXAPI",291,0)
+ ; call event driver
+"RTN","BSDXAPI",292,0)
+ D CANCEL^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDMODE,SDCPHDL)
+"RTN","BSDXAPI",293,0)
+ Q 0
+"RTN","BSDXAPI",294,0)
+ ;
+"RTN","BSDXAPI",295,0)
+CI(PAT,CLINIC,DATE,SDIEN) ;PEP; -- returns 1 if appt already checked-in
+"RTN","BSDXAPI",296,0)
+ NEW X
+"RTN","BSDXAPI",297,0)
+ S X=$G(SDIEN)   ;ien sent in call
+"RTN","BSDXAPI",298,0)
+ I 'X S X=$$SCIEN(PAT,CLINIC,DATE) I 'X Q 0
+"RTN","BSDXAPI",299,0)
+ S X=$P($G(^SC(CLINIC,"S",DATE,1,X,"C")),U)
+"RTN","BSDXAPI",300,0)
+ Q $S(X:1,1:0)
+"RTN","BSDXAPI",301,0)
+ ;
+"RTN","BSDXAPI",302,0)
+RMCI(PAT,CLINIC,DATE)  ;PEP; -- Remove Check-in; $$
+"RTN","BSDXAPI",303,0)
+ ; PAT = DFN
+"RTN","BSDXAPI",304,0)
+ ; CLINIC = SC IEN
+"RTN","BSDXAPI",305,0)
+ ; DATE = FM Date/Time of Appointment
+"RTN","BSDXAPI",306,0)
+ ;
+"RTN","BSDXAPI",307,0)
+ ; Returns:
+"RTN","BSDXAPI",308,0)
+ ; 0 if okay
+"RTN","BSDXAPI",309,0)
+ ; -1 if failure
+"RTN","BSDXAPI",310,0)
+ ;
+"RTN","BSDXAPI",311,0)
+ ; Call like this: $$RMCI(233,33,3110102.1130)
+"RTN","BSDXAPI",312,0)
+ ;
+"RTN","BSDXAPI",313,0)
+ ; Move my variables into the ones used by SDAPIs (just a convenience)
+"RTN","BSDXAPI",314,0)
+ NEW SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL
+"RTN","BSDXAPI",315,0)
+ S DFN=PAT,SDT=DATE,SDCL=CLINIC,SDMODE=2,SDDA=$$SCIEN(DFN,SDCL,SDT)
+"RTN","BSDXAPI",316,0)
+ ;
+"RTN","BSDXAPI",317,0)
+ I SDDA<1 QUIT 0    ; Appt cancelled; cancelled appts rm'ed from file 44
+"RTN","BSDXAPI",318,0)
+ ;
+"RTN","BSDXAPI",319,0)
+ ; remember before status
+"RTN","BSDXAPI",320,0)
+ S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",321,0)
+ D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+"RTN","BSDXAPI",322,0)
+ ;
+"RTN","BSDXAPI",323,0)
+ ; remove check-in using filer.
+"RTN","BSDXAPI",324,0)
+ N BSDXIENS S BSDXIENS=SDDA_","_DATE_","_CLINIC_","
+"RTN","BSDXAPI",325,0)
+ S BSDXFDA(44.003,BSDXIENS,309)="@"	; CHECKED-IN
+"RTN","BSDXAPI",326,0)
+ S BSDXFDA(44.003,BSDXIENS,302)="@"	; CHECK IN USER
+"RTN","BSDXAPI",327,0)
+ S BSDXFDA(44.003,BSDXIENS,305)="@"	; CHECK IN ENTERED
+"RTN","BSDXAPI",328,0)
+ N BSDXERR
+"RTN","BSDXAPI",329,0)
+ D FILE^DIE("","BSDXFDA","BSDXERR")
+"RTN","BSDXAPI",330,0)
+ I $D(BSDXERR) QUIT "-1~Can't file for Pat "_PAT_" in Clinic "_CLINIC_" at "_DATE_". Fileman reported an error: "_BSDXERR("DIERR",1,"TEXT",1)
+"RTN","BSDXAPI",331,0)
+ ;
+"RTN","BSDXAPI",332,0)
+ ; set after status
+"RTN","BSDXAPI",333,0)
+ S SDDA=$$SCIEN(DFN,SDCL,SDT)
+"RTN","BSDXAPI",334,0)
+ S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",335,0)
+ D AFTER^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+"RTN","BSDXAPI",336,0)
+ ;
+"RTN","BSDXAPI",337,0)
+ ; call event driver
+"RTN","BSDXAPI",338,0)
+ D EVT^SDAMEVT(.SDATA,4,SDMODE,SDCIHDL)
+"RTN","BSDXAPI",339,0)
+ QUIT 0
+"RTN","BSDXAPI",340,0)
+ ;
+"RTN","BSDXAPI",341,0)
+SCIEN(PAT,CLINIC,DATE) ;PEP; returns ien for appt in ^SC
+"RTN","BSDXAPI",342,0)
+ NEW X,IEN
+"RTN","BSDXAPI",343,0)
+ S X=0 F  S X=$O(^SC(CLINIC,"S",DATE,1,X)) Q:'X  Q:$G(IEN)  D
+"RTN","BSDXAPI",344,0)
+ . Q:$P($G(^SC(CLINIC,"S",DATE,1,X,0)),U,9)["C"  ;cancelled
+"RTN","BSDXAPI",345,0)
+  . I +$G(^SC(CLINIC,"S",DATE,1,X,0))=PAT S IEN=X
+"RTN","BSDXAPI",346,0)
+ Q $G(IEN)
+"RTN","BSDXAPI",347,0)
+ ;
+"RTN","BSDXAPI",348,0)
+APPTYP(PAT,DATE) ;PEP; -- returns type of appt (scheduled or walk-in)
+"RTN","BSDXAPI",349,0)
+ NEW X S X=$P($G(^DPT(PAT,"S",DATE,0)),U,7)
+"RTN","BSDXAPI",350,0)
+ Q $S(X=3:"SCHED",X=4:"WALK-IN",1:"??")
+"RTN","BSDXAPI",351,0)
+ ;
+"RTN","BSDXAPI",352,0)
+CO(PAT,CLINIC,DATE,SDIEN) ;PEP; -- returns 1 if appt already checked-out
+"RTN","BSDXAPI",353,0)
+ NEW X
+"RTN","BSDXAPI",354,0)
+ S X=$G(SDIEN)   ;ien sent in call
+"RTN","BSDXAPI",355,0)
+ I 'X S X=$$SCIEN(PAT,CLINIC,DATE) I 'X Q 0
+"RTN","BSDXAPI",356,0)
+ S X=$P($G(^SC(CLINIC,"S",DATE,1,X,"C")),U,3)
+"RTN","BSDXAPI",357,0)
+ Q $S(X:1,1:0)
+"RTN","BSDXAPI",358,0)
+ ;
+"RTN","BSDXAPI",359,0)
+UPDATENOTE(PAT,CLINIC,DATE,NOTE) ; PEP; Update Note in ^SC for patient's appointment @ DATE
+"RTN","BSDXAPI",360,0)
+ ; PAT = DFN
+"RTN","BSDXAPI",361,0)
+ ; CLINIC = SC IEN
+"RTN","BSDXAPI",362,0)
+ ; DATE = FM Date/Time of Appointment
+"RTN","BSDXAPI",363,0)
+ ;
+"RTN","BSDXAPI",364,0)
+ ; Returns:
+"RTN","BSDXAPI",365,0)
+ ; 0 if okay
+"RTN","BSDXAPI",366,0)
+ ; -1 if failure
+"RTN","BSDXAPI",367,0)
+ N SCIEN S SCIEN=$$SCIEN(PAT,CLINIC,DATE) ; ien of appt in ^SC
+"RTN","BSDXAPI",368,0)
+ I SCIEN<1 QUIT 0    ; Appt cancelled; cancelled appts rm'ed from file 44
+"RTN","BSDXAPI",369,0)
+ N BSDXIENS S BSDXIENS=SCIEN_","_DATE_","_CLINIC_","
+"RTN","BSDXAPI",370,0)
+ S BSDXFDA(44.003,BSDXIENS,3)=$E(NOTE,1,150)
+"RTN","BSDXAPI",371,0)
+ N BSDXERR
+"RTN","BSDXAPI",372,0)
+ D FILE^DIE("","BSDXFDA","BSDXERR")
+"RTN","BSDXAPI",373,0)
+ I $D(BSDXERR) QUIT "-1~Can't file for Pat "_PAT_" in Clinic "_CLINIC_" at "_DATE_". Fileman reported an error: "_BSDXERR("DIERR",1,"TEXT",1)
+"RTN","BSDXAPI",374,0)
+ QUIT 0
+"RTN","BSDXGPRV")
+0^36^B4804670
+"RTN","BSDXGPRV",1,0)
+BSDXGPRV ; WV/SMH - WINDOWS SCHEDULING RPCS ; 11/2/10 4:27pm
+"RTN","BSDXGPRV",2,0)
+ ;;1.5;BSDX;;Jan 25, 2011;Build 11
+"RTN","BSDXGPRV",3,0)
+ ;
+"RTN","BSDXGPRV",4,0)
+ ;
+"RTN","BSDXGPRV",5,0)
+ERROR ;
+"RTN","BSDXGPRV",6,0)
+ D ERR("RPMS Error")
+"RTN","BSDXGPRV",7,0)
+ Q
+"RTN","BSDXGPRV",8,0)
+ ;
+"RTN","BSDXGPRV",9,0)
+ERR(BSDXERR) ;Error processing
+"RTN","BSDXGPRV",10,0)
+ D ^%ZTER
+"RTN","BSDXGPRV",11,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",12,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR
+"RTN","BSDXGPRV",13,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",14,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDXGPRV",15,0)
+ Q
+"RTN","BSDXGPRV",16,0)
+ ;
+"RTN","BSDXGPRV",17,0)
+PD(BSDXY,HLIEN) ;EP Debugging entry point
+"RTN","BSDXGPRV",18,0)
+ ;
+"RTN","BSDXGPRV",19,0)
+ D DEBUG^%Serenji("P^BSDXGPRV(.BSDXY,HLIEN)","192.168.254.130")
+"RTN","BSDXGPRV",20,0)
+ ;
+"RTN","BSDXGPRV",21,0)
+ Q
+"RTN","BSDXGPRV",22,0)
+ ;
+"RTN","BSDXGPRV",23,0)
+P(BSDXY,HLIEN) ; Public Entry point; Get Providers for Hosp Location
+"RTN","BSDXGPRV",24,0)
+ ; Input: HLIEN - Hospital Location IEN
+"RTN","BSDXGPRV",25,0)
+ ; Output: ADO Datatable with columns:
+"RTN","BSDXGPRV",26,0)
+ ; - HOSPITAL_LOCATION_ID, BMXIEN, PROV_NAME, DEFAULT
+"RTN","BSDXGPRV",27,0)
+ ; If there are providers in the PROVIDER multiple of file 44 
+"RTN","BSDXGPRV",28,0)
+ ; (Hospital Location) return them;
+"RTN","BSDXGPRV",29,0)
+ ; If no providers in PROVIDER multiple of file 44, return nothing
+"RTN","BSDXGPRV",30,0)
+ ; Called by BSDX HOSP LOC PROVIDERS
+"RTN","BSDXGPRV",31,0)
+ ;
+"RTN","BSDXGPRV",32,0)
+ S BSDXI=0
+"RTN","BSDXGPRV",33,0)
+ I '$D(^SC(HLIEN,0)) D ERR("HOSPITAL LOCATION NOT FOUND") QUIT
+"RTN","BSDXGPRV",34,0)
+ D ^XBKVAR 
+"RTN","BSDXGPRV",35,0)
+ N $ET S $ET="G ERROR^BSDXGPRV"
+"RTN","BSDXGPRV",36,0)
+ K ^BSDXTMP($J)
+"RTN","BSDXGPRV",37,0)
+ S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDXGPRV",38,0)
+ S $P(^BSDXTMP($J,BSDXI),U,1)="I00020HOSPITAL_LOCATION_ID"
+"RTN","BSDXGPRV",39,0)
+ S $P(^BSDXTMP($J,BSDXI),U,2)="I00020BMXIEN"
+"RTN","BSDXGPRV",40,0)
+ S $P(^BSDXTMP($J,BSDXI),U,3)="T00030NAME"
+"RTN","BSDXGPRV",41,0)
+ S $P(^BSDXTMP($J,BSDXI),U,4)="T00005DEFAULT"
+"RTN","BSDXGPRV",42,0)
+ S ^BSDXTMP($J,BSDXI)=^BSDXTMP($J,BSDXI)_$C(30)
+"RTN","BSDXGPRV",43,0)
+ ;
+"RTN","BSDXGPRV",44,0)
+ N OUTPUT
+"RTN","BSDXGPRV",45,0)
+ D GETS^DIQ(44,HLIEN_",","2600*","IE","OUTPUT") ; Provider Multiple
+"RTN","BSDXGPRV",46,0)
+ ; No results
+"RTN","BSDXGPRV",47,0)
+ I '$D(OUTPUT) S ^BSDXTMP($J,BSDXI+1)=$C(31) QUIT
+"RTN","BSDXGPRV",48,0)
+ ; if results, get them
+"RTN","BSDXGPRV",49,0)
+ N I S I=""
+"RTN","BSDXGPRV",50,0)
+ F  S I=$O(OUTPUT(44.1,I)) Q:I=""  D
+"RTN","BSDXGPRV",51,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",52,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,1)=HLIEN                  ; HL IEN
+"RTN","BSDXGPRV",53,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,2)=$P(OUTPUT(44.1,I,.01,"I"),",") ; PROV IEN
+"RTN","BSDXGPRV",54,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,3)=$E(OUTPUT(44.1,I,.01,"E"),1,30) ; PROV NAME
+"RTN","BSDXGPRV",55,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,4)=OUTPUT(44.1,I,.02,"E") ; Default - YES, NO
+"RTN","BSDXGPRV",56,0)
+ . S ^BSDXTMP($J,BSDXI)=^BSDXTMP($J,BSDXI)_$C(30)
+"RTN","BSDXGPRV",57,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",58,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDXGPRV",59,0)
+ QUIT
+"SEC","^DIC",9002018.1,9002018.1,0,"AUDIT")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"DD")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"DEL")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"LAYGO")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"RD")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"WR")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"AUDIT")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"DD")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"DEL")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"LAYGO")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"RD")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"WR")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"AUDIT")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"DD")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"DEL")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"LAYGO")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"RD")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"WR")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"AUDIT")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"DD")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"DEL")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"LAYGO")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"RD")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"WR")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"AUDIT")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"DD")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"DEL")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"LAYGO")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"RD")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"WR")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"AUDIT")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"DD")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"DEL")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"LAYGO")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"RD")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"WR")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"AUDIT")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"DD")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"DEL")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"LAYGO")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"RD")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"WR")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"AUDIT")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"DD")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"DEL")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"LAYGO")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"RD")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"WR")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"AUDIT")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"DD")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"DEL")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"LAYGO")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"RD")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"WR")
+@
+"VER")
+8.0^22.0
+"^DD",9002018.1,9002018.1,0)
+FIELD^^2001^8
+"^DD",9002018.1,9002018.1,0,"DT")
+3040820
+"^DD",9002018.1,9002018.1,0,"IX","ALOC",9002018.1,.04)
+
+"^DD",9002018.1,9002018.1,0,"IX","ASSOC",9002018.12001,.01)
+
+"^DD",9002018.1,9002018.1,0,"IX","B",9002018.1,.01)
+
+"^DD",9002018.1,9002018.1,0,"NM","BSDX RESOURCE")
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.15,.01)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.21,.01)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.25,.02)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.3,.01)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.4,.07)
+
+"^DD",9002018.1,9002018.1,0,"VRPK")
+BSDX
+"^DD",9002018.1,9002018.1,.01,0)
+NAME^RF^^0;1^K:$L(X)>30!($L(X)<1)!'(X'?1P.E) X
+"^DD",9002018.1,9002018.1,.01,1,0)
+^.1
+"^DD",9002018.1,9002018.1,.01,1,1,0)
+9002018.1^B
+"^DD",9002018.1,9002018.1,.01,1,1,1)
+S ^BSDXRES("B",$E(X,1,30),DA)=""
+"^DD",9002018.1,9002018.1,.01,1,1,2)
+K ^BSDXRES("B",$E(X,1,30),DA)
+"^DD",9002018.1,9002018.1,.01,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.1,9002018.1,.01,"DT")
+3040719
+"^DD",9002018.1,9002018.1,.02,0)
+INACTIVE^S^1:YES;0:NO;^0;2^Q
+"^DD",9002018.1,9002018.1,.02,3)
+
+"^DD",9002018.1,9002018.1,.02,"DT")
+3030520
+"^DD",9002018.1,9002018.1,.03,0)
+TIME SCALE^S^5:5;10:10;15:15;20:20;30:30;60:60;^0;3^Q
+"^DD",9002018.1,9002018.1,.03,"DT")
+3040212
+"^DD",9002018.1,9002018.1,.04,0)
+HOSPITAL LOCATION^P44'^SC(^0;4^Q
+"^DD",9002018.1,9002018.1,.04,1,0)
+^.1
+"^DD",9002018.1,9002018.1,.04,1,1,0)
+9002018.1^ALOC
+"^DD",9002018.1,9002018.1,.04,1,1,1)
+S ^BSDXRES("ALOC",$E(X,1,30),DA)=""
+"^DD",9002018.1,9002018.1,.04,1,1,2)
+K ^BSDXRES("ALOC",$E(X,1,30),DA)
+"^DD",9002018.1,9002018.1,.04,1,1,"%D",0)
+^^1^1^3040915^
+"^DD",9002018.1,9002018.1,.04,1,1,"%D",1,0)
+Cross reference on hospital location.
+"^DD",9002018.1,9002018.1,.04,1,1,"DT")
+3040915
+"^DD",9002018.1,9002018.1,.04,"DT")
+3040915
+"^DD",9002018.1,9002018.1,1,0)
+LETTER TEXT^9002018.11^^1;0
+"^DD",9002018.1,9002018.1,1201,0)
+NO SHOW LETTER^9002018.11201^^12;0
+"^DD",9002018.1,9002018.1,1301,0)
+CLINIC CANCELLATION LETTER^9002018.11301^^13;0
+"^DD",9002018.1,9002018.1,2001,0)
+ASSOCIATED RPMS CLINICS^9002018.12001P^^20;0
+"^DD",9002018.1,9002018.11,0)
+LETTER TEXT SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.11,0,"DT")
+3040212
+"^DD",9002018.1,9002018.11,0,"NM","LETTER TEXT")
+
+"^DD",9002018.1,9002018.11,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.11,.01,0)
+LETTER TEXT^W^^0;1^Q
+"^DD",9002018.1,9002018.11,.01,3)
+Enter the text of reminder letters sent to patients with appointments with this resource.
+"^DD",9002018.1,9002018.11,.01,"DT")
+3040212
+"^DD",9002018.1,9002018.11201,0)
+NO SHOW LETTER SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.11201,0,"DT")
+3040613
+"^DD",9002018.1,9002018.11201,0,"NM","NO SHOW LETTER")
+
+"^DD",9002018.1,9002018.11201,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.11201,.01,0)
+NO SHOW LETTER^W^^0;1^Q
+"^DD",9002018.1,9002018.11201,.01,"DT")
+3040613
+"^DD",9002018.1,9002018.11301,0)
+CLINIC CANCELLATION LETTER SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.11301,0,"DT")
+3040613
+"^DD",9002018.1,9002018.11301,0,"NM","CLINIC CANCELLATION LETTER")
+
+"^DD",9002018.1,9002018.11301,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.11301,.01,0)
+CLINIC CANCELLATION LETTER^W^^0;1^Q
+"^DD",9002018.1,9002018.11301,.01,"DT")
+3040613
+"^DD",9002018.1,9002018.12001,0)
+ASSOCIATED RPMS CLINICS SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.12001,0,"DT")
+3040820
+"^DD",9002018.1,9002018.12001,0,"IX","B",9002018.12001,.01)
+
+"^DD",9002018.1,9002018.12001,0,"NM","ASSOCIATED RPMS CLINICS")
+
+"^DD",9002018.1,9002018.12001,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.12001,.01,0)
+ASSOCIATED RPMS CLINICS^MP44'^SC(^0;1^Q
+"^DD",9002018.1,9002018.12001,.01,1,0)
+^.1
+"^DD",9002018.1,9002018.12001,.01,1,1,0)
+9002018.12001^B
+"^DD",9002018.1,9002018.12001,.01,1,1,1)
+S ^BSDXRES(DA(1),20,"B",$E(X,1,30),DA)=""
+"^DD",9002018.1,9002018.12001,.01,1,1,2)
+K ^BSDXRES(DA(1),20,"B",$E(X,1,30),DA)
+"^DD",9002018.1,9002018.12001,.01,1,2,0)
+9002018.1^ASSOC
+"^DD",9002018.1,9002018.12001,.01,1,2,1)
+S ^BSDXRES("ASSOC",$E(X,1,30),DA(1),DA)=""
+"^DD",9002018.1,9002018.12001,.01,1,2,2)
+K ^BSDXRES("ASSOC",$E(X,1,30),DA(1),DA)
+"^DD",9002018.1,9002018.12001,.01,1,2,"%D",0)
+^^1^1^3040915^
+"^DD",9002018.1,9002018.12001,.01,1,2,"%D",1,0)
+Cross reference on ASSOCIATED RPMS CLINICS
+"^DD",9002018.1,9002018.12001,.01,1,2,"DT")
+3040915
+"^DD",9002018.1,9002018.12001,.01,3)
+ENTER ASSOCIATED RPMS CLINIC
+"^DD",9002018.1,9002018.12001,.01,"DT")
+3040915
+"^DD",9002018.15,9002018.15,0)
+FIELD^^.05^5
+"^DD",9002018.15,9002018.15,0,"DT")
+3030703
+"^DD",9002018.15,9002018.15,0,"IX","AC",9002018.15,.02)
+
+"^DD",9002018.15,9002018.15,0,"IX","B",9002018.15,.01)
+
+"^DD",9002018.15,9002018.15,0,"NM","BSDX RESOURCE USER")
+
+"^DD",9002018.15,9002018.15,0,"VRPK")
+BSDX
+"^DD",9002018.15,9002018.15,.01,0)
+RESOURCENAME^RP9002018.1'^BSDXRES(^0;1^Q
+"^DD",9002018.15,9002018.15,.01,1,0)
+^.1
+"^DD",9002018.15,9002018.15,.01,1,1,0)
+9002018.15^B
+"^DD",9002018.15,9002018.15,.01,1,1,1)
+S ^BSDXRSU("B",$E(X,1,30),DA)=""
+"^DD",9002018.15,9002018.15,.01,1,1,2)
+K ^BSDXRSU("B",$E(X,1,30),DA)
+"^DD",9002018.15,9002018.15,.01,3)
+
+"^DD",9002018.15,9002018.15,.01,"DT")
+3030508
+"^DD",9002018.15,9002018.15,.02,0)
+USERNAME^P200'^VA(200,^0;2^Q
+"^DD",9002018.15,9002018.15,.02,1,0)
+^.1
+"^DD",9002018.15,9002018.15,.02,1,1,0)
+9002018.15^AC
+"^DD",9002018.15,9002018.15,.02,1,1,1)
+S ^BSDXRSU("AC",$E(X,1,30),DA)=""
+"^DD",9002018.15,9002018.15,.02,1,1,2)
+K ^BSDXRSU("AC",$E(X,1,30),DA)
+"^DD",9002018.15,9002018.15,.02,1,1,"DT")
+3030508
+"^DD",9002018.15,9002018.15,.02,"DT")
+3030508
+"^DD",9002018.15,9002018.15,.03,0)
+OVERBOOK^S^1:YES;0:NO;^0;3^Q
+"^DD",9002018.15,9002018.15,.03,3)
+
+"^DD",9002018.15,9002018.15,.03,"DT")
+3030703
+"^DD",9002018.15,9002018.15,.04,0)
+MODIFY SCHEDULE^S^1:YES;0:NO;^0;4^Q
+"^DD",9002018.15,9002018.15,.04,"DT")
+3030701
+"^DD",9002018.15,9002018.15,.05,0)
+MODIFY APPOINTMENTS^S^1:YES;0:NO;^0;5^Q
+"^DD",9002018.15,9002018.15,.05,3)
+
+"^DD",9002018.15,9002018.15,.05,"DT")
+3040722
+"^DD",9002018.2,9002018.2,0)
+FIELD^^1^3
+"^DD",9002018.2,9002018.2,0,"DDA")
+N
+"^DD",9002018.2,9002018.2,0,"DT")
+3030508
+"^DD",9002018.2,9002018.2,0,"IX","AB",9002018.21,.01)
+
+"^DD",9002018.2,9002018.2,0,"IX","B",9002018.2,.01)
+
+"^DD",9002018.2,9002018.2,0,"NM","BSDX RESOURCE GROUP")
+
+"^DD",9002018.2,9002018.2,0,"PT",9002018.25,.01)
+
+"^DD",9002018.2,9002018.2,0,"PT",9002018.35,.03)
+
+"^DD",9002018.2,9002018.2,0,"VRPK")
+BSDX
+"^DD",9002018.2,9002018.2,.01,0)
+NAME^RF^^0;1^K:$L(X)>30!(X?.N)!($L(X)<3)!'(X'?1P.E) X
+"^DD",9002018.2,9002018.2,.01,1,0)
+^.1
+"^DD",9002018.2,9002018.2,.01,1,1,0)
+9002018.2^B
+"^DD",9002018.2,9002018.2,.01,1,1,1)
+S ^BSDXDEPT("B",$E(X,1,30),DA)=""
+"^DD",9002018.2,9002018.2,.01,1,1,2)
+K ^BSDXDEPT("B",$E(X,1,30),DA)
+"^DD",9002018.2,9002018.2,.01,3)
+NAME MUST BE 3-30 CHARACTERS, NOT NUMERIC OR STARTING WITH PUNCTUATION
+"^DD",9002018.2,9002018.2,.02,0)
+INACTIVATION DATE^D^^0;2^S %DT="E" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.2,9002018.2,.02,"DT")
+3030508
+"^DD",9002018.2,9002018.2,1,0)
+RESOURCE^9002018.21P^^1;0
+"^DD",9002018.2,9002018.21,0)
+RESOURCE SUB-FIELD^^.01^1
+"^DD",9002018.2,9002018.21,0,"DT")
+3030508
+"^DD",9002018.2,9002018.21,0,"IX","B",9002018.21,.01)
+
+"^DD",9002018.2,9002018.21,0,"NM","RESOURCE")
+
+"^DD",9002018.2,9002018.21,0,"UP")
+9002018.2
+"^DD",9002018.2,9002018.21,.01,0)
+RESOURCE^MP9002018.1'^BSDXRES(^0;1^Q
+"^DD",9002018.2,9002018.21,.01,1,0)
+^.1
+"^DD",9002018.2,9002018.21,.01,1,1,0)
+9002018.21^B
+"^DD",9002018.2,9002018.21,.01,1,1,1)
+S ^BSDXDEPT(DA(1),1,"B",$E(X,1,30),DA)=""
+"^DD",9002018.2,9002018.21,.01,1,1,2)
+K ^BSDXDEPT(DA(1),1,"B",$E(X,1,30),DA)
+"^DD",9002018.2,9002018.21,.01,1,2,0)
+9002018.2^AB
+"^DD",9002018.2,9002018.21,.01,1,2,1)
+S ^BSDXDEPT("AB",$E(X,1,30),DA(1),DA)=""
+"^DD",9002018.2,9002018.21,.01,1,2,2)
+K ^BSDXDEPT("AB",$E(X,1,30),DA(1),DA)
+"^DD",9002018.2,9002018.21,.01,1,2,"DT")
+3030508
+"^DD",9002018.2,9002018.21,.01,"DT")
+3030508
+"^DD",9002018.3,9002018.3,0)
+FIELD^^1^6
+"^DD",9002018.3,9002018.3,0,"DT")
+3030508
+"^DD",9002018.3,9002018.3,0,"IX","ARSCT",9002018.3,.02)
+
+"^DD",9002018.3,9002018.3,0,"IX","B",9002018.3,.01)
+
+"^DD",9002018.3,9002018.3,0,"NM","BSDX ACCESS BLOCK")
+
+"^DD",9002018.3,9002018.3,0,"VRPK")
+BSDX
+"^DD",9002018.3,9002018.3,.01,0)
+RESOURCE^RP9002018.1'^BSDXRES(^0;1^Q
+"^DD",9002018.3,9002018.3,.01,1,0)
+^.1
+"^DD",9002018.3,9002018.3,.01,1,1,0)
+9002018.3^B
+"^DD",9002018.3,9002018.3,.01,1,1,1)
+S ^BSDXAB("B",$E(X,1,30),DA)=""
+"^DD",9002018.3,9002018.3,.01,1,1,2)
+K ^BSDXAB("B",$E(X,1,30),DA)
+"^DD",9002018.3,9002018.3,.01,3)
+
+"^DD",9002018.3,9002018.3,.01,"DT")
+3030508
+"^DD",9002018.3,9002018.3,.02,0)
+STARTTIME^D^^0;2^S %DT="ET" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.3,9002018.3,.02,1,0)
+^.1
+"^DD",9002018.3,9002018.3,.02,1,1,0)
+9002018.3^ARSCT^MUMPS
+"^DD",9002018.3,9002018.3,.02,1,1,1)
+D XR4S^BSDX03(DA)
+"^DD",9002018.3,9002018.3,.02,1,1,2)
+D XR4K^BSDX03(DA)
+"^DD",9002018.3,9002018.3,.02,1,1,"%D",0)
+^^1^1^3030512^
+"^DD",9002018.3,9002018.3,.02,1,1,"%D",1,0)
+Supports lookup of all access blocks for a given resource during a given time period
+"^DD",9002018.3,9002018.3,.02,1,1,"DT")
+3030512
+"^DD",9002018.3,9002018.3,.02,"DT")
+3030512
+"^DD",9002018.3,9002018.3,.03,0)
+ENDTIME^D^^0;3^S %DT="ET" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.3,9002018.3,.03,3)
+
+"^DD",9002018.3,9002018.3,.03,"DT")
+3030508
+"^DD",9002018.3,9002018.3,.04,0)
+SLOTS^NJ2,0^^0;4^K:+X'=X!(X>99)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.3,9002018.3,.04,3)
+Type a Number between 0 and 99, 0 Decimal Digits
+"^DD",9002018.3,9002018.3,.04,"DT")
+3030508
+"^DD",9002018.3,9002018.3,.05,0)
+ACCESS TYPE^P9002018.35'^BSDXTYPE(^0;5^Q
+"^DD",9002018.3,9002018.3,.05,"DT")
+3030508
+"^DD",9002018.3,9002018.3,1,0)
+NOTE^9002018.31^^1;0
+"^DD",9002018.3,9002018.31,0)
+NOTE SUB-FIELD^^.01^1
+"^DD",9002018.3,9002018.31,0,"DT")
+3030508
+"^DD",9002018.3,9002018.31,0,"NM","NOTE")
+
+"^DD",9002018.3,9002018.31,0,"UP")
+9002018.3
+"^DD",9002018.3,9002018.31,.01,0)
+NOTE^W^^0;1^Q
+"^DD",9002018.3,9002018.31,.01,"DT")
+3030508
+"^DD",9002018.35,9002018.35,0)
+FIELD^^.07^7
+"^DD",9002018.35,9002018.35,0,"DT")
+3030521
+"^DD",9002018.35,9002018.35,0,"IX","B",9002018.35,.01)
+
+"^DD",9002018.35,9002018.35,0,"NM","BSDX ACCESS TYPE")
+
+"^DD",9002018.35,9002018.35,0,"PT",9002018.3,.05)
+
+"^DD",9002018.35,9002018.35,0,"PT",9002018.39,.02)
+
+"^DD",9002018.35,9002018.35,0,"VRPK")
+BSDX
+"^DD",9002018.35,9002018.35,.01,0)
+ACCESS TYPE NAME^RF^^0;1^K:$L(X)>30!($L(X)<3)!'(X'?1P.E) X
+"^DD",9002018.35,9002018.35,.01,1,0)
+^.1
+"^DD",9002018.35,9002018.35,.01,1,1,0)
+9002018.35^B
+"^DD",9002018.35,9002018.35,.01,1,1,1)
+S ^BSDXTYPE("B",$E(X,1,30),DA)=""
+"^DD",9002018.35,9002018.35,.01,1,1,2)
+K ^BSDXTYPE("B",$E(X,1,30),DA)
+"^DD",9002018.35,9002018.35,.01,3)
+Answer must be 3-30 characters in length.
+"^DD",9002018.35,9002018.35,.01,"DT")
+3030508
+"^DD",9002018.35,9002018.35,.02,0)
+INACTIVE^S^1:YES;0:NO;^0;2^Q
+"^DD",9002018.35,9002018.35,.02,3)
+
+"^DD",9002018.35,9002018.35,.02,"DT")
+3030520
+"^DD",9002018.35,9002018.35,.03,0)
+DEPARTMENT NAME^P9002018.2'^BSDXDEPT(^0;3^Q
+"^DD",9002018.35,9002018.35,.03,"DT")
+3030508
+"^DD",9002018.35,9002018.35,.04,0)
+DISPLAY COLOR^F^^0;4^K:$L(X)>30!($L(X)<1) X
+"^DD",9002018.35,9002018.35,.04,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.35,9002018.35,.04,"DT")
+3030508
+"^DD",9002018.35,9002018.35,.05,0)
+RED^NJ3,0^^0;5^K:+X'=X!(X>255)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.35,9002018.35,.05,3)
+Type a Number between 0 and 255, 0 Decimal Digits
+"^DD",9002018.35,9002018.35,.05,"DT")
+3030521
+"^DD",9002018.35,9002018.35,.06,0)
+GREEN^NJ3,0^^0;6^K:+X'=X!(X>255)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.35,9002018.35,.06,3)
+Type a Number between 0 and 255, 0 Decimal Digits
+"^DD",9002018.35,9002018.35,.06,"DT")
+3030521
+"^DD",9002018.35,9002018.35,.07,0)
+BLUE^NJ3,0^^0;7^K:+X'=X!(X>255)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.35,9002018.35,.07,3)
+Type a Number between 0 and 255, 0 Decimal Digits
+"^DD",9002018.35,9002018.35,.07,"DT")
+3030521
+"^DD",9002018.38,9002018.38,0)
+FIELD^^.01^1
+"^DD",9002018.38,9002018.38,0,"DT")
+3030527
+"^DD",9002018.38,9002018.38,0,"IX","B",9002018.38,.01)
+
+"^DD",9002018.38,9002018.38,0,"NM","BSDX ACCESS GROUP")
+
+"^DD",9002018.38,9002018.38,0,"PT",9002018.39,.01)
+
+"^DD",9002018.38,9002018.38,0,"VRPK")
+BSDX
+"^DD",9002018.38,9002018.38,.01,0)
+ACCESS GROUP^RF^^0;1^K:$L(X)>30!($L(X)<3)!'(X'?1P.E) X
+"^DD",9002018.38,9002018.38,.01,1,0)
+^.1
+"^DD",9002018.38,9002018.38,.01,1,1,0)
+9002018.38^B
+"^DD",9002018.38,9002018.38,.01,1,1,1)
+S ^BSDXAGP("B",$E(X,1,30),DA)=""
+"^DD",9002018.38,9002018.38,.01,1,1,2)
+K ^BSDXAGP("B",$E(X,1,30),DA)
+"^DD",9002018.38,9002018.38,.01,3)
+Answer must be 3-30 characters in length.
+"^DD",9002018.38,9002018.38,.01,"DT")
+3030527
+"^DD",9002018.39,9002018.39,0)
+FIELD^^.02^2
+"^DD",9002018.39,9002018.39,0,"DDA")
+N
+"^DD",9002018.39,9002018.39,0,"DT")
+3030527
+"^DD",9002018.39,9002018.39,0,"IX","B",9002018.39,.01)
+
+"^DD",9002018.39,9002018.39,0,"NM","BSDX ACCESS GROUP TYPE")
+
+"^DD",9002018.39,9002018.39,0,"VRPK")
+BSDX
+"^DD",9002018.39,9002018.39,.01,0)
+ACCESS GROUP^RP9002018.38'^BSDXAGP(^0;1^Q
+"^DD",9002018.39,9002018.39,.01,1,0)
+^.1
+"^DD",9002018.39,9002018.39,.01,1,1,0)
+9002018.39^B
+"^DD",9002018.39,9002018.39,.01,1,1,1)
+S ^BSDXAGTP("B",$E(X,1,30),DA)=""
+"^DD",9002018.39,9002018.39,.01,1,1,2)
+K ^BSDXAGTP("B",$E(X,1,30),DA)
+"^DD",9002018.39,9002018.39,.01,3)
+
+"^DD",9002018.39,9002018.39,.01,"DT")
+3030720
+"^DD",9002018.39,9002018.39,.02,0)
+ACCESS TYPE^P9002018.35'^BSDXTYPE(^0;2^Q
+"^DD",9002018.39,9002018.39,.02,"DT")
+3030720
+"^DD",9002018.4,9002018.4,0)
+FIELD^^1^14
+"^DD",9002018.4,9002018.4,0,"DT")
+3040615
+"^DD",9002018.4,9002018.4,0,"IX","ARSRC",9002018.4,.07)
+
+"^DD",9002018.4,9002018.4,0,"IX","B",9002018.4,.01)
+
+"^DD",9002018.4,9002018.4,0,"IX","CPAT",9002018.4,.05)
+
+"^DD",9002018.4,9002018.4,0,"NM","BSDX APPOINTMENT")
+
+"^DD",9002018.4,9002018.4,0,"VRPK")
+BSDX
+"^DD",9002018.4,9002018.4,.01,0)
+STARTTIME^RD^^0;1^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.01,1,0)
+^.1
+"^DD",9002018.4,9002018.4,.01,1,1,0)
+9002018.4^B
+"^DD",9002018.4,9002018.4,.01,1,1,1)
+S ^BSDXAPPT("B",$E(X,1,30),DA)=""
+"^DD",9002018.4,9002018.4,.01,1,1,2)
+K ^BSDXAPPT("B",$E(X,1,30),DA)
+"^DD",9002018.4,9002018.4,.01,3)
+
+"^DD",9002018.4,9002018.4,.01,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.02,0)
+ENDTIME^RD^^0;2^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.02,3)
+
+"^DD",9002018.4,9002018.4,.02,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.03,0)
+CHECKIN^RD^^0;3^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.03,3)
+
+"^DD",9002018.4,9002018.4,.03,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.04,0)
+AUXTIME^RD^^0;4^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.04,3)
+
+"^DD",9002018.4,9002018.4,.04,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.05,0)
+PATIENT^P9000001'^AUPNPAT(^0;5^Q
+"^DD",9002018.4,9002018.4,.05,1,0)
+^.1
+"^DD",9002018.4,9002018.4,.05,1,1,0)
+9002018.4^CPAT
+"^DD",9002018.4,9002018.4,.05,1,1,1)
+S ^BSDXAPPT("CPAT",$E(X,1,30),DA)=""
+"^DD",9002018.4,9002018.4,.05,1,1,2)
+K ^BSDXAPPT("CPAT",$E(X,1,30),DA)
+"^DD",9002018.4,9002018.4,.05,1,1,"%D",0)
+^^1^1^3040109^
+"^DD",9002018.4,9002018.4,.05,1,1,"%D",1,0)
+Cross reference of PATIENT field for lookup and sorting
+"^DD",9002018.4,9002018.4,.05,1,1,"DT")
+3040109
+"^DD",9002018.4,9002018.4,.05,"DT")
+3040109
+"^DD",9002018.4,9002018.4,.06,0)
+ACCESS TYPE ID^NJ6,0^^0;6^K:+X'=X!(X>999999)!(X<1)!(X?.E1"."1N.N) X
+"^DD",9002018.4,9002018.4,.06,3)
+Type a Number between 1 and 999999, 0 Decimal Digits
+"^DD",9002018.4,9002018.4,.06,"DT")
+3040614
+"^DD",9002018.4,9002018.4,.07,0)
+RESOURCE^P9002018.1'^BSDXRES(^0;7^Q
+"^DD",9002018.4,9002018.4,.07,1,0)
+^.1
+"^DD",9002018.4,9002018.4,.07,1,1,0)
+9002018.4^ARSRC^MUMPS
+"^DD",9002018.4,9002018.4,.07,1,1,1)
+D XR2S^BSDX03(DA)
+"^DD",9002018.4,9002018.4,.07,1,1,2)
+D XR2K^BSDX03(DA)
+"^DD",9002018.4,9002018.4,.07,1,1,"%D",0)
+^^1^1^3030512^
+"^DD",9002018.4,9002018.4,.07,1,1,"%D",1,0)
+This index is used to find all appointments for a given resource during a given time period
+"^DD",9002018.4,9002018.4,.07,1,1,"DT")
+3030512
+"^DD",9002018.4,9002018.4,.07,"DT")
+3030512
+"^DD",9002018.4,9002018.4,.08,0)
+DATA ENTRY CLERK^P200'^VA(200,^0;8^Q
+"^DD",9002018.4,9002018.4,.08,3)
+Enter the name of the clerk who made the appointment.
+"^DD",9002018.4,9002018.4,.08,21,0)
+^^1^1^3040214^
+"^DD",9002018.4,9002018.4,.08,21,1,0)
+Field contains the name of the clerk who made the appointment.
+"^DD",9002018.4,9002018.4,.08,"DT")
+3040214
+"^DD",9002018.4,9002018.4,.09,0)
+DATE APPT MADE^D^^0;9^S %DT="ETX" D ^%DT S X=Y K:X<1 X
+"^DD",9002018.4,9002018.4,.09,3)
+Enter the date the appointment was made.
+"^DD",9002018.4,9002018.4,.09,21,0)
+^^1^1^3040214^
+"^DD",9002018.4,9002018.4,.09,21,1,0)
+Field contains the date the appointment was made.
+"^DD",9002018.4,9002018.4,.09,"DT")
+3040214
+"^DD",9002018.4,9002018.4,.1,0)
+NOSHOW^S^1:YES;0:NO;^0;10^Q
+"^DD",9002018.4,9002018.4,.1,"DT")
+3040223
+"^DD",9002018.4,9002018.4,.11,0)
+REBOOK DATETIME^D^^0;11^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.11,"DT")
+3040613
+"^DD",9002018.4,9002018.4,.12,0)
+CANCEL DATETIME^D^^0;12^S %DT="ET" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.12,"DT")
+3040613
+"^DD",9002018.4,9002018.4,.13,0)
+WALKIN^S^y:YES;n:NO;^0;13^Q
+"^DD",9002018.4,9002018.4,.13,"DT")
+3040615
+"^DD",9002018.4,9002018.4,1,0)
+NOTE^9002018.41^^1;0
+"^DD",9002018.4,9002018.41,0)
+NOTE SUB-FIELD^^.01^1
+"^DD",9002018.4,9002018.41,0,"DT")
+3030508
+"^DD",9002018.4,9002018.41,0,"NM","NOTE")
+
+"^DD",9002018.4,9002018.41,0,"UP")
+9002018.4
+"^DD",9002018.4,9002018.41,.01,0)
+NOTE^W^^0;1^Q
+"^DD",9002018.4,9002018.41,.01,"DT")
+3030508
+"^DD",9002018.5,9002018.5,0)
+FIELD^^.03^3
+"^DD",9002018.5,9002018.5,0,"DT")
+3040226
+"^DD",9002018.5,9002018.5,0,"IX","B",9002018.5,.01)
+
+"^DD",9002018.5,9002018.5,0,"NM","BSDX APPLICATION")
+
+"^DD",9002018.5,9002018.5,0,"VRPK")
+BSDX
+"^DD",9002018.5,9002018.5,.01,0)
+MAJOR VERSION^RF^^0;1^K:$L(X)>30!($L(X)<1)!'(X'?1P.E) X
+"^DD",9002018.5,9002018.5,.01,1,0)
+^.1
+"^DD",9002018.5,9002018.5,.01,1,1,0)
+9002018.5^B
+"^DD",9002018.5,9002018.5,.01,1,1,1)
+S ^BSDXAPPL("B",$E(X,1,30),DA)=""
+"^DD",9002018.5,9002018.5,.01,1,1,2)
+K ^BSDXAPPL("B",$E(X,1,30),DA)
+"^DD",9002018.5,9002018.5,.01,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.5,9002018.5,.01,"DT")
+3040226
+"^DD",9002018.5,9002018.5,.02,0)
+MINOR VERSION^RF^^0;2^K:$L(X)>30!($L(X)<1)!'(X'?1P.E) X
+"^DD",9002018.5,9002018.5,.02,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.5,9002018.5,.02,"DT")
+3040226
+"^DD",9002018.5,9002018.5,.03,0)
+BUILD^D^^0;3^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.5,9002018.5,.03,"DT")
+3040226
+"^DIC",9002018.1,9002018.1,0)
+BSDX RESOURCE^9002018.1
+"^DIC",9002018.1,9002018.1,0,"GL")
+^BSDXRES(
+"^DIC",9002018.1,"B","BSDX RESOURCE",9002018.1)
+
+"^DIC",9002018.15,9002018.15,0)
+BSDX RESOURCE USER^9002018.15
+"^DIC",9002018.15,9002018.15,0,"GL")
+^BSDXRSU(
+"^DIC",9002018.15,"B","BSDX RESOURCE USER",9002018.15)
+
+"^DIC",9002018.2,9002018.2,0)
+BSDX RESOURCE GROUP^9002018.2
+"^DIC",9002018.2,9002018.2,0,"GL")
+^BSDXDEPT(
+"^DIC",9002018.2,"B","BSDX RESOURCE GROUP",9002018.2)
+
+"^DIC",9002018.3,9002018.3,0)
+BSDX ACCESS BLOCK^9002018.3
+"^DIC",9002018.3,9002018.3,0,"GL")
+^BSDXAB(
+"^DIC",9002018.3,"B","BSDX ACCESS BLOCK",9002018.3)
+
+"^DIC",9002018.35,9002018.35,0)
+BSDX ACCESS TYPE^9002018.35
+"^DIC",9002018.35,9002018.35,0,"GL")
+^BSDXTYPE(
+"^DIC",9002018.35,"B","BSDX ACCESS TYPE",9002018.35)
+
+"^DIC",9002018.38,9002018.38,0)
+BSDX ACCESS GROUP^9002018.38
+"^DIC",9002018.38,9002018.38,0,"GL")
+^BSDXAGP(
+"^DIC",9002018.38,"B","BSDX ACCESS GROUP",9002018.38)
+
+"^DIC",9002018.39,9002018.39,0)
+BSDX ACCESS GROUP TYPE^9002018.39
+"^DIC",9002018.39,9002018.39,0,"GL")
+^BSDXAGTP(
+"^DIC",9002018.39,"B","BSDX ACCESS GROUP TYPE",9002018.39)
+
+"^DIC",9002018.4,9002018.4,0)
+BSDX APPOINTMENT^9002018.4
+"^DIC",9002018.4,9002018.4,0,"GL")
+^BSDXAPPT(
+"^DIC",9002018.4,"B","BSDX APPOINTMENT",9002018.4)
+
+"^DIC",9002018.5,9002018.5,0)
+BSDX APPLICATION^9002018.5
+"^DIC",9002018.5,9002018.5,0,"GL")
+^BSDXAPPL(
+"^DIC",9002018.5,"B","BSDX APPLICATION",9002018.5)
+
+**END**
+**END**
Index: Scheduling/branches/Radiology-Support/kids/bsdx0150.v2.k
===================================================================
--- Scheduling/branches/Radiology-Support/kids/bsdx0150.v2.k	(revision 1134)
+++ Scheduling/branches/Radiology-Support/kids/bsdx0150.v2.k	(revision 1134)
@@ -0,0 +1,13376 @@
+KIDS Distribution saved on Mar 03, 2011@05:06:47
+VISTA Windows Scheduling v1.5 Alpha 2
+**KIDS**:BSDX 1.5V2^
+
+**INSTALL NAME**
+BSDX 1.5V2
+"BLD",7655,0)
+BSDX 1.5V2^IHS Windows Scheduling^^3110303^n
+"BLD",7655,1,0)
+^^1^1^3110125^^^^
+"BLD",7655,1,1,0)
+Clinical Scheduling M Server support routines, files, options and RPCs.
+"BLD",7655,4,0)
+^9.64PA^9002018.5^9
+"BLD",7655,4,9002018.1,0)
+9002018.1
+"BLD",7655,4,9002018.1,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.15,0)
+9002018.15
+"BLD",7655,4,9002018.15,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.2,0)
+9002018.2
+"BLD",7655,4,9002018.2,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.3,0)
+9002018.3
+"BLD",7655,4,9002018.3,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.35,0)
+9002018.35
+"BLD",7655,4,9002018.35,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.38,0)
+9002018.38
+"BLD",7655,4,9002018.38,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.39,0)
+9002018.39
+"BLD",7655,4,9002018.39,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.4,0)
+9002018.4
+"BLD",7655,4,9002018.4,222)
+y^y^f^^n^^n^o^n
+"BLD",7655,4,9002018.5,0)
+9002018.5
+"BLD",7655,4,9002018.5,222)
+y^y^f^^n^^y^o^n
+"BLD",7655,4,"B",9002018.1,9002018.1)
+
+"BLD",7655,4,"B",9002018.15,9002018.15)
+
+"BLD",7655,4,"B",9002018.2,9002018.2)
+
+"BLD",7655,4,"B",9002018.3,9002018.3)
+
+"BLD",7655,4,"B",9002018.35,9002018.35)
+
+"BLD",7655,4,"B",9002018.38,9002018.38)
+
+"BLD",7655,4,"B",9002018.39,9002018.39)
+
+"BLD",7655,4,"B",9002018.4,9002018.4)
+
+"BLD",7655,4,"B",9002018.5,9002018.5)
+
+"BLD",7655,6.3)
+12
+"BLD",7655,"ABPKG")
+n
+"BLD",7655,"INIT")
+V0200^BSDX2E
+"BLD",7655,"KRN",0)
+^9.67PA^8989.52^19
+"BLD",7655,"KRN",.4,0)
+.4
+"BLD",7655,"KRN",.4,"NM",0)
+^9.68A^^
+"BLD",7655,"KRN",.401,0)
+.401
+"BLD",7655,"KRN",.402,0)
+.402
+"BLD",7655,"KRN",.403,0)
+.403
+"BLD",7655,"KRN",.5,0)
+.5
+"BLD",7655,"KRN",.84,0)
+.84
+"BLD",7655,"KRN",3.6,0)
+3.6
+"BLD",7655,"KRN",3.8,0)
+3.8
+"BLD",7655,"KRN",9.2,0)
+9.2
+"BLD",7655,"KRN",9.8,0)
+9.8
+"BLD",7655,"KRN",9.8,"NM",0)
+^9.68A^36^36
+"BLD",7655,"KRN",9.8,"NM",1,0)
+BSDX01^^0^B107139484
+"BLD",7655,"KRN",9.8,"NM",2,0)
+BSDX02^^0^B16323271
+"BLD",7655,"KRN",9.8,"NM",3,0)
+BSDX03^^0^B2855259
+"BLD",7655,"KRN",9.8,"NM",4,0)
+BSDX04^^0^B24350739
+"BLD",7655,"KRN",9.8,"NM",5,0)
+BSDX05^^0^B10878471
+"BLD",7655,"KRN",9.8,"NM",6,0)
+BSDX06^^0^B6812445
+"BLD",7655,"KRN",9.8,"NM",7,0)
+BSDX07^^0^B188802132
+"BLD",7655,"KRN",9.8,"NM",8,0)
+BSDX08^^0^B118482818
+"BLD",7655,"KRN",9.8,"NM",9,0)
+BSDX09^^0^B35707298
+"BLD",7655,"KRN",9.8,"NM",10,0)
+BSDX12^^0^B7203579
+"BLD",7655,"KRN",9.8,"NM",11,0)
+BSDX13^^0^B9772451
+"BLD",7655,"KRN",9.8,"NM",12,0)
+BSDX14^^0^B6450810
+"BLD",7655,"KRN",9.8,"NM",13,0)
+BSDX15^^0^B5327807
+"BLD",7655,"KRN",9.8,"NM",14,0)
+BSDX16^^0^B11948965
+"BLD",7655,"KRN",9.8,"NM",15,0)
+BSDX17^^0^B2072173
+"BLD",7655,"KRN",9.8,"NM",16,0)
+BSDX18^^0^B87953431
+"BLD",7655,"KRN",9.8,"NM",17,0)
+BSDX19^^0^B7890401
+"BLD",7655,"KRN",9.8,"NM",18,0)
+BSDX20^^0^B5911607
+"BLD",7655,"KRN",9.8,"NM",19,0)
+BSDX21^^0^B8672065
+"BLD",7655,"KRN",9.8,"NM",20,0)
+BSDX22^^0^B9479861
+"BLD",7655,"KRN",9.8,"NM",21,0)
+BSDX23^^0^B8488013
+"BLD",7655,"KRN",9.8,"NM",22,0)
+BSDX24^^0^B13455014
+"BLD",7655,"KRN",9.8,"NM",23,0)
+BSDX25^^0^B21230952
+"BLD",7655,"KRN",9.8,"NM",24,0)
+BSDX26^^0^B30714245
+"BLD",7655,"KRN",9.8,"NM",25,0)
+BSDX27^^0^B133007616
+"BLD",7655,"KRN",9.8,"NM",26,0)
+BSDX28^^0^B32389827
+"BLD",7655,"KRN",9.8,"NM",27,0)
+BSDX29^^0^B51424449
+"BLD",7655,"KRN",9.8,"NM",28,0)
+BSDX30^^0^B6616255
+"BLD",7655,"KRN",9.8,"NM",29,0)
+BSDX31^^0^B67823338
+"BLD",7655,"KRN",9.8,"NM",30,0)
+BSDX32^^0^B17196738
+"BLD",7655,"KRN",9.8,"NM",31,0)
+BSDX33^^0^B14923306
+"BLD",7655,"KRN",9.8,"NM",32,0)
+BSDX34^^0^B43182525
+"BLD",7655,"KRN",9.8,"NM",33,0)
+BSDX35^^0^B8147998
+"BLD",7655,"KRN",9.8,"NM",34,0)
+BSDX11^^0^B6358791
+"BLD",7655,"KRN",9.8,"NM",35,0)
+BSDXAPI^^0^B148584022
+"BLD",7655,"KRN",9.8,"NM",36,0)
+BSDXGPRV^^0^B4804670
+"BLD",7655,"KRN",9.8,"NM","B","BSDX01",1)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX02",2)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX03",3)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX04",4)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX05",5)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX06",6)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX07",7)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX08",8)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX09",9)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX11",34)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX12",10)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX13",11)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX14",12)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX15",13)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX16",14)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX17",15)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX18",16)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX19",17)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX20",18)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX21",19)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX22",20)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX23",21)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX24",22)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX25",23)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX26",24)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX27",25)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX28",26)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX29",27)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX30",28)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX31",29)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX32",30)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX33",31)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX34",32)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDX35",33)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDXAPI",35)
+
+"BLD",7655,"KRN",9.8,"NM","B","BSDXGPRV",36)
+
+"BLD",7655,"KRN",19,0)
+19
+"BLD",7655,"KRN",19,"NM",0)
+^9.68A^1^1
+"BLD",7655,"KRN",19,"NM",1,0)
+BSDXRPC^^0
+"BLD",7655,"KRN",19,"NM","B","BSDXRPC",1)
+
+"BLD",7655,"KRN",19.1,0)
+19.1
+"BLD",7655,"KRN",19.1,"NM",0)
+^9.68A^2^2
+"BLD",7655,"KRN",19.1,"NM",1,0)
+BSDXZMENU^^0
+"BLD",7655,"KRN",19.1,"NM",2,0)
+BSDXZMGR^^0
+"BLD",7655,"KRN",19.1,"NM","B","BSDXZMENU",1)
+
+"BLD",7655,"KRN",19.1,"NM","B","BSDXZMGR",2)
+
+"BLD",7655,"KRN",101,0)
+101
+"BLD",7655,"KRN",101,"NM",0)
+^9.68A^4^4
+"BLD",7655,"KRN",101,"NM",1,0)
+BSDX ADD APPOINTMENT^^0
+"BLD",7655,"KRN",101,"NM",2,0)
+BSDX CANCEL APPOINTMENT^^0
+"BLD",7655,"KRN",101,"NM",3,0)
+BSDX CHECKIN APPOINTMENT^^0
+"BLD",7655,"KRN",101,"NM",4,0)
+BSDX NOSHOW APPOINTMENT^^0
+"BLD",7655,"KRN",101,"NM","B","BSDX ADD APPOINTMENT",1)
+
+"BLD",7655,"KRN",101,"NM","B","BSDX CANCEL APPOINTMENT",2)
+
+"BLD",7655,"KRN",101,"NM","B","BSDX CHECKIN APPOINTMENT",3)
+
+"BLD",7655,"KRN",101,"NM","B","BSDX NOSHOW APPOINTMENT",4)
+
+"BLD",7655,"KRN",409.61,0)
+409.61
+"BLD",7655,"KRN",771,0)
+771
+"BLD",7655,"KRN",870,0)
+870
+"BLD",7655,"KRN",8989.51,0)
+8989.51
+"BLD",7655,"KRN",8989.52,0)
+8989.52
+"BLD",7655,"KRN",8994,0)
+8994
+"BLD",7655,"KRN",8994,"NM",0)
+^9.68A^104^101
+"BLD",7655,"KRN",8994,"NM",1,0)
+BSDX ADD NEW APPOINTMENT^^0
+"BLD",7655,"KRN",8994,"NM",2,0)
+BSDX ADD NEW AVAILABILITY^^0
+"BLD",7655,"KRN",8994,"NM",3,0)
+BSDX APPT BLOCKS OVERLAP^^0
+"BLD",7655,"KRN",8994,"NM",4,0)
+BSDX CANCEL APPOINTMENT^^0
+"BLD",7655,"KRN",8994,"NM",5,0)
+BSDX CANCEL AVAILABILITY^^0
+"BLD",7655,"KRN",8994,"NM",6,0)
+BSDX CREATE APPT SCHEDULE^^0
+"BLD",7655,"KRN",8994,"NM",7,0)
+BSDX CREATE ASGND SLOT SCHED^^0
+"BLD",7655,"KRN",8994,"NM",10,0)
+BSDX GET BASIC REG INFO^^0
+"BLD",7655,"KRN",8994,"NM",12,0)
+BSDX TYPE BLOCKS OVERLAP^^0
+"BLD",7655,"KRN",8994,"NM",13,0)
+BSDX ADD/EDIT ACCESS TYPE^^0
+"BLD",7655,"KRN",8994,"NM",14,0)
+BSDX GET ACCESS GROUP TYPES^^0
+"BLD",7655,"KRN",8994,"NM",15,0)
+BSDX GROUP RESOURCE^^0
+"BLD",7655,"KRN",8994,"NM",16,0)
+BSDX RESOURCE GROUPS BY USER^^0
+"BLD",7655,"KRN",8994,"NM",17,0)
+BSDX ADD/EDIT RESOURCEUSER^^0
+"BLD",7655,"KRN",8994,"NM",18,0)
+BSDX DELETE RESOURCEUSER^^0
+"BLD",7655,"KRN",8994,"NM",19,0)
+BSDX SCHEDULE USER^^0
+"BLD",7655,"KRN",8994,"NM",20,0)
+BSDX ADD/EDIT RESOURCE^^0
+"BLD",7655,"KRN",8994,"NM",21,0)
+BSDX SCHEDULING USER INFO^^0
+"BLD",7655,"KRN",8994,"NM",22,0)
+BSDX RESOURCES^^0
+"BLD",7655,"KRN",8994,"NM",23,0)
+BSDX ADD/EDIT RESOURCE GROUP^^0
+"BLD",7655,"KRN",8994,"NM",24,0)
+BSDX DELETE RESOURCE GROUP^^0
+"BLD",7655,"KRN",8994,"NM",25,0)
+BSDX DELETE RES GROUP ITEM^^0
+"BLD",7655,"KRN",8994,"NM",26,0)
+BSDX DEPARTMENT RESOURCE^^0
+"BLD",7655,"KRN",8994,"NM",27,0)
+BSDX DEPARTMENTS BY USER^^0
+"BLD",7655,"KRN",8994,"NM",28,0)
+BSDX RESOURCES BY USER^^0
+"BLD",7655,"KRN",8994,"NM",29,0)
+BSDX ADD ACCESS GROUP ITEM^^0
+"BLD",7655,"KRN",8994,"NM",30,0)
+BSDX ADD RES GROUP ITEM^^0
+"BLD",7655,"KRN",8994,"NM",31,0)
+BSDX ADD/EDIT ACCESS GROUP^^0
+"BLD",7655,"KRN",8994,"NM",32,0)
+BSDX DELETE ACCESS GROUP^^0
+"BLD",7655,"KRN",8994,"NM",33,0)
+BSDX DELETE ACCESS GROUP ITEM^^0
+"BLD",7655,"KRN",8994,"NM",34,0)
+BSDX REGISTER EVENT^^0
+"BLD",7655,"KRN",8994,"NM",35,0)
+BSDX UNREGISTER EVENT^^0
+"BLD",7655,"KRN",8994,"NM",36,0)
+BSDX RAISE EVENT^^0
+"BLD",7655,"KRN",8994,"NM",37,0)
+BSDX SEARCH AVAILABILITY^^0
+"BLD",7655,"KRN",8994,"NM",38,0)
+BSDX CHECKIN APPOINTMENT^^0
+"BLD",7655,"KRN",8994,"NM",39,0)
+BSDX EDIT APPOINTMENT^^0
+"BLD",7655,"KRN",8994,"NM",40,0)
+BSDX PATIENT APPT DISPLAY^^0
+"BLD",7655,"KRN",8994,"NM",41,0)
+BSDXPatientLookupRS^^0
+"BLD",7655,"KRN",8994,"NM",42,0)
+BSDX SPACEBAR SET^^0
+"BLD",7655,"KRN",8994,"NM",43,0)
+BSDX COPY APPOINTMENT CANCEL^^0
+"BLD",7655,"KRN",8994,"NM",44,0)
+BSDX COPY APPOINTMENT STATUS^^0
+"BLD",7655,"KRN",8994,"NM",45,0)
+BSDX COPY APPOINTMENTS^^0
+"BLD",7655,"KRN",8994,"NM",46,0)
+BSDX CLINIC LETTERS^^0
+"BLD",7655,"KRN",8994,"NM",47,0)
+BSDX NOSHOW^^0
+"BLD",7655,"KRN",8994,"NM",48,0)
+BSDX IM HERE^^0
+"BLD",7655,"KRN",8994,"NM",49,0)
+BSDX HOSPITAL LOCATION^^0
+"BLD",7655,"KRN",8994,"NM",50,0)
+BSDX CLINIC SETUP^^0
+"BLD",7655,"KRN",8994,"NM",51,0)
+BSDX REBOOK LIST^^0
+"BLD",7655,"KRN",8994,"NM",52,0)
+BSDX REBOOK CLINIC LIST^^0
+"BLD",7655,"KRN",8994,"NM",53,0)
+BSDX REBOOK SET^^0
+"BLD",7655,"KRN",8994,"NM",54,0)
+BSDX RESOURCE LETTERS^^0
+"BLD",7655,"KRN",8994,"NM",55,0)
+BSDX CANCEL CLINIC LIST^^0
+"BLD",7655,"KRN",8994,"NM",56,0)
+BSDX CANCEL AV BY DATE^^0
+"BLD",7655,"KRN",8994,"NM",57,0)
+BSDX REBOOK NEXT BLOCK^^0
+"BLD",7655,"KRN",8994,"NM",58,0)
+BSDX EHR PATIENT^^0
+"BLD",7655,"KRN",8994,"NM",59,0)
+BSDX HOSP LOC PROVIDERS^^0
+"BLD",7655,"KRN",8994,"NM",60,0)
+BMX ADO SS^^0
+"BLD",7655,"KRN",8994,"NM",61,0)
+BMX ASYNC GET^^0
+"BLD",7655,"KRN",8994,"NM",62,0)
+BMX ASYNC QUEUE^^0
+"BLD",7655,"KRN",8994,"NM",63,0)
+BMX AV CODE^^0
+"BLD",7655,"KRN",8994,"NM",64,0)
+BMX DEMO^^0
+"BLD",7655,"KRN",8994,"NM",65,0)
+BMX DENTAL REPORT 1^^0
+"BLD",7655,"KRN",8994,"NM",66,0)
+BMX DENTAL REPORT 2^^0
+"BLD",7655,"KRN",8994,"NM",67,0)
+BMX EVENT POLL^^0
+"BLD",7655,"KRN",8994,"NM",68,0)
+BMX EVENT RAISE^^0
+"BLD",7655,"KRN",8994,"NM",69,0)
+BMX EVENT REGISTER^^0
+"BLD",7655,"KRN",8994,"NM",70,0)
+BMX EVENT UNREGISTER^^0
+"BLD",7655,"KRN",8994,"NM",71,0)
+BMX FIELD LIST^^0
+"BLD",7655,"KRN",8994,"NM",72,0)
+BMX FIND^^0
+"BLD",7655,"KRN",8994,"NM",73,0)
+BMX GET VARIABLE VALUE^^0
+"BLD",7655,"KRN",8994,"NM",74,0)
+BMX HEALTH SUMMARY^^0
+"BLD",7655,"KRN",8994,"NM",75,0)
+BMX IM HERE^^0
+"BLD",7655,"KRN",8994,"NM",76,0)
+BMX LOCK^^0
+"BLD",7655,"KRN",8994,"NM",77,0)
+BMX LOOKUP^^0
+"BLD",7655,"KRN",8994,"NM",78,0)
+BMX MULT LIST^^0
+"BLD",7655,"KRN",8994,"NM",79,0)
+BMX NTUSER^^0
+"BLD",7655,"KRN",8994,"NM",80,0)
+BMX PATIENT DEMOG DATA GET^^0
+"BLD",7655,"KRN",8994,"NM",81,0)
+BMX PDATA CHART^^0
+"BLD",7655,"KRN",8994,"NM",82,0)
+BMX SCHEMA ONLY^^0
+"BLD",7655,"KRN",8994,"NM",83,0)
+BMX SECURITY KEY^^0
+"BLD",7655,"KRN",8994,"NM",84,0)
+BMX SIGNATURE^^0
+"BLD",7655,"KRN",8994,"NM",85,0)
+BMX SQL^^0
+"BLD",7655,"KRN",8994,"NM",86,0)
+BMX SQL COLINFO^^0
+"BLD",7655,"KRN",8994,"NM",87,0)
+BMX TABLE^^0
+"BLD",7655,"KRN",8994,"NM",88,0)
+BMX TEST^^0
+"BLD",7655,"KRN",8994,"NM",89,0)
+BMX TIMER TEST^^0
+"BLD",7655,"KRN",8994,"NM",90,0)
+BMX TLIST^^0
+"BLD",7655,"KRN",8994,"NM",91,0)
+BMX UPDATE^^0
+"BLD",7655,"KRN",8994,"NM",92,0)
+BMX USER^^0
+"BLD",7655,"KRN",8994,"NM",93,0)
+BMX UTF-8^^0
+"BLD",7655,"KRN",8994,"NM",94,0)
+BMX VERSION INFO^^0
+"BLD",7655,"KRN",8994,"NM",95,0)
+BMXGetFac^^0
+"BLD",7655,"KRN",8994,"NM",96,0)
+BMXGetFacRS^^0
+"BLD",7655,"KRN",8994,"NM",97,0)
+BMXNRC^^0
+"BLD",7655,"KRN",8994,"NM",98,0)
+BMXNetGetCodes^^0
+"BLD",7655,"KRN",8994,"NM",99,0)
+BMXNetSetUser^^0
+"BLD",7655,"KRN",8994,"NM",100,0)
+BMXPatientInfoRS^^0
+"BLD",7655,"KRN",8994,"NM",101,0)
+BMXPatientLookupRS^^0
+"BLD",7655,"KRN",8994,"NM",102,0)
+BMXProviderLookupRS^^0
+"BLD",7655,"KRN",8994,"NM",103,0)
+BMXSetFac^^0
+"BLD",7655,"KRN",8994,"NM",104,0)
+BMXUserKeyRS^^0
+"BLD",7655,"KRN",8994,"NM","B","BMX ADO SS",60)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX ASYNC GET",61)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX ASYNC QUEUE",62)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX AV CODE",63)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX DEMO",64)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX DENTAL REPORT 1",65)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX DENTAL REPORT 2",66)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX EVENT POLL",67)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX EVENT RAISE",68)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX EVENT REGISTER",69)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX EVENT UNREGISTER",70)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX FIELD LIST",71)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX FIND",72)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX GET VARIABLE VALUE",73)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX HEALTH SUMMARY",74)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX IM HERE",75)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX LOCK",76)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX LOOKUP",77)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX MULT LIST",78)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX NTUSER",79)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX PATIENT DEMOG DATA GET",80)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX PDATA CHART",81)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX SCHEMA ONLY",82)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX SECURITY KEY",83)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX SIGNATURE",84)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX SQL",85)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX SQL COLINFO",86)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX TABLE",87)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX TEST",88)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX TIMER TEST",89)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX TLIST",90)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX UPDATE",91)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX USER",92)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX UTF-8",93)
+
+"BLD",7655,"KRN",8994,"NM","B","BMX VERSION INFO",94)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXGetFac",95)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXGetFacRS",96)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXNRC",97)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXNetGetCodes",98)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXNetSetUser",99)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXPatientInfoRS",100)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXPatientLookupRS",101)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXProviderLookupRS",102)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXSetFac",103)
+
+"BLD",7655,"KRN",8994,"NM","B","BMXUserKeyRS",104)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD ACCESS GROUP ITEM",29)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD NEW APPOINTMENT",1)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD NEW AVAILABILITY",2)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD RES GROUP ITEM",30)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD/EDIT ACCESS GROUP",31)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD/EDIT ACCESS TYPE",13)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD/EDIT RESOURCE",20)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD/EDIT RESOURCE GROUP",23)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX ADD/EDIT RESOURCEUSER",17)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX APPT BLOCKS OVERLAP",3)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CANCEL APPOINTMENT",4)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CANCEL AV BY DATE",56)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CANCEL AVAILABILITY",5)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CANCEL CLINIC LIST",55)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CHECKIN APPOINTMENT",38)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CLINIC LETTERS",46)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CLINIC SETUP",50)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX COPY APPOINTMENT CANCEL",43)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX COPY APPOINTMENT STATUS",44)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX COPY APPOINTMENTS",45)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CREATE APPT SCHEDULE",6)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX CREATE ASGND SLOT SCHED",7)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX DELETE ACCESS GROUP",32)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX DELETE ACCESS GROUP ITEM",33)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX DELETE RES GROUP ITEM",25)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX DELETE RESOURCE GROUP",24)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX DELETE RESOURCEUSER",18)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX DEPARTMENT RESOURCE",26)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX DEPARTMENTS BY USER",27)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX EDIT APPOINTMENT",39)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX EHR PATIENT",58)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX GET ACCESS GROUP TYPES",14)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX GET BASIC REG INFO",10)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX GROUP RESOURCE",15)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX HOSP LOC PROVIDERS",59)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX HOSPITAL LOCATION",49)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX IM HERE",48)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX NOSHOW",47)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX PATIENT APPT DISPLAY",40)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX RAISE EVENT",36)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX REBOOK CLINIC LIST",52)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX REBOOK LIST",51)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX REBOOK NEXT BLOCK",57)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX REBOOK SET",53)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX REGISTER EVENT",34)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX RESOURCE GROUPS BY USER",16)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX RESOURCE LETTERS",54)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX RESOURCES",22)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX RESOURCES BY USER",28)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX SCHEDULE USER",19)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX SCHEDULING USER INFO",21)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX SEARCH AVAILABILITY",37)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX SPACEBAR SET",42)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX TYPE BLOCKS OVERLAP",12)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDX UNREGISTER EVENT",35)
+
+"BLD",7655,"KRN",8994,"NM","B","BSDXPatientLookupRS",41)
+
+"BLD",7655,"KRN","B",.4,.4)
+
+"BLD",7655,"KRN","B",.401,.401)
+
+"BLD",7655,"KRN","B",.402,.402)
+
+"BLD",7655,"KRN","B",.403,.403)
+
+"BLD",7655,"KRN","B",.5,.5)
+
+"BLD",7655,"KRN","B",.84,.84)
+
+"BLD",7655,"KRN","B",3.6,3.6)
+
+"BLD",7655,"KRN","B",3.8,3.8)
+
+"BLD",7655,"KRN","B",9.2,9.2)
+
+"BLD",7655,"KRN","B",9.8,9.8)
+
+"BLD",7655,"KRN","B",19,19)
+
+"BLD",7655,"KRN","B",19.1,19.1)
+
+"BLD",7655,"KRN","B",101,101)
+
+"BLD",7655,"KRN","B",409.61,409.61)
+
+"BLD",7655,"KRN","B",771,771)
+
+"BLD",7655,"KRN","B",870,870)
+
+"BLD",7655,"KRN","B",8989.51,8989.51)
+
+"BLD",7655,"KRN","B",8989.52,8989.52)
+
+"BLD",7655,"KRN","B",8994,8994)
+
+"BLD",7655,"PRE")
+BSDX2E
+"BLD",7655,"QUES",0)
+^9.62^^
+"BLD",7655,"REQB",0)
+^9.611^^
+"DATA",9002018.5,1,0)
+1^5^3110303.0501
+"FIA",9002018.1)
+BSDX RESOURCE
+"FIA",9002018.1,0)
+^BSDXRES(
+"FIA",9002018.1,0,0)
+9002018.1
+"FIA",9002018.1,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.1,0,10)
+
+"FIA",9002018.1,0,11)
+
+"FIA",9002018.1,0,"RLRO")
+
+"FIA",9002018.1,0,"VR")
+1.5V2^BSDX
+"FIA",9002018.1,9002018.1)
+0
+"FIA",9002018.1,9002018.11)
+0
+"FIA",9002018.1,9002018.11201)
+0
+"FIA",9002018.1,9002018.11301)
+0
+"FIA",9002018.1,9002018.12001)
+0
+"FIA",9002018.15)
+BSDX RESOURCE USER
+"FIA",9002018.15,0)
+^BSDXRSU(
+"FIA",9002018.15,0,0)
+9002018.15P
+"FIA",9002018.15,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.15,0,10)
+
+"FIA",9002018.15,0,11)
+
+"FIA",9002018.15,0,"RLRO")
+
+"FIA",9002018.15,0,"VR")
+1.5V2^BSDX
+"FIA",9002018.15,9002018.15)
+0
+"FIA",9002018.2)
+BSDX RESOURCE GROUP
+"FIA",9002018.2,0)
+^BSDXDEPT(
+"FIA",9002018.2,0,0)
+9002018.2
+"FIA",9002018.2,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.2,0,10)
+
+"FIA",9002018.2,0,11)
+
+"FIA",9002018.2,0,"RLRO")
+
+"FIA",9002018.2,0,"VR")
+1.5V2^BSDX
+"FIA",9002018.2,9002018.2)
+0
+"FIA",9002018.2,9002018.21)
+0
+"FIA",9002018.3)
+BSDX ACCESS BLOCK
+"FIA",9002018.3,0)
+^BSDXAB(
+"FIA",9002018.3,0,0)
+9002018.3PA
+"FIA",9002018.3,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.3,0,10)
+
+"FIA",9002018.3,0,11)
+
+"FIA",9002018.3,0,"RLRO")
+
+"FIA",9002018.3,0,"VR")
+1.5V2^BSDX
+"FIA",9002018.3,9002018.3)
+0
+"FIA",9002018.3,9002018.31)
+0
+"FIA",9002018.35)
+BSDX ACCESS TYPE
+"FIA",9002018.35,0)
+^BSDXTYPE(
+"FIA",9002018.35,0,0)
+9002018.35
+"FIA",9002018.35,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.35,0,10)
+
+"FIA",9002018.35,0,11)
+
+"FIA",9002018.35,0,"RLRO")
+
+"FIA",9002018.35,0,"VR")
+1.5V2^BSDX
+"FIA",9002018.35,9002018.35)
+0
+"FIA",9002018.38)
+BSDX ACCESS GROUP
+"FIA",9002018.38,0)
+^BSDXAGP(
+"FIA",9002018.38,0,0)
+9002018.38
+"FIA",9002018.38,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.38,0,10)
+
+"FIA",9002018.38,0,11)
+
+"FIA",9002018.38,0,"RLRO")
+
+"FIA",9002018.38,0,"VR")
+1.5V2^BSDX
+"FIA",9002018.38,9002018.38)
+0
+"FIA",9002018.39)
+BSDX ACCESS GROUP TYPE
+"FIA",9002018.39,0)
+^BSDXAGTP(
+"FIA",9002018.39,0,0)
+9002018.39P
+"FIA",9002018.39,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.39,0,10)
+
+"FIA",9002018.39,0,11)
+
+"FIA",9002018.39,0,"RLRO")
+
+"FIA",9002018.39,0,"VR")
+1.5V2^BSDX
+"FIA",9002018.39,9002018.39)
+0
+"FIA",9002018.4)
+BSDX APPOINTMENT
+"FIA",9002018.4,0)
+^BSDXAPPT(
+"FIA",9002018.4,0,0)
+9002018.4DA
+"FIA",9002018.4,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.4,0,10)
+
+"FIA",9002018.4,0,11)
+
+"FIA",9002018.4,0,"RLRO")
+
+"FIA",9002018.4,0,"VR")
+1.5V2^BSDX
+"FIA",9002018.4,9002018.4)
+0
+"FIA",9002018.4,9002018.41)
+0
+"FIA",9002018.5)
+BSDX APPLICATION
+"FIA",9002018.5,0)
+^BSDXAPPL(
+"FIA",9002018.5,0,0)
+9002018.5
+"FIA",9002018.5,0,1)
+y^y^f^^n^^y^o^n
+"FIA",9002018.5,0,10)
+
+"FIA",9002018.5,0,11)
+
+"FIA",9002018.5,0,"RLRO")
+
+"FIA",9002018.5,0,"VR")
+1.5V2^BSDX
+"FIA",9002018.5,9002018.5)
+0
+"INIT")
+V0200^BSDX2E
+"IX",9002018.39,9002018.39,"AC",0)
+9002018.39^AC^INDEX OF ACCESS GROUP, ACCESS TYPE^R^^R^IR^I^9002018.39^^^^^S
+"IX",9002018.39,9002018.39,"AC",1)
+S ^BSDXAGTP("AC",$E(X(1),1,30),$E(X(2),1,30),DA)=""
+"IX",9002018.39,9002018.39,"AC",2)
+K ^BSDXAGTP("AC",$E(X(1),1,30),$E(X(2),1,30),DA)
+"IX",9002018.39,9002018.39,"AC",2.5)
+K ^BSDXAGTP("AC")
+"IX",9002018.39,9002018.39,"AC",11.1,0)
+^.114IA^2^2
+"IX",9002018.39,9002018.39,"AC",11.1,1,0)
+1^F^9002018.39^.01^30^1^F
+"IX",9002018.39,9002018.39,"AC",11.1,1,3)
+
+"IX",9002018.39,9002018.39,"AC",11.1,2,0)
+2^F^9002018.39^.02^30^2^F
+"IX",9002018.39,9002018.39,"AC",11.1,2,3)
+
+"KRN",19,10987,-1)
+0^1
+"KRN",19,10987,0)
+BSDXRPC^WINDOWS SCHEDULING PROCEDURE CALLS^^B^^^^^^^^IHS Windows Scheduling
+"KRN",19,10987,1,0)
+^19.06^4^4^3100618^^
+"KRN",19,10987,1,1,0)
+This option hosts RPCs in the BSDX namespace.  Windows Scheduling users
+"KRN",19,10987,1,2,0)
+ mustg have access to this option
+"KRN",19,10987,1,3,0)
+ 
+"KRN",19,10987,1,4,0)
+in order to use Windows Scheduling.
+"KRN",19,10987,99.1)
+61545,63078
+"KRN",19,10987,"RPC",0)
+^19.05P^101^101
+"KRN",19,10987,"RPC",1,0)
+BSDX ADD ACCESS GROUP ITEM
+"KRN",19,10987,"RPC",2,0)
+BSDX ADD NEW APPOINTMENT
+"KRN",19,10987,"RPC",3,0)
+BSDX ADD NEW AVAILABILITY
+"KRN",19,10987,"RPC",4,0)
+BSDX ADD RES GROUP ITEM
+"KRN",19,10987,"RPC",5,0)
+BSDX ADD/EDIT ACCESS GROUP
+"KRN",19,10987,"RPC",6,0)
+BSDX ADD/EDIT ACCESS TYPE
+"KRN",19,10987,"RPC",7,0)
+BSDX ADD/EDIT RESOURCE
+"KRN",19,10987,"RPC",8,0)
+BSDX ADD/EDIT RESOURCE GROUP
+"KRN",19,10987,"RPC",9,0)
+BSDX ADD/EDIT RESOURCEUSER
+"KRN",19,10987,"RPC",10,0)
+BSDX APPT BLOCKS OVERLAP
+"KRN",19,10987,"RPC",11,0)
+BSDX CANCEL APPOINTMENT
+"KRN",19,10987,"RPC",12,0)
+BSDX CANCEL AVAILABILITY
+"KRN",19,10987,"RPC",13,0)
+BSDX CHECKIN APPOINTMENT
+"KRN",19,10987,"RPC",14,0)
+BSDX CREATE APPT SCHEDULE
+"KRN",19,10987,"RPC",15,0)
+BSDX CREATE ASGND SLOT SCHED
+"KRN",19,10987,"RPC",16,0)
+BSDX DELETE ACCESS GROUP
+"KRN",19,10987,"RPC",17,0)
+BSDX DELETE ACCESS GROUP ITEM
+"KRN",19,10987,"RPC",18,0)
+BSDX DELETE RES GROUP ITEM
+"KRN",19,10987,"RPC",19,0)
+BSDX DELETE RESOURCE GROUP
+"KRN",19,10987,"RPC",20,0)
+BSDX DELETE RESOURCEUSER
+"KRN",19,10987,"RPC",21,0)
+BSDX DEPARTMENT RESOURCE
+"KRN",19,10987,"RPC",22,0)
+BSDX DEPARTMENTS BY USER
+"KRN",19,10987,"RPC",23,0)
+BSDX EDIT APPOINTMENT
+"KRN",19,10987,"RPC",24,0)
+BSDX GET ACCESS GROUP TYPES
+"KRN",19,10987,"RPC",25,0)
+BSDX GET BASIC REG INFO
+"KRN",19,10987,"RPC",26,0)
+BSDX GROUP RESOURCE
+"KRN",19,10987,"RPC",27,0)
+BSDX PATIENT APPT DISPLAY
+"KRN",19,10987,"RPC",28,0)
+BSDX RAISE EVENT
+"KRN",19,10987,"RPC",29,0)
+BSDX REGISTER EVENT
+"KRN",19,10987,"RPC",30,0)
+BSDX RESOURCE GROUPS BY USER
+"KRN",19,10987,"RPC",31,0)
+BSDX RESOURCES
+"KRN",19,10987,"RPC",32,0)
+BSDX RESOURCES BY USER
+"KRN",19,10987,"RPC",33,0)
+BSDX SCHEDULE USER
+"KRN",19,10987,"RPC",34,0)
+BSDX SCHEDULING USER INFO
+"KRN",19,10987,"RPC",35,0)
+BSDX SEARCH AVAILABILITY
+"KRN",19,10987,"RPC",36,0)
+BSDX TYPE BLOCKS OVERLAP
+"KRN",19,10987,"RPC",37,0)
+BSDX UNREGISTER EVENT
+"KRN",19,10987,"RPC",38,0)
+BSDXPatientLookupRS
+"KRN",19,10987,"RPC",39,0)
+BSDX SPACEBAR SET
+"KRN",19,10987,"RPC",40,0)
+BSDX COPY APPOINTMENTS
+"KRN",19,10987,"RPC",41,0)
+BSDX COPY APPOINTMENT CANCEL
+"KRN",19,10987,"RPC",42,0)
+BSDX COPY APPOINTMENT STATUS
+"KRN",19,10987,"RPC",43,0)
+BSDX CLINIC LETTERS
+"KRN",19,10987,"RPC",44,0)
+BSDX NOSHOW
+"KRN",19,10987,"RPC",45,0)
+BSDX IM HERE
+"KRN",19,10987,"RPC",46,0)
+BSDX HOSPITAL LOCATION
+"KRN",19,10987,"RPC",47,0)
+BSDX CLINIC SETUP
+"KRN",19,10987,"RPC",49,0)
+BSDX REBOOK LIST
+"KRN",19,10987,"RPC",50,0)
+BSDX REBOOK CLINIC LIST
+"KRN",19,10987,"RPC",51,0)
+BSDX REBOOK SET
+"KRN",19,10987,"RPC",52,0)
+BSDX RESOURCE LETTERS
+"KRN",19,10987,"RPC",53,0)
+BSDX CANCEL CLINIC LIST
+"KRN",19,10987,"RPC",54,0)
+BSDX CANCEL AV BY DATE
+"KRN",19,10987,"RPC",55,0)
+BSDX REBOOK NEXT BLOCK
+"KRN",19,10987,"RPC",56,0)
+BSDX HOSP LOC PROVIDERS
+"KRN",19,10987,"RPC",57,0)
+BMX ADO SS
+"KRN",19,10987,"RPC",58,0)
+BMX ASYNC GET
+"KRN",19,10987,"RPC",59,0)
+BMX ASYNC QUEUE
+"KRN",19,10987,"RPC",60,0)
+BMX AV CODE
+"KRN",19,10987,"RPC",61,0)
+BMX DEMO
+"KRN",19,10987,"RPC",62,0)
+BMX DENTAL REPORT 1
+"KRN",19,10987,"RPC",63,0)
+BMX DENTAL REPORT 2
+"KRN",19,10987,"RPC",64,0)
+BMX EVENT POLL
+"KRN",19,10987,"RPC",65,0)
+BMX EVENT RAISE
+"KRN",19,10987,"RPC",66,0)
+BMX EVENT REGISTER
+"KRN",19,10987,"RPC",67,0)
+BMX EVENT UNREGISTER
+"KRN",19,10987,"RPC",68,0)
+BMX FIELD LIST
+"KRN",19,10987,"RPC",69,0)
+BMX FIND
+"KRN",19,10987,"RPC",70,0)
+BMX GET VARIABLE VALUE
+"KRN",19,10987,"RPC",71,0)
+BMX HEALTH SUMMARY
+"KRN",19,10987,"RPC",72,0)
+BMX IM HERE
+"KRN",19,10987,"RPC",73,0)
+BMX LOCK
+"KRN",19,10987,"RPC",74,0)
+BMX LOOKUP
+"KRN",19,10987,"RPC",75,0)
+BMX MULT LIST
+"KRN",19,10987,"RPC",76,0)
+BMX NTUSER
+"KRN",19,10987,"RPC",77,0)
+BMX PATIENT DEMOG DATA GET
+"KRN",19,10987,"RPC",78,0)
+BMX PDATA CHART
+"KRN",19,10987,"RPC",79,0)
+BMX SCHEMA ONLY
+"KRN",19,10987,"RPC",80,0)
+BMX SECURITY KEY
+"KRN",19,10987,"RPC",81,0)
+BMX SIGNATURE
+"KRN",19,10987,"RPC",82,0)
+BMX SQL
+"KRN",19,10987,"RPC",83,0)
+BMX SQL COLINFO
+"KRN",19,10987,"RPC",84,0)
+BMX TABLE
+"KRN",19,10987,"RPC",85,0)
+BMX TEST
+"KRN",19,10987,"RPC",86,0)
+BMX TIMER TEST
+"KRN",19,10987,"RPC",87,0)
+BMX TLIST
+"KRN",19,10987,"RPC",88,0)
+BMX UPDATE
+"KRN",19,10987,"RPC",89,0)
+BMX USER
+"KRN",19,10987,"RPC",90,0)
+BMX UTF-8
+"KRN",19,10987,"RPC",91,0)
+BMX VERSION INFO
+"KRN",19,10987,"RPC",92,0)
+BMXGetFac
+"KRN",19,10987,"RPC",93,0)
+BMXGetFacRS
+"KRN",19,10987,"RPC",94,0)
+BMXNRC
+"KRN",19,10987,"RPC",95,0)
+BMXNetGetCodes
+"KRN",19,10987,"RPC",96,0)
+BMXNetSetUser
+"KRN",19,10987,"RPC",97,0)
+BMXPatientInfoRS
+"KRN",19,10987,"RPC",98,0)
+BMXPatientLookupRS
+"KRN",19,10987,"RPC",99,0)
+BMXProviderLookupRS
+"KRN",19,10987,"RPC",100,0)
+BMXSetFac
+"KRN",19,10987,"RPC",101,0)
+BMXUserKeyRS
+"KRN",19,10987,"U")
+WINDOWS SCHEDULING PROCEDURE C
+"KRN",19.1,480,-1)
+0^1
+"KRN",19.1,480,0)
+BSDXZMENU^IHS Windows Scheduling
+"KRN",19.1,481,-1)
+0^2
+"KRN",19.1,481,0)
+BSDXZMGR^IHS Windows Scheduling Manager
+"KRN",101,4262,-1)
+0^2
+"KRN",101,4262,0)
+BSDX CANCEL APPOINTMENT^BSDX CANCEL APPOINTMENT^^A^^^^^^^^
+"KRN",101,4262,1,0)
+^^4^4^3040915^
+"KRN",101,4262,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4262,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4262,1,3,0)
+cancel an appointment in the IHS Windows Scheduling package
+"KRN",101,4262,1,4,0)
+when the corresponding appointment in RPMS Scheduling is cancelled.
+"KRN",101,4262,4)
+^^^BSDX CANCEL APPOINTMENT
+"KRN",101,4262,20)
+I $G(SDAMEVT)=2,$D(^BSDXAPPL) D CANEVT^BSDX08($G(DFN),$G(SDT),$G(SDCL))
+"KRN",101,4262,99)
+61598,46412
+"KRN",101,4263,-1)
+0^1
+"KRN",101,4263,0)
+BSDX ADD APPOINTMENT^BSDX ADD APPOINTMENT^^A^^^^^^^^
+"KRN",101,4263,1,0)
+^101.06^4^4^3040915^^
+"KRN",101,4263,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4263,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4263,1,3,0)
+add an appointment in the IHS Windows Scheduling package
+"KRN",101,4263,1,4,0)
+when the corresponding appointment in RPMS Scheduling is added.
+"KRN",101,4263,4)
+^^^BSDX ADD APPOINTMENT
+"KRN",101,4263,20)
+I $G(SDAMEVT)=1,$D(^BSDXAPPL) D ADDEVT^BSDX07($G(DFN),$G(SDT),$G(SDCL),$G(SDDA))
+"KRN",101,4263,99)
+61598,46412
+"KRN",101,4264,-1)
+0^4
+"KRN",101,4264,0)
+BSDX NOSHOW APPOINTMENT^BSDX NOSHOW APPOINTMENT^^A^^^^^^^^
+"KRN",101,4264,1,0)
+^101.06^4^4^3040915^^
+"KRN",101,4264,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4264,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4264,1,3,0)
+no-show an appointment in the IHS Windows Scheduling package
+"KRN",101,4264,1,4,0)
+when the corresponding appointment in RPMS Scheduling is no-showed.
+"KRN",101,4264,4)
+^^^BSDX NOSHOW APPOINTMENT
+"KRN",101,4264,20)
+I $G(SDAMEVT)=3,$D(^BSDXAPPL) D NOSEVT^BSDX31($G(DFN),$G(SDT),$G(SDCL))
+"KRN",101,4264,99)
+61598,46412
+"KRN",101,4265,-1)
+0^3
+"KRN",101,4265,0)
+BSDX CHECKIN APPOINTMENT^BSDX CHECKIN APPOINTMENT^^A^^^^^^^^
+"KRN",101,4265,1,0)
+^101.06^4^4^3040915^^^
+"KRN",101,4265,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4265,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4265,1,3,0)
+check in an appointment in the IHS Windows Scheduling package
+"KRN",101,4265,1,4,0)
+when the corresponding appointment in RPMS Scheduling is checked in.
+"KRN",101,4265,4)
+^^^BSDX CHECKIN APPOINTMENT
+"KRN",101,4265,20)
+I $G(SDAMEVT)=4,$D(^BSDXAPPL) D CHKEVT^BSDX25($G(DFN),$G(SDT),$G(SDCL))
+"KRN",101,4265,99)
+61598,46412
+"KRN",8994,2396,-1)
+0^80
+"KRN",8994,2396,0)
+BMX PATIENT DEMOG DATA GET^PDATA^BMXRPC1^1
+"KRN",8994,2397,-1)
+0^77
+"KRN",8994,2397,0)
+BMX LOOKUP^LOOKUP^BMXRPC^4
+"KRN",8994,2398,-1)
+0^71
+"KRN",8994,2398,0)
+BMX FIELD LIST^FLDLIST^BMXRPC2^4
+"KRN",8994,2399,-1)
+0^72
+"KRN",8994,2399,0)
+BMX FIND^FIND^BMXFIND^4
+"KRN",8994,2400,-1)
+0^87
+"KRN",8994,2400,0)
+BMX TABLE^TABLE^BMXFIND^4
+"KRN",8994,2401,-1)
+0^85
+"KRN",8994,2401,0)
+BMX SQL^SQL^BMXSQL^4
+"KRN",8994,2402,-1)
+0^90
+"KRN",8994,2402,0)
+BMX TLIST^TLIST^BMXSQL^4
+"KRN",8994,2403,-1)
+0^86
+"KRN",8994,2403,0)
+BMX SQL COLINFO^SQLCOL^BMXSQL^4
+"KRN",8994,2404,-1)
+0^73
+"KRN",8994,2404,0)
+BMX GET VARIABLE VALUE^VARVAL^BMXRPC3^1
+"KRN",8994,2405,-1)
+0^92
+"KRN",8994,2405,0)
+BMX USER^USER^BMXRPC3^1
+"KRN",8994,2406,-1)
+0^79
+"KRN",8994,2406,0)
+BMX NTUSER^NTUSER^BMXRPC3^1
+"KRN",8994,2407,-1)
+0^103
+"KRN",8994,2407,0)
+BMXSetFac^SETFCRS^BMXRPC3^1
+"KRN",8994,2408,-1)
+0^95
+"KRN",8994,2408,0)
+BMXGetFac^GETFC^BMXRPC3^1
+"KRN",8994,2409,-1)
+0^83
+"KRN",8994,2409,0)
+BMX SECURITY KEY^APSEC^BMXRPC3^1
+"KRN",8994,2410,-1)
+0^84
+"KRN",8994,2410,0)
+BMX SIGNATURE^SIGCHK^BMXRPC3^1
+"KRN",8994,2411,-1)
+0^78
+"KRN",8994,2411,0)
+BMX MULT LIST^MLTLIST^BMXRPC2^4
+"KRN",8994,2412,-1)
+0^96
+"KRN",8994,2412,0)
+BMXGetFacRS^GETFCRS^BMXRPC3^1
+"KRN",8994,2413,-1)
+0^101
+"KRN",8994,2413,0)
+BMXPatientLookupRS^PTLOOKRS^BMXRPC4^1
+"KRN",8994,2414,-1)
+0^100
+"KRN",8994,2414,0)
+BMXPatientInfoRS^PTINFORS^BMXRPC4^1
+"KRN",8994,2415,-1)
+0^74
+"KRN",8994,2415,0)
+BMX HEALTH SUMMARY^HS^BMXRPC5^4
+"KRN",8994,2416,-1)
+0^65
+"KRN",8994,2416,0)
+BMX DENTAL REPORT 1^BMXADE^BMXADE1^4
+"KRN",8994,2417,-1)
+0^104
+"KRN",8994,2417,0)
+BMXUserKeyRS^USRKEYRS^BMXRPC6^1
+"KRN",8994,2418,-1)
+0^102
+"KRN",8994,2418,0)
+BMXProviderLookupRS^PRVLKRS^BMXQA2^1
+"KRN",8994,2419,-1)
+0^81
+"KRN",8994,2419,0)
+BMX PDATA CHART^PDATA^BMXRPC6^4
+"KRN",8994,2420,-1)
+0^66
+"KRN",8994,2420,0)
+BMX DENTAL REPORT 2^BMXADE^BMXADE2^4
+"KRN",8994,2421,-1)
+0^97
+"KRN",8994,2421,0)
+BMXNRC^ZTM^BMXNRC^4
+"KRN",8994,2422,-1)
+0^98
+"KRN",8994,2422,0)
+BMXNetGetCodes^NTUGET^BMXRPC3^4
+"KRN",8994,2423,-1)
+0^99
+"KRN",8994,2423,0)
+BMXNetSetUser^NTUSET^BMXRPC3^4
+"KRN",8994,2424,-1)
+0^64
+"KRN",8994,2424,0)
+BMX DEMO^PDEMO^BMXRPC6^4
+"KRN",8994,2425,-1)
+0^63
+"KRN",8994,2425,0)
+BMX AV CODE^WINVAL^BMXRPC7^2
+"KRN",8994,2426,-1)
+0^76
+"KRN",8994,2426,0)
+BMX LOCK^BMXLOCK^BMXRPC8^1
+"KRN",8994,2427,-1)
+0^94
+"KRN",8994,2427,0)
+BMX VERSION INFO^BMXVER^BMXRPC8^4
+"KRN",8994,2428,-1)
+0^75
+"KRN",8994,2428,0)
+BMX IM HERE^IMHERE^BMXRPC8^1^P
+"KRN",8994,2428,1,0)
+^8994.01^2^2^3040304^^^
+"KRN",8994,2428,1,1,0)
+Returns a simple value to client.  Used to establish continued existence
+"KRN",8994,2428,1,2,0)
+of the client to the server; resets the server READ timeout.
+"KRN",8994,2429,-1)
+0^91
+"KRN",8994,2429,0)
+BMX UPDATE^FILE^BMXADOF^1
+"KRN",8994,2430,-1)
+0^88
+"KRN",8994,2430,0)
+BMX TEST^TESTRPC^BMXRPC9^4
+"KRN",8994,2431,-1)
+0^82
+"KRN",8994,2431,0)
+BMX SCHEMA ONLY^SONLY^BMXRPC9^1
+"KRN",8994,2432,-1)
+0^60
+"KRN",8994,2432,0)
+BMX ADO SS^SS^BMXADO^4
+"KRN",8994,2433,-1)
+0^68
+"KRN",8994,2433,0)
+BMX EVENT RAISE^RAISEVNT^BMXMEVN^4
+"KRN",8994,2434,-1)
+0^69
+"KRN",8994,2434,0)
+BMX EVENT REGISTER^REGEVNT^BMXMEVN^4
+"KRN",8994,2435,-1)
+0^70
+"KRN",8994,2435,0)
+BMX EVENT UNREGISTER^UNREG^BMXMEVN^4
+"KRN",8994,2436,-1)
+0^67
+"KRN",8994,2436,0)
+BMX EVENT POLL^POLL^BMXMEVN^4
+"KRN",8994,2437,-1)
+0^89
+"KRN",8994,2437,0)
+BMX TIMER TEST^TTEST^BMXMEVN^4
+"KRN",8994,2438,-1)
+0^61
+"KRN",8994,2438,0)
+BMX ASYNC GET^ASYNCGET^BMXMEVN^4
+"KRN",8994,2439,-1)
+0^62
+"KRN",8994,2439,0)
+BMX ASYNC QUEUE^ASYNCQUE^BMXMEVN^4
+"KRN",8994,2440,-1)
+0^16
+"KRN",8994,2440,0)
+BSDX RESOURCE GROUPS BY USER^DEPUSR^BSDX01^4
+"KRN",8994,2441,-1)
+0^22
+"KRN",8994,2441,0)
+BSDX RESOURCES^RESUSR^BSDX01^4
+"KRN",8994,2442,-1)
+0^6
+"KRN",8994,2442,0)
+BSDX CREATE APPT SCHEDULE^CRSCH^BSDX02^4
+"KRN",8994,2443,-1)
+0^1
+"KRN",8994,2443,0)
+BSDX ADD NEW APPOINTMENT^APPADD^BSDX07^4
+"KRN",8994,2444,-1)
+0^4
+"KRN",8994,2444,0)
+BSDX CANCEL APPOINTMENT^APPDEL^BSDX08^4
+"KRN",8994,2445,-1)
+0^7
+"KRN",8994,2445,0)
+BSDX CREATE ASGND SLOT SCHED^CASSCH^BSDX04^4
+"KRN",8994,2446,-1)
+0^2
+"KRN",8994,2446,0)
+BSDX ADD NEW AVAILABILITY^AVADD^BSDX12^4
+"KRN",8994,2447,-1)
+0^5
+"KRN",8994,2447,0)
+BSDX CANCEL AVAILABILITY^AVDEL^BSDX13^4
+"KRN",8994,2448,-1)
+0^3
+"KRN",8994,2448,0)
+BSDX APPT BLOCKS OVERLAP^APBLKOV^BSDX05^4
+"KRN",8994,2449,-1)
+0^12
+"KRN",8994,2449,0)
+BSDX TYPE BLOCKS OVERLAP^TPBLKOV^BSDX06^4
+"KRN",8994,2450,-1)
+0^10
+"KRN",8994,2450,0)
+BSDX GET BASIC REG INFO^GETREGA^BSDX09^4
+"KRN",8994,2451,-1)
+0^15
+"KRN",8994,2451,0)
+BSDX GROUP RESOURCE^DEPRES^BSDX01^4
+"KRN",8994,2452,-1)
+0^13
+"KRN",8994,2452,0)
+BSDX ADD/EDIT ACCESS TYPE^ACCTYP^BSDX14^4
+"KRN",8994,2453,-1)
+0^14
+"KRN",8994,2453,0)
+BSDX GET ACCESS GROUP TYPES^GRPTYP^BSDX15^4
+"KRN",8994,2454,-1)
+0^20
+"KRN",8994,2454,0)
+BSDX ADD/EDIT RESOURCE^RSRC^BSDX16^4
+"KRN",8994,2455,-1)
+0^19
+"KRN",8994,2455,0)
+BSDX SCHEDULE USER^SCHUSR^BSDX17^4
+"KRN",8994,2456,-1)
+0^18
+"KRN",8994,2456,0)
+BSDX DELETE RESOURCEUSER^DELRU^BSDX18^4
+"KRN",8994,2457,-1)
+0^17
+"KRN",8994,2457,0)
+BSDX ADD/EDIT RESOURCEUSER^ADDRU^BSDX18^4
+"KRN",8994,2458,-1)
+0^21
+"KRN",8994,2458,0)
+BSDX SCHEDULING USER INFO^SUINFO^BSDX01^4
+"KRN",8994,2459,-1)
+0^23
+"KRN",8994,2459,0)
+BSDX ADD/EDIT RESOURCE GROUP^ADDRG^BSDX19^4
+"KRN",8994,2460,-1)
+0^24
+"KRN",8994,2460,0)
+BSDX DELETE RESOURCE GROUP^DELRG^BSDX19^4
+"KRN",8994,2461,-1)
+0^27
+"KRN",8994,2461,0)
+BSDX DEPARTMENTS BY USER^DEPUSR^BSDX01^4
+"KRN",8994,2462,-1)
+0^28
+"KRN",8994,2462,0)
+BSDX RESOURCES BY USER^RESUSR^BSDX01^4
+"KRN",8994,2463,-1)
+0^26
+"KRN",8994,2463,0)
+BSDX DEPARTMENT RESOURCE^DEPRES^BSDX01^4
+"KRN",8994,2464,-1)
+0^25
+"KRN",8994,2464,0)
+BSDX DELETE RES GROUP ITEM^DELRGI^BSDX20^4
+"KRN",8994,2465,-1)
+0^30
+"KRN",8994,2465,0)
+BSDX ADD RES GROUP ITEM^ADDRGI^BSDX20^4
+"KRN",8994,2466,-1)
+0^31
+"KRN",8994,2466,0)
+BSDX ADD/EDIT ACCESS GROUP^ADDAG^BSDX21^4
+"KRN",8994,2467,-1)
+0^32
+"KRN",8994,2467,0)
+BSDX DELETE ACCESS GROUP^DELAG^BSDX21^4
+"KRN",8994,2468,-1)
+0^29
+"KRN",8994,2468,0)
+BSDX ADD ACCESS GROUP ITEM^ADDAGI^BSDX22^4
+"KRN",8994,2469,-1)
+0^33
+"KRN",8994,2469,0)
+BSDX DELETE ACCESS GROUP ITEM^DELAGI^BSDX22^4
+"KRN",8994,2470,-1)
+0^34
+"KRN",8994,2470,0)
+BSDX REGISTER EVENT^REGEVNT^BSDX23^4
+"KRN",8994,2471,-1)
+0^35
+"KRN",8994,2471,0)
+BSDX UNREGISTER EVENT^UNREG^BSDX23^4
+"KRN",8994,2472,-1)
+0^36
+"KRN",8994,2472,0)
+BSDX RAISE EVENT^RAISEVNT^BSDX23^4
+"KRN",8994,2473,-1)
+0^37
+"KRN",8994,2473,0)
+BSDX SEARCH AVAILABILITY^SEARCH^BSDX24^4
+"KRN",8994,2474,-1)
+0^38
+"KRN",8994,2474,0)
+BSDX CHECKIN APPOINTMENT^CHECKIN^BSDX25^4
+"KRN",8994,2475,-1)
+0^39
+"KRN",8994,2475,0)
+BSDX EDIT APPOINTMENT^EDITAPT^BSDX26^4
+"KRN",8994,2476,-1)
+0^40
+"KRN",8994,2476,0)
+BSDX PATIENT APPT DISPLAY^PADISP^BSDX27^4
+"KRN",8994,2477,-1)
+0^41
+"KRN",8994,2477,0)
+BSDXPatientLookupRS^PTLOOKRS^BSDX28^1
+"KRN",8994,2478,-1)
+0^42
+"KRN",8994,2478,0)
+BSDX SPACEBAR SET^SPACE^BSDX30^4
+"KRN",8994,2479,-1)
+0^45
+"KRN",8994,2479,0)
+BSDX COPY APPOINTMENTS^BSDXCP^BSDX29^4
+"KRN",8994,2480,-1)
+0^44
+"KRN",8994,2480,0)
+BSDX COPY APPOINTMENT STATUS^CPSTAT^BSDX29^4
+"KRN",8994,2481,-1)
+0^43
+"KRN",8994,2481,0)
+BSDX COPY APPOINTMENT CANCEL^CPCANC^BSDX29^4
+"KRN",8994,2482,-1)
+0^46
+"KRN",8994,2482,0)
+BSDX CLINIC LETTERS^CLDISP^BSDX27^4
+"KRN",8994,2483,-1)
+0^47
+"KRN",8994,2483,0)
+BSDX NOSHOW^NOSHOW^BSDX31^4
+"KRN",8994,2484,-1)
+0^48
+"KRN",8994,2484,0)
+BSDX IM HERE^IMHERE^BSDX31^1
+"KRN",8994,2484,1,0)
+^^2^2^3040304^
+"KRN",8994,2484,1,1,0)
+Returns a simple value to client.  Used to establish continued existence
+"KRN",8994,2484,1,2,0)
+of the client to the server; resets the server READ timeout.
+"KRN",8994,2485,-1)
+0^49
+"KRN",8994,2485,0)
+BSDX HOSPITAL LOCATION^HOSPLOC^BSDX32^4
+"KRN",8994,2486,-1)
+0^50
+"KRN",8994,2486,0)
+BSDX CLINIC SETUP^CLNSET^BSDX32^4
+"KRN",8994,2487,-1)
+0^51
+"KRN",8994,2487,0)
+BSDX REBOOK LIST^RBLETT^BSDX34^4
+"KRN",8994,2488,-1)
+0^52
+"KRN",8994,2488,0)
+BSDX REBOOK CLINIC LIST^RBCLIN^BSDX34^4
+"KRN",8994,2489,-1)
+0^53
+"KRN",8994,2489,0)
+BSDX REBOOK SET^SETRBK^BSDX33^4
+"KRN",8994,2490,-1)
+0^54
+"KRN",8994,2490,0)
+BSDX RESOURCE LETTERS^RSRCLTR^BSDX35^4
+"KRN",8994,2491,-1)
+0^55
+"KRN",8994,2491,0)
+BSDX CANCEL CLINIC LIST^CANCLIN^BSDX34^4
+"KRN",8994,2492,-1)
+0^56
+"KRN",8994,2492,0)
+BSDX CANCEL AV BY DATE^AVDELDT^BSDX13^4
+"KRN",8994,2493,-1)
+0^57
+"KRN",8994,2493,0)
+BSDX REBOOK NEXT BLOCK^RBNEXT^BSDX33^4
+"KRN",8994,2494,-1)
+0^58
+"KRN",8994,2494,0)
+BSDX EHR PATIENT^EHRPT^BSDX30^4
+"KRN",8994,2501,-1)
+0^59
+"KRN",8994,2501,0)
+BSDX HOSP LOC PROVIDERS^P^BSDXGPRV^4
+"KRN",8994,2502,-1)
+0^93
+"KRN",8994,2502,0)
+BMX UTF-8^UTF8^BMXRPC^1^P
+"KRN",8994,2502,1,0)
+^^4^4^3100907^
+"KRN",8994,2502,1,1,0)
+This RPC returns a single value of 1 if database supports UTF-8; 0 if 
+"KRN",8994,2502,1,2,0)
+not. Only works on GT.M.
+"KRN",8994,2502,1,3,0)
+ 
+"KRN",8994,2502,1,4,0)
+Doesn't take any parameters.
+"MBREQ")
+0
+"ORD",3,19.1)
+19.1;3;1;;KEY^XPDTA1;;;KEYF2^XPDIA1;;KEYDEL^XPDIA1
+"ORD",3,19.1,0)
+SECURITY KEY
+"ORD",15,101)
+101;15;;;PRO^XPDTA;PROF1^XPDIA;PROE1^XPDIA;PROF2^XPDIA;;PRODEL^XPDIA
+"ORD",15,101,0)
+PROTOCOL
+"ORD",16,8994)
+8994;16;1;;;;;;;RPCDEL^XPDIA1
+"ORD",16,8994,0)
+REMOTE PROCEDURE
+"ORD",18,19)
+19;18;;;OPT^XPDTA;OPTF1^XPDIA;OPTE1^XPDIA;OPTF2^XPDIA;;OPTDEL^XPDIA
+"ORD",18,19,0)
+OPTION
+"PKG",211,-1)
+1^1
+"PKG",211,0)
+IHS Windows Scheduling^BSDX^IHS Windows Scheduling Extensions
+"PKG",211,20,0)
+^9.402P^^
+"PKG",211,22,0)
+^9.49I^1^1
+"PKG",211,22,1,0)
+1.5V2^3110303
+"PKG",211,22,1,1,0)
+^^1^1^3110303
+"PKG",211,22,1,1,1,0)
+Clinical Scheduling M Server support routines, files, options and RPCs.
+"PKG",211,"VERSION")
+1.5V2
+"PRE")
+BSDX2E
+"QUES","XPF1",0)
+Y
+"QUES","XPF1","??")
+^D REP^XPDH
+"QUES","XPF1","A")
+Shall I write over your |FLAG| File
+"QUES","XPF1","B")
+YES
+"QUES","XPF1","M")
+D XPF1^XPDIQ
+"QUES","XPF2",0)
+Y
+"QUES","XPF2","??")
+^D DTA^XPDH
+"QUES","XPF2","A")
+Want my data |FLAG| yours
+"QUES","XPF2","B")
+YES
+"QUES","XPF2","M")
+D XPF2^XPDIQ
+"QUES","XPI1",0)
+YO
+"QUES","XPI1","??")
+^D INHIBIT^XPDH
+"QUES","XPI1","A")
+Want KIDS to INHIBIT LOGONs during the install
+"QUES","XPI1","B")
+NO
+"QUES","XPI1","M")
+D XPI1^XPDIQ
+"QUES","XPM1",0)
+PO^VA(200,:EM
+"QUES","XPM1","??")
+^D MG^XPDH
+"QUES","XPM1","A")
+Enter the Coordinator for Mail Group '|FLAG|'
+"QUES","XPM1","B")
+
+"QUES","XPM1","M")
+D XPM1^XPDIQ
+"QUES","XPO1",0)
+Y
+"QUES","XPO1","??")
+^D MENU^XPDH
+"QUES","XPO1","A")
+Want KIDS to Rebuild Menu Trees Upon Completion of Install
+"QUES","XPO1","B")
+NO
+"QUES","XPO1","M")
+D XPO1^XPDIQ
+"QUES","XPZ1",0)
+Y
+"QUES","XPZ1","??")
+^D OPT^XPDH
+"QUES","XPZ1","A")
+Want to DISABLE Scheduled Options, Menu Options, and Protocols
+"QUES","XPZ1","B")
+NO
+"QUES","XPZ1","M")
+D XPZ1^XPDIQ
+"QUES","XPZ2",0)
+Y
+"QUES","XPZ2","??")
+^D RTN^XPDH
+"QUES","XPZ2","A")
+Want to MOVE routines to other CPUs
+"QUES","XPZ2","B")
+NO
+"QUES","XPZ2","M")
+D XPZ2^XPDIQ
+"RTN")
+37
+"RTN","BSDX01")
+0^1^B107139484
+"RTN","BSDX01",1,0)
+BSDX01 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 9/29/10 10:20am
+"RTN","BSDX01",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX01",3,0)
+ ;
+"RTN","BSDX01",4,0)
+SUINFOD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",5,0)
+ ;D DEBUG^%Serenji("SUINFO^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",6,0)
+ ;
+"RTN","BSDX01",7,0)
+ Q
+"RTN","BSDX01",8,0)
+ ;
+"RTN","BSDX01",9,0)
+SUINFO(BSDXY,BSDXDUZ)  ;EP
+"RTN","BSDX01",10,0)
+ ;Called by BSDX SCHEDULING USER INFO
+"RTN","BSDX01",11,0)
+ ;Returns ADO Recordset having column MANAGER
+"RTN","BSDX01",12,0)
+ ;MANAGER = YES if user has keys BSDXZMGR or XUPROGMODE
+"RTN","BSDX01",13,0)
+ ;
+"RTN","BSDX01",14,0)
+ N BSDXMGR,BSDXERR
+"RTN","BSDX01",15,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",16,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",17,0)
+ S BSDXI=0
+"RTN","BSDX01",18,0)
+ S BSDXERR=""
+"RTN","BSDX01",19,0)
+ S ^BSDXTMP($J,BSDXI)="T00010MANAGER"_$C(30)
+"RTN","BSDX01",20,0)
+ ;Check SECURITY KEY file for BSDXZMGR or XUPROGMODE keys
+"RTN","BSDX01",21,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",22,0)
+ S BSDXMGR=$$APSEC("BSDXZMGR",BSDXDUZ)
+"RTN","BSDX01",23,0)
+ S BSDXMGR=$S(BSDXMGR=1:"YES",1:"NO")
+"RTN","BSDX01",24,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX01",25,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXMGR_$C(30)
+"RTN","BSDX01",26,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",27,0)
+ Q
+"RTN","BSDX01",28,0)
+DEPUSRD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",29,0)
+ ;
+"RTN","BSDX01",30,0)
+ ;
+"RTN","BSDX01",31,0)
+ ;D DEBUG^%Serenji("DEPUSR^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",32,0)
+ ;
+"RTN","BSDX01",33,0)
+ Q
+"RTN","BSDX01",34,0)
+ ;
+"RTN","BSDX01",35,0)
+DEPUSR(BSDXY,BSDXDUZ)  ;EP
+"RTN","BSDX01",36,0)
+ ;Called by BSDX RESOURCE GROUPS BY USER
+"RTN","BSDX01",37,0)
+ ;Returns ADO Recordset with all ACTIVE resource group names to which user has access
+"RTN","BSDX01",38,0)
+ ;based on entries in BSDX RESOURCE USER file (Say this again for myself: Groups ONLY!!)
+"RTN","BSDX01",39,0)
+ ;If BSDXDUZ=0 then returns all department names for current DUZ
+"RTN","BSDX01",40,0)
+    ;if not linked, always returned.
+"RTN","BSDX01",41,0)
+ ;If user BSDXDUZ possesses the key BSDXZMGR or XUPROGMODE
+"RTN","BSDX01",42,0)
+ ;then ALL resource group names are returned regardless of whether any active resources
+"RTN","BSDX01",43,0)
+ ;are associated with the group or not.
+"RTN","BSDX01",44,0)
+ ;
+"RTN","BSDX01",45,0)
+ ;
+"RTN","BSDX01",46,0)
+ N BSDXERR,BSDXRET,BSDXIEN,BSDXRES,BSDXDEP,BSDXDDR,BSDXDEPN,BSDXRDAT,BSDXRNOD,BSDXI
+"RTN","BSDX01",47,0)
+ N BSDXMGR,BSDXNOD
+"RTN","BSDX01",48,0)
+ K ^BSDXTEMP($J)
+"RTN","BSDX01",49,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",50,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",51,0)
+ S BSDXI=0
+"RTN","BSDX01",52,0)
+ S BSDXERR=""
+"RTN","BSDX01",53,0)
+ S ^BSDXTMP($J,BSDXI)="I00020RESOURCE_GROUPID^T00030RESOURCE_GROUP"_$C(30)
+"RTN","BSDX01",54,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",55,0)
+ ;Check SECURITY KEY file for BSDXZMGR or XUPROGMODE keys
+"RTN","BSDX01",56,0)
+ S BSDXMGR=$$APSEC("BSDXZMGR",BSDXDUZ)
+"RTN","BSDX01",57,0)
+ ;
+"RTN","BSDX01",58,0)
+ ;User does not have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",59,0)
+ ;$O THRU AC XREF OF BSDX RESOURCE USER
+"RTN","BSDX01",60,0)
+ I 'BSDXMGR,$D(^BSDXRSU("AC",BSDXDUZ)) S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRSU("AC",BSDXDUZ,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",61,0)
+ . S BSDXRES=$P(^BSDXRSU(BSDXIEN,0),U)
+"RTN","BSDX01",62,0)
+ . Q:'$D(^BSDXDEPT("AB",BSDXRES))  ; If not part of a group, quit ("AB" is the whole file index for the resource multiple in Group file)
+"RTN","BSDX01",63,0)
+    . ; Q:'$$INDIV2(BSDXRES)  ; If not in the same division as user, quit
+"RTN","BSDX01",64,0)
+ . S BSDXRNOD=^BSDXRES(BSDXRES,0)
+"RTN","BSDX01",65,0)
+ . ;QUIT if the resource is inactive
+"RTN","BSDX01",66,0)
+ . Q:$P(BSDXRNOD,U,2)=1
+"RTN","BSDX01",67,0)
+ . S BSDXDEP=0 F  S BSDXDEP=$O(^BSDXDEPT("AB",BSDXRES,BSDXDEP)) Q:'+BSDXDEP  D
+"RTN","BSDX01",68,0)
+ . . Q:'$D(^BSDXDEPT(BSDXDEP,0))
+"RTN","BSDX01",69,0)
+ . . Q:$D(^BSDXTEMP($J,BSDXDEP))
+"RTN","BSDX01",70,0)
+ . . S ^BSDXTEMP($J,BSDXDEP)=""
+"RTN","BSDX01",71,0)
+ . . S BSDXDEPN=$P(^BSDXDEPT(BSDXDEP,0),U)
+"RTN","BSDX01",72,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX01",73,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXDEP_U_BSDXDEPN_$C(30)
+"RTN","BSDX01",74,0)
+ . . Q
+"RTN","BSDX01",75,0)
+ . Q
+"RTN","BSDX01",76,0)
+ ;
+"RTN","BSDX01",77,0)
+ ;User does have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",78,0)
+ ;$O THRU BSDX RESOURCE GROUP file directly
+"RTN","BSDX01",79,0)
+ I BSDXMGR S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXDEPT(BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",80,0)
+ . Q:'$D(^BSDXDEPT(BSDXIEN,0))
+"RTN","BSDX01",81,0)
+ . S BSDXNOD=^BSDXDEPT(BSDXIEN,0)
+"RTN","BSDX01",82,0)
+ . S BSDXDEPN=$P(BSDXNOD,U)
+"RTN","BSDX01",83,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX01",84,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXDEPN_$C(30)
+"RTN","BSDX01",85,0)
+ . Q
+"RTN","BSDX01",86,0)
+ ;
+"RTN","BSDX01",87,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",88,0)
+ Q
+"RTN","BSDX01",89,0)
+ ;
+"RTN","BSDX01",90,0)
+ ;
+"RTN","BSDX01",91,0)
+RESUSRD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",92,0)
+ ;
+"RTN","BSDX01",93,0)
+ ;
+"RTN","BSDX01",94,0)
+ ;D DEBUG^%Serenji("RESUSR^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",95,0)
+ ;
+"RTN","BSDX01",96,0)
+ Q
+"RTN","BSDX01",97,0)
+ ;
+"RTN","BSDX01",98,0)
+RESUSR(BSDXY,BSDXDUZ) ;EP
+"RTN","BSDX01",99,0)
+ ;Returns ADO Recordset with ALL RESOURCE names
+"RTN","BSDX01",100,0)
+ ;Inactive RESOURCES are NOT filtered out
+"RTN","BSDX01",101,0)
+ ;Called by BSDX RESOURCES BY USER
+"RTN","BSDX01",102,0)
+ ;
+"RTN","BSDX01",103,0)
+ N BSDXERR,BSDXRET,BSDXIEN,BSDXRES,BSDXDEP,BSDXDDR,BSDXDEPN,BSDXRDAT,BSDXRNOD,BSDXI,BSDX,BSDXLTR
+"RTN","BSDX01",104,0)
+ N BSDXNOS,BSDXCAN
+"RTN","BSDX01",105,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",106,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",107,0)
+ S BSDXI=0
+"RTN","BSDX01",108,0)
+ S BSDXERR=""
+"RTN","BSDX01",109,0)
+ S ^BSDXTMP($J,BSDXI)="I00010RESOURCEID^T00030RESOURCE_NAME^T00010INACTIVE^I00010TIMESCALE^I00010HOSPITAL_LOCATION_ID^T00030LETTER_TEXT^T00030NO_SHOW_LETTER"
+"RTN","BSDX01",110,0)
+ S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^T00030CLINIC_CANCELLATION_LETTER^I00010VIEW^I00010OVERBOOK^I00010MODIFY_SCHEDULE^I00010MODIFY_APPOINTMENTS"_$C(30)
+"RTN","BSDX01",111,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",112,0)
+ ;$O THRU AC XREF OF BSDX RESOURCE USER
+"RTN","BSDX01",113,0)
+ ;Rmoved these lines in order to just return all resource names
+"RTN","BSDX01",114,0)
+ ;I $D(^BSDXRSU("AC",BSDXDUZ)) S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRSU("AC",BSDXDUZ,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",115,0)
+ ;. S BSDXRES=$P(^BSDXRSU(BSDXIEN,0),U)
+"RTN","BSDX01",116,0)
+ ;
+"RTN","BSDX01",117,0)
+ ;$O THRU BSDX RESOURCE File
+"RTN","BSDX01",118,0)
+ S BSDXRES=0 F  S BSDXRES=$O(^BSDXRES(BSDXRES)) Q:'+BSDXRES  D
+"RTN","BSDX01",119,0)
+ . Q:'$D(^BSDXRES(BSDXRES,0))
+"RTN","BSDX01",120,0)
+ . S BSDXRNOD=^BSDXRES(BSDXRES,0)
+"RTN","BSDX01",121,0)
+ . N BSDXSC S BSDXSC=$P(BSDXRNOD,U,4)  ; Hospital Location
+"RTN","BSDX01",122,0)
+    . ;Q:$P(BSDXRNOD,U,2)=1  ;Inactive resources not filtered
+"RTN","BSDX01",123,0)
+ . ;S BSDXRDAT=$P(BSDXRNOD,U,1,4)
+"RTN","BSDX01",124,0)
+ . ;I '$$INDIV(BSDXSC) QUIT  ; If not in division, quit
+"RTN","BSDX01",125,0)
+    . K BSDXRDAT
+"RTN","BSDX01",126,0)
+ . F BSDX=1:1:4 S $P(BSDXRDAT,U,BSDX)=$P(BSDXRNOD,U,BSDX)
+"RTN","BSDX01",127,0)
+ . S BSDXRDAT=BSDXRES_U_BSDXRDAT
+"RTN","BSDX01",128,0)
+ . ;Get letter text from wp field
+"RTN","BSDX01",129,0)
+ . S BSDXLTR=""
+"RTN","BSDX01",130,0)
+ . I $D(^BSDXRES(BSDXRES,1)) D
+"RTN","BSDX01",131,0)
+ . . S BSDXIEN=0
+"RTN","BSDX01",132,0)
+ . . F  S BSDXIEN=$O(^BSDXRES(BSDXRES,1,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",133,0)
+ . . . S BSDXLTR=BSDXLTR_$G(^BSDXRES(BSDXRES,1,BSDXIEN,0))
+"RTN","BSDX01",134,0)
+ . . . S BSDXLTR=BSDXLTR_$C(13)_$C(10)
+"RTN","BSDX01",135,0)
+ . S BSDXNOS=""
+"RTN","BSDX01",136,0)
+ . I $D(^BSDXRES(BSDXRES,12)) D
+"RTN","BSDX01",137,0)
+ . . S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRES(BSDXRES,12,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",138,0)
+ . . . S BSDXNOS=BSDXNOS_$G(^BSDXRES(BSDXRES,12,BSDXIEN,0))
+"RTN","BSDX01",139,0)
+ . . . S BSDXNOS=BSDXNOS_$C(13)_$C(10)
+"RTN","BSDX01",140,0)
+ . S BSDXCAN=""
+"RTN","BSDX01",141,0)
+ . I $D(^BSDXRES(BSDXRES,13)) D
+"RTN","BSDX01",142,0)
+ . . S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRES(BSDXRES,13,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",143,0)
+ . . . S BSDXCAN=BSDXCAN_$G(^BSDXRES(BSDXRES,13,BSDXIEN,0))
+"RTN","BSDX01",144,0)
+ . . . S BSDXCAN=BSDXCAN_$C(13)_$C(10)
+"RTN","BSDX01",145,0)
+ . N BSDXACC,BSDXMGR
+"RTN","BSDX01",146,0)
+ . S BSDXACC="0^0^0^0"
+"RTN","BSDX01",147,0)
+ . S BSDXMGR=$O(^DIC(19.1,"B","BSDXZMGR",0))
+"RTN","BSDX01",148,0)
+ . I +BSDXMGR,$D(^VA(200,BSDXDUZ,51,BSDXMGR)) S BSDXACC="1^1^1^1"
+"RTN","BSDX01",149,0)
+ . S BSDXMGR=$O(^DIC(19.1,"B","XUPROGMODE",0))
+"RTN","BSDX01",150,0)
+ . I +BSDXMGR,$D(^VA(200,BSDXDUZ,51,BSDXMGR)) S BSDXACC="1^1^1^1"
+"RTN","BSDX01",151,0)
+ . I BSDXACC="0^0^0^0" D
+"RTN","BSDX01",152,0)
+ . . N BSDXNOD,BSDXRUID
+"RTN","BSDX01",153,0)
+ . . S BSDXRUID=0
+"RTN","BSDX01",154,0)
+ . . ;Get entry for this user and resource
+"RTN","BSDX01",155,0)
+ . . F  S BSDXRUID=$O(^BSDXRSU("AC",BSDXDUZ,BSDXRUID)) Q:'+BSDXRUID  I $D(^BSDXRSU(BSDXRUID,0)),$P(^(0),U)=BSDXRES Q
+"RTN","BSDX01",156,0)
+ . . Q:'+BSDXRUID
+"RTN","BSDX01",157,0)
+ . . S $P(BSDXACC,U)=1
+"RTN","BSDX01",158,0)
+ . . S BSDXNOD=$G(^BSDXRSU(BSDXRUID,0))
+"RTN","BSDX01",159,0)
+ . . S $P(BSDXACC,U,2)=+$P(BSDXNOD,U,3)
+"RTN","BSDX01",160,0)
+ . . S $P(BSDXACC,U,3)=+$P(BSDXNOD,U,4)
+"RTN","BSDX01",161,0)
+ . . S $P(BSDXACC,U,4)=+$P(BSDXNOD,U,5)
+"RTN","BSDX01",162,0)
+ . S BSDXRDAT=BSDXRDAT_U_BSDXLTR_U_BSDXNOS_U_BSDXCAN_U_BSDXACC
+"RTN","BSDX01",163,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX01",164,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXRDAT_$C(30)
+"RTN","BSDX01",165,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",166,0)
+ Q
+"RTN","BSDX01",167,0)
+ ;
+"RTN","BSDX01",168,0)
+DEPRESD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",169,0)
+ ;
+"RTN","BSDX01",170,0)
+ ;
+"RTN","BSDX01",171,0)
+ ;D DEBUG^%Serenji("DEPRES^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",172,0)
+ ;
+"RTN","BSDX01",173,0)
+ Q
+"RTN","BSDX01",174,0)
+ ;
+"RTN","BSDX01",175,0)
+DEPRES(BSDXY,BSDXDUZ) ;EP
+"RTN","BSDX01",176,0)
+ ;Called by BSDX GROUP RESOURCE
+"RTN","BSDX01",177,0)
+ ;Returns ADO Recordset with all ACTIVE GROUP/RESOURCE combinations
+"RTN","BSDX01",178,0)
+ ;to which user has access based on entries in BSDX RESOURCE USER file
+"RTN","BSDX01",179,0)
+ ;If BSDXDUZ=0 then returns all ACTIVE GROUP/RESOURCE combinations for current DUZ
+"RTN","BSDX01",180,0)
+ ;If user BSDXDUZ possesses the key BSDXZMGR or XUPROGMODE
+"RTN","BSDX01",181,0)
+ ;then ALL ACTIVE resource group names are returned
+"RTN","BSDX01",182,0)
+ ;
+"RTN","BSDX01",183,0)
+ N BSDXERR,BSDXRET,BSDXIEN,BSDXRES,BSDXDEP,BSDXDDR,BSDXDEPN,BSDXRDAT,BSDXRNOD,BSDXI
+"RTN","BSDX01",184,0)
+ N BSDXRESN,BSDXMGR,BSDXRESD,BSDXNOD,BSDXSUBID
+"RTN","BSDX01",185,0)
+ K ^BSDXTEMP($J)
+"RTN","BSDX01",186,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",187,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",188,0)
+ S BSDXI=0
+"RTN","BSDX01",189,0)
+ S BSDXERR=""
+"RTN","BSDX01",190,0)
+ S ^BSDXTMP($J,BSDXI)="I00020RESOURCE_GROUPID^T00030RESOURCE_GROUP^I00020RESOURCE_GROUP_ITEMID^T00030RESOURCE_NAME^I00020RESOURCEID"_$C(30)
+"RTN","BSDX01",191,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",192,0)
+ ;Check SECURITY KEY file for BSDXZMGR or XUPROGMODE keys
+"RTN","BSDX01",193,0)
+ S BSDXMGR=$$APSEC("BSDXZMGR",BSDXDUZ)
+"RTN","BSDX01",194,0)
+ ;
+"RTN","BSDX01",195,0)
+ ;User does not have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",196,0)
+ ;$O THRU AC XREF OF BSDX RESOURCE USER
+"RTN","BSDX01",197,0)
+ I 'BSDXMGR,$D(^BSDXRSU("AC",BSDXDUZ))  S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRSU("AC",BSDXDUZ,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",198,0)
+ . S BSDXRES=$P(^BSDXRSU(BSDXIEN,0),U)
+"RTN","BSDX01",199,0)
+ . Q:'$D(^BSDXDEPT("AB",BSDXRES))  ; Quit if Resource isn't part of any Group
+"RTN","BSDX01",200,0)
+    . ;Q:'$$INDIV2(BSDXRES)  ; Quit if Resource isn't in same division as user.
+"RTN","BSDX01",201,0)
+ . S BSDXRNOD=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX01",202,0)
+ . Q:BSDXRNOD=""
+"RTN","BSDX01",203,0)
+ . ;QUIT if the resource is inactive
+"RTN","BSDX01",204,0)
+ . Q:$P(BSDXRNOD,U,2)=1
+"RTN","BSDX01",205,0)
+ . S BSDXRESN=$P(BSDXRNOD,U)
+"RTN","BSDX01",206,0)
+ . S BSDXDEP=0 F  S BSDXDEP=$O(^BSDXDEPT("AB",BSDXRES,BSDXDEP)) Q:'+BSDXDEP  D
+"RTN","BSDX01",207,0)
+ . . Q:'$D(^BSDXDEPT(BSDXDEP,0))
+"RTN","BSDX01",208,0)
+ . . S BSDXDEPN=$P(^BSDXDEPT(BSDXDEP,0),U)
+"RTN","BSDX01",209,0)
+ . . S BSDXSUBID=$O(^BSDXDEPT(BSDXDEP,1,"B",BSDXRES,0))
+"RTN","BSDX01",210,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX01",211,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXDEP_U_BSDXDEPN_U_BSDXSUBID_U_BSDXRESN_U_BSDXRES_$C(30)
+"RTN","BSDX01",212,0)
+ . Q
+"RTN","BSDX01",213,0)
+ ;
+"RTN","BSDX01",214,0)
+ ;User does have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",215,0)
+ ;$O THRU BSDX RESOURCE GROUP file directly
+"RTN","BSDX01",216,0)
+ I BSDXMGR S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXDEPT(BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",217,0)
+ . Q:'$D(^BSDXDEPT(BSDXIEN,0))
+"RTN","BSDX01",218,0)
+ . S BSDXNOD=^BSDXDEPT(BSDXIEN,0)
+"RTN","BSDX01",219,0)
+ . S BSDXDEPN=$P(BSDXNOD,U)
+"RTN","BSDX01",220,0)
+ . S BSDXRES=0 F  S BSDXRES=$O(^BSDXDEPT(BSDXIEN,1,BSDXRES)) Q:'+BSDXRES  D
+"RTN","BSDX01",221,0)
+ . . N BSDXRESD
+"RTN","BSDX01",222,0)
+ . . Q:'$D(^BSDXDEPT(BSDXIEN,1,BSDXRES,0))  ; Quit if zero node is invalid in multiple
+"RTN","BSDX01",223,0)
+ . . S BSDXRESD=$P(^BSDXDEPT(BSDXIEN,1,BSDXRES,0),"^")
+"RTN","BSDX01",224,0)
+ . . Q:'$D(^BSDXRES(BSDXRESD,0))  ; Quit if zero node of resouce file is invalid
+"RTN","BSDX01",225,0)
+    . . ;Q:'$$INDIV2(BSDXRESD)  ; Quit if resource is not in the same division
+"RTN","BSDX01",226,0)
+ . . S BSDXRNOD=$G(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX01",227,0)
+ . . Q:BSDXRNOD=""
+"RTN","BSDX01",228,0)
+ . . ;QUIT if the resource is inactive
+"RTN","BSDX01",229,0)
+ . . Q:$P(BSDXRNOD,U,2)=1
+"RTN","BSDX01",230,0)
+ . . S BSDXRESN=$P(BSDXRNOD,U)
+"RTN","BSDX01",231,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX01",232,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXDEPN_U_BSDXRES_U_BSDXRESN_U_BSDXRESD_$C(30)
+"RTN","BSDX01",233,0)
+ . . Q
+"RTN","BSDX01",234,0)
+ . Q
+"RTN","BSDX01",235,0)
+ ;
+"RTN","BSDX01",236,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",237,0)
+ Q
+"RTN","BSDX01",238,0)
+ ;
+"RTN","BSDX01",239,0)
+APSEC(BSDXKEY,BSDXDUZ) ;EP - Return TRUE (1) if user has keys BSDXKEY or XUPROGMODE, otherwise, returns FALSE (0)
+"RTN","BSDX01",240,0)
+ ;
+"RTN","BSDX01",241,0)
+ N BSDXIEN,BSDXPROG,BSDXPKEY
+"RTN","BSDX01",242,0)
+ I '$G(BSDXDUZ) Q 0
+"RTN","BSDX01",243,0)
+ ;
+"RTN","BSDX01",244,0)
+ ;Test for programmer mode key
+"RTN","BSDX01",245,0)
+ S BSDXPROG=0
+"RTN","BSDX01",246,0)
+ I $D(^DIC(19.1,"B","XUPROGMODE")) D
+"RTN","BSDX01",247,0)
+ . S BSDXPKEY=$O(^DIC(19.1,"B","XUPROGMODE",0))
+"RTN","BSDX01",248,0)
+ . I '+BSDXPKEY Q
+"RTN","BSDX01",249,0)
+ . I '$D(^VA(200,BSDXDUZ,51,BSDXPKEY,0)) Q
+"RTN","BSDX01",250,0)
+ . S BSDXPROG=1
+"RTN","BSDX01",251,0)
+ I BSDXPROG Q 1
+"RTN","BSDX01",252,0)
+ ;
+"RTN","BSDX01",253,0)
+ I BSDXKEY="" Q 0
+"RTN","BSDX01",254,0)
+ I '$D(^DIC(19.1,"B",BSDXKEY)) Q 0
+"RTN","BSDX01",255,0)
+ S BSDXIEN=$O(^DIC(19.1,"B",BSDXKEY,0))
+"RTN","BSDX01",256,0)
+ I '+BSDXIEN Q 0
+"RTN","BSDX01",257,0)
+ I '$D(^VA(200,BSDXDUZ,51,BSDXIEN,0)) Q 0
+"RTN","BSDX01",258,0)
+ Q 1
+"RTN","BSDX01",259,0)
+INDIV(BSDXSC) ; PEP - Is ^SC clinic in the same DUZ(2) as user?
+"RTN","BSDX01",260,0)
+    ; Input: BSDXSC - Hospital Location IEN
+"RTN","BSDX01",261,0)
+    ; Output: True or False
+"RTN","BSDX01",262,0)
+    I '+BSDXSC QUIT 1  ;If not tied to clinic, yes
+"RTN","BSDX01",263,0)
+    I '$D(^SC(BSDXSC,0)) QUIT 1 ; If Clinic does not exist, yes
+"RTN","BSDX01",264,0)
+    ; Jump to Division:Medical Center Division:Inst File Pointer for
+"RTN","BSDX01",265,0)
+    ; Institution IEN (and get its internal value)
+"RTN","BSDX01",266,0)
+    N DIV S DIV=$$GET1^DIQ(44,BSDXSC_",","3.5:.07","I")
+"RTN","BSDX01",267,0)
+    I DIV="" Q 1 ; If clinic has no division, consider it avial to user.
+"RTN","BSDX01",268,0)
+    I DIV=DUZ(2) Q 1 ; If same, then User is in same Div as Clinic
+"RTN","BSDX01",269,0)
+    E  Q 0 ; Otherwise, no
+"RTN","BSDX01",270,0)
+    QUIT
+"RTN","BSDX01",271,0)
+INDIV2(BSDXRES) ; PEP - Is Resource in the same DUZ(2) as user?
+"RTN","BSDX01",272,0)
+    ; Input BSDXRES - BSDX RESOURCE IEN
+"RTN","BSDX01",273,0)
+    ; Output: True of False
+"RTN","BSDX01",274,0)
+    Q $$INDIV($P($G(^BSDXRES(BSDXRES,0)),U,4)) ; Extract Hospital Location and send to $$INDIV
+"RTN","BSDX01",275,0)
+UnitTestINDIV 
+"RTN","BSDX01",276,0)
+    W "Testing if they are the same",!
+"RTN","BSDX01",277,0)
+    S DUZ(2)=67
+"RTN","BSDX01",278,0)
+    I '$$INDIV(1) W "ERROR",!
+"RTN","BSDX01",279,0)
+    I '$$INDIV(2) W "ERROR",!
+"RTN","BSDX01",280,0)
+    W "Testing if Div not defined in 44, should be true",!
+"RTN","BSDX01",281,0)
+    I '$$INDIV(3) W "ERROR",!
+"RTN","BSDX01",282,0)
+    W "Testing empty string. Should be true",!
+"RTN","BSDX01",283,0)
+    I '$$INDIV("") W "ERROR",!
+"RTN","BSDX01",284,0)
+    W "Testing if they are different",!
+"RTN","BSDX01",285,0)
+    S DUZ(2)=899
+"RTN","BSDX01",286,0)
+    I $$INDIV(1) W "ERROR",!
+"RTN","BSDX01",287,0)
+    I $$INDIV(2) W "ERROR",!
+"RTN","BSDX01",288,0)
+    QUIT
+"RTN","BSDX01",289,0)
+UnitTestINDIV2 
+"RTN","BSDX01",290,0)
+    W "Testing if they are the same",!
+"RTN","BSDX01",291,0)
+    S DUZ(2)=69
+"RTN","BSDX01",292,0)
+    I $$INDIV2(22)'=0 W "ERROR",!
+"RTN","BSDX01",293,0)
+    I $$INDIV2(25)'=1 W "ERROR",!
+"RTN","BSDX01",294,0)
+    I $$INDIV2(26)'=1 W "ERROR",!
+"RTN","BSDX01",295,0)
+    I $$INDIV2(27)'=1 W "ERROR",!
+"RTN","BSDX01",296,0)
+    QUIT
+"RTN","BSDX02")
+0^2^B16323271
+"RTN","BSDX02",1,0)
+BSDX02 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 12:25pm
+"RTN","BSDX02",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX02",3,0)
+    ; 
+"RTN","BSDX02",4,0)
+    ; Change Log
+"RTN","BSDX02",5,0)
+    ; July 15 2010: UJO/SMH - Pass FM dates in instead of US dates for i18n
+"RTN","BSDX02",6,0)
+ ;
+"RTN","BSDX02",7,0)
+ ;
+"RTN","BSDX02",8,0)
+CRSCHD(BSDXY,BSDXRES,BSDXSTART,BSDXEND) ;EP
+"RTN","BSDX02",9,0)
+ ;Entry point for debugging
+"RTN","BSDX02",10,0)
+ ;
+"RTN","BSDX02",11,0)
+ ;D DEBUG^%Serenji("CRSCH^BSDX02(.BSDXY,BSDXRES,BSDXSTART,BSDXEND)")
+"RTN","BSDX02",12,0)
+ Q
+"RTN","BSDX02",13,0)
+ ;
+"RTN","BSDX02",14,0)
+CRSCH(BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXWKIN)     ;
+"RTN","BSDX02",15,0)
+ ;Called by BSDX CREATE APPT SCHEDULE
+"RTN","BSDX02",16,0)
+ ;Create Resource Appointment Schedule recordset
+"RTN","BSDX02",17,0)
+ ;On error, returns 0 in APPOINTMENTID field and error text in NOTE field
+"RTN","BSDX02",18,0)
+ ;
+"RTN","BSDX02",19,0)
+ ;$O Thru ^BSDXAPPT("ARSRC", RESOURCE, STARTTIME, APPTID)
+"RTN","BSDX02",20,0)
+ ;BMXRES is a | delimited list of resource names
+"RTN","BSDX02",21,0)
+ ;BSDXWKIN - If 1, then return walkins, otherwise skip them
+"RTN","BSDX02",22,0)
+ ;9-27-2004 Added walkin to returned datatable
+"RTN","BSDX02",23,0)
+ ;TODO: Change BSDXRES from names to IDs
+"RTN","BSDX02",24,0)
+ ;
+"RTN","BSDX02",25,0)
+ N BSDXERR,BSDXIEN,BSDXDEPD,BSDXDEPN,BSDXRESD,BSDXI,BSDXJ,BSDXRESN,BSDXS,BSDXAD,BSDXZ,BSDXQ,BSDXNOD
+"RTN","BSDX02",26,0)
+ N BSDXPAT,BSDXNOT,BSDXZPCD,BSDXPCD
+"RTN","BSDX02",27,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX02",28,0)
+ S BSDXERR=""
+"RTN","BSDX02",29,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX02",30,0)
+ S ^BSDXTMP($J,0)="I00020APPOINTMENTID^D00030START_TIME^D00030END_TIME^D00030CHECKIN^D00030AUXTIME^I00020PATIENTID^T00030PATIENTNAME^T00030RESOURCENAME^I00005NOSHOW^T00020HRN^I00005ACCESSTYPEID^I00005WALKIN^T00250NOTE"_$C(30)
+"RTN","BSDX02",31,0)
+ D ^XBKVAR S X="ETRAP^BSDX02",@^%ZOSF("TRAP")
+"RTN","BSDX02",32,0)
+ ;
+"RTN","BSDX02",33,0)
+ ; S %DT="T",X=BSDXSTART D ^%DT S BSDXSTART=Y
+"RTN","BSDX02",34,0)
+ ; I BSDXSTART=-1 S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX02",35,0)
+ ; S %DT="T",X=BSDXEND D ^%DT S BSDXEND=Y
+"RTN","BSDX02",36,0)
+ ; I BSDXEND=-1 S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX02",37,0)
+    ;
+"RTN","BSDX02",38,0)
+ S BSDXI=0
+"RTN","BSDX02",39,0)
+ D STRES
+"RTN","BSDX02",40,0)
+ ;
+"RTN","BSDX02",41,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",42,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX02",43,0)
+ Q
+"RTN","BSDX02",44,0)
+ ;
+"RTN","BSDX02",45,0)
+STRES ;
+"RTN","BSDX02",46,0)
+ F BSDXJ=1:1:$L(BSDXRES,"|") S BSDXRESN=$P(BSDXRES,"|",BSDXJ) D
+"RTN","BSDX02",47,0)
+ . Q:BSDXRESN=""
+"RTN","BSDX02",48,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX02",49,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX02",50,0)
+ . Q:'+BSDXRESD
+"RTN","BSDX02",51,0)
+ . Q:'$D(^BSDXAPPT("ARSRC",BSDXRESD))
+"RTN","BSDX02",52,0)
+ . S BSDXS=BSDXSTART-.0001
+"RTN","BSDX02",53,0)
+ . F  S BSDXS=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX02",54,0)
+ . . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D STCOMM(BSDXAD,BSDXRESN)
+"RTN","BSDX02",55,0)
+ Q
+"RTN","BSDX02",56,0)
+ ;
+"RTN","BSDX02",57,0)
+STCOMM(BSDXAD,BSDXRESN)      ;
+"RTN","BSDX02",58,0)
+ ;BSDXAD is the appointment IEN
+"RTN","BSDX02",59,0)
+ N BSDXC,BSDXQ,BSDXZ,BSDXSUBC,BSDXHRN,BSDXPATD,BSDXATID,BSDXISWK
+"RTN","BSDX02",60,0)
+ Q:'$D(^BSDXAPPT(BSDXAD,0))
+"RTN","BSDX02",61,0)
+ S BSDXNOD=^BSDXAPPT(BSDXAD,0)
+"RTN","BSDX02",62,0)
+ Q:$P(BSDXNOD,U,12)]""  ;CANCELLED
+"RTN","BSDX02",63,0)
+ S BSDXISWK=0
+"RTN","BSDX02",64,0)
+ S:$P(BSDXNOD,U,13)="y" BSDXISWK=1
+"RTN","BSDX02",65,0)
+ I +$G(BSDXWKIN) Q:BSDXISWK  ;Don't return walkins if appt is WALKIN and BSDXWKIN is 1
+"RTN","BSDX02",66,0)
+ S BSDXZ=BSDXAD_"^"
+"RTN","BSDX02",67,0)
+ F BSDXQ=1:1:4 D
+"RTN","BSDX02",68,0)
+ . S Y=$P(BSDXNOD,U,BSDXQ)
+"RTN","BSDX02",69,0)
+ . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX02",70,0)
+ . S BSDXZ=BSDXZ_Y_"^"
+"RTN","BSDX02",71,0)
+ S BSDXPATD=$P(BSDXNOD,U,5)
+"RTN","BSDX02",72,0)
+ S BSDXZ=BSDXZ_BSDXPATD_"^" ;PATIENT ID
+"RTN","BSDX02",73,0)
+ S BSDXPAT=""
+"RTN","BSDX02",74,0)
+ I BSDXPATD]"",$D(^DPT(BSDXPATD,0)) S BSDXPAT=$P(^DPT(BSDXPATD,0),U)
+"RTN","BSDX02",75,0)
+ S BSDXZ=BSDXZ_BSDXPAT_"^" ;PATIENT NAME
+"RTN","BSDX02",76,0)
+ S BSDXZ=BSDXZ_BSDXRESN_"^" ;RESOURCENAME
+"RTN","BSDX02",77,0)
+ S BSDXZ=BSDXZ_+$P(BSDXNOD,U,10)_"^" ;NOSHOW
+"RTN","BSDX02",78,0)
+ S BSDXHRN=""
+"RTN","BSDX02",79,0)
+ I $D(DUZ(2)),DUZ(2)>0 S BSDXHRN=$P($G(^AUPNPAT(BSDXPATD,41,DUZ(2),0)),U,2) ;HRN
+"RTN","BSDX02",80,0)
+ S BSDXZ=BSDXZ_BSDXHRN_"^"
+"RTN","BSDX02",81,0)
+ S BSDXATID=$P(BSDXNOD,U,6)
+"RTN","BSDX02",82,0)
+ S:'+BSDXATID BSDXATID=0 ;UNKNOWN TYPE
+"RTN","BSDX02",83,0)
+ S BSDXZ=BSDXZ_BSDXATID_"^"_BSDXISWK_"^"
+"RTN","BSDX02",84,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",85,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXZ
+"RTN","BSDX02",86,0)
+ ;NOTE
+"RTN","BSDX02",87,0)
+ S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXAD,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX02",88,0)
+ . S BSDXNOT=$G(^BSDXAPPT(BSDXAD,1,BSDXQ,0))
+"RTN","BSDX02",89,0)
+ . S:$E(BSDXNOT,$L(BSDXNOT)-1,$L(BSDXNOT))'=" " BSDXNOT=BSDXNOT_" "
+"RTN","BSDX02",90,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX02",91,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXNOT
+"RTN","BSDX02",92,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",93,0)
+ S ^BSDXTMP($J,BSDXI)=$C(30)
+"RTN","BSDX02",94,0)
+ Q
+"RTN","BSDX02",95,0)
+ ;
+"RTN","BSDX02",96,0)
+ERR(BSDXI,BSDXERR) ;Error processing
+"RTN","BSDX02",97,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",98,0)
+ S ^BSDXTMP($J,BSDXI)="0^^^^^^^^^^^"_BSDXERR_$C(30)
+"RTN","BSDX02",99,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",100,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX02",101,0)
+ Q
+"RTN","BSDX02",102,0)
+ ;
+"RTN","BSDX02",103,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX02",104,0)
+ D ^%ZTER
+"RTN","BSDX02",105,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX02",106,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",107,0)
+ D ERR(BSDXI,"BSDX31 Error: "_$G(%ZTERROR))
+"RTN","BSDX02",108,0)
+ Q
+"RTN","BSDX03")
+0^3^B2855259
+"RTN","BSDX03",1,0)
+BSDX03 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX03",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX03",3,0)
+ ;
+"RTN","BSDX03",4,0)
+ ;
+"RTN","BSDX03",5,0)
+ Q
+"RTN","BSDX03",6,0)
+ ;
+"RTN","BSDX03",7,0)
+XR2S(BSDXDA) ;EP
+"RTN","BSDX03",8,0)
+ ;XR2 is the ARSRC xref for the
+"RTN","BSDX03",9,0)
+ ;RESOURCE field of the BSDX APPOINTMENT file
+"RTN","BSDX03",10,0)
+ ;Format is ^BSDXAPPT("ARSRC",RESOURCEID,STARTTIME,APPTID)
+"RTN","BSDX03",11,0)
+ Q:'$D(^BSDXAPPT(BSDXDA,0))
+"RTN","BSDX03",12,0)
+ N BSDXNOD,BSDXAPPID,BSDXRSID,BSDXS
+"RTN","BSDX03",13,0)
+ S BSDXNOD=^BSDXAPPT(BSDXDA,0)
+"RTN","BSDX03",14,0)
+ S BSDXAPPID=BSDXDA
+"RTN","BSDX03",15,0)
+ S BSDXRSID=$P(BSDXNOD,U,7)
+"RTN","BSDX03",16,0)
+ Q:'+BSDXAPPID>0
+"RTN","BSDX03",17,0)
+ Q:'+BSDXRSID>0
+"RTN","BSDX03",18,0)
+ S BSDXS=$P(BSDXNOD,U)
+"RTN","BSDX03",19,0)
+ Q:'+BSDXS
+"RTN","BSDX03",20,0)
+ S ^BSDXAPPT("ARSRC",BSDXRSID,BSDXS,BSDXAPPID)=""
+"RTN","BSDX03",21,0)
+ Q
+"RTN","BSDX03",22,0)
+ ;
+"RTN","BSDX03",23,0)
+XR2K(BSDXA) ;EP
+"RTN","BSDX03",24,0)
+ Q:'$D(^BSDXAPPT(BSDXA,0))
+"RTN","BSDX03",25,0)
+ N BSDXNOD,BSDXAPPID,BSDXRSID,BSDXS
+"RTN","BSDX03",26,0)
+ S BSDXNOD=^BSDXAPPT(BSDXA,0)
+"RTN","BSDX03",27,0)
+ S BSDXAPPID=BSDXA
+"RTN","BSDX03",28,0)
+ S BSDXRSID=$P(BSDXNOD,U,7)
+"RTN","BSDX03",29,0)
+ S BSDXS=$P(BSDXNOD,U)
+"RTN","BSDX03",30,0)
+ Q:'+BSDXAPPID>0
+"RTN","BSDX03",31,0)
+ Q:'+BSDXRSID>0
+"RTN","BSDX03",32,0)
+ Q:'+BSDXS>0
+"RTN","BSDX03",33,0)
+ K ^BSDXAPPT("ARSRC",BSDXRSID,BSDXS,BSDXAPPID)
+"RTN","BSDX03",34,0)
+ Q
+"RTN","BSDX03",35,0)
+XR4S(BSDXDA) ;EP
+"RTN","BSDX03",36,0)
+ ;XR4 is the ARSCT xref for the
+"RTN","BSDX03",37,0)
+ ;STARTTIME field of the BSDX ACCESS BLOCK file
+"RTN","BSDX03",38,0)
+ ;Format is ^BSDXAB("ARSCT",RESOURCEID,STARTTIME,DA)
+"RTN","BSDX03",39,0)
+ Q:'$D(^BSDXAB(BSDXDA,0))
+"RTN","BSDX03",40,0)
+ N BSDXNOD,BSDXR,BSDXS
+"RTN","BSDX03",41,0)
+ S BSDXNOD=^BSDXAB(BSDXDA,0)
+"RTN","BSDX03",42,0)
+ S BSDXR=$P(BSDXNOD,U)
+"RTN","BSDX03",43,0)
+ S BSDXS=$P(BSDXNOD,U,2)
+"RTN","BSDX03",44,0)
+ Q:'+BSDXR>0
+"RTN","BSDX03",45,0)
+ Q:'+BSDXS>0
+"RTN","BSDX03",46,0)
+ S ^BSDXAB("ARSCT",BSDXR,BSDXS,BSDXDA)=""
+"RTN","BSDX03",47,0)
+ Q
+"RTN","BSDX03",48,0)
+ ;
+"RTN","BSDX03",49,0)
+XR4K(BSDXDA) ;EP
+"RTN","BSDX03",50,0)
+ Q:'$D(^BSDXAB(BSDXDA,0))
+"RTN","BSDX03",51,0)
+ N BSDXNOD,BSDXR,BSDXS
+"RTN","BSDX03",52,0)
+ S BSDXNOD=^BSDXAB(BSDXDA,0)
+"RTN","BSDX03",53,0)
+ S BSDXR=$P(BSDXNOD,U)
+"RTN","BSDX03",54,0)
+ S BSDXS=$P(BSDXNOD,U,2)
+"RTN","BSDX03",55,0)
+ Q:'+BSDXR>0
+"RTN","BSDX03",56,0)
+ Q:'+BSDXS>0
+"RTN","BSDX03",57,0)
+ K ^BSDXAB("ARSCT",BSDXR,BSDXS,BSDXDA)
+"RTN","BSDX03",58,0)
+ Q
+"RTN","BSDX04")
+0^4^B24350739
+"RTN","BSDX04",1,0)
+BSDX04 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;  ; 2/27/11 6:32am
+"RTN","BSDX04",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX04",3,0)
+ ; Change Log:
+"RTN","BSDX04",4,0)
+ ; July 11 2010: Pass BSDXSTART and END as FM dates rather than US formatted dates
+"RTN","BSDX04",5,0)
+ ;       for i18n
+"RTN","BSDX04",6,0)
+ ; Feb 27 2010 (v. 1.5) SMH
+"RTN","BSDX04",7,0)
+ ; - Grab multiple resources instead of a single resource. 
+"RTN","BSDX04",8,0)
+ ;   --> Will be passed from C# as | delimited.
+"RTN","BSDX04",9,0)
+ ; - Change in algorithm. Padding part to pad start and end dates to coincide
+"RTN","BSDX04",10,0)
+ ;   --> with schedule now not performed. C# won't need that anymore.
+"RTN","BSDX04",11,0)
+ ;
+"RTN","BSDX04",12,0)
+ ;
+"RTN","BSDX04",13,0)
+CASSCHD(BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXTYPES,BSDXSRCH) ;EP
+"RTN","BSDX04",14,0)
+ ;
+"RTN","BSDX04",15,0)
+ ;D DEBUG^%Serenji("CASSCH^BSDX04(.BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXTYPES,BSDXSRCH)")
+"RTN","BSDX04",16,0)
+ ;
+"RTN","BSDX04",17,0)
+ Q
+"RTN","BSDX04",18,0)
+ ;
+"RTN","BSDX04",19,0)
+CASSET ;EP
+"RTN","BSDX04",20,0)
+ ;Error Trap
+"RTN","BSDX04",21,0)
+ D ^%ZTER
+"RTN","BSDX04",22,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=99999
+"RTN","BSDX04",23,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX04",24,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX04",25,0)
+ Q
+"RTN","BSDX04",26,0)
+ ;
+"RTN","BSDX04",27,0)
+CASSCH(BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXTYPES,BSDXSRCH) ;EP  -- RPC: BSDX CREATE ASGND SLOT SCHED
+"RTN","BSDX04",28,0)
+ ;Create Assigned Slot Schedule recordset (Access Blocks, Availabilities, etc.)
+"RTN","BSDX04",29,0)
+ ;This call is used both to create a schedule of availability for the calendar display
+"RTN","BSDX04",30,0)
+ ;and to search for availability in the Find Appointment function
+"RTN","BSDX04",31,0)
+ ;
+"RTN","BSDX04",32,0)
+ ;BSDXRES is resources name, delimited by |
+"RTN","BSDX04",33,0)
+ ;
+"RTN","BSDX04",34,0)
+ ; BSDXSTART and BSDXEND both passed in FM Format.
+"RTN","BSDX04",35,0)
+ ; BSDXSTART is the Date Portion of FM Date
+"RTN","BSDX04",36,0)
+ ; BSDXEND -- pass date and h,m,s as well
+"RTN","BSDX04",37,0)
+ ;
+"RTN","BSDX04",38,0)
+ ;BSDXTYPES is |-delimited list of Access Type Names
+"RTN","BSDX04",39,0)
+ ;If BSDXTYPES is "" then the screen passes all types.
+"RTN","BSDX04",40,0)
+ ;
+"RTN","BSDX04",41,0)
+ ;BSDXSRCH is |-delimited search info for the Find Appointment function
+"RTN","BSDX04",42,0)
+ ;First piece is 1 if we are in a Find Appointment call
+"RTN","BSDX04",43,0)
+ ;Second piece is weekday info in the format MTWHFSU
+"RTN","BSDX04",44,0)
+ ;Third piece is AM PM info in the form AP
+"RTN","BSDX04",45,0)
+ ;If 2nd or 3rd pieces are null, the screen for that piece is skipped
+"RTN","BSDX04",46,0)
+ ;
+"RTN","BSDX04",47,0)
+ ;Test lines:
+"RTN","BSDX04",48,0)
+ ;D CASSCH^BSDX04(.RES,"REMILLARD,MIKE","<fmdate>","<fmdate>") ZW RES
+"RTN","BSDX04",49,0)
+ ;BSDX CREATE ASGND SLOT SCHED^ROGERS,BUCK^<fmdate>^<fmdate>^2
+"RTN","BSDX04",50,0)
+ ;S ^HW("BSDX04")=BSDXRES_U_BSDXSTART_U_BSDXEND
+"RTN","BSDX04",51,0)
+ ;
+"RTN","BSDX04",52,0)
+ N BSDXERR,BSDXIEN,BSDXDEP,BSDXTYPED,BSDXTYPE,BSDXBS,BSDXI,BSDXNEND,BSDXNSTART,BSDXPEND,BSDXRESD,BSDXRESN,BSDXS,BSDXZ,BSDXTMP,BSDXQ,BSDXNOT,BSDXNOD,BSDXAD
+"RTN","BSDX04",53,0)
+ N BSDXSUBCD
+"RTN","BSDX04",54,0)
+ S X="CASSET^BSDX04",@^%ZOSF("TRAP")
+"RTN","BSDX04",55,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX04",56,0)
+ S BSDXERR=""
+"RTN","BSDX04",57,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX04",58,0)
+ S ^BSDXTMP($J,0)="D00030START_TIME^D00030END_TIME^I00010SLOTS^T00030RESOURCE^T00010ACCESS_TYPE^T00250NOTE^I00030AVAILABILITYID"_$C(30)
+"RTN","BSDX04",59,0)
+ S BSDXI=2
+"RTN","BSDX04",60,0)
+ ;
+"RTN","BSDX04",61,0)
+ ;Get Access Type IDs
+"RTN","BSDX04",62,0)
+ N BSDXK,BSDXTYPED,BSDXL
+"RTN","BSDX04",63,0)
+ I '+BSDXSRCH S BSDXTYPED=""
+"RTN","BSDX04",64,0)
+ I +BSDXSRCH F BSDXK=1:1:$L(BSDXTYPES,"|") D
+"RTN","BSDX04",65,0)
+ . S BSDXL=$P(BSDXTYPES,"|",BSDXK)
+"RTN","BSDX04",66,0)
+ . I BSDXL="" S $P(BSDXTYPED,"|",BSDXK)=0 Q
+"RTN","BSDX04",67,0)
+ . I '$D(^BSDXTYPE("B",BSDXL)) S $P(BSDXTYPED,"|",BSDXK)=0 Q
+"RTN","BSDX04",68,0)
+ . S $P(BSDXTYPED,"|",BSDXK)=$O(^BSDXTYPE("B",BSDXL,0))
+"RTN","BSDX04",69,0)
+ ;
+"RTN","BSDX04",70,0)
+ N BSDXCOUN ; Counter
+"RTN","BSDX04",71,0)
+ FOR BSDXCOUN=1:1:$L(BSDXRES,"|") DO  ;smh - d in algo to do multiple res
+"RTN","BSDX04",72,0)
+ . S BSDXRESN=$P(BSDXRES,"|",BSDXCOUN)
+"RTN","BSDX04",73,0)
+ . Q:BSDXRESN=""
+"RTN","BSDX04",74,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX04",75,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0)) 
+"RTN","BSDX04",76,0)
+ . Q:'+BSDXRESD
+"RTN","BSDX04",77,0)
+ . Q:'$D(^BSDXAB("ARSCT",BSDXRESD))
+"RTN","BSDX04",78,0)
+ . S BSDXBS=0
+"RTN","BSDX04",79,0)
+ . D STRES(BSDXRESN,BSDXRESD)
+"RTN","BSDX04",80,0)
+ . Q
+"RTN","BSDX04",81,0)
+ ;
+"RTN","BSDX04",82,0)
+ ; V 1.5 -- All of this commented out; algo changed on C# side.
+"RTN","BSDX04",83,0)
+ ;start, end, slots, resource, accesstype, note, availabilityid
+"RTN","BSDX04",84,0)
+ ;I '+BSDXSRCH,BSDXALO D
+"RTN","BSDX04",85,0)
+ ; I BSDXALO D
+"RTN","BSDX04",86,0)
+ ; . ;If first block start time > input start time then pad with new block
+"RTN","BSDX04",87,0)
+ ; . I BSDXBS>BSDXSTART K BSDXTMP D
+"RTN","BSDX04",88,0)
+ ; . . S Y=BSDXSTART X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",89,0)
+ ; . . S BSDXTMP=Y
+"RTN","BSDX04",90,0)
+ ; . . S Y=BSDXBS X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",91,0)
+ ; . . S BSDXTMP=BSDXTMP_"^"_Y_"^0^"_BSDXRESN_"^0^^0"_$C(30)
+"RTN","BSDX04",92,0)
+ ; . . S ^BSDXTMP($J,1)=BSDXTMP
+"RTN","BSDX04",93,0)
+ ; . ;
+"RTN","BSDX04",94,0)
+ ; . ;If first block start time < input start time then trim
+"RTN","BSDX04",95,0)
+ ; . I BSDXBS<BSDXSTART D
+"RTN","BSDX04",96,0)
+ ; . . S Y=BSDXSTART
+"RTN","BSDX04",97,0)
+ ; . . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",98,0)
+ ; . . S $P(^BSDXTMP($J,2),U,1)=Y
+"RTN","BSDX04",99,0)
+ ; . ;
+"RTN","BSDX04",100,0)
+ ; . ;If last block end time < input end time then pad end with new block
+"RTN","BSDX04",101,0)
+ ; . I BSDXPEND<BSDXEND D
+"RTN","BSDX04",102,0)
+ ; . . S Y=BSDXPEND X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",103,0)
+ ; . . S BSDXTMP=Y
+"RTN","BSDX04",104,0)
+ ; . . S Y=BSDXEND X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",105,0)
+ ; . . S BSDXTMP=BSDXTMP_"^"_Y_"^0^"_BSDXRESN_"^0^^0"_$C(30)
+"RTN","BSDX04",106,0)
+ ; . . S ^BSDXTMP($J,BSDXI-1)=BSDXTMP
+"RTN","BSDX04",107,0)
+ ; . ;
+"RTN","BSDX04",108,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX04",109,0)
+ Q
+"RTN","BSDX04",110,0)
+ ;
+"RTN","BSDX04",111,0)
+STRES(BSDXRESN,BSDXRESD) ;
+"RTN","BSDX04",112,0)
+ ;BSDXRESD is a Resource ID
+"RTN","BSDX04",113,0)
+ ;$O THRU "ARSCT" XREF OF ^BSDXAB
+"RTN","BSDX04",114,0)
+ S BSDXS=$P(BSDXSTART,"."),BSDXS=BSDXS-.0001
+"RTN","BSDX04",115,0)
+ S BSDXNEND=0,BSDXNSTART=0,BSDXPEND=0
+"RTN","BSDX04",116,0)
+ F  S BSDXS=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX04",117,0)
+ . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D STCOMM(BSDXRESN,BSDXRESD,BSDXS,BSDXAD) ;BSDXAD Is the AvailabilityID
+"RTN","BSDX04",118,0)
+ . Q
+"RTN","BSDX04",119,0)
+ Q
+"RTN","BSDX04",120,0)
+ ;
+"RTN","BSDX04",121,0)
+STCOMM(BSDXRESN,BSDXRESD,BSDXS,BSDXAD) ;
+"RTN","BSDX04",122,0)
+ N BSDXNSTART,BSDXNEND,BSDXNOD,Y,BSDXQ,BSDXZ,BSDXATID,BSDXATOK
+"RTN","BSDX04",123,0)
+ Q:'$D(^BSDXAB(BSDXAD,0))
+"RTN","BSDX04",124,0)
+ S BSDXNOD=^BSDXAB(BSDXAD,0)
+"RTN","BSDX04",125,0)
+ S BSDXATID=$P(BSDXNOD,U,5)
+"RTN","BSDX04",126,0)
+ ;
+"RTN","BSDX04",127,0)
+ ;Screen for Access Type
+"RTN","BSDX04",128,0)
+ ;S BSDXATOK=0
+"RTN","BSDX04",129,0)
+ ;I BSDXTYPED="" S BSDXATOK=1
+"RTN","BSDX04",130,0)
+ ;E  D
+"RTN","BSDX04",131,0)
+ ;. F J=1:1:$L(BSDXTYPED,"|") I BSDXATID=$P(BSDXTYPED,"|",J) S BSDXATOK=1 Q
+"RTN","BSDX04",132,0)
+ ;Q:'BSDXATOK
+"RTN","BSDX04",133,0)
+ ;
+"RTN","BSDX04",134,0)
+ ;I +BSDXSRCH
+"RTN","BSDX04",135,0)
+ ;Screen for Weekday
+"RTN","BSDX04",136,0)
+ ;
+"RTN","BSDX04",137,0)
+ ;Screen for AM PM
+"RTN","BSDX04",138,0)
+ ;
+"RTN","BSDX04",139,0)
+ S BSDXZ=""
+"RTN","BSDX04",140,0)
+ S BSDXNSTART=$P(BSDXNOD,U,2)
+"RTN","BSDX04",141,0)
+ S BSDXNEND=$P(BSDXNOD,U,3)
+"RTN","BSDX04",142,0)
+ I BSDXNEND'>BSDXSTART Q  ;End is less than start
+"RTN","BSDX04",143,0)
+ I +BSDXBS=0 S BSDXBS=$P(BSDXNOD,U,2) ;First block start time
+"RTN","BSDX04",144,0)
+ F BSDXQ=2:1:3 D  ;Start and End times
+"RTN","BSDX04",145,0)
+ . S Y=$P(BSDXNOD,U,BSDXQ)
+"RTN","BSDX04",146,0)
+ . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",147,0)
+ . S BSDXZ=BSDXZ_Y_"^"
+"RTN","BSDX04",148,0)
+ S BSDXZ=BSDXZ_$P(BSDXNOD,U,4)_"^" ;SLOTS
+"RTN","BSDX04",149,0)
+ S BSDXZ=BSDXZ_BSDXRESN_"^" ;Resource name
+"RTN","BSDX04",150,0)
+ S BSDXZ=BSDXZ_BSDXATID_"^" ;Access type ID
+"RTN","BSDX04",151,0)
+ S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAB(BSDXAD,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX04",152,0)
+ . S BSDXNOT=BSDXNOT_$G(^BSDXAB(BSDXAD,1,BSDXQ,0))_" "
+"RTN","BSDX04",153,0)
+ S BSDXZ=BSDXZ_BSDXNOT ;_"^"
+"RTN","BSDX04",154,0)
+ ;I '+BSDXSRCH,BSDXPEND,BSDXNSTART>BSDXPEND D  ;Fill in gap between appointment
+"RTN","BSDX04",155,0)
+ I BSDXPEND,BSDXNSTART>BSDXPEND D  ;Fill in gap between appointment
+"RTN","BSDX04",156,0)
+ . S Y=BSDXPEND X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",157,0)
+ . S BSDXTMP=Y
+"RTN","BSDX04",158,0)
+ . S Y=BSDXNSTART X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",159,0)
+ . S BSDXTMP=BSDXTMP_"^"_Y_"^0^"_BSDXRESN_"^0^^0"_$C(30)
+"RTN","BSDX04",160,0)
+ . S ^BSDXTMP($J,BSDXI-1)=BSDXTMP
+"RTN","BSDX04",161,0)
+ S BSDXPEND=BSDXNEND
+"RTN","BSDX04",162,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXZ_"^"_BSDXAD_$C(30)
+"RTN","BSDX04",163,0)
+ S BSDXI=BSDXI+2
+"RTN","BSDX04",164,0)
+ Q
+"RTN","BSDX05")
+0^5^B10878471
+"RTN","BSDX05",1,0)
+BSDX05  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 5:36pm
+"RTN","BSDX05",2,0)
+    ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX05",3,0)
+    ;
+"RTN","BSDX05",4,0)
+    ; Change Log:
+"RTN","BSDX05",5,0)
+    ; UJO/SMH - July 11 2010: pass FM Dates for Start and End rather than US Dates
+"RTN","BSDX05",6,0)
+    ; UJO/SMH - Dec 8 2010: In STCOMM, the logic was that an appointment 
+"RTN","BSDX05",7,0)
+    ;  that was a walk-in didn't count towards slot calculations.
+"RTN","BSDX05",8,0)
+    ;  I checked PIMS, and Walk-ins do indeed count towards slot calculations.
+"RTN","BSDX05",9,0)
+    ;  Therefore, I commented this line out:
+"RTN","BSDX05",10,0)
+    ;    ;Q:$P(BSDXNOD,U,13)="y"  ;WALKIN
+"RTN","BSDX05",11,0)
+    ;
+"RTN","BSDX05",12,0)
+APBLKOV(BSDXY,BSDXSTART,BSDXEND,BSDXRES)     ;EP
+"RTN","BSDX05",13,0)
+    ;Called by BSDX APPT BLOCKS OVERLAP
+"RTN","BSDX05",14,0)
+       ; July 11 2010 - pass FM Dates for Start and End rather than US Dates
+"RTN","BSDX05",15,0)
+    ;(Duplicates old qryAppointmentBlocksOverlapB)
+"RTN","BSDX05",16,0)
+    ;BSDXRES is resource name
+"RTN","BSDX05",17,0)
+    ;
+"RTN","BSDX05",18,0)
+    ;Test lines:
+"RTN","BSDX05",19,0)
+    ;D APBLKOV^BSDX05(.RES,"11-8-2000","11-8-2004","WHITT") ZW RES
+"RTN","BSDX05",20,0)
+    ;BSDX APPT BLOCKS OVERLAP^11-8-2000^11-8-2004^WHITT
+"RTN","BSDX05",21,0)
+    ;S ^HW("BSDXD05")=BSDXSTART_U_BSDXEND_U_BSDXRES
+"RTN","BSDX05",22,0)
+    ;
+"RTN","BSDX05",23,0)
+    N BSDXERR,BSDXIEN,BSDXDEP,BSDXBS,BSDXI,BSDXNEND,BSDXNSTART,BSDXPEND,BSDXRESD,BSDXRESN,BSDXS,BSDXAD,BSDXNOD
+"RTN","BSDX05",24,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX05",25,0)
+    S BSDXERR=""
+"RTN","BSDX05",26,0)
+    S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX05",27,0)
+    S ^BSDXTMP($J,0)="D00030START_TIME^D00030END_TIME"_$C(30)
+"RTN","BSDX05",28,0)
+    D
+"RTN","BSDX05",29,0)
+    . S BSDXBS=0
+"RTN","BSDX05",30,0)
+    . S BSDXEND=BSDXEND+.9999 ;Go to end of day
+"RTN","BSDX05",31,0)
+    . S BSDXRESN=BSDXRES
+"RTN","BSDX05",32,0)
+    . Q:BSDXRESN=""
+"RTN","BSDX05",33,0)
+    . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX05",34,0)
+    . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX05",35,0)
+    . Q:'+BSDXRESD
+"RTN","BSDX05",36,0)
+    . Q:'$D(^BSDXAPPT("ARSRC",BSDXRESD))
+"RTN","BSDX05",37,0)
+    . D STRES(BSDXRESD,BSDXSTART,BSDXEND)
+"RTN","BSDX05",38,0)
+    . Q
+"RTN","BSDX05",39,0)
+    ;
+"RTN","BSDX05",40,0)
+    S BSDXI=$G(BSDXI)+1
+"RTN","BSDX05",41,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX05",42,0)
+    Q
+"RTN","BSDX05",43,0)
+    ;
+"RTN","BSDX05",44,0)
+STRES(BSDXRESD,BSDXSTART,BSDXEND)   ;
+"RTN","BSDX05",45,0)
+    ;$O THRU "ARSRC" XREF OF ^BSDXAPPT
+"RTN","BSDX05",46,0)
+    ;Start at the beginning of the day -- appts can't overlap days
+"RTN","BSDX05",47,0)
+    S BSDXS=$P(BSDXSTART,"."),BSDXS=BSDXS-.0001
+"RTN","BSDX05",48,0)
+    S BSDXI=0
+"RTN","BSDX05",49,0)
+    F  S BSDXS=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX05",50,0)
+    . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D STCOMM(BSDXAD) ;BSDXAD Is the AppointmentID
+"RTN","BSDX05",51,0)
+    . Q
+"RTN","BSDX05",52,0)
+    Q
+"RTN","BSDX05",53,0)
+    ;
+"RTN","BSDX05",54,0)
+STCOMM(BSDXAD)  ;
+"RTN","BSDX05",55,0)
+    S BSDXNEND=0,BSDXNSTART=0,BSDXPEND=0
+"RTN","BSDX05",56,0)
+    Q:'$D(^BSDXAPPT(BSDXAD,0))
+"RTN","BSDX05",57,0)
+    S BSDXNOD=^BSDXAPPT(BSDXAD,0)
+"RTN","BSDX05",58,0)
+    Q:$P(BSDXNOD,U,10)=1  ;NO-SHOW Flag
+"RTN","BSDX05",59,0)
+    Q:$P(BSDXNOD,U,12)]""  ;CANCELLED APPT
+"RTN","BSDX05",60,0)
+    ; Q:$P(BSDXNOD,U,13)="y"  ;WALKIN -- new in V 1.42. See top comments.
+"RTN","BSDX05",61,0)
+    S BSDXNSTART=$P(BSDXNOD,U)
+"RTN","BSDX05",62,0)
+    S BSDXNEND=$P(BSDXNOD,U,2)
+"RTN","BSDX05",63,0)
+    I BSDXNEND'>BSDXSTART Q  ;End is less than start
+"RTN","BSDX05",64,0)
+    S Y=BSDXNSTART X ^DD("DD") S BSDXNSTART=$TR(Y,"@"," ")
+"RTN","BSDX05",65,0)
+    S Y=BSDXNEND X ^DD("DD") S BSDXNEND=$TR(Y,"@"," ")
+"RTN","BSDX05",66,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX05",67,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXNSTART_U_BSDXNEND_$C(30)
+"RTN","BSDX05",68,0)
+    Q
+"RTN","BSDX06")
+0^6^B6812445
+"RTN","BSDX06",1,0)
+BSDX06 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 4:51pm
+"RTN","BSDX06",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX06",3,0)
+    ; Change Log:
+"RTN","BSDX06",4,0)
+    ; UJO/SMH: July 15 2010: Change in BSDXSTART and BSDXEND: get
+"RTN","BSDX06",5,0)
+    ; dates in FM format for i18n
+"RTN","BSDX06",6,0)
+ ;
+"RTN","BSDX06",7,0)
+ ;
+"RTN","BSDX06",8,0)
+TPBLKOV(BSDXY,BSDXSTART,BSDXEND,BSDXRES)  ;EP
+"RTN","BSDX06",9,0)
+ ;Called by BSDXD TYPE BLOCKS OVERLAP
+"RTN","BSDX06",10,0)
+ ;(Duplicates old qryTypeBlocksOverlapB)
+"RTN","BSDX06",11,0)
+ ;BSDXRES is resource name
+"RTN","BSDX06",12,0)
+ ;
+"RTN","BSDX06",13,0)
+ ;Test lines:
+"RTN","BSDX06",14,0)
+ ;D TPBLKOV^BSDX06(.RES,"3030513","3030516","REMILLARD,MIKE") ZW RES
+"RTN","BSDX06",15,0)
+ ;BSDX TYPE BLOCKS OVERLAP^303513^3030516^REMILLARD,MIKE
+"RTN","BSDX06",16,0)
+ ;S ^HW("BSDXD06")=BSDXSTART_U_BSDXEND_U_BSDXRES
+"RTN","BSDX06",17,0)
+ ;
+"RTN","BSDX06",18,0)
+ N BSDXERR,BSDXIEN,BSDXDEP,BSDXBS,BSDXI,BSDXNEND,BSDXNSTART,BSDXPEND,BSDXRESD,BSDXRESN,BSDXS,BSDXTPID,BSDXNOD,BSDXAD
+"RTN","BSDX06",19,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX06",20,0)
+ S BSDXERR=""
+"RTN","BSDX06",21,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX06",22,0)
+ S ^BSDXTMP($J,0)="D00030StartTime^D00030EndTime^I00010AppointmentTypeID^I00010AvailabilityID^T00030ResourceName"_$C(30)
+"RTN","BSDX06",23,0)
+ S BSDXI=0
+"RTN","BSDX06",24,0)
+ D
+"RTN","BSDX06",25,0)
+ . S BSDXBS=0
+"RTN","BSDX06",26,0)
+ . I $L(BSDXEND,".")=1 S BSDXEND=BSDXEND+.9999 ;Go to end of day if only date (not time) is passed
+"RTN","BSDX06",27,0)
+ . S BSDXRESN=BSDXRES
+"RTN","BSDX06",28,0)
+ . Q:BSDXRESN=""
+"RTN","BSDX06",29,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX06",30,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX06",31,0)
+ . Q:'+BSDXRESD
+"RTN","BSDX06",32,0)
+ . D STCOMM(BSDXRESN,BSDXRESD)
+"RTN","BSDX06",33,0)
+ . Q
+"RTN","BSDX06",34,0)
+ ;
+"RTN","BSDX06",35,0)
+ S BSDXI=$G(BSDXI)+1
+"RTN","BSDX06",36,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX06",37,0)
+ Q
+"RTN","BSDX06",38,0)
+ ;
+"RTN","BSDX06",39,0)
+STCOMM(BSDXRESN,BSDXRESD) ;EP
+"RTN","BSDX06",40,0)
+ ;
+"RTN","BSDX06",41,0)
+ Q:'$D(^BSDXAB("ARSCT",BSDXRESD))
+"RTN","BSDX06",42,0)
+ Q:'$D(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX06",43,0)
+ ;$O THRU "ARSCT" XREF OF ^BSDXAB
+"RTN","BSDX06",44,0)
+ S BSDXNEND=0,BSDXNSTART=0,BSDXPEND=0
+"RTN","BSDX06",45,0)
+ ;Start at the beginning of the day -- AV Blocks can't overlap days
+"RTN","BSDX06",46,0)
+ S BSDXS=$P(BSDXSTART,"."),BSDXS=BSDXS-.0001
+"RTN","BSDX06",47,0)
+ F  S BSDXS=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX06",48,0)
+ . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D
+"RTN","BSDX06",49,0)
+ . . Q:'$D(^BSDXAB(BSDXAD,0))
+"RTN","BSDX06",50,0)
+ . . S BSDXNOD=^BSDXAB(BSDXAD,0)
+"RTN","BSDX06",51,0)
+ . . S BSDXNSTART=$P(BSDXNOD,U,2)
+"RTN","BSDX06",52,0)
+ . . S BSDXNEND=$P(BSDXNOD,U,3)
+"RTN","BSDX06",53,0)
+ . . I BSDXNEND'>BSDXSTART Q
+"RTN","BSDX06",54,0)
+ . . S Y=BSDXNSTART X ^DD("DD") S BSDXNSTART=$TR(Y,"@"," ")
+"RTN","BSDX06",55,0)
+ . . S Y=BSDXNEND X ^DD("DD") S BSDXNEND=$TR(Y,"@"," ")
+"RTN","BSDX06",56,0)
+ . . S BSDXTPID=$P(BSDXNOD,U,5)
+"RTN","BSDX06",57,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX06",58,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXNSTART_U_BSDXNEND_U_BSDXTPID_U_BSDXAD_U_BSDXRESN_$C(30)
+"RTN","BSDX06",59,0)
+ . . Q
+"RTN","BSDX06",60,0)
+ . Q
+"RTN","BSDX06",61,0)
+ Q
+"RTN","BSDX07")
+0^7^B188802132
+"RTN","BSDX07",1,0)
+BSDX07 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS  ; 1/26/11 11:29am
+"RTN","BSDX07",2,0)
+    ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX07",3,0)
+    ;
+"RTN","BSDX07",4,0)
+    ; Change Log:
+"RTN","BSDX07",5,0)
+    ; UJO/SMH
+"RTN","BSDX07",6,0)
+    ; v1.3 July 13 2010 - Add support i18n - Dates input as FM dates, not US.
+"RTN","BSDX07",7,0)
+    ; v1.42 Oct 22 2010 - Transaction now restartable by providing arguments
+"RTN","BSDX07",8,0)
+    ;   thanks to Rick Marshall and Zach Gonzalez at Oroville.
+"RTN","BSDX07",9,0)
+    ; v1.42 Oct 30 2010 - Extensive refactoring.
+"RTN","BSDX07",10,0)
+    ;
+"RTN","BSDX07",11,0)
+    ; Error Reference:
+"RTN","BSDX07",12,0)
+    ; -1: Patient Record is locked. This means something is wrong!!!!
+"RTN","BSDX07",13,0)
+    ; -2: Start Time is not a valid Fileman date
+"RTN","BSDX07",14,0)
+    ; -3: End Time is not a valid Fileman date
+"RTN","BSDX07",15,0)
+    ; -4: End Time does not have time inside of it.
+"RTN","BSDX07",16,0)
+    ; -5: BSDXPATID is not numeric
+"RTN","BSDX07",17,0)
+    ; -6: Patient Does not exist in ^DPT
+"RTN","BSDX07",18,0)
+    ; -7: Resource Name does not exist in B index of BSDX RESOURCE
+"RTN","BSDX07",19,0)
+    ; -8: Resouce doesn't exist in ^BSDXRES
+"RTN","BSDX07",20,0)
+    ; -9: Couldn't add appointment to BSDX APPOINTMENT
+"RTN","BSDX07",21,0)
+    ; -10: Couldn't add appointment to files 2 and/or 44
+"RTN","BSDX07",22,0)
+    ; -100: Mumps Error
+"RTN","BSDX07",23,0)
+ 
+"RTN","BSDX07",24,0)
+APPADDD(BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID)    ;EP
+"RTN","BSDX07",25,0)
+    ;Entry point for debugging
+"RTN","BSDX07",26,0)
+    D DEBUG^%Serenji("APPADD^BSDX07(.BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID)")
+"RTN","BSDX07",27,0)
+    Q
+"RTN","BSDX07",28,0)
+    ;
+"RTN","BSDX07",29,0)
+UT ; Unit Tests
+"RTN","BSDX07",30,0)
+    N ZZZ
+"RTN","BSDX07",31,0)
+    ; Test for bad start date
+"RTN","BSDX07",32,0)
+    D APPADD(.ZZZ,2100123,3100123.3,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",33,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-2 W "Error in -2",!
+"RTN","BSDX07",34,0)
+    ; Test for bad end date
+"RTN","BSDX07",35,0)
+    D APPADD(.ZZZ,3100123,2100123.3,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",36,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-3 W "Error in -3",!
+"RTN","BSDX07",37,0)
+    ; Test for end date without time
+"RTN","BSDX07",38,0)
+    D APPADD(.ZZZ,3100123.1,3100123,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",39,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-4 W "Error in -4",!
+"RTN","BSDX07",40,0)
+    ; Test for mumps error
+"RTN","BSDX07",41,0)
+    S bsdxdie=1
+"RTN","BSDX07",42,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",43,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-100 W "Error in -100: M Error",!
+"RTN","BSDX07",44,0)
+    K bsdxdie
+"RTN","BSDX07",45,0)
+    ; Test for TRESTART
+"RTN","BSDX07",46,0)
+    s bsdxrestart=1
+"RTN","BSDX07",47,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",48,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=0&(+$P(^BSDXTMP($J,1),U,2)'=-10) W "Error in TRESTART",!
+"RTN","BSDX07",49,0)
+    k bsdxrestart
+"RTN","BSDX07",50,0)
+    ; Test for non-numeric patient
+"RTN","BSDX07",51,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,"CAT,DOG","Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",52,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-5 W "Error in -5",!
+"RTN","BSDX07",53,0)
+    ; Test for a non-existent patient
+"RTN","BSDX07",54,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,8989898989,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",55,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-6 W "Error in -6",!
+"RTN","BSDX07",56,0)
+    ; Test for a non-existent resource name
+"RTN","BSDX07",57,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"lkajsflkjsadf",30,"Sam's Note",1)
+"RTN","BSDX07",58,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-7 W "Error in -7",!
+"RTN","BSDX07",59,0)
+    ; Test for corrupted resource
+"RTN","BSDX07",60,0)
+    ; Can't test for -8 since it requires DB corruption
+"RTN","BSDX07",61,0)
+    ; Test for inability to add appointment to BSDX Appointment
+"RTN","BSDX07",62,0)
+    ; Also requires something wrong in the DB
+"RTN","BSDX07",63,0)
+    ; Test for inability to add appointment to 2,44
+"RTN","BSDX07",64,0)
+    ; Test by creating a duplicate appointment
+"RTN","BSDX07",65,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",66,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",67,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-10 W "Error in -10",!
+"RTN","BSDX07",68,0)
+    ; Test for normality:
+"RTN","BSDX07",69,0)
+    D APPADD(.ZZZ,3110123.09,3110123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",70,0)
+    ; Does Appt exist?
+"RTN","BSDX07",71,0)
+    N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX07",72,0)
+    I 'APPID W "Error Making Appt-1" QUIT
+"RTN","BSDX07",73,0)
+    I +^BSDXAPPT(APPID,0)'=3110123.09 W "Error Making Appt-2"
+"RTN","BSDX07",74,0)
+    I '$D(^DPT(3,"S",3110123.09)) W "Error Making Appt-3"
+"RTN","BSDX07",75,0)
+    I '$D(^SC(2,"S",3110123.09)) W "Error Making Appt-4"
+"RTN","BSDX07",76,0)
+    QUIT
+"RTN","BSDX07",77,0)
+    ; 
+"RTN","BSDX07",78,0)
+APPADD(BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID) ;EP
+"RTN","BSDX07",79,0)
+    ;Called by RPC: BSDX ADD NEW APPOINTMENT
+"RTN","BSDX07",80,0)
+    ;
+"RTN","BSDX07",81,0)
+    ;Add new appointment to 3 files
+"RTN","BSDX07",82,0)
+    ; - BSDX APPOINTMENT
+"RTN","BSDX07",83,0)
+    ; - Hosp Location Appointment SubSubfile if Resource is linked to clinic
+"RTN","BSDX07",84,0)
+    ; - Patient Appointment Subfile if Resource is linked to clinic
+"RTN","BSDX07",85,0)
+    ;
+"RTN","BSDX07",86,0)
+    ;Paramters:
+"RTN","BSDX07",87,0)
+    ;BSDXY: Global Return (RPC must be set to Global Array)
+"RTN","BSDX07",88,0)
+    ;BSDXSTART: FM Start Date
+"RTN","BSDX07",89,0)
+    ;BSDXEND: FM End Date
+"RTN","BSDX07",90,0)
+    ;BSDXPATID: Patient DFN
+"RTN","BSDX07",91,0)
+    ;BSDXRES is ResourceName in BSDX RESOURCE file (not IEN)
+"RTN","BSDX07",92,0)
+    ;BSDXLEN is the appointment duration in minutes
+"RTN","BSDX07",93,0)
+    ;BSDXNOTE is the Appiontment Note
+"RTN","BSDX07",94,0)
+    ;BSDXATID is used for 2 purposes:
+"RTN","BSDX07",95,0)
+    ; if BSDXATID = "WALKIN" then BSDAPI is called to create a walkin appt.
+"RTN","BSDX07",96,0)
+    ; if BSDXATID = a number, then it is the access type id (used for rebooking)
+"RTN","BSDX07",97,0)
+    ;
+"RTN","BSDX07",98,0)
+    ;Return:
+"RTN","BSDX07",99,0)
+    ; ADO.net Recordset having fields:
+"RTN","BSDX07",100,0)
+    ; AppointmentID and ErrorNumber
+"RTN","BSDX07",101,0)
+    ;
+"RTN","BSDX07",102,0)
+    ;Test lines:
+"RTN","BSDX07",103,0)
+    ;BSDX ADD NEW APPOINTMENT^3091122.0930^3091122.1000^370^Dr Office^30^EXAM^WALKIN
+"RTN","BSDX07",104,0)
+    ;
+"RTN","BSDX07",105,0)
+    ; Return Array; set Return and clear array
+"RTN","BSDX07",106,0)
+    S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX07",107,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX07",108,0)
+    ; $ET
+"RTN","BSDX07",109,0)
+    N $ET S $ET="G ETRAP^BSDX07"
+"RTN","BSDX07",110,0)
+    ; Counter
+"RTN","BSDX07",111,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX07",112,0)
+    ; Lock BSDX node, only to synchronize access to the globals.
+"RTN","BSDX07",113,0)
+    ; It's not expected that the error will ever happen as no filing
+"RTN","BSDX07",114,0)
+    ; is supposed to take 5 seconds.
+"RTN","BSDX07",115,0)
+    L +^BSDXAPPT(BSDXPATID):5 I '$T D ERR(BSDXI,"-1~Patient record is locked. Please contact technical support.") Q
+"RTN","BSDX07",116,0)
+    ; Header Node
+"RTN","BSDX07",117,0)
+    S ^BSDXTMP($J,BSDXI)="I00020APPOINTMENTID^T00100ERRORID"_$C(30)
+"RTN","BSDX07",118,0)
+    ;Restartable Transaction; restore paramters when starting.
+"RTN","BSDX07",119,0)
+    ; (Params restored are what's passed here + BSDXI)
+"RTN","BSDX07",120,0)
+    TSTART (BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID,BSDXI):T="BSDX ADD NEW APPOINTMENT^BSDX07"
+"RTN","BSDX07",121,0)
+    ;
+"RTN","BSDX07",122,0)
+    ; Turn off SDAM APPT PROTOCOL BSDX Entries
+"RTN","BSDX07",123,0)
+    N BSDXNOEV
+"RTN","BSDX07",124,0)
+    S BSDXNOEV=1 ;Don't execute BSDX ADD APPOINTMENT protocol
+"RTN","BSDX07",125,0)
+    ;
+"RTN","BSDX07",126,0)
+    ; Set Error Message to be empty
+"RTN","BSDX07",127,0)
+    N BSDXERR S BSDXERR=0
+"RTN","BSDX07",128,0)
+    ;
+"RTN","BSDX07",129,0)
+    ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX07",130,0)
+    I $G(bsdxdie) S X=1/0
+"RTN","BSDX07",131,0)
+    ;;;test
+"RTN","BSDX07",132,0)
+    ;;;test for TRESTART
+"RTN","BSDX07",133,0)
+    I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX07",134,0)
+    ;;;test
+"RTN","BSDX07",135,0)
+    ;
+"RTN","BSDX07",136,0)
+    ; -- Start and End Date Processing --
+"RTN","BSDX07",137,0)
+    ; If C# sends the dates with extra zeros, remove them
+"RTN","BSDX07",138,0)
+    S BSDXSTART=+BSDXSTART,BSDXEND=+BSDXEND
+"RTN","BSDX07",139,0)
+    ; Are the dates valid? Must be FM Dates > than 2010
+"RTN","BSDX07",140,0)
+    I BSDXSTART'>3100000 D ERR(BSDXI,"-2~BSDX07 Error: Invalid Start Time") Q
+"RTN","BSDX07",141,0)
+    I BSDXEND'>3100000 D ERR(BSDXI,"-3~BSDX07 Error: Invalid End Time") Q
+"RTN","BSDX07",142,0)
+    ; If Ending date doesn't have a time, this is an error
+"RTN","BSDX07",143,0)
+    I $L(BSDXEND,".")=1 D ERR(BSDXI,"-4~BSDX07 Error: Invalid End Time") Q
+"RTN","BSDX07",144,0)
+    ; If the Start Date is greater than the end date, swap dates
+"RTN","BSDX07",145,0)
+    N BSDXTMP
+"RTN","BSDX07",146,0)
+    I BSDXSTART>BSDXEND S BSDXTMP=BSDXEND,BSDXEND=BSDXSTART,BSDXSTART=BSDXTMP
+"RTN","BSDX07",147,0)
+    ;
+"RTN","BSDX07",148,0)
+    ; Check if the patient exists:
+"RTN","BSDX07",149,0)
+    ; - DFN valid number?
+"RTN","BSDX07",150,0)
+    ; - Valid Patient in file 2?
+"RTN","BSDX07",151,0)
+    I '+BSDXPATID D ERR(BSDXI,"-5~BSDX07 Error: Invalid Patient ID") Q 
+"RTN","BSDX07",152,0)
+    I '$D(^DPT(BSDXPATID,0)) D ERR(BSDXI,"-6~BSDX07 Error: Invalid Patient ID") Q
+"RTN","BSDX07",153,0)
+    ;
+"RTN","BSDX07",154,0)
+    ;Validate Resource entry
+"RTN","BSDX07",155,0)
+    I '$D(^BSDXRES("B",BSDXRES)) D ERR(BSDXI,"-7~BSDX07 Error: Invalid Resource ID") Q
+"RTN","BSDX07",156,0)
+    N BSDXRESD ; Resource IEN
+"RTN","BSDX07",157,0)
+    S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0))
+"RTN","BSDX07",158,0)
+    N BSDXRNOD ; Resouce zero node
+"RTN","BSDX07",159,0)
+    S BSDXRNOD=$G(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX07",160,0)
+    I BSDXRNOD="" D ERR(BSDXI,"-8~BSDX07 Error: invalid Resource entry.") Q
+"RTN","BSDX07",161,0)
+    ;
+"RTN","BSDX07",162,0)
+    ; Walk-in (Unscheduled) Appointment?
+"RTN","BSDX07",163,0)
+    N BSDXWKIN S BSDXWKIN=0
+"RTN","BSDX07",164,0)
+    I BSDXATID="WALKIN" S BSDXWKIN=1
+"RTN","BSDX07",165,0)
+    ; Reset Access Type ID if it doesn't say "WALKIN" and isn't a number
+"RTN","BSDX07",166,0)
+    I BSDXATID'?.N&(BSDXATID'="WALKIN") S BSDXATID=""
+"RTN","BSDX07",167,0)
+    ;
+"RTN","BSDX07",168,0)
+    ; Done with all checks, let's make appointment in BSDX APPOINTMENT
+"RTN","BSDX07",169,0)
+    N BSDXAPPTID
+"RTN","BSDX07",170,0)
+    S BSDXAPPTID=$$BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRESD,BSDXATID)
+"RTN","BSDX07",171,0)
+    I 'BSDXAPPTID D ERR(BSDXI,"-9~BSDX07 Error: Unable to add appointment to BSDX APPOINTMENT file.") Q
+"RTN","BSDX07",172,0)
+    I BSDXNOTE]"" D BSDXWP(BSDXAPPTID,BSDXNOTE)
+"RTN","BSDX07",173,0)
+    ;
+"RTN","BSDX07",174,0)
+    ; Then Create Subfiles in 2/44 Appointment
+"RTN","BSDX07",175,0)
+    N BSDXSCD S BSDXSCD=$P(BSDXRNOD,U,4)  ; Hosp Location IEN
+"RTN","BSDX07",176,0)
+    ; Only if we have a valid Hosp Loc can we make an appointment
+"RTN","BSDX07",177,0)
+    I +BSDXSCD,$D(^SC(BSDXSCD,0)) D  I +BSDXERR D ERR(BSDXI,"-10~BSDX07 Error: MAKE^BSDXAPI returned error code: "_BSDXERR) Q
+"RTN","BSDX07",178,0)
+    . N BSDXC
+"RTN","BSDX07",179,0)
+    . S BSDXC("PAT")=BSDXPATID
+"RTN","BSDX07",180,0)
+    . S BSDXC("CLN")=BSDXSCD
+"RTN","BSDX07",181,0)
+    . S BSDXC("TYP")=3 ;3 for scheduled appts, 4 for walkins
+"RTN","BSDX07",182,0)
+    . S:BSDXWKIN BSDXC("TYP")=4
+"RTN","BSDX07",183,0)
+    . S BSDXC("ADT")=BSDXSTART
+"RTN","BSDX07",184,0)
+    . S BSDXC("LEN")=BSDXLEN
+"RTN","BSDX07",185,0)
+    . S BSDXC("OI")=$E($G(BSDXNOTE),1,150) ;File 44 has 150 character limit on OTHER field
+"RTN","BSDX07",186,0)
+    . S BSDXC("OI")=$TR(BSDXC("OI"),";"," ") ;No semicolons allowed by MAKE^BSDXAPI
+"RTN","BSDX07",187,0)
+    . S BSDXC("OI")=$$STRIP(BSDXC("OI")) ;Strip control characters from note
+"RTN","BSDX07",188,0)
+    . S BSDXC("USR")=DUZ
+"RTN","BSDX07",189,0)
+    . S BSDXERR=$$MAKE^BSDXAPI(.BSDXC)
+"RTN","BSDX07",190,0)
+    . Q:BSDXERR
+"RTN","BSDX07",191,0)
+    . ;Update RPMS Clinic availability
+"RTN","BSDX07",192,0)
+    . D AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN)
+"RTN","BSDX07",193,0)
+    . Q
+"RTN","BSDX07",194,0)
+    ;
+"RTN","BSDX07",195,0)
+    ;Return Recordset
+"RTN","BSDX07",196,0)
+    TCOMMIT
+"RTN","BSDX07",197,0)
+    L -^BSDXAPPT(BSDXPATID)
+"RTN","BSDX07",198,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",199,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXAPPTID_"^"_$C(30)
+"RTN","BSDX07",200,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",201,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX07",202,0)
+    Q
+"RTN","BSDX07",203,0)
+BSDXDEL(BSDXAPPTID) ;Deletes appointment BSDXAPPTID from BSDXAPPOINTMETN
+"RTN","BSDX07",204,0)
+    N DA,DIK
+"RTN","BSDX07",205,0)
+    S DIK="^BSDXAPPT(",DA=BSDXAPPTID
+"RTN","BSDX07",206,0)
+    D ^DIK
+"RTN","BSDX07",207,0)
+    Q
+"RTN","BSDX07",208,0)
+    ;
+"RTN","BSDX07",209,0)
+STRIP(BSDXZ)    ;Replace control characters with spaces
+"RTN","BSDX07",210,0)
+    N BSDXI
+"RTN","BSDX07",211,0)
+    F BSDXI=1:1:$L(BSDXZ) I (32>$A($E(BSDXZ,BSDXI))) S BSDXZ=$E(BSDXZ,1,BSDXI-1)_" "_$E(BSDXZ,BSDXI+1,999)
+"RTN","BSDX07",212,0)
+    Q BSDXZ
+"RTN","BSDX07",213,0)
+    ;
+"RTN","BSDX07",214,0)
+BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRESD,BSDXATID)  ;ADD BSDX APPOINTMENT ENTRY
+"RTN","BSDX07",215,0)
+    ;Returns ien in BSDXAPPT or 0 if failed
+"RTN","BSDX07",216,0)
+    ;Create entry in BSDX APPOINTMENT
+"RTN","BSDX07",217,0)
+    N BSDXAPPTID
+"RTN","BSDX07",218,0)
+    S BSDXFDA(9002018.4,"+1,",.01)=BSDXSTART
+"RTN","BSDX07",219,0)
+    S BSDXFDA(9002018.4,"+1,",.02)=BSDXEND
+"RTN","BSDX07",220,0)
+    S BSDXFDA(9002018.4,"+1,",.05)=BSDXPATID
+"RTN","BSDX07",221,0)
+    S BSDXFDA(9002018.4,"+1,",.07)=BSDXRESD
+"RTN","BSDX07",222,0)
+    S BSDXFDA(9002018.4,"+1,",.08)=$G(DUZ)
+"RTN","BSDX07",223,0)
+    S BSDXFDA(9002018.4,"+1,",.09)=$$NOW^XLFDT
+"RTN","BSDX07",224,0)
+    S:BSDXATID="WALKIN" BSDXFDA(9002018.4,"+1,",.13)="y"
+"RTN","BSDX07",225,0)
+    S:BSDXATID?.N BSDXFDA(9002018.4,"+1,",.06)=BSDXATID
+"RTN","BSDX07",226,0)
+    N BSDXIEN,BSDXMSG
+"RTN","BSDX07",227,0)
+    D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX07",228,0)
+    S BSDXAPPTID=+$G(BSDXIEN(1))
+"RTN","BSDX07",229,0)
+    Q BSDXAPPTID
+"RTN","BSDX07",230,0)
+    ;
+"RTN","BSDX07",231,0)
+BSDXWP(BSDXAPPTID,BSDXNOTE) ;
+"RTN","BSDX07",232,0)
+    ;Add WP field
+"RTN","BSDX07",233,0)
+    I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX07",234,0)
+    I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX07",235,0)
+    I $D(BSDXNOTE(.5)) D
+"RTN","BSDX07",236,0)
+    . D WP^DIE(9002018.4,BSDXAPPTID_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX07",237,0)
+    Q
+"RTN","BSDX07",238,0)
+    ;
+"RTN","BSDX07",239,0)
+ADDEVT(BSDXPATID,BSDXSTART,BSDXSC,BSDXSCDA) ;EP
+"RTN","BSDX07",240,0)
+    ;Called by BSDX ADD APPOINTMENT protocol
+"RTN","BSDX07",241,0)
+    ;BSDXSC=IEN of clinic in ^SC
+"RTN","BSDX07",242,0)
+    ;BSDXSCDA=IEN for ^SC(BSDXSC,"S",BSDXSTART,1,BSDXSCDA). Use to get Length & Note
+"RTN","BSDX07",243,0)
+    ;
+"RTN","BSDX07",244,0)
+    N BSDXNOD,BSDXLEN,BSDXAPPTID,BSDXNODP,BSDXWKIN,BSDXRES
+"RTN","BSDX07",245,0)
+    Q:+$G(BSDXNOEV)
+"RTN","BSDX07",246,0)
+    I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0))
+"RTN","BSDX07",247,0)
+    E  I $D(^BSDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0))
+"RTN","BSDX07",248,0)
+    Q:'+$G(BSDXRES)
+"RTN","BSDX07",249,0)
+    S BSDXNOD=$G(^SC(BSDXSC,"S",BSDXSTART,1,BSDXSCDA,0))
+"RTN","BSDX07",250,0)
+    Q:BSDXNOD=""
+"RTN","BSDX07",251,0)
+    S BSDXNODP=$G(^DPT(BSDXPATID,"S",BSDXSTART,0))
+"RTN","BSDX07",252,0)
+    S BSDXWKIN=""
+"RTN","BSDX07",253,0)
+    S:$P(BSDXNODP,U,7)=4 BSDXWKIN="WALKIN" ;Purpose of Visit field of DPT Appointment subfile
+"RTN","BSDX07",254,0)
+    S BSDXLEN=$P(BSDXNOD,U,2)
+"RTN","BSDX07",255,0)
+    Q:'+BSDXLEN
+"RTN","BSDX07",256,0)
+    S BSDXEND=$$FMADD^XLFDT(BSDXSTART,0,0,BSDXLEN,0)
+"RTN","BSDX07",257,0)
+    S BSDXAPPTID=$$BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXWKIN)
+"RTN","BSDX07",258,0)
+    Q:'+BSDXAPPTID
+"RTN","BSDX07",259,0)
+    S BSDXNOTE=$P(BSDXNOD,U,4)
+"RTN","BSDX07",260,0)
+    I BSDXNOTE]"" D BSDXWP(BSDXAPPTID,BSDXNOTE)
+"RTN","BSDX07",261,0)
+    D ADDEVT3(BSDXRES)
+"RTN","BSDX07",262,0)
+    Q
+"RTN","BSDX07",263,0)
+    ;
+"RTN","BSDX07",264,0)
+ADDEVT3(BSDXRES)    ;
+"RTN","BSDX07",265,0)
+    ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX07",266,0)
+    N BSDXRESN
+"RTN","BSDX07",267,0)
+    S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX07",268,0)
+    Q:BSDXRESN=""
+"RTN","BSDX07",269,0)
+    S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX07",270,0)
+    ;D EVENT^BSDX23("SCHEDULE-"_BSDXRESN,"","","")
+"RTN","BSDX07",271,0)
+    D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX07",272,0)
+    Q
+"RTN","BSDX07",273,0)
+    ;
+"RTN","BSDX07",274,0)
+ERR(BSDXI,BSDXERR)  ;Error processing
+"RTN","BSDX07",275,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",276,0)
+    S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX07",277,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX07",278,0)
+    S ^BSDXTMP($J,BSDXI)="0^"_BSDXERR_$C(30)
+"RTN","BSDX07",279,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",280,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX07",281,0)
+    L -^BSDXAPPT(BSDXPATID)
+"RTN","BSDX07",282,0)
+    Q
+"RTN","BSDX07",283,0)
+    ;
+"RTN","BSDX07",284,0)
+ETRAP   ;EP Error trap entry
+"RTN","BSDX07",285,0)
+    N $ET S $ET="D ^%ZTER HALT"  ; Emergency Error Trap
+"RTN","BSDX07",286,0)
+    ; Rollback, otherwise ^XTER will be empty from future rollback
+"RTN","BSDX07",287,0)
+    I $TL>0 TROLLBACK 
+"RTN","BSDX07",288,0)
+    D ^%ZTER
+"RTN","BSDX07",289,0)
+    S $EC=""  ; Clear Error
+"RTN","BSDX07",290,0)
+    ; Log error message and send to client
+"RTN","BSDX07",291,0)
+    I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX07",292,0)
+    D ERR(BSDXI,"-100~BSDX07 Error: "_$G(%ZTERZE))
+"RTN","BSDX07",293,0)
+    Q
+"RTN","BSDX07",294,0)
+    ;
+"RTN","BSDX07",295,0)
+DAY ;;^SUN^MON^TUES^WEDNES^THURS^FRI^SATUR
+"RTN","BSDX07",296,0)
+    ;
+"RTN","BSDX07",297,0)
+DOW S %=$E(X,1,3),Y=$E(X,4,5),Y=Y>2&'(%#4)+$E("144025036146",Y)
+"RTN","BSDX07",298,0)
+    F %=%:-1:281 S Y=%#4=1+1+Y
+"RTN","BSDX07",299,0)
+    S Y=$E(X,6,7)+Y#7
+"RTN","BSDX07",300,0)
+    Q
+"RTN","BSDX07",301,0)
+    ;
+"RTN","BSDX07",302,0)
+AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN)   ;Update RPMS Clinic availability
+"RTN","BSDX07",303,0)
+    ;SEE SDM1
+"RTN","BSDX07",304,0)
+    N Y,DFN
+"RTN","BSDX07",305,0)
+    N SL,STARTDAY,X,SC,SB,HSI,SI,STR,SDDIF,SDMAX,SDDATE,SDDMAX,SDSDATE,CCXN,MXOK,COV,SDPROG
+"RTN","BSDX07",306,0)
+    N X1,SDEDT,X2,SD,SM,SS,S,SDLOCK,ST,I
+"RTN","BSDX07",307,0)
+    S Y=BSDXSCD,DFN=BSDXPATID
+"RTN","BSDX07",308,0)
+    S SL=$G(^SC(+Y,"SL")),X=$P(SL,U,3),STARTDAY=$S($L(X):X,1:8),SC=Y,SB=STARTDAY-1/100,X=$P(SL,U,6),HSI=$S(X=1:X,X:X,1:4),SI=$S(X="":4,X<3:4,X:X,1:4),STR="#@!$* XXWVUTSRQPONMLKJIHGFEDCBA0123456789jklmnopqrstuvwxyz",SDDIF=$S(HSI<3:8/HSI,1:2) K Y
+"RTN","BSDX07",309,0)
+    ;Determine maximum days for scheduling
+"RTN","BSDX07",310,0)
+    S SDMAX(1)=$P($G(^SC(+SC,"SDP")),U,2) S:'SDMAX(1) SDMAX(1)=365
+"RTN","BSDX07",311,0)
+    S (SDMAX,SDDMAX)=$$FMADD^XLFDT(DT,SDMAX(1))
+"RTN","BSDX07",312,0)
+    S SDDATE=BSDXSTART
+"RTN","BSDX07",313,0)
+    S SDSDATE=SDDATE,SDDATE=SDDATE\1
+"RTN","BSDX07",314,0)
+1   ;L  Q:$D(SDXXX)  S CCXN=0 K MXOK,COV,SDPROT Q:DFN<0  S SC=+SC
+"RTN","BSDX07",315,0)
+    Q:$D(SDXXX)  S CCXN=0 K MXOK,COV,SDPROT Q:DFN<0  S SC=+SC
+"RTN","BSDX07",316,0)
+    S X1=DT,SDEDT=365 S:$D(^SC(SC,"SDP")) SDEDT=$P(^SC(SC,"SDP"),"^",2)
+"RTN","BSDX07",317,0)
+    S X2=SDEDT D C^%DTC S SDEDT=X
+"RTN","BSDX07",318,0)
+    S Y=BSDXSTART
+"RTN","BSDX07",319,0)
+EN1 S (X,SD)=Y,SM=0 D DOW
+"RTN","BSDX07",320,0)
+S   I '$D(^SC(SC,"ST",$P(SD,"."),1)) S SS=+$O(^SC(+SC,"T"_Y,SD)) Q:SS'>0  Q:^(SS,1)=""  S ^SC(+SC,"ST",$P(SD,"."),1)=$E($P($T(DAY),U,Y+2),1,2)_" "_$E(SD,6,7)_$J("",SI+SI-6)_^(1),^(0)=$P(SD,".")
+"RTN","BSDX07",321,0)
+    S S=BSDXLEN
+"RTN","BSDX07",322,0)
+    ;Check if BSDXLEN evenly divisible by appointment length
+"RTN","BSDX07",323,0)
+    S RPMSL=$P(SL,U)
+"RTN","BSDX07",324,0)
+    I BSDXLEN<RPMSL S BSDXLEN=RPMSL
+"RTN","BSDX07",325,0)
+    I BSDXLEN#RPMSL'=0 D
+"RTN","BSDX07",326,0)
+    . S BSDXINC=BSDXLEN\RPMSL
+"RTN","BSDX07",327,0)
+    . S BSDXINC=BSDXINC+1
+"RTN","BSDX07",328,0)
+    . S BSDXLEN=RPMSL*BSDXINC
+"RTN","BSDX07",329,0)
+    S SL=S_U_$P(SL,U,2,99)
+"RTN","BSDX07",330,0)
+SC  S SDLOCK=$S('$D(SDLOCK):1,1:SDLOCK+1) Q:SDLOCK>9
+"RTN","BSDX07",331,0)
+    L +^SC(SC,"ST",$P(SD,"."),1):5 G:'$T SC
+"RTN","BSDX07",332,0)
+    S SDLOCK=0,S=^SC(SC,"ST",$P(SD,"."),1)
+"RTN","BSDX07",333,0)
+    S I=SD#1-SB*100,ST=I#1*SI\.6+($P(I,".")*SI),SS=SL*HSI/60*SDDIF+ST+ST
+"RTN","BSDX07",334,0)
+    I (I<1!'$F(S,"["))&(S'["CAN") L -^SC(SC,"ST",$P(SD,"."),1) Q
+"RTN","BSDX07",335,0)
+    I SM<7 S %=$F(S,"[",SS-1) S:'%!($P(SL,"^",6)<3) %=999 I $F(S,"]",SS)'<%!(SDDIF=2&$E(S,ST+ST+1,SS-1)["[") S SM=7
+"RTN","BSDX07",336,0)
+    ;
+"RTN","BSDX07",337,0)
+SP  I ST+ST>$L(S),$L(S)<80 S S=S_" " G SP
+"RTN","BSDX07",338,0)
+    S SDNOT=1
+"RTN","BSDX07",339,0)
+    S ABORT=0
+"RTN","BSDX07",340,0)
+    F I=ST+ST:SDDIF:SS-SDDIF D  Q:ABORT
+"RTN","BSDX07",341,0)
+    . S ST=$E(S,I+1) S:ST="" ST=" "
+"RTN","BSDX07",342,0)
+    . S Y=$E(STR,$F(STR,ST)-2)
+"RTN","BSDX07",343,0)
+    . I S["CAN"!(ST="X"&($D(^SC(+SC,"ST",$P(SD,"."),"CAN")))) S ABORT=1 Q
+"RTN","BSDX07",344,0)
+    . I Y="" S ABORT=1 Q
+"RTN","BSDX07",345,0)
+    . S:Y'?1NL&(SM<6) SM=6 S ST=$E(S,I+2,999) S:ST="" ST=" " S S=$E(S,1,I)_Y_ST
+"RTN","BSDX07",346,0)
+    . Q
+"RTN","BSDX07",347,0)
+    S ^SC(SC,"ST",$P(SD,"."),1)=S
+"RTN","BSDX07",348,0)
+    L -^SC(SC,"ST",$P(SD,"."),1)
+"RTN","BSDX07",349,0)
+    Q
+"RTN","BSDX08")
+0^8^B118482818
+"RTN","BSDX08",1,0)
+BSDX08 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 1/25/11 12:39pm
+"RTN","BSDX08",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX08",3,0)
+ ; 
+"RTN","BSDX08",4,0)
+ ; Original by HMW. New Written by Sam Habiel. Licensed under LGPL.
+"RTN","BSDX08",5,0)
+ ; 
+"RTN","BSDX08",6,0)
+ ; Change History
+"RTN","BSDX08",7,0)
+ ; 3101022 UJO/SMH v1.42
+"RTN","BSDX08",8,0)
+ ;  - Transaction now restartable. Thanks to 
+"RTN","BSDX08",9,0)
+ ;   --> Zach Gonzalez and Rick Marshall for fix.
+"RTN","BSDX08",10,0)
+ ;  - Extra TROLLBACK in Lock Statement when lock fails.
+"RTN","BSDX08",11,0)
+ ;   --> Removed--Rollback is already in ERR tag.
+"RTN","BSDX08",12,0)
+ ;  - Added new statements to old SD code in AVUPDT to obviate
+"RTN","BSDX08",13,0)
+ ;   --> need to restore variables in transaction
+"RTN","BSDX08",14,0)
+ ;  - Refactored this chunk of code. Don't really know whether it 
+"RTN","BSDX08",15,0)
+ ;   --> worked in the first place. Waiting for bug report to know.
+"RTN","BSDX08",16,0)
+ ;  - Refactored all of APPDEL.
+"RTN","BSDX08",17,0)
+ ; 
+"RTN","BSDX08",18,0)
+ ; 3111125 UJO/SMH v1.5
+"RTN","BSDX08",19,0)
+ ;  - Added ability to remove checked in appointments. Added a couple
+"RTN","BSDX08",20,0)
+ ;    of units tests for that under UT2.
+"RTN","BSDX08",21,0)
+ ;  - Minor reformatting because of how KIDS adds tabs.
+"RTN","BSDX08",22,0)
+ ; 
+"RTN","BSDX08",23,0)
+ ; Error Reference:
+"RTN","BSDX08",24,0)
+ ;  -1~BSDX08: Appt record is locked. Please contact technical support.
+"RTN","BSDX08",25,0)
+ ;  -2~BSDX08: Invalid Appointment ID
+"RTN","BSDX08",26,0)
+ ;  -3~BSDX08: Invalid Appointment ID
+"RTN","BSDX08",27,0)
+ ;  -4~BSDX08: Cancelled appointment does not have a Resouce ID  
+"RTN","BSDX08",28,0)
+ ;  -5~BSDX08: Resouce ID does not exist in BSDX RESOURCE
+"RTN","BSDX08",29,0)
+ ;  -6~BSDX08: Invalid Hosp Location stored in Database
+"RTN","BSDX08",30,0)
+ ;  -7~BSDX08: Patient does not have an appointment in PIMS Clinic
+"RTN","BSDX08",31,0)
+ ;  -8^BSDX08: Unable to find associated PIMS appointment for this patient
+"RTN","BSDX08",32,0)
+ ;  -9^BSDX08: BSDXAPI returned an error: (error)
+"RTN","BSDX08",33,0)
+ ;  -100~BSDX08 Error: (Mumps Error)
+"RTN","BSDX08",34,0)
+ ;
+"RTN","BSDX08",35,0)
+APPDELD(BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT) ;EP
+"RTN","BSDX08",36,0)
+ ;Entry point for debugging
+"RTN","BSDX08",37,0)
+ D DEBUG^%Serenji("APPDEL^BSDX08(.BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT)")
+"RTN","BSDX08",38,0)
+ Q
+"RTN","BSDX08",39,0)
+ ;
+"RTN","BSDX08",40,0)
+UT ; Unit Tests
+"RTN","BSDX08",41,0)
+ ; Test 1: Make normal appointment and cancel it. See if every thing works
+"RTN","BSDX08",42,0)
+ N ZZZ
+"RTN","BSDX08",43,0)
+ D APPADD^BSDX07(.ZZZ,3110123.2,3110123.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",44,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",45,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Sam's Cancel Note")
+"RTN","BSDX08",46,0)
+ I $P(^BSDXAPPT(APPID,0),U,12)'>0 W "Error in Cancellation-1"
+"RTN","BSDX08",47,0)
+ I $O(^SC(2,"S",3110123.2,1,0))]"" W "Error in Cancellation-2"
+"RTN","BSDX08",48,0)
+ I $P(^DPT(4,"S",3110123.2,0),U,2)'="PC" W "Error in Cancellation-3"
+"RTN","BSDX08",49,0)
+ I ^DPT(4,"S",3110123.2,"R")'="Sam's Cancel Note" W "Error in Cancellation-4"
+"RTN","BSDX08",50,0)
+ ;
+"RTN","BSDX08",51,0)
+ ; Test 2: Check for -1
+"RTN","BSDX08",52,0)
+ ; Make appt
+"RTN","BSDX08",53,0)
+ D APPADD^BSDX07(.ZZZ,3110125.2,3110125.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",54,0)
+ ; Lock the node in another job
+"RTN","BSDX08",55,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",56,0)
+ ; W "Lock ^BSDXAPPT("_APPID_") in another session. You have 10 seconds." H 10
+"RTN","BSDX08",57,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Sam's Cancel Note")
+"RTN","BSDX08",58,0)
+ ;
+"RTN","BSDX08",59,0)
+ ; Test 3: Check for -100
+"RTN","BSDX08",60,0)
+ S bsdxdie=1
+"RTN","BSDX08",61,0)
+ D APPADD^BSDX07(.ZZZ,3110126.2,3110126.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",62,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",63,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Reasons")
+"RTN","BSDX08",64,0)
+ I $P(^BSDXTMP($J,1),"~")'=-100 W "Error in -100",!
+"RTN","BSDX08",65,0)
+ K bsdxdie
+"RTN","BSDX08",66,0)
+ ;
+"RTN","BSDX08",67,0)
+ ; Test 4: Restartable transaction
+"RTN","BSDX08",68,0)
+ S bsdxrestart=1
+"RTN","BSDX08",69,0)
+ D APPADD^BSDX07(.ZZZ,3110128.2,3110128.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",70,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",71,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Reasons")
+"RTN","BSDX08",72,0)
+ I $P(^DPT(4,"S",3110128.2,0),U,2)'="PC" W "Error in Restartable Transaction",!
+"RTN","BSDX08",73,0)
+ ;
+"RTN","BSDX08",74,0)
+ ; Test 5: for invalid Appointment ID (-2 and -3)
+"RTN","BSDX08",75,0)
+ D APPDEL^BSDX08(.ZZZ,0,"PC",1,"Reasons")
+"RTN","BSDX08",76,0)
+ I $P(^BSDXTMP($J,1),"~")'=-2 W "Error in -2",!
+"RTN","BSDX08",77,0)
+ D APPDEL^BSDX08(.ZZZ,999999,"PC",1,"Reasons")
+"RTN","BSDX08",78,0)
+ I $P(^BSDXTMP($J,1),"~")'=-3 W "Error in -3",!
+"RTN","BSDX08",79,0)
+UT2 ; More unit Tests
+"RTN","BSDX08",80,0)
+ ;
+"RTN","BSDX08",81,0)
+ ; Test 6: for Cancelling walkin and checked-in appointments 
+"RTN","BSDX08",82,0)
+ S BSDXSTART=$E($$NOW^XLFDT,1,12),BSDXEND=BSDXSTART+.0001
+"RTN","BSDX08",83,0)
+ D APPADD^BSDX07(.ZZZ,BSDXSTART,BSDXEND,4,"Dr Office",10,"Sam's Note",1) ; Add appt
+"RTN","BSDX08",84,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",85,0)
+ I APPID=0 W "Error in test 6",!
+"RTN","BSDX08",86,0)
+ D CHECKIN^BSDX25(.ZZZ,APPID,$$NOW^XLFDT) ; check-in
+"RTN","BSDX08",87,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",10,"Cancel Note") ; Delete appt
+"RTN","BSDX08",88,0)
+ I $P(^BSDXTMP($J,1),$C(30))'="" W "Error in test 6",!
+"RTN","BSDX08",89,0)
+ ;
+"RTN","BSDX08",90,0)
+ ; Test 7: for cancelling walkin and checked-in appointments
+"RTN","BSDX08",91,0)
+ S BSDXSTART=$E($$NOW^XLFDT,1,12)+.0001,BSDXEND=BSDXSTART+.0001
+"RTN","BSDX08",92,0)
+ D APPADD^BSDX07(.ZZZ,BSDXSTART,BSDXEND,4,"Dr Office",10,"Sam's Note",1) ; Add appt
+"RTN","BSDX08",93,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",94,0)
+ I APPID=0 W "Error in test 6",!
+"RTN","BSDX08",95,0)
+ D CHECKIN^BSDX25(.ZZZ,APPID,$$NOW^XLFDT) ; Checkin
+"RTN","BSDX08",96,0)
+ S BSDXRES=$O(^BSDXRES("B","Dr Office",""))
+"RTN","BSDX08",97,0)
+ S BSDXCLN=$P(^BSDXRES(BSDXRES,0),U,4)
+"RTN","BSDX08",98,0)
+ S BSDXRESULT=$$RMCI^BSDXAPI(4,BSDXCLN,BSDXSTART) ; remove checkin
+"RTN","BSDX08",99,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",10,"Cancel Note") ; delete appt
+"RTN","BSDX08",100,0)
+ I $P(^BSDXTMP($J,1),$C(30))'="" W "Error in test 6",!
+"RTN","BSDX08",101,0)
+ QUIT
+"RTN","BSDX08",102,0)
+APPDEL(BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT)        ;EP
+"RTN","BSDX08",103,0)
+ ;Called by RPC: BSDX CANCEL APPOINTMENT
+"RTN","BSDX08",104,0)
+ ;Cancels existing appointment in BSDX APPOINTMENT and 44/2 subfiles
+"RTN","BSDX08",105,0)
+ ;Input Parameters:
+"RTN","BSDX08",106,0)
+ ; - BSDXAPTID is entry number in BSDX APPOINTMENT file
+"RTN","BSDX08",107,0)
+ ; - BSDXTYP is C for clinic-cancelled and PC for patient cancelled
+"RTN","BSDX08",108,0)
+ ; - BSDXCR is pointer to CANCELLATION REASON File (409.2)
+"RTN","BSDX08",109,0)
+ ; - BSDXNOT is user note
+"RTN","BSDX08",110,0)
+ ;
+"RTN","BSDX08",111,0)
+ ; Returns error code in recordset field ERRORID. Empty string is success.
+"RTN","BSDX08",112,0)
+ ; Returns Global Array. Must use this type in RPC.
+"RTN","BSDX08",113,0)
+ ;
+"RTN","BSDX08",114,0)
+ ; Return Array: set Return and clear array
+"RTN","BSDX08",115,0)
+ S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX08",116,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX08",117,0)
+ ;
+"RTN","BSDX08",118,0)
+ ; Set min DUZ vars if they don't exist
+"RTN","BSDX08",119,0)
+ D ^XBKVAR
+"RTN","BSDX08",120,0)
+ ;
+"RTN","BSDX08",121,0)
+ ; $ET
+"RTN","BSDX08",122,0)
+ N $ET S $ET="G ETRAP^BSDX08"
+"RTN","BSDX08",123,0)
+ ;
+"RTN","BSDX08",124,0)
+ ; Counter
+"RTN","BSDX08",125,0)
+ N BSDXI S BSDXI=0
+"RTN","BSDX08",126,0)
+ ; Header Node
+"RTN","BSDX08",127,0)
+ S ^BSDXTMP($J,BSDXI)="T00100ERRORID"_$C(30)
+"RTN","BSDX08",128,0)
+ ;
+"RTN","BSDX08",129,0)
+ ; Lock BSDX node, only to synchronize access to the globals.
+"RTN","BSDX08",130,0)
+ ; It's not expected that the error will ever happen as no filing
+"RTN","BSDX08",131,0)
+ ; is supposed to take 5 seconds.
+"RTN","BSDX08",132,0)
+ L +^BSDXAPPT(BSDXAPTID):5 I '$T D ERR(BSDXI,"-1~BSDX08: Appt record is locked. Please contact technical support.") Q
+"RTN","BSDX08",133,0)
+ ;
+"RTN","BSDX08",134,0)
+ ;Restartable Transaction; restore paramters when starting.
+"RTN","BSDX08",135,0)
+ ; (Params restored are what's passed here + BSDXI)
+"RTN","BSDX08",136,0)
+ TSTART (BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT,BSDXI):T="BSDX CANCEL APPOINTEMENT^BSDX08"
+"RTN","BSDX08",137,0)
+ ;
+"RTN","BSDX08",138,0)
+ ; Turn off SDAM APPT PROTOCOL BSDX Entries
+"RTN","BSDX08",139,0)
+ N BSDXNOEV
+"RTN","BSDX08",140,0)
+ S BSDXNOEV=1 ;Don't execute BSDX CANCEL APPOINTMENT protocol
+"RTN","BSDX08",141,0)
+ ;
+"RTN","BSDX08",142,0)
+ ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX08",143,0)
+ I $G(bsdxdie) S X=1/0
+"RTN","BSDX08",144,0)
+ ;;;test
+"RTN","BSDX08",145,0)
+ ;;;test for TRESTART
+"RTN","BSDX08",146,0)
+ I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX08",147,0)
+ ;;;test
+"RTN","BSDX08",148,0)
+ ;
+"RTN","BSDX08",149,0)
+ ; Check appointment ID and whether it exists
+"RTN","BSDX08",150,0)
+ I '+BSDXAPTID D ERR(BSDXI,"-2~BSDX08: Invalid Appointment ID") Q
+"RTN","BSDX08",151,0)
+ I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(BSDXI,"-3~BSDX08: Invalid Appointment ID") Q
+"RTN","BSDX08",152,0)
+ ;
+"RTN","BSDX08",153,0)
+ ; Start Processing:
+"RTN","BSDX08",154,0)
+ ; First, add cancellation date to appt entry in BSDX APPOINTMENT
+"RTN","BSDX08",155,0)
+ N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPTID,0) ; BSDX Appt Node
+"RTN","BSDX08",156,0)
+ N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) ; Patient ID
+"RTN","BSDX08",157,0)
+ N BSDXSTART S BSDXSTART=$P(BSDXNOD,U) ; Start Time
+"RTN","BSDX08",158,0)
+ D BSDXCAN(BSDXAPTID)  ; Add a cancellation date in BSDX APPOINTMENT
+"RTN","BSDX08",159,0)
+ ;
+"RTN","BSDX08",160,0)
+ ; Second, cancel appt in "S" nodes in file 2 and 44, then update Legacy PIMS Availability
+"RTN","BSDX08",161,0)
+ N BSDXSC1 S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID
+"RTN","BSDX08",162,0)
+ ; If the resouce id doesn't exist...
+"RTN","BSDX08",163,0)
+ I BSDXSC1="" D ERR(BSDXI,"-4~BSDX08: Cancelled appointment does not have a Resouce ID") QUIT
+"RTN","BSDX08",164,0)
+ I '$D(^BSDXRES(BSDXSC1,0)) D ERR(BSDXI,"-5~BSDX08: Resouce ID does not exist in BSDX RESOURCE") QUIT
+"RTN","BSDX08",165,0)
+ ; Get zero node of resouce
+"RTN","BSDX08",166,0)
+ S BSDXNOD=^BSDXRES(BSDXSC1,0)
+"RTN","BSDX08",167,0)
+ ; Get Hosp location
+"RTN","BSDX08",168,0)
+ N BSDXLOC S BSDXLOC=$P(BSDXNOD,U,4)
+"RTN","BSDX08",169,0)
+ ; Error indicator for Hosp Location filing for getting out of routine
+"RTN","BSDX08",170,0)
+ N BSDXERR S BSDXERR=0
+"RTN","BSDX08",171,0)
+ ; Only file in 2/44 if there is an associated hospital location
+"RTN","BSDX08",172,0)
+ I BSDXLOC D  QUIT:BSDXERR  
+"RTN","BSDX08",173,0)
+ . I '$D(^SC(BSDXLOC,0)) S BSDXERR=1 D ERR(BSDXI,"-6~BSDX08: Invalid Hosp Location stored in Database") QUIT
+"RTN","BSDX08",174,0)
+ . ; Get the IEN of the appointment in the "S" node of ^SC
+"RTN","BSDX08",175,0)
+ . N BSDXSCIEN
+"RTN","BSDX08",176,0)
+ . S BSDXSCIEN=$$SCIEN^BSDXAPI(BSDXPATID,BSDXLOC,BSDXSTART)
+"RTN","BSDX08",177,0)
+ . I BSDXSCIEN="" S BSDXERR=1 D ERR(BSDXI,"-7~BSDX08: Patient does not have an appointment in PIMS Clinic") QUIT
+"RTN","BSDX08",178,0)
+ . ; Get the appointment node
+"RTN","BSDX08",179,0)
+ . S BSDXNOD=$G(^SC(BSDXLOC,"S",BSDXSTART,1,BSDXSCIEN,0))
+"RTN","BSDX08",180,0)
+ . I BSDXNOD="" S BSDXERR=1 D ERR(BSDXI,"-8^BSDX08: Unable to find associated PIMS appointment for this patient") QUIT
+"RTN","BSDX08",181,0)
+ . N BSDXLEN S BSDXLEN=$P(BSDXNOD,U,2)
+"RTN","BSDX08",182,0)
+ . ; Cancel through BSDXAPI
+"RTN","BSDX08",183,0)
+ . N BSDXZ
+"RTN","BSDX08",184,0)
+ . D APCAN(.BSDXZ,BSDXLOC,BSDXPATID,BSDXSTART)
+"RTN","BSDX08",185,0)
+ . I +BSDXZ>0 S BSDXERR=1 D ERR(BSDXI,"-9^BSDX08: BSDXAPI returned an error: "_$P(BSDXZ,U,2)) QUIT
+"RTN","BSDX08",186,0)
+ . ; Update Legacy PIMS clinic Availability
+"RTN","BSDX08",187,0)
+ . D AVUPDT(BSDXLOC,BSDXSTART,BSDXLEN)
+"RTN","BSDX08",188,0)
+ ;
+"RTN","BSDX08",189,0)
+ TCOMMIT
+"RTN","BSDX08",190,0)
+ L -^BSDXAPPT(BSDXAPTID)
+"RTN","BSDX08",191,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",192,0)
+ S ^BSDXTMP($J,BSDXI)=""_$C(30)
+"RTN","BSDX08",193,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",194,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX08",195,0)
+ Q
+"RTN","BSDX08",196,0)
+ ;
+"RTN","BSDX08",197,0)
+AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN) ;Update Legacy PIMS Clinic availability
+"RTN","BSDX08",198,0)
+ ;See SDCNP0
+"RTN","BSDX08",199,0)
+ N SD,S  ; Start Date
+"RTN","BSDX08",200,0)
+ S (SD,S)=BSDXSTART 
+"RTN","BSDX08",201,0)
+ N I ; Clinic IEN in 44
+"RTN","BSDX08",202,0)
+ S I=BSDXSCD
+"RTN","BSDX08",203,0)
+ ; if day has no schedule in legacy PIMS, forget about this update.
+"RTN","BSDX08",204,0)
+ Q:'$D(^SC(I,"ST",SD\1,1))
+"RTN","BSDX08",205,0)
+ N SL ; Clinic characteristics node (length of appt, when appts start etc)
+"RTN","BSDX08",206,0)
+ S SL=^SC(I,"SL")
+"RTN","BSDX08",207,0)
+ N X ; Hour Clinic Display Begins
+"RTN","BSDX08",208,0)
+ S X=$P(SL,U,3)
+"RTN","BSDX08",209,0)
+ N STARTDAY ; When does the day start?
+"RTN","BSDX08",210,0)
+ S STARTDAY=$S($L(X):X,1:8) ; If defined, use it; otherwise, 8am
+"RTN","BSDX08",211,0)
+ N SB ; ?? Who knows? Day Start - 1 divided by 100.
+"RTN","BSDX08",212,0)
+ S SB=STARTDAY-1/100
+"RTN","BSDX08",213,0)
+ S X=$P(SL,U,6) ; Now X is Display increments per hour
+"RTN","BSDX08",214,0)
+ N HSI ; Slots per hour, try 1
+"RTN","BSDX08",215,0)
+ S HSI=$S(X:X,1:4) ; if defined, use it; otherwise, 4
+"RTN","BSDX08",216,0)
+ N SI ; Slots per hour, try 2
+"RTN","BSDX08",217,0)
+ S SI=$S(X="":4,X<3:4,X:X,1:4) ; If slots "", or less than 3, then 4
+"RTN","BSDX08",218,0)
+ N STR ; ??
+"RTN","BSDX08",219,0)
+ S STR="#@!$* XXWVUTSRQPONMLKJIHGFEDCBA0123456789jklmnopqrstuvwxyz"
+"RTN","BSDX08",220,0)
+ N SDDIF ; Slots per hour diff??
+"RTN","BSDX08",221,0)
+ S SDDIF=$S(HSI<3:8/HSI,1:2)
+"RTN","BSDX08",222,0)
+ S SL=BSDXLEN ; Dammit, reusing variable; SL now Appt Length from GUI
+"RTN","BSDX08",223,0)
+ S S=^SC(I,"ST",SD\1,1) ; reusing var again; S now Day Pattern from PIMS
+"RTN","BSDX08",224,0)
+ N Y ; Hours since start of Date
+"RTN","BSDX08",225,0)
+ S Y=SD#1-SB*100 ;SD#1=FM Time portion; -SB minus start of day; conv to hrs
+"RTN","BSDX08",226,0)
+ N ST  ; ??
+"RTN","BSDX08",227,0)
+ ; Y#1 -> Minutes; *SI -> * Slots per hour; \.6 trunc min to hour
+"RTN","BSDX08",228,0)
+ ; Y\1 -> Hours since start of day; * SI: * slots
+"RTN","BSDX08",229,0)
+ S ST=Y#1*SI\.6+(Y\1*SI) 
+"RTN","BSDX08",230,0)
+ N SS ; how many slots are supposed to be taken by appointment
+"RTN","BSDX08",231,0)
+ S SS=SL*HSI/60 ; (nb: try SL: 30 min; HSI: 4 slots)
+"RTN","BSDX08",232,0)
+ N I
+"RTN","BSDX08",233,0)
+ I Y'<1 D  ; If Hours since start of Date is greater than 1
+"RTN","BSDX08",234,0)
+ . ; loop through pattern. Tired of documenting.
+"RTN","BSDX08",235,0)
+ . F I=ST+ST:SDDIF D  Q:Y=""  Q:SS'>0
+"RTN","BSDX08",236,0)
+ . . S Y=$E(STR,$F(STR,$E(S,I+1))) Q:Y=""  
+"RTN","BSDX08",237,0)
+ . . S S=$E(S,1,I)_Y_$E(S,I+2,999)
+"RTN","BSDX08",238,0)
+ . . S SS=SS-1 
+"RTN","BSDX08",239,0)
+ . . Q:SS'>0
+"RTN","BSDX08",240,0)
+ S ^SC(BSDXSCD,"ST",SD\1,1)=S  ; new pattern; global set
+"RTN","BSDX08",241,0)
+ Q
+"RTN","BSDX08",242,0)
+ ;
+"RTN","BSDX08",243,0)
+APCAN(BSDXZ,BSDXLOC,BSDXDFN,BSDXSD)         ;
+"RTN","BSDX08",244,0)
+ ;Cancel appointment for patient BSDXDFN in clinic BSDXSC1
+"RTN","BSDX08",245,0)
+ ;at time BSDXSD
+"RTN","BSDX08",246,0)
+ N BSDXC,%H
+"RTN","BSDX08",247,0)
+ S BSDXC("PAT")=BSDXPATID
+"RTN","BSDX08",248,0)
+ S BSDXC("CLN")=BSDXLOC
+"RTN","BSDX08",249,0)
+ S BSDXC("TYP")=BSDXTYP
+"RTN","BSDX08",250,0)
+ S BSDXC("ADT")=BSDXSD
+"RTN","BSDX08",251,0)
+ S %H=$H D YMD^%DTC
+"RTN","BSDX08",252,0)
+ S BSDXC("CDT")=X+%
+"RTN","BSDX08",253,0)
+ S BSDXC("NOT")=BSDXNOT
+"RTN","BSDX08",254,0)
+ S:'+$G(BSDXCR) BSDXCR=11 ;Other
+"RTN","BSDX08",255,0)
+ S BSDXC("CR")=BSDXCR
+"RTN","BSDX08",256,0)
+ S BSDXC("USR")=DUZ
+"RTN","BSDX08",257,0)
+ ;
+"RTN","BSDX08",258,0)
+ S BSDXZ=$$CANCEL^BSDXAPI(.BSDXC)
+"RTN","BSDX08",259,0)
+ Q
+"RTN","BSDX08",260,0)
+ ;
+"RTN","BSDX08",261,0)
+BSDXCAN(BSDXAPTID) ;
+"RTN","BSDX08",262,0)
+ ;Cancel BSDX APPOINTMENT entry
+"RTN","BSDX08",263,0)
+ N %DT,X,BSDXDATE,Y,BSDXIENS,BSDXFDA,BSDXMSG
+"RTN","BSDX08",264,0)
+ S %DT="XT",X="NOW" D ^%DT ; X ^DD("DD")
+"RTN","BSDX08",265,0)
+ S BSDXDATE=Y
+"RTN","BSDX08",266,0)
+ S BSDXIENS=BSDXAPTID_","
+"RTN","BSDX08",267,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.12)=BSDXDATE
+"RTN","BSDX08",268,0)
+ K BSDXMSG
+"RTN","BSDX08",269,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX08",270,0)
+ Q
+"RTN","BSDX08",271,0)
+ ;
+"RTN","BSDX08",272,0)
+CANEVT(BSDXPAT,BSDXSTART,BSDXSC) ;EP Called by BSDX CANCEL APPOINTMENT event
+"RTN","BSDX08",273,0)
+ ;when appointments cancelled via PIMS interface.
+"RTN","BSDX08",274,0)
+ ;Propagates cancellation to BSDXAPPT and raises refresh event to running GUI clients
+"RTN","BSDX08",275,0)
+ N BSDXFOUND,BSDXRES
+"RTN","BSDX08",276,0)
+ Q:+$G(BSDXNOEV)
+"RTN","BSDX08",277,0)
+ Q:'+$G(BSDXSC)
+"RTN","BSDX08",278,0)
+ S BSDXFOUND=0
+"RTN","BSDX08",279,0)
+ I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$CANEVT1(BSDXRES,BSDXSTART,BSDXPAT)
+"RTN","BSDX08",280,0)
+ I BSDXFOUND D CANEVT3(BSDXRES) Q
+"RTN","BSDX08",281,0)
+ I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$CANEVT1(BSDXRES,BSDXSTART,BSDXPAT)
+"RTN","BSDX08",282,0)
+ I BSDXFOUND D CANEVT3(BSDXRES)
+"RTN","BSDX08",283,0)
+ Q
+"RTN","BSDX08",284,0)
+ ;
+"RTN","BSDX08",285,0)
+CANEVT1(BSDXRES,BSDXSTART,BSDXPAT) ;
+"RTN","BSDX08",286,0)
+ ;Get appointment id in BSDXAPT
+"RTN","BSDX08",287,0)
+ ;If found, call BSDXCAN(BSDXAPPT) and return 1
+"RTN","BSDX08",288,0)
+ ;else return 0
+"RTN","BSDX08",289,0)
+ N BSDXFOUND,BSDXAPPT
+"RTN","BSDX08",290,0)
+ S BSDXFOUND=0
+"RTN","BSDX08",291,0)
+ Q:'+BSDXRES BSDXFOUND
+"RTN","BSDX08",292,0)
+ Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND
+"RTN","BSDX08",293,0)
+ S BSDXAPPT=0 F  S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT  D  Q:BSDXFOUND
+"RTN","BSDX08",294,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""
+"RTN","BSDX08",295,0)
+ . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q
+"RTN","BSDX08",296,0)
+ I BSDXFOUND,+$G(BSDXAPPT) D BSDXCAN(BSDXAPPT)
+"RTN","BSDX08",297,0)
+ Q BSDXFOUND
+"RTN","BSDX08",298,0)
+ ;
+"RTN","BSDX08",299,0)
+CANEVT3(BSDXRES) ;
+"RTN","BSDX08",300,0)
+ ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX08",301,0)
+ ;
+"RTN","BSDX08",302,0)
+ N BSDXRESN
+"RTN","BSDX08",303,0)
+ S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX08",304,0)
+ Q:BSDXRESN=""
+"RTN","BSDX08",305,0)
+ S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX08",306,0)
+ ;D EVENT^BSDX23("SCHEDULE-"_BSDXRESN,"","","")
+"RTN","BSDX08",307,0)
+ D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX08",308,0)
+ Q
+"RTN","BSDX08",309,0)
+ ;
+"RTN","BSDX08",310,0)
+ERR(BSDXI,BSDXERR) ;Error processing
+"RTN","BSDX08",311,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",312,0)
+ S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX08",313,0)
+ I $TL>0 TROLLBACK
+"RTN","BSDX08",314,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX08",315,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",316,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX08",317,0)
+ L -^BSDXAPPT(BSDXAPTID)
+"RTN","BSDX08",318,0)
+ QUIT
+"RTN","BSDX08",319,0)
+ ;
+"RTN","BSDX08",320,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX08",321,0)
+ N $ET S $ET="D ^%ZTER HALT"  ; Emergency Error Trap
+"RTN","BSDX08",322,0)
+ ; Rollback, otherwise ^XTER will be empty from future rollback
+"RTN","BSDX08",323,0)
+ I $TL>0 TROLLBACK 
+"RTN","BSDX08",324,0)
+ D ^%ZTER
+"RTN","BSDX08",325,0)
+ S $EC=""  ; Clear Error
+"RTN","BSDX08",326,0)
+ ; Log error message and send to client
+"RTN","BSDX08",327,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX08",328,0)
+ D ERR(BSDXI,"-100~BSDX08 Error: "_$G(%ZTERZE))
+"RTN","BSDX08",329,0)
+ QUIT
+"RTN","BSDX08",330,0)
+ ;
+"RTN","BSDX08",331,0)
+ ;;;NB: This is code that is unused in both original and port.
+"RTN","BSDX08",332,0)
+ ; ; If not appt in the "S" node is found in ^SC then check associated RPMS Clinic Multiple
+"RTN","BSDX08",333,0)
+ ; I BSDXSCIEN="" D  I 'BSDXZ Q  ;Q:BSDXZ
+"RTN","BSDX08",334,0)
+ ; . S BSDXERR="BSDX08: Unable to find associated RPMS appointment for this patient. "
+"RTN","BSDX08",335,0)
+ ; . S BSDXZ=1
+"RTN","BSDX08",336,0)
+ ; . ; Check if there are associated RPMS clinics. (not currently used) Does the multiple exist? No, then quit
+"RTN","BSDX08",337,0)
+ ; . I '$D(^BSDXRES(BSDXSC1,20)) S BSDXZ=0 QUIT
+"RTN","BSDX08",338,0)
+ ; . ; Loop through the multiple. Get Location and then the ^SC "S" node IEN.
+"RTN","BSDX08",339,0)
+ ; . N BSDX1 S BSDX1=0
+"RTN","BSDX08",340,0)
+ ; . F  S BSDX1=$O(^BSDXRES(BSDXSC1,20,BSDX1)) Q:'+BSDX1  Q:BSDXZ=0  D
+"RTN","BSDX08",341,0)
+ ; . . Q:'$D(^BSDXRES(BSDXSC1,20,BSDX1,0))
+"RTN","BSDX08",342,0)
+ ; . . S BSDXLOC=$P(^BSDXRES(BSDXSC1,20,BSDX1,0),U)
+"RTN","BSDX08",343,0)
+ ; . . S BSDXSCIEN=$$SCIEN^BSDXAPI(BSDXPATID,BSDXLOC,BSDXSTART) I +BSDXSCIEN S BSDXZ=0 Q
+"RTN","BSDX09")
+0^9^B35707298
+"RTN","BSDX09",1,0)
+BSDX09 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;  ; 10/20/10 4:16pm
+"RTN","BSDX09",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX09",3,0)
+ ;
+"RTN","BSDX09",4,0)
+ ; Change Log:
+"RTN","BSDX09",5,0)
+ ; UJO/TH - v 1.3 on 3100714 - Extra Demographics:
+"RTN","BSDX09",6,0)
+ ; - Email
+"RTN","BSDX09",7,0)
+ ; - Cell Phone
+"RTN","BSDX09",8,0)
+ ; - Country
+"RTN","BSDX09",9,0)
+ ; - + refactoring of routine
+"RTN","BSDX09",10,0)
+ ; 
+"RTN","BSDX09",11,0)
+ ; UJO/TH - v 1.3 on 3100715 - Change SSN to PID and get PID field instead
+"RTN","BSDX09",12,0)
+ ;
+"RTN","BSDX09",13,0)
+    ; UJO/TH - v 1.42 on 3101020 - Add Sex field.
+"RTN","BSDX09",14,0)
+    ;
+"RTN","BSDX09",15,0)
+GETREGA(BSDXRET,BSDXPAT)        ;EP
+"RTN","BSDX09",16,0)
+ ;
+"RTN","BSDX09",17,0)
+    ; See below for the returned fields
+"RTN","BSDX09",18,0)
+ ;
+"RTN","BSDX09",19,0)
+ ;For patient with ien BSDXPAT
+"RTN","BSDX09",20,0)
+ ;K ^BSDXTMP($J)
+"RTN","BSDX09",21,0)
+ S BSDXERR=""
+"RTN","BSDX09",22,0)
+ S BSDXRET="^BSDXTMP("_$J_")"
+"RTN","BSDX09",23,0)
+ ;
+"RTN","BSDX09",24,0)
+ N OUT S OUT=$NA(^BSDXTMP($J,0))
+"RTN","BSDX09",25,0)
+ S $P(@OUT,U,1)="T00030IEN"
+"RTN","BSDX09",26,0)
+ S $P(@OUT,U,2)="T00030STREET"
+"RTN","BSDX09",27,0)
+ S $P(@OUT,U,3)="T00030CITY"
+"RTN","BSDX09",28,0)
+ S $P(@OUT,U,4)="T00030STATE"
+"RTN","BSDX09",29,0)
+ S $P(@OUT,U,5)="T00030ZIP"
+"RTN","BSDX09",30,0)
+ S $P(@OUT,U,6)="T00030NAME"
+"RTN","BSDX09",31,0)
+ S $P(@OUT,U,7)="D00030DOB"
+"RTN","BSDX09",32,0)
+ S $P(@OUT,U,8)="T00030PID"
+"RTN","BSDX09",33,0)
+ S $P(@OUT,U,9)="T00030HRN"
+"RTN","BSDX09",34,0)
+ S $P(@OUT,U,10)="T00030HOMEPHONE"
+"RTN","BSDX09",35,0)
+ S $P(@OUT,U,11)="T00030OFCPHONE"
+"RTN","BSDX09",36,0)
+ S $P(@OUT,U,12)="T00030MSGPHONE"
+"RTN","BSDX09",37,0)
+ S $P(@OUT,U,13)="T00030NOK NAME"
+"RTN","BSDX09",38,0)
+ S $P(@OUT,U,14)="T00030RELATIONSHIP"
+"RTN","BSDX09",39,0)
+ S $P(@OUT,U,15)="T00030PHONE"
+"RTN","BSDX09",40,0)
+ S $P(@OUT,U,16)="T00030STREET"
+"RTN","BSDX09",41,0)
+ S $P(@OUT,U,17)="T00030CITY"
+"RTN","BSDX09",42,0)
+ S $P(@OUT,U,18)="T00030STATE"
+"RTN","BSDX09",43,0)
+ S $P(@OUT,U,19)="T00030ZIP"
+"RTN","BSDX09",44,0)
+ S $P(@OUT,U,20)="D00030DATAREVIEWED"
+"RTN","BSDX09",45,0)
+ S $P(@OUT,U,21)="T00030RegistrationComments"
+"RTN","BSDX09",46,0)
+ S $P(@OUT,U,22)="T00050EMAIL ADDRESS"
+"RTN","BSDX09",47,0)
+ S $P(@OUT,U,23)="T00020PHONE NUMBER [CELLULAR]"
+"RTN","BSDX09",48,0)
+ S $P(@OUT,U,24)="T00030COUNTRY"
+"RTN","BSDX09",49,0)
+ S $P(@OUT,U,25)="T00030SEX"
+"RTN","BSDX09",50,0)
+ S $E(@OUT,$L(@OUT)+1)=$C(30)
+"RTN","BSDX09",51,0)
+ ;
+"RTN","BSDX09",52,0)
+ ;
+"RTN","BSDX09",53,0)
+ N BSDXNOD,BSDXNAM,Y,U
+"RTN","BSDX09",54,0)
+ S U="^"
+"RTN","BSDX09",55,0)
+ S BSDXY="ERROR"
+"RTN","BSDX09",56,0)
+ K NAME
+"RTN","BSDX09",57,0)
+ I '+BSDXPAT S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX09",58,0)
+ I '$D(^DPT(+BSDXPAT,0)) S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX09",59,0)
+ S BSDXY=""
+"RTN","BSDX09",60,0)
+ S $P(BSDXY,U)=BSDXPAT
+"RTN","BSDX09",61,0)
+ ;//smh S $P(BSDXY,U,23)=""
+"RTN","BSDX09",62,0)
+ S $P(BSDXY,U,21)=""
+"RTN","BSDX09",63,0)
+ S BSDXNOD=^DPT(+BSDXPAT,0)
+"RTN","BSDX09",64,0)
+ S $P(BSDXY,"^",6)=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX09",65,0)
+ S $P(BSDXY,"^",8)=$$GET1^DIQ(2,BSDXPAT,"PRIMARY LONG ID") ;PID
+"RTN","BSDX09",66,0)
+ S Y=$P(BSDXNOD,U,3) I Y]""  X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX09",67,0)
+ S $P(BSDXY,"^",7)=Y ;DOB
+"RTN","BSDX09",68,0)
+ S $P(BSDXY,"^",9)=""
+"RTN","BSDX09",69,0)
+ I $D(DUZ(2)) I DUZ(2)>0 S $P(BSDXY,"^",9)=$P($G(^AUPNPAT(BSDXPAT,41,DUZ(2),0)),U,2) ;HRN
+"RTN","BSDX09",70,0)
+ D MAIL
+"RTN","BSDX09",71,0)
+ D PHONE
+"RTN","BSDX09",72,0)
+ D NOK
+"RTN","BSDX09",73,0)
+ D DATAREV
+"RTN","BSDX09",74,0)
+ ;/smh D MEDICARE
+"RTN","BSDX09",75,0)
+ D REGCMT
+"RTN","BSDX09",76,0)
+ S $P(BSDXY,"^",22)=$$GET1^DIQ(2,BSDXPAT,"EMAIL ADDRESS")
+"RTN","BSDX09",77,0)
+ S $P(BSDXY,"^",23)=$$GET1^DIQ(2,BSDXPAT,"PHONE NUMBER [CELLULAR]")
+"RTN","BSDX09",78,0)
+ S $P(BSDXY,"^",24)=$$GET1^DIQ(2,BSDXPAT,"COUNTRY:DESCRIPTION")
+"RTN","BSDX09",79,0)
+ S $P(BSDXY,"^",25)=$$GET1^DIQ(2,BSDXPAT,"SEX")
+"RTN","BSDX09",80,0)
+ N BSDXBEG,BSDXEND,BSDXLEN,BSDXI
+"RTN","BSDX09",81,0)
+ S BSDXLEN=$L(BSDXY)
+"RTN","BSDX09",82,0)
+ S BSDXBEG=0,BSDXI=2
+"RTN","BSDX09",83,0)
+ F  D  Q:BSDXEND=BSDXLEN
+"RTN","BSDX09",84,0)
+ . S BSDXEND=BSDXBEG+100
+"RTN","BSDX09",85,0)
+ . S:BSDXEND>BSDXLEN BSDXEND=BSDXLEN
+"RTN","BSDX09",86,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX09",87,0)
+ . S ^BSDXTMP($J,BSDXI)=$E(BSDXY,BSDXBEG,BSDXEND)
+"RTN","BSDX09",88,0)
+ . S BSDXBEG=BSDXBEG+101
+"RTN","BSDX09",89,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(30)_$C(31)
+"RTN","BSDX09",90,0)
+ Q
+"RTN","BSDX09",91,0)
+ ;
+"RTN","BSDX09",92,0)
+MAIL N BSDXST
+"RTN","BSDX09",93,0)
+ Q:'$D(^DPT(+BSDXPAT,.11))
+"RTN","BSDX09",94,0)
+ S BSDXNOD=^DPT(+BSDXPAT,.11)
+"RTN","BSDX09",95,0)
+ Q:BSDXNOD=""
+"RTN","BSDX09",96,0)
+ S $P(BSDXY,"^",2)=$E($P(BSDXNOD,U),1,50) ;STREET
+"RTN","BSDX09",97,0)
+ S $P(BSDXY,"^",3)=$P(BSDXNOD,U,4) ;CITY
+"RTN","BSDX09",98,0)
+ S BSDXST=$P(BSDXNOD,U,5)
+"RTN","BSDX09",99,0)
+ I +BSDXST,$D(^DIC(5,+BSDXST,0)) S BSDXST=$P(^DIC(5,+BSDXST,0),U,2)
+"RTN","BSDX09",100,0)
+ S $P(BSDXY,"^",4)=BSDXST ;STATE
+"RTN","BSDX09",101,0)
+ S $P(BSDXY,"^",5)=$P(BSDXNOD,U,6) ;ZIP
+"RTN","BSDX09",102,0)
+ Q
+"RTN","BSDX09",103,0)
+ ;
+"RTN","BSDX09",104,0)
+PHONE ;PHONE 10,11,12 HOME,OFC,MSG
+"RTN","BSDX09",105,0)
+ I $D(^DPT(+BSDXPAT,.13)) D
+"RTN","BSDX09",106,0)
+ . S BSDXNOD=^DPT(+BSDXPAT,.13)
+"RTN","BSDX09",107,0)
+ . S $P(BSDXY,U,10)=$P(BSDXNOD,U,1)
+"RTN","BSDX09",108,0)
+ . S $P(BSDXY,U,11)=$P(BSDXNOD,U,2)
+"RTN","BSDX09",109,0)
+ I $D(^DPT(+BSDXPAT,.121)) D
+"RTN","BSDX09",110,0)
+ . S BSDXNOD=^DPT(+BSDXPAT,.121)
+"RTN","BSDX09",111,0)
+ . S $P(BSDXY,U,12)=$P(BSDXNOD,U,10)
+"RTN","BSDX09",112,0)
+ Q
+"RTN","BSDX09",113,0)
+ ;
+"RTN","BSDX09",114,0)
+NOK ;NOK
+"RTN","BSDX09",115,0)
+ ;   13 NOK NAME^RELATIONSHIP^PHONE^STREET^CITY^STATE^ZIP
+"RTN","BSDX09",116,0)
+ N Y,BSDXST
+"RTN","BSDX09",117,0)
+ I $D(^DPT(+BSDXPAT,.21)) D
+"RTN","BSDX09",118,0)
+ . S BSDXNOD=^DPT(+BSDXPAT,.21)
+"RTN","BSDX09",119,0)
+ . S $P(BSDXY,U,13)=$P(BSDXNOD,U,1)
+"RTN","BSDX09",120,0)
+ . S $P(BSDXY,U,14)=$$VAL^XBDIQ1(9000001,BSDXPAT,2802)
+"RTN","BSDX09",121,0)
+ . S $P(BSDXY,U,15)=$P(BSDXNOD,U,9)
+"RTN","BSDX09",122,0)
+ . S $P(BSDXY,U,16)=$P(BSDXNOD,U,3)
+"RTN","BSDX09",123,0)
+ . S $P(BSDXY,U,17)=$P(BSDXNOD,U,6)
+"RTN","BSDX09",124,0)
+ . S BSDXST=$P(BSDXNOD,U,7)
+"RTN","BSDX09",125,0)
+ . I +BSDXST D
+"RTN","BSDX09",126,0)
+ . . I $D(^DIC(5,+BSDXST,0)) S BSDXST=$P(^DIC(5,+BSDXST,0),U,2),$P(BSDXY,U,18)=BSDXST
+"RTN","BSDX09",127,0)
+ . S $P(BSDXY,U,19)=$P(BSDXNOD,U,8)
+"RTN","BSDX09",128,0)
+ Q
+"RTN","BSDX09",129,0)
+ ;
+"RTN","BSDX09",130,0)
+DATAREV S $P(BSDXY,U,20)=$P($$VAL^XBDIQ1(9000001,BSDXPAT,16651),"@")
+"RTN","BSDX09",131,0)
+ Q
+"RTN","BSDX09",132,0)
+ ;
+"RTN","BSDX09",133,0)
+REGCMT N BSDXI,BSDXM,BSDXR
+"RTN","BSDX09",134,0)
+ S BSDXR=""
+"RTN","BSDX09",135,0)
+ D ENP^XBDIQ1(9000001,BSDXPAT,1301,"BSDXM(")
+"RTN","BSDX09",136,0)
+ S BSDXI=0 F  S BSDXI=$O(BSDXM(1301,BSDXI)) Q:'+BSDXI  D
+"RTN","BSDX09",137,0)
+ . S BSDXR=BSDXR_" "_BSDXM(1301,BSDXI)
+"RTN","BSDX09",138,0)
+ ; S $P(BSDXY,U,23)=$TR($E(BSDXR,1,1024),U," ") ; MJL 1/17/2007 //smh
+"RTN","BSDX09",139,0)
+ S $P(BSDXY,U,21)=$TR($E(BSDXR,1,1024),U," ") ;
+"RTN","BSDX09",140,0)
+ Q
+"RTN","BSDX09",141,0)
+ ;
+"RTN","BSDX09",142,0)
+GETMCAID(BSDXY,BSDXPAT) ; not in wv
+"RTN","BSDX09",143,0)
+ ;Returns PATIENTIEN^ENTRY#^MEDICAID#^SUBENTRY#^ELIG.BEGIN^ELIG.END |
+"RTN","BSDX09",144,0)
+ ;File is not dinum
+"RTN","BSDX09",145,0)
+ N C,N,ASDGX,BSDXM,BSDXBLD,BSDXCNT
+"RTN","BSDX09",146,0)
+ N BSDXIEN
+"RTN","BSDX09",147,0)
+ S BSDXBLD=""
+"RTN","BSDX09",148,0)
+ S BSDXIEN=0
+"RTN","BSDX09",149,0)
+ S BSDXCNT=1
+"RTN","BSDX09",150,0)
+ F  S BSDXIEN=$O(^AUPNMCD("B",BSDXPAT,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX09",151,0)
+ . S BSDXNUM=$$VAL^XBDIQ1(9000004,BSDXIEN,.03) ;MCAID#
+"RTN","BSDX09",152,0)
+ . D ENPM^XBDIQ1(9000004.11,BSDXIEN_",0",".01:.02","ASDGX(")
+"RTN","BSDX09",153,0)
+ . S C=1,N=0,BSDXM=""
+"RTN","BSDX09",154,0)
+ . F  S N=$O(ASDGX(N)) Q:'N  D
+"RTN","BSDX09",155,0)
+ . . S $P(BSDXY,"|",C)=BSDXPAT_U_BSDXIEN_U_BSDXNUM_U_N_U_ASDGX(N,.01)_U_ASDGX(N,.02)
+"RTN","BSDX09",156,0)
+ . . S C=C+1
+"RTN","BSDX09",157,0)
+ . . Q
+"RTN","BSDX09",158,0)
+ . Q
+"RTN","BSDX09",159,0)
+ Q
+"RTN","BSDX09",160,0)
+ ;
+"RTN","BSDX09",161,0)
+MEDICARE ; not in WV
+"RTN","BSDX09",162,0)
+ S $P(BSDXY,U,21)=$$VAL^XBDIQ1(9000003,BSDXPAT,.03)
+"RTN","BSDX09",163,0)
+ S $P(BSDXY,U,22)=$$VAL^XBDIQ1(9000003,BSDXPAT,.04)
+"RTN","BSDX09",164,0)
+ Q
+"RTN","BSDX09",165,0)
+ ;
+"RTN","BSDX09",166,0)
+GETMCARE(BSDXY,BSDXPAT)      ;
+"RTN","BSDX09",167,0)
+ ;Returns IEN^MEDICARE#^SUFFIX^SUBENTRY#^TYPE^ELIG.BEGIN^ELIG.END |
+"RTN","BSDX09",168,0)
+ ;File is dinum
+"RTN","BSDX09",169,0)
+ ;
+"RTN","BSDX09",170,0)
+ N ASDGX,C,N,BSDXNUM,BSDXSUF,BSDXBLD
+"RTN","BSDX09",171,0)
+ S BSDXNUM=$$VAL^XBDIQ1(9000003,BSDXPAT,.03)
+"RTN","BSDX09",172,0)
+ S BSDXSUF=$$VAL^XBDIQ1(9000003,BSDXPAT,.04)
+"RTN","BSDX09",173,0)
+ D ENPM^XBDIQ1(9000003.11,BSDXPAT_",0",".01:.03","ASDGX(")
+"RTN","BSDX09",174,0)
+ S C=1,N=0,BSDXBLD=""
+"RTN","BSDX09",175,0)
+ F  S N=$O(ASDGX(N)) Q:'N  D
+"RTN","BSDX09",176,0)
+ . S $P(BSDXY,"|",C)=BSDXPAT_U_BSDXNUM_U_BSDXSUF_U_N_U_ASDGX(N,.03)_U_ASDGX(N,.01)_U_ASDGX(N,.02)
+"RTN","BSDX09",177,0)
+ . S C=C+1
+"RTN","BSDX09",178,0)
+ . Q
+"RTN","BSDX09",179,0)
+ Q
+"RTN","BSDX09",180,0)
+ ;
+"RTN","BSDX09",181,0)
+GETPVTIN(BSDXY,BSDXPAT) ;
+"RTN","BSDX09",182,0)
+ ;Returns IEN^SUBENTRY^INSURER^POLICYNUMBER^ELIG.BEGIN^ELIG.END|...
+"RTN","BSDX09",183,0)
+ ;File is dinum
+"RTN","BSDX09",184,0)
+ ;
+"RTN","BSDX09",185,0)
+ N ASDGX,C,N
+"RTN","BSDX09",186,0)
+ D ENPM^XBDIQ1(9000006.11,BSDXPAT_",0",".01;.02;.06;.07","ASDGX(")
+"RTN","BSDX09",187,0)
+ S C=1,N=0
+"RTN","BSDX09",188,0)
+ F  S N=$O(ASDGX(N)) Q:'N  D
+"RTN","BSDX09",189,0)
+ . S $P(BSDXY,"|",C)=BSDXPAT_U_N_U_ASDGX(N,.01)_U_ASDGX(N,.02)_U_ASDGX(N,.06)_U_ASDGX(N,.07)
+"RTN","BSDX09",190,0)
+ . S C=C+1
+"RTN","BSDX09",191,0)
+ . Q
+"RTN","BSDX09",192,0)
+ Q
+"RTN","BSDX09",193,0)
+ ;
+"RTN","BSDX09",194,0)
+DFN(FILE,BSDXPAT) ; -- returns ien for file
+"RTN","BSDX09",195,0)
+ I FILE'[9000004 Q BSDXPAT
+"RTN","BSDX09",196,0)
+ Q +$O(^AUPNMCD("B",BSDXPAT,0))
+"RTN","BSDX11")
+0^34^B6358791
+"RTN","BSDX11",1,0)
+BSDX11 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX11",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX11",3,0)
+ ;
+"RTN","BSDX11",4,0)
+ENV0100 ;EP Version 1.0 Environment check
+"RTN","BSDX11",5,0)
+ I '$G(IOM) D HOME^%ZIS
+"RTN","BSDX11",6,0)
+ I '$G(DUZ) W !,"DUZ UNDEFINED OR 0." D SORRY(2) Q
+"RTN","BSDX11",7,0)
+ I '$L($G(DUZ(0))) W !,"DUZ(0) UNDEFINED OR NULL." D SORRY(2) Q
+"RTN","BSDX11",8,0)
+ I '(DUZ(0)["@") W:'$D(ZTQUEUED) !,"DUZ(0) DOES NOT CONTAIN AN '@'." D SORRY(2) Q
+"RTN","BSDX11",9,0)
+ S X=$$GET1^DIQ(200,DUZ,.01)
+"RTN","BSDX11",10,0)
+ W !!,$$CJ^XLFSTR("Hello, "_$P(X,",",2)_" "_$P(X,","),IOM)
+"RTN","BSDX11",11,0)
+ W !!,$$CJ^XLFSTR("Checking Environment...",IOM)
+"RTN","BSDX11",12,0)
+ ;
+"RTN","BSDX11",13,0)
+ ;is the PIMS requirement present?
+"RTN","BSDX11",14,0)
+ I '$$INSTALLD("PIMS*5.3*1003") D
+"RTN","BSDX11",15,0)
+ .D BMES^XPDUTL("Version 1.0 of the BSDX Package")
+"RTN","BSDX11",16,0)
+ . D BMES^XPDUTL("Cannot Be Installed Unless")
+"RTN","BSDX11",17,0)
+ . D BMES^XPDUTL("Patch 1003 of version 5.3 of the PIMS Package has been installed.")
+"RTN","BSDX11",18,0)
+ . D SORRY(2)
+"RTN","BSDX11",19,0)
+ . Q
+"RTN","BSDX11",20,0)
+ ;is the BMX requirement present?
+"RTN","BSDX11",21,0)
+ I '$$INSTALLD("BMX 1.0") D
+"RTN","BSDX11",22,0)
+ .D BMES^XPDUTL("Version 1.0 of the BSDX Package")
+"RTN","BSDX11",23,0)
+ . D BMES^XPDUTL("Cannot Be Installed Unless")
+"RTN","BSDX11",24,0)
+ . D BMES^XPDUTL("version 1.0 of the BMX Package has been installed.")
+"RTN","BSDX11",25,0)
+ . D SORRY(2)
+"RTN","BSDX11",26,0)
+ . Q
+"RTN","BSDX11",27,0)
+ Q
+"RTN","BSDX11",28,0)
+ ;End Environment check
+"RTN","BSDX11",29,0)
+ ;
+"RTN","BSDX11",30,0)
+V0100 ;EP Version 1.0 PostInit
+"RTN","BSDX11",31,0)
+ ;Add Protocol items to BSDAM APPOINTMENT EVENTS protocol
+"RTN","BSDX11",32,0)
+ ;
+"RTN","BSDX11",33,0)
+ N BSDXDA,BSDXFDA,BSDXDA1,BSDXSEQ,BSDXDAT,BSDXNOD,BSDXIEN,BSDXMSG
+"RTN","BSDX11",34,0)
+ S BSDXDA=$O(^ORD(101,"B","BSDAM APPOINTMENT EVENTS",0))
+"RTN","BSDX11",35,0)
+ Q:'+BSDXDA
+"RTN","BSDX11",36,0)
+ S BSDXDAT="BSDX ADD APPOINTMENT;10.2^BSDX CANCEL APPOINTMENT;10.4^BSDX CHECKIN APPOINTMENT;10.6^BSDX NOSHOW APPOINTMENT;10.8"
+"RTN","BSDX11",37,0)
+ F J=1:1:$L(BSDXDAT,U) D
+"RTN","BSDX11",38,0)
+ . K BSDXIEN,BSDXMSG,BSDXFDA
+"RTN","BSDX11",39,0)
+ . S BSDXNOD=$P(BSDXDAT,U,J)
+"RTN","BSDX11",40,0)
+ . S BSDXDA1=$P(BSDXNOD,";")
+"RTN","BSDX11",41,0)
+ . S BSDXSEQ=$P(BSDXNOD,";",2)
+"RTN","BSDX11",42,0)
+ . S BSDXDA1=$O(^ORD(101,"B",BSDXDA1,0))
+"RTN","BSDX11",43,0)
+ . Q:'+BSDXDA1
+"RTN","BSDX11",44,0)
+ . Q:$D(^ORD(101,BSDXDA,10,"B",BSDXDA1))
+"RTN","BSDX11",45,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",",".01")=BSDXDA1
+"RTN","BSDX11",46,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",","3")=BSDXSEQ
+"RTN","BSDX11",47,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX11",48,0)
+ . Q
+"RTN","BSDX11",49,0)
+ Q
+"RTN","BSDX11",50,0)
+ ;
+"RTN","BSDX11",51,0)
+SORRY(X) ;
+"RTN","BSDX11",52,0)
+ KILL DIFQ
+"RTN","BSDX11",53,0)
+ S XPDQUIT=X
+"RTN","BSDX11",54,0)
+ W *7,!,$$CJ^XLFSTR("Sorry....Please fix it.",IOM)
+"RTN","BSDX11",55,0)
+ Q
+"RTN","BSDX11",56,0)
+ ;
+"RTN","BSDX11",57,0)
+INSTALLD(BMXPKG) ;
+"RTN","BSDX11",58,0)
+ ;Determine if BMXPKG is present.
+"RTN","BSDX11",59,0)
+ Q 1
+"RTN","BSDX11",60,0)
+ ;S BSDXFIN=$O(^XPD(9.7,"B","PIMS*5.3*1003",""))
+"RTN","BSDX11",61,0)
+ S BSDXFIN=$O(^XPD(9.7,"B",BMXPKG,""))
+"RTN","BSDX11",62,0)
+ I $G(BSDXFIN)="" Q 0
+"RTN","BSDX11",63,0)
+ S BSDXSTAT=$P($G(^XPD(9.7,BSDXFIN,0)),U,9)
+"RTN","BSDX11",64,0)
+ ;'0' Loaded from Distribution
+"RTN","BSDX11",65,0)
+ ;'1' Queued for Install 
+"RTN","BSDX11",66,0)
+ ;'2' Start of Install 
+"RTN","BSDX11",67,0)
+ ;'3' Install Completed 
+"RTN","BSDX11",68,0)
+ ;'4' FOR De-Installed; 
+"RTN","BSDX11",69,0)
+ ;
+"RTN","BSDX11",70,0)
+ I BSDXSTAT'=3 Q 0
+"RTN","BSDX11",71,0)
+ Q 1
+"RTN","BSDX12")
+0^10^B7203579
+"RTN","BSDX12",1,0)
+BSDX12 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/18/10 2:14pm
+"RTN","BSDX12",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX12",3,0)
+    ; 
+"RTN","BSDX12",4,0)
+    ; Change Log:
+"RTN","BSDX12",5,0)
+    ; v 1.3 - i18n support - 3100718
+"RTN","BSDX12",6,0)
+    ; BSDXSTART and BSDXEND passed in FM Dates, not US dates
+"RTN","BSDX12",7,0)
+ ;
+"RTN","BSDX12",8,0)
+ ;
+"RTN","BSDX12",9,0)
+AVADD(BSDXY,BSDXSTART,BSDXEND,BSDXTYPID,BSDXRES,BSDXSLOTS,BSDXNOTE)  ;EP
+"RTN","BSDX12",10,0)
+ ;Called by BSDX ADD NEW AVAILABILITY
+"RTN","BSDX12",11,0)
+ ;Create entry in BSDX ACCESS BLOCK
+"RTN","BSDX12",12,0)
+ ;
+"RTN","BSDX12",13,0)
+ ;BSDXRES is Resource Name
+"RTN","BSDX12",14,0)
+ ;Returns recordset having fields 
+"RTN","BSDX12",15,0)
+ ; AvailabilityID and ErrorNumber
+"RTN","BSDX12",16,0)
+ ;
+"RTN","BSDX12",17,0)
+ ;Test lines:
+"RTN","BSDX12",18,0)
+ ;D AVADD^BSDX12(.RES,"3091227.09","3091227.0930","1","WHITT",2,"SCRATCH AV NOTE") ZW RES
+"RTN","BSDX12",19,0)
+ ;BSDX ADD NEW AVAILABILITY^3091227.09^3091227.0930^1^WHITT^2^SCRATCH AVAILABILITY NOTE
+"RTN","BSDX12",20,0)
+ ;
+"RTN","BSDX12",21,0)
+ N BSDXERR,BSDXIEN,BSDXDEP,BSDXI,BSDXAVID,BSDXI,BSDXERR,BSDXFDA,BSDXMSG,BSDXRESD
+"RTN","BSDX12",22,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX12",23,0)
+ S BSDXERR=0
+"RTN","BSDX12",24,0)
+ S BSDXI=0
+"RTN","BSDX12",25,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX12",26,0)
+ S ^BSDXTMP($J,0)="I00020AVAILABILITYID^I00020ERRORID"_$C(30)
+"RTN","BSDX12",27,0)
+ ;Check input data for errors
+"RTN","BSDX12",28,0)
+    ; i18n - FM Dates passed in
+"RTN","BSDX12",29,0)
+ ; S:BSDXSTART["@0000" BSDXSTART=$P(BSDXSTART,"@")
+"RTN","BSDX12",30,0)
+ ; S:BSDXEND["@0000" BSDXEND=$P(BSDXEND,"@")
+"RTN","BSDX12",31,0)
+ ; S %DT="T",X=BSDXSTART D ^%DT S BSDXSTART=Y
+"RTN","BSDX12",32,0)
+ ; I BSDXSTART=-1 D ERR(70) Q
+"RTN","BSDX12",33,0)
+ ; S %DT="T",X=BSDXEND D ^%DT S BSDXEND=Y
+"RTN","BSDX12",34,0)
+ ; I BSDXEND=-1 D ERR(70) Q
+"RTN","BSDX12",35,0)
+    ; Make sure dates are canonical and don't contain extra zeros
+"RTN","BSDX12",36,0)
+    S BSDXSTART=+BSDXSTART,BSDXEND=+BSDXEND
+"RTN","BSDX12",37,0)
+    ;
+"RTN","BSDX12",38,0)
+ I $L(BSDXEND,".")=1 D ERR(70) Q
+"RTN","BSDX12",39,0)
+ I BSDXSTART>BSDXEND S BSDXTMP=BSDXEND,BSDXEND=BSDXSTART,BSDXSTART=BSDXTMP
+"RTN","BSDX12",40,0)
+ ;Validate Access Type
+"RTN","BSDX12",41,0)
+ I '+BSDXTYPID,'$D(^BSDXTYPE(BSDXTYPID,0)) D ERR(70) Q
+"RTN","BSDX12",42,0)
+ ;Validate Resource
+"RTN","BSDX12",43,0)
+ I '$D(^BSDXRES("B",BSDXRES)) S BSDXERR=70 D ERR(BSDXERR) Q
+"RTN","BSDX12",44,0)
+ S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0)) I '+BSDXRESD S BSDXERR=70 D ERR(BSDXERR) Q
+"RTN","BSDX12",45,0)
+ ;
+"RTN","BSDX12",46,0)
+ ;Create entry in BSDX ACCESS BLOCK
+"RTN","BSDX12",47,0)
+ S BSDXFDA(9002018.3,"+1,",.01)=BSDXRESD
+"RTN","BSDX12",48,0)
+ S BSDXFDA(9002018.3,"+1,",.02)=BSDXSTART
+"RTN","BSDX12",49,0)
+ S BSDXFDA(9002018.3,"+1,",.03)=BSDXEND
+"RTN","BSDX12",50,0)
+ S BSDXFDA(9002018.3,"+1,",.04)=BSDXSLOTS
+"RTN","BSDX12",51,0)
+ S BSDXFDA(9002018.3,"+1,",.05)=BSDXTYPID
+"RTN","BSDX12",52,0)
+ K BSDXIEN,BSDXMSG
+"RTN","BSDX12",53,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX12",54,0)
+ S BSDXAVID=+$G(BSDXIEN(1))
+"RTN","BSDX12",55,0)
+ I 'BSDXAVID D ERR(70) Q
+"RTN","BSDX12",56,0)
+ ;
+"RTN","BSDX12",57,0)
+ ;Add WP field
+"RTN","BSDX12",58,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX12",59,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX12",60,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX12",61,0)
+ . D WP^DIE(9002018.3,BSDXAVID_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX12",62,0)
+ ;
+"RTN","BSDX12",63,0)
+ ;Return Recordset
+"RTN","BSDX12",64,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",65,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXAVID_"^-1"_$C(30)
+"RTN","BSDX12",66,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",67,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX12",68,0)
+ Q
+"RTN","BSDX12",69,0)
+ ;
+"RTN","BSDX12",70,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX12",71,0)
+ S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX12",72,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",73,0)
+ S ^BSDXTMP($J,BSDXI)="0^"_BSDXERR_$C(30)
+"RTN","BSDX12",74,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",75,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX12",76,0)
+ Q
+"RTN","BSDX13")
+0^11^B9772451
+"RTN","BSDX13",1,0)
+BSDX13 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 6:05pm
+"RTN","BSDX13",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX13",3,0)
+    ;
+"RTN","BSDX13",4,0)
+    ; Change Log:
+"RTN","BSDX13",5,0)
+    ; V 1.3 - i18n support - Dates passed to Routine as FM Date - WV/SMH
+"RTN","BSDX13",6,0)
+ Q
+"RTN","BSDX13",7,0)
+AVDELDTD(BSDXY,BSDXRESD,BSDXSTART,BSDXEND) ;EP
+"RTN","BSDX13",8,0)
+ ;Entry point for debugging
+"RTN","BSDX13",9,0)
+ ;
+"RTN","BSDX13",10,0)
+ ;D DEBUG^%Serenji("AVDELDT^BSDX13(.BSDXY,BSDXRESD,BSDXSTART,BSDXEND)")
+"RTN","BSDX13",11,0)
+ Q
+"RTN","BSDX13",12,0)
+ ;
+"RTN","BSDX13",13,0)
+AVDELDT(BSDXY,BSDXRESD,BSDXSTART,BSDXEND) ;EP
+"RTN","BSDX13",14,0)
+ ;Cancel availability in a date range
+"RTN","BSDX13",15,0)
+ ;Called by BSDX CANCEL AV BY DATE
+"RTN","BSDX13",16,0)
+ ;
+"RTN","BSDX13",17,0)
+ ;BSDXRESD is BSDX RESOURCE ien
+"RTN","BSDX13",18,0)
+ ;BSDXSTART and BSDXEND are FM dates (change in v 1.3)
+"RTN","BSDX13",19,0)
+ ;
+"RTN","BSDX13",20,0)
+ S X="ERROR^BSDX13",@^%ZOSF("TRAP")
+"RTN","BSDX13",21,0)
+ N BMXIEN,BSDXI
+"RTN","BSDX13",22,0)
+ S BSDXI=0
+"RTN","BSDX13",23,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX13",24,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX13",25,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX13",26,0)
+ ; S X=BSDXSTART ; commented out *v1.3
+"RTN","BSDX13",27,0)
+ ; S %DT="X" D ^%DT
+"RTN","BSDX13",28,0)
+ ; I Y=-1 D ERR(0,"AVDELDT-BSDX13: Invalid Start Date") Q
+"RTN","BSDX13",29,0)
+ ; S BSDXSTART=$P(Y,".")
+"RTN","BSDX13",30,0)
+ ; S X=BSDXEND
+"RTN","BSDX13",31,0)
+ ; S %DT="X" D ^%DT
+"RTN","BSDX13",32,0)
+ ; I Y=-1 D ERR(0,"AVDELDT-BSDX13: Invalid End Date") Q
+"RTN","BSDX13",33,0)
+ S BSDXEND=$P(BSDXEND,".")_".99999"
+"RTN","BSDX13",34,0)
+ I '+BSDXRESD D ERR(0,"AVDELDT-BSDX13: Invalid Resource ID") Q
+"RTN","BSDX13",35,0)
+ ;
+"RTN","BSDX13",36,0)
+ F  S BSDXSTART=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXSTART)) Q:'+BSDXSTART  Q:BSDXSTART>BSDXEND  D
+"RTN","BSDX13",37,0)
+ . S BMXIEN=0
+"RTN","BSDX13",38,0)
+ . F  S BMXIEN=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXSTART,BMXIEN)) Q:'+BMXIEN  D
+"RTN","BSDX13",39,0)
+ . . D CALLDIK(BMXIEN)
+"RTN","BSDX13",40,0)
+ ;
+"RTN","BSDX13",41,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",42,0)
+ S ^BSDXTMP($J,BSDXI)="-1^"_$C(30)_$C(31)
+"RTN","BSDX13",43,0)
+ Q
+"RTN","BSDX13",44,0)
+ERROR ;
+"RTN","BSDX13",45,0)
+ D ^%ZTER
+"RTN","BSDX13",46,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX13",47,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",48,0)
+ D ERR(0,"BSDX13 M Error: <"_$G(%ZTERZE)_">")
+"RTN","BSDX13",49,0)
+ Q
+"RTN","BSDX13",50,0)
+ ;
+"RTN","BSDX13",51,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX13",52,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX13",53,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",54,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX13",55,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",56,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX13",57,0)
+ Q
+"RTN","BSDX13",58,0)
+ ;
+"RTN","BSDX13",59,0)
+AVDEL(BSDXY,BSDXAVID) ;EP
+"RTN","BSDX13",60,0)
+ ;Called by BSDX CANCEL AVAILABILITY
+"RTN","BSDX13",61,0)
+ ;Deletes Access block
+"RTN","BSDX13",62,0)
+ ;BSDXAVID is entry number in BSDX AVAILABILITY file
+"RTN","BSDX13",63,0)
+ ;Returns error code in recordset field ERRORID
+"RTN","BSDX13",64,0)
+ ;
+"RTN","BSDX13",65,0)
+ S X="ERROR^BSDX13",@^%ZOSF("TRAP")
+"RTN","BSDX13",66,0)
+ N BSDXNOD,BSDXSTART,DIK,DA,BSDXID,BSDXI,BSDXEND,BSDXRSID
+"RTN","BSDX13",67,0)
+ ;
+"RTN","BSDX13",68,0)
+ S BSDXI=0
+"RTN","BSDX13",69,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX13",70,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX13",71,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX13",72,0)
+ I '+BSDXAVID D ERR(70) Q
+"RTN","BSDX13",73,0)
+ I '$D(^BSDXAB(BSDXAVID,0)) D ERR(70) Q
+"RTN","BSDX13",74,0)
+ ;
+"RTN","BSDX13",75,0)
+ ;
+"RTN","BSDX13",76,0)
+ ;TODO: Test for existing appointments in availability block
+"RTN","BSDX13",77,0)
+ ; (corresponds to old qryAppointmentBlocksOverlapC
+"RTN","BSDX13",78,0)
+ ;  and AVBlockHasAppointments)
+"RTN","BSDX13",79,0)
+ ;
+"RTN","BSDX13",80,0)
+ ;I $$APTINBLK(BSDXAVID) D ERR(20) Q
+"RTN","BSDX13",81,0)
+ ;
+"RTN","BSDX13",82,0)
+ ;Delete AVAILABILITY entries
+"RTN","BSDX13",83,0)
+ D CALLDIK(BSDXAVID)
+"RTN","BSDX13",84,0)
+ ;
+"RTN","BSDX13",85,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",86,0)
+ S ^BSDXTMP($J,BSDXI)="-1^"_$C(30)_$C(31)
+"RTN","BSDX13",87,0)
+ Q
+"RTN","BSDX13",88,0)
+ ;
+"RTN","BSDX13",89,0)
+CALLDIK(BSDXAVID) ;
+"RTN","BSDX13",90,0)
+ ;Delete AVAILABILITY entries
+"RTN","BSDX13",91,0)
+ ;
+"RTN","BSDX13",92,0)
+ S DIK="^BSDXAB("
+"RTN","BSDX13",93,0)
+ S DA=BSDXAVID
+"RTN","BSDX13",94,0)
+ D ^DIK
+"RTN","BSDX13",95,0)
+ ;
+"RTN","BSDX13",96,0)
+ Q
+"RTN","BSDX13",97,0)
+ ;
+"RTN","BSDX13",98,0)
+APTINBLK(BSDXAVID) ;
+"RTN","BSDX13",99,0)
+ ;
+"RTN","BSDX13",100,0)
+ ;NOTE: This Subroutine Not called in current version.  Keep code for later use.
+"RTN","BSDX13",101,0)
+ ;
+"RTN","BSDX13",102,0)
+ ;N BSDXS,BSDXID,BSDXHIT,BSDXNOD,BSDXE,BSDXSTART,BSDXEND,BSDXRSID
+"RTN","BSDX13",103,0)
+ ;S BSDXNOD=^BSDXAB(BSDXAVID,0)
+"RTN","BSDX13",104,0)
+ ;S BSDXSTART=$P(BSDXNOD,U,3)
+"RTN","BSDX13",105,0)
+ ;S BSDXEND=$P(BSDXNOD,U,4)
+"RTN","BSDX13",106,0)
+ ;S BSDXRSID=$P(BSDXNOD,U,1)
+"RTN","BSDX13",107,0)
+ ;I '$D(^BSDXDAPRS("ARSRC",BSDXRSID)) Q 0
+"RTN","BSDX13",108,0)
+ ;;If any appointments start at the AV block start time:
+"RTN","BSDX13",109,0)
+ ;I $D(^BSDXDAPRS("ARSRC",BSDXRSID,BSDXSTART)) Q 1
+"RTN","BSDX13",110,0)
+ ;;Find the first appt time BSDXS on the same day as the av block
+"RTN","BSDX13",111,0)
+ ;S BSDXS=$O(^BSDXDAPRS("ARSRC",BSDXRSID,$P(BSDXSTART,".")))
+"RTN","BSDX13",112,0)
+ ;I BSDXS>BSDXEND Q 0
+"RTN","BSDX13",113,0)
+ ;;For all the appts that day with start times less
+"RTN","BSDX13",114,0)
+ ;;than the av block's end time, find any whose end time is
+"RTN","BSDX13",115,0)
+ ;;greater than the av block's start time
+"RTN","BSDX13",116,0)
+ ;S BSDXHIT=0
+"RTN","BSDX13",117,0)
+ ;S BSDXS=BSDXS-.0001
+"RTN","BSDX13",118,0)
+ ;F  S BSDXS=$O(^BSDXDAPRS("ARSRC",BSDXRSID,BSDXS)) Q:'+BSDXS  Q:BSDXS'<BSDXEND  D  Q:BSDXHIT
+"RTN","BSDX13",119,0)
+ ;. S BSDXID=0 F  S BSDXID=$O(^BSDXDAPRS("ARSRC",BSDXRSID,BSDXS,BSDXID)) Q:'+BSDXID  D  Q:BSDXHIT
+"RTN","BSDX13",120,0)
+ ;. . Q:'$D(^BSDXDAPT(BSDXID,0))
+"RTN","BSDX13",121,0)
+ ;. . S BSDXNOD=^BSDXDAPT(BSDXID,0)
+"RTN","BSDX13",122,0)
+ ;. . S BSDXE=$P(BSDXNOD,U,2)
+"RTN","BSDX13",123,0)
+ ;. . I BSDXE>BSDXSTART S BSDXHIT=1 Q
+"RTN","BSDX13",124,0)
+ ;;
+"RTN","BSDX13",125,0)
+ ;I BSDXHIT Q 1
+"RTN","BSDX13",126,0)
+ Q 0
+"RTN","BSDX13",127,0)
+ ;
+"RTN","BSDX13",128,0)
+ ;ERR(ERRNO) ;Error processing
+"RTN","BSDX13",129,0)
+ ;N BSDXERR
+"RTN","BSDX13",130,0)
+ ;S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX13",131,0)
+ ;S BSDXI=BSDXI+1
+"RTN","BSDX13",132,0)
+ ;S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX13",133,0)
+ ;S BSDXI=BSDXI+1
+"RTN","BSDX13",134,0)
+ ;S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX13",135,0)
+ ;Q
+"RTN","BSDX14")
+0^12^B6450810
+"RTN","BSDX14",1,0)
+BSDX14 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX14",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX14",3,0)
+ ;
+"RTN","BSDX14",4,0)
+ ;
+"RTN","BSDX14",5,0)
+ACCTYPD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX14",6,0)
+ ;Entry point for debugging
+"RTN","BSDX14",7,0)
+ ;
+"RTN","BSDX14",8,0)
+ ;D DEBUG^%Serenji("ACCTYP^BSDX14(.BSDXY,BSDXVAL)")
+"RTN","BSDX14",9,0)
+ Q
+"RTN","BSDX14",10,0)
+ ;
+"RTN","BSDX14",11,0)
+ACCTYP(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX14",12,0)
+ ;Called by BSDX ADD/EDIT ACCESS TYPE
+"RTN","BSDX14",13,0)
+ ;Add/Edit ACCESS TYPE entry
+"RTN","BSDX14",14,0)
+ ;BSDXVAL is IEN|NAME|INACTIVE|COLOR|RED|GREEN|BLUE
+"RTN","BSDX14",15,0)
+ ;If IEN=0 Then this is a new ACCTYPE
+"RTN","BSDX14",16,0)
+ ;Test Line:
+"RTN","BSDX14",17,0)
+ ;D ACCTYP^BSDX14(.RES,"0|ORAL HYGIENE|false|Red")
+"RTN","BSDX14",18,0)
+ ;
+"RTN","BSDX14",19,0)
+ S X="ERROR^BSDX14",@^%ZOSF("TRAP")
+"RTN","BSDX14",20,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXNAM
+"RTN","BSDX14",21,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX14",22,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSTYPEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX14",23,0)
+ I BSDXVAL="" D ERR(0,"BSDX14: Invalid null input Parameter") Q
+"RTN","BSDX14",24,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX14",25,0)
+ I +BSDXIEN D
+"RTN","BSDX14",26,0)
+ . S BSDX="EDIT"
+"RTN","BSDX14",27,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX14",28,0)
+ E  D
+"RTN","BSDX14",29,0)
+ . S BSDX="ADD"
+"RTN","BSDX14",30,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX14",31,0)
+ ;
+"RTN","BSDX14",32,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX14",33,0)
+ I BSDXNAM="" D ERR(0,"BSDX14: Invalid null Access Type name.") Q
+"RTN","BSDX14",34,0)
+ ;
+"RTN","BSDX14",35,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX14",36,0)
+ I $D(^BSDXTYPE("B",BSDXNAM)),$O(^BSDXTYPE("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX14",37,0)
+ . D ERR(0,"BSDX14: Cannot have two Access Types with the same name.")
+"RTN","BSDX14",38,0)
+ . Q
+"RTN","BSDX14",39,0)
+ ;
+"RTN","BSDX14",40,0)
+ S BSDXINA=$P(BSDXVAL,"|",3)
+"RTN","BSDX14",41,0)
+ S BSDXINA=$S(BSDXINA="YES":1,1:0)
+"RTN","BSDX14",42,0)
+ ;
+"RTN","BSDX14",43,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.01)=$P(BSDXVAL,"|",2) ;NAME
+"RTN","BSDX14",44,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.02)=BSDXINA ;INACTIVE
+"RTN","BSDX14",45,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.04)=$P(BSDXVAL,"|",4) ;COLOR
+"RTN","BSDX14",46,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.05)=$P(BSDXVAL,"|",5) ;RED
+"RTN","BSDX14",47,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.06)=$P(BSDXVAL,"|",6) ;GREEN
+"RTN","BSDX14",48,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.07)=$P(BSDXVAL,"|",7) ;BLUE
+"RTN","BSDX14",49,0)
+ K BSDXMSG
+"RTN","BSDX14",50,0)
+ I BSDX="ADD" D
+"RTN","BSDX14",51,0)
+ . K BSDXIEN
+"RTN","BSDX14",52,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX14",53,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX14",54,0)
+ E  D
+"RTN","BSDX14",55,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX14",56,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^-1"_$C(30)_$C(31)
+"RTN","BSDX14",57,0)
+ Q
+"RTN","BSDX14",58,0)
+ ;
+"RTN","BSDX14",59,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX14",60,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX14",61,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX14",62,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX14",63,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX14",64,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX14",65,0)
+ Q
+"RTN","BSDX14",66,0)
+ ;
+"RTN","BSDX14",67,0)
+ERROR ;
+"RTN","BSDX14",68,0)
+ D ^%ZTER
+"RTN","BSDX14",69,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX14",70,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX14",71,0)
+ D ERR(0,"BSDX14 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX14",72,0)
+ Q
+"RTN","BSDX15")
+0^13^B5327807
+"RTN","BSDX15",1,0)
+BSDX15 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX15",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX15",3,0)
+ ;
+"RTN","BSDX15",4,0)
+ ;
+"RTN","BSDX15",5,0)
+GRPTYP(BSDXY) ;EP
+"RTN","BSDX15",6,0)
+ ;Called by BSDX GET ACCESS GROUP TYPES
+"RTN","BSDX15",7,0)
+ ;Returns ADO recordset containing ACTIVE Access types ordered alphabetically
+"RTN","BSDX15",8,0)
+ ;by Access Group
+"RTN","BSDX15",9,0)
+ ;AccessGroupID, AccessGroup, AccessTypeID, AccessType
+"RTN","BSDX15",10,0)
+ ;
+"RTN","BSDX15",11,0)
+ ;Test Code:
+"RTN","BSDX15",12,0)
+ ;D GRPTYP^BSDX15(.RES) ZW RES
+"RTN","BSDX15",13,0)
+ ;
+"RTN","BSDX15",14,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX15",15,0)
+ N BSDX1
+"RTN","BSDX15",16,0)
+ S BSDXI=0
+"RTN","BSDX15",17,0)
+ S X="ETRAP^BSDX15",@^%ZOSF("TRAP")
+"RTN","BSDX15",18,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ACCESS_GROUP_TYPEID^I00020ACCESS_GROUP_ID^T00030ACCESS_GROUP^I00020ACCESS_TYPE_ID^T00030ACCESS_TYPE"_$C(30)
+"RTN","BSDX15",19,0)
+ ;
+"RTN","BSDX15",20,0)
+ ;N BSDX0,BSDX1,BSDXNOD,BSDXGPN,BSDXTN
+"RTN","BSDX15",21,0)
+ ;$O Through "B" x-ref of BSDX ACCESS GROUP file
+"RTN","BSDX15",22,0)
+ ;S BSDXGPN=0 F  S BSDXGPN=$O(^BSDXAGP("B",BSDXGPN)) Q:BSDXGPN=""  D
+"RTN","BSDX15",23,0)
+ ;. S BSDX0=$O(^BSDXAGP("B",BSDXGPN,0))
+"RTN","BSDX15",24,0)
+ ;. Q:'+BSDX0
+"RTN","BSDX15",25,0)
+ ;. Q:'$D(^BSDXAGP(BSDX0,0))  ;INDEX VALIDITY CHECK
+"RTN","BSDX15",26,0)
+ ;. Q:'$D(^BSDXAGTP("B",BSDX0))
+"RTN","BSDX15",27,0)
+ ;. ;$O through "B" x-ref of BSDX ACCESS GROUP TYPE
+"RTN","BSDX15",28,0)
+ ;. S BSDX1=0 F  S BSDX1=$O(^BSDXAGTP("B",BSDX0,BSDX1)) Q:'+BSDX1  D
+"RTN","BSDX15",29,0)
+ ;. . Q:'$D(^BSDXAGTP(BSDX1,0))
+"RTN","BSDX15",30,0)
+ ;. . S BSDX2=$P(^BSDXAGTP(BSDX1,0),U,2)
+"RTN","BSDX15",31,0)
+ ;. . Q:'+BSDX2
+"RTN","BSDX15",32,0)
+ ;. . Q:'$D(^BSDXTYPE(BSDX2,0))
+"RTN","BSDX15",33,0)
+ ;. . S BSDXNOD=^BSDXTYPE(BSDX2,0)
+"RTN","BSDX15",34,0)
+ ;. . Q:$P(BSDXNOD,U,2)=1  ;INACTIVE
+"RTN","BSDX15",35,0)
+ ;. . S BSDXTN=$P(BSDXNOD,U)
+"RTN","BSDX15",36,0)
+ ;. . S BSDXI=BSDXI+1
+"RTN","BSDX15",37,0)
+ ;. . S ^BSDXTMP($J,BSDXI)=BSDX1_U_BSDX0_U_BSDXGPN_U_BSDX2_U_BSDXTN_$C(30)
+"RTN","BSDX15",38,0)
+ ;. . Q
+"RTN","BSDX15",39,0)
+ ;. Q
+"RTN","BSDX15",40,0)
+ ;
+"RTN","BSDX15",41,0)
+ ;$O Through "AC" x-ref of BSDX ACCESS GROUP TYPE file
+"RTN","BSDX15",42,0)
+ N BSDXAGID,BSDXAGN,BSDXATID,BSDXATN,BSDXAGTID
+"RTN","BSDX15",43,0)
+ S BSDXAGID=0
+"RTN","BSDX15",44,0)
+ F  S BSDXAGID=$O(^BSDXAGTP("AC",BSDXAGID)) Q:'+BSDXAGID  D
+"RTN","BSDX15",45,0)
+ . I '$D(^BSDXAGP(BSDXAGID,0)) Q
+"RTN","BSDX15",46,0)
+ . S BSDXAGN=$P(^BSDXAGP(BSDXAGID,0),U)
+"RTN","BSDX15",47,0)
+ . S BSDXATID=0 F  S BSDXATID=$O(^BSDXAGTP("AC",BSDXAGID,BSDXATID)) Q:'+BSDXATID  D
+"RTN","BSDX15",48,0)
+ . . S BSDXNOD=$G(^BSDXTYPE(BSDXATID,0))
+"RTN","BSDX15",49,0)
+ . . I BSDXNOD="" Q
+"RTN","BSDX15",50,0)
+ . . I $P(BSDXNOD,U,2)=1 Q  ;Inactive
+"RTN","BSDX15",51,0)
+ . . S BSDXATN=$P(BSDXNOD,U)
+"RTN","BSDX15",52,0)
+ . . S BSDXAGTID=$O(^BSDXAGTP("AC",BSDXAGID,BSDXATID,0))
+"RTN","BSDX15",53,0)
+ . . I '+BSDXAGTID Q
+"RTN","BSDX15",54,0)
+ . . I '$D(^BSDXAGTP(BSDXAGTID,0)) Q
+"RTN","BSDX15",55,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX15",56,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXAGTID_U_BSDXAGID_U_BSDXAGN_U_BSDXATID_U_BSDXATN_$C(30)
+"RTN","BSDX15",57,0)
+ . . Q
+"RTN","BSDX15",58,0)
+ . Q
+"RTN","BSDX15",59,0)
+ ;
+"RTN","BSDX15",60,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",61,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX15",62,0)
+ Q
+"RTN","BSDX15",63,0)
+ ;
+"RTN","BSDX15",64,0)
+ERR(BSDXI,BSDXID,BSDXERR) ;Error processing
+"RTN","BSDX15",65,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",66,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_"^^^^"_$C(30)
+"RTN","BSDX15",67,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",68,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX15",69,0)
+ Q
+"RTN","BSDX15",70,0)
+ ;
+"RTN","BSDX15",71,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX15",72,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX15",73,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",74,0)
+ D ERR(BSDXI,99,70)
+"RTN","BSDX15",75,0)
+ Q
+"RTN","BSDX16")
+0^14^B11948965
+"RTN","BSDX16",1,0)
+BSDX16 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 
+"RTN","BSDX16",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX16",3,0)
+ ;
+"RTN","BSDX16",4,0)
+ ;
+"RTN","BSDX16",5,0)
+RSRCD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX16",6,0)
+ ;Entry point for debugging
+"RTN","BSDX16",7,0)
+ ;
+"RTN","BSDX16",8,0)
+ ;D DEBUG^%Serenji("RSRC^BSDX16(.BSDXY,BSDXVAL)")
+"RTN","BSDX16",9,0)
+ Q
+"RTN","BSDX16",10,0)
+ ;
+"RTN","BSDX16",11,0)
+RSRC(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX16",12,0)
+ ;
+"RTN","BSDX16",13,0)
+ ;Called by BSDX ADD/EDIT RESOURCE
+"RTN","BSDX16",14,0)
+ ;Add/Edit BSDX RESOURCE entry
+"RTN","BSDX16",15,0)
+ ;BSDXVAL is sResourceID|sResourceName|sInactive|sHospLocID|TIME_SCALE|LETTER_TEXT|NO_SHOW_LETTER|CANCELLATION_LETTER
+"RTN","BSDX16",16,0)
+ ;If IEN=0 Then this is a new Resource
+"RTN","BSDX16",17,0)
+ ;Test Line:
+"RTN","BSDX16",18,0)
+ ;D RSRC^BSDX16(.RES,"sResourceID|sResourceName|sInactive|sHospLocID")
+"RTN","BSDX16",19,0)
+ ;
+"RTN","BSDX16",20,0)
+ S X="ERROR^BSDX16",@^%ZOSF("TRAP")
+"RTN","BSDX16",21,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXINA,BSDXNOTE,BSDXNAM
+"RTN","BSDX16",22,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX16",23,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX16",24,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX16",25,0)
+ ; Changed following from a $G = "" to $D check: $G didn't work since BSDXVAL is an array. MJL 10/18/2006
+"RTN","BSDX16",26,0)
+ I BSDXVAL="",$D(BSDXVAL)<2 D ERR(0,"BSDX16: Invalid null input Parameter") Q
+"RTN","BSDX16",27,0)
+ ;Unpack array at @XWBARY
+"RTN","BSDX16",28,0)
+ I BSDXVAL="" D
+"RTN","BSDX16",29,0)
+ . N BSDXC S BSDXC=0 F  S BSDXC=$O(BSDXVAL(BSDXC)) Q:'BSDXC  D
+"RTN","BSDX16",30,0)
+ . . S BSDXVAL=BSDXVAL_BSDXVAL(BSDXC)
+"RTN","BSDX16",31,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX16",32,0)
+ I +BSDXIEN D
+"RTN","BSDX16",33,0)
+ . S BSDX="EDIT"
+"RTN","BSDX16",34,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX16",35,0)
+ E  D
+"RTN","BSDX16",36,0)
+ . S BSDX="ADD"
+"RTN","BSDX16",37,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX16",38,0)
+ ;
+"RTN","BSDX16",39,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX16",40,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX16",41,0)
+ I $D(^BSDXRES("B",BSDXNAM)),$O(^BSDXRES("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX16",42,0)
+ . D ERR(0,"BSDX16: Cannot have two Resources with the same name.")
+"RTN","BSDX16",43,0)
+ . Q
+"RTN","BSDX16",44,0)
+ ;
+"RTN","BSDX16",45,0)
+ S BSDXINA=$P(BSDXVAL,"|",3)
+"RTN","BSDX16",46,0)
+ S BSDXINA=$S(BSDXINA="YES":1,1:0)
+"RTN","BSDX16",47,0)
+ ;
+"RTN","BSDX16",48,0)
+ S BSDXFDA(9002018.1,BSDXIENS,.01)=$P(BSDXVAL,"|",2) ;NAME
+"RTN","BSDX16",49,0)
+ S BSDXFDA(9002018.1,BSDXIENS,.02)=BSDXINA ;INACTIVE
+"RTN","BSDX16",50,0)
+ I +$P(BSDXVAL,"|",5) S BSDXFDA(9002018.1,BSDXIENS,.03)=+$P(BSDXVAL,"|",5) ;TIME SCALE
+"RTN","BSDX16",51,0)
+ I +$P(BSDXVAL,"|",4) S BSDXFDA(9002018.1,BSDXIENS,.04)=$P(BSDXVAL,"|",4) ;HOSPITAL LOCATION
+"RTN","BSDX16",52,0)
+ K BSDXMSG
+"RTN","BSDX16",53,0)
+ I BSDX="ADD" D  ;TODO: Check for error
+"RTN","BSDX16",54,0)
+ . K BSDXIEN
+"RTN","BSDX16",55,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX16",56,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX16",57,0)
+ E  D
+"RTN","BSDX16",58,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX16",59,0)
+ ;
+"RTN","BSDX16",60,0)
+ ;LETTER TEXT wp field
+"RTN","BSDX16",61,0)
+ S BSDXNOTE=$P(BSDXVAL,"|",6)
+"RTN","BSDX16",62,0)
+ ;
+"RTN","BSDX16",63,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX16",64,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX16",65,0)
+ ;
+"RTN","BSDX16",66,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX16",67,0)
+ . D WP^DIE(9002018.1,BSDXIEN_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX16",68,0)
+ ;
+"RTN","BSDX16",69,0)
+ ;NO SHOW LETTER wp fields
+"RTN","BSDX16",70,0)
+ K BSDXNOTE
+"RTN","BSDX16",71,0)
+ S BSDXNOTE=$P(BSDXVAL,"|",7)
+"RTN","BSDX16",72,0)
+ ;
+"RTN","BSDX16",73,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX16",74,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX16",75,0)
+ ;
+"RTN","BSDX16",76,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX16",77,0)
+ . D WP^DIE(9002018.1,BSDXIEN_",",1201,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX16",78,0)
+ ;
+"RTN","BSDX16",79,0)
+ ;CANCELLATION LETTER wp field
+"RTN","BSDX16",80,0)
+ K BSDXNOTE
+"RTN","BSDX16",81,0)
+ S BSDXNOTE=$P(BSDXVAL,"|",8)
+"RTN","BSDX16",82,0)
+ ;
+"RTN","BSDX16",83,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX16",84,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX16",85,0)
+ ;
+"RTN","BSDX16",86,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX16",87,0)
+ . D WP^DIE(9002018.1,BSDXIEN_",",1301,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX16",88,0)
+ ;
+"RTN","BSDX16",89,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^"_$C(30)_$C(31)
+"RTN","BSDX16",90,0)
+ Q
+"RTN","BSDX16",91,0)
+ ;
+"RTN","BSDX16",92,0)
+ERROR ;
+"RTN","BSDX16",93,0)
+ D ^%ZTER
+"RTN","BSDX16",94,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX16",95,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX16",96,0)
+ D ERR(0,"BSDX16 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX16",97,0)
+ Q
+"RTN","BSDX16",98,0)
+ ;
+"RTN","BSDX16",99,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX16",100,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX16",101,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX16",102,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX16",103,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX16",104,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX16",105,0)
+ Q
+"RTN","BSDX17")
+0^15^B2072173
+"RTN","BSDX17",1,0)
+BSDX17 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX17",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX17",3,0)
+ ;
+"RTN","BSDX17",4,0)
+ ;
+"RTN","BSDX17",5,0)
+SCHUSRD(BSDXY) ;EP
+"RTN","BSDX17",6,0)
+ ;Entry point for debugging
+"RTN","BSDX17",7,0)
+ ;
+"RTN","BSDX17",8,0)
+ ;D DEBUG^%Serenji("SCHUSR^BSDX17(.BSDXY)")
+"RTN","BSDX17",9,0)
+ Q
+"RTN","BSDX17",10,0)
+ ;
+"RTN","BSDX17",11,0)
+SCHUSR(BSDXY) ;EP
+"RTN","BSDX17",12,0)
+ ;Return recordset of all users in NEW PERSON having BSDXZMENU key
+"RTN","BSDX17",13,0)
+ ;Called by BSDX SCHEDULE USER
+"RTN","BSDX17",14,0)
+ ;Test Line:
+"RTN","BSDX17",15,0)
+ ;D SCHUSR^BSDX17(.RES)
+"RTN","BSDX17",16,0)
+ ;
+"RTN","BSDX17",17,0)
+ N BSDXDUZ,BSDXKEY,BSDXI,BSDXNAM,BSDXKEYN
+"RTN","BSDX17",18,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX17",19,0)
+ K ^TEMP($J,"BSDX17")
+"RTN","BSDX17",20,0)
+ S BSDXI=0
+"RTN","BSDX17",21,0)
+ S ^BSDXTMP($J,0)="I00020USERID^T00030USERNAME"_$C(30)
+"RTN","BSDX17",22,0)
+ ;$O Through ^VA(200,"AB",
+"RTN","BSDX17",23,0)
+ F BSDXKEYN="BSDXZMENU","BSDXZMGR","XUPROGMODE" S BSDXKEY=+$O(^DIC(19.1,"B",BSDXKEYN,0)) D
+"RTN","BSDX17",24,0)
+ . Q:'+BSDXKEY  S BSDXDUZ=0 F  S BSDXDUZ=$O(^VA(200,"AB",BSDXKEY,BSDXDUZ)) Q:'+BSDXDUZ  D
+"RTN","BSDX17",25,0)
+ . . Q:BSDXDUZ<1  ;IHS/HMW **1**
+"RTN","BSDX17",26,0)
+ . . Q:'$D(^VA(200,BSDXDUZ,0))
+"RTN","BSDX17",27,0)
+ . . Q:$D(^TEMP($J,"BSDX17",BSDXDUZ))
+"RTN","BSDX17",28,0)
+ . . S BSDXNAM=$P(^VA(200,BSDXDUZ,0),U)
+"RTN","BSDX17",29,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX17",30,0)
+ . . S ^TEMP($J,"BSDX17",BSDXDUZ)=""
+"RTN","BSDX17",31,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXDUZ_"^"_BSDXNAM_$C(30)
+"RTN","BSDX17",32,0)
+ . . Q
+"RTN","BSDX17",33,0)
+ . Q
+"RTN","BSDX17",34,0)
+ ;
+"RTN","BSDX17",35,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX17",36,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX17",37,0)
+ Q
+"RTN","BSDX18")
+0^16^B87953431
+"RTN","BSDX18",1,0)
+BSDX18 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX18",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX18",3,0)
+ ;
+"RTN","BSDX18",4,0)
+ ;
+"RTN","BSDX18",5,0)
+DELRUD(BSDXY,BSDXIEN) ;EP
+"RTN","BSDX18",6,0)
+ ;Entry point for debugging
+"RTN","BSDX18",7,0)
+ ;
+"RTN","BSDX18",8,0)
+ ;D DEBUG^%Serenji("DELRU^BSDX18(.BSDXY,BSDXIEN)")
+"RTN","BSDX18",9,0)
+ Q
+"RTN","BSDX18",10,0)
+ ;
+"RTN","BSDX18",11,0)
+DELRU(BSDXY,BSDXIEN) ;EP
+"RTN","BSDX18",12,0)
+ ;Deletes entry BSDXIEN from RESOURCE USERS file
+"RTN","BSDX18",13,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX18",14,0)
+ ;Called by BSDX DELETE RESOURCEUSER
+"RTN","BSDX18",15,0)
+ ;Test Line:
+"RTN","BSDX18",16,0)
+ ;D DELRU^BSDX18(.RES,99)
+"RTN","BSDX18",17,0)
+ ;
+"RTN","BSDX18",18,0)
+ N BSDXI,DIK,DA
+"RTN","BSDX18",19,0)
+ S BSDXI=0
+"RTN","BSDX18",20,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX18",21,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEUSERID^I00020ERRORID"_$C(30)
+"RTN","BSDX18",22,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",23,0)
+ I '$D(^BSDXRSU(BSDXIEN,0)) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",24,0)
+ ;Delete entry BSDXIEN
+"RTN","BSDX18",25,0)
+ S DIK="^BSDXRSU("
+"RTN","BSDX18",26,0)
+ S DA=BSDXIEN
+"RTN","BSDX18",27,0)
+ D ^DIK
+"RTN","BSDX18",28,0)
+ ;
+"RTN","BSDX18",29,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX18",30,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX18",31,0)
+ Q
+"RTN","BSDX18",32,0)
+ ;
+"RTN","BSDX18",33,0)
+ADDRUD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX18",34,0)
+ ;Entry point for debugging
+"RTN","BSDX18",35,0)
+ ;
+"RTN","BSDX18",36,0)
+ ;D DEBUG^%Serenji("ADDRU^BSDX18(.BSDXY,BSDXVAL)")
+"RTN","BSDX18",37,0)
+ Q
+"RTN","BSDX18",38,0)
+ ;
+"RTN","BSDX18",39,0)
+ADDRU(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX18",40,0)
+ ;
+"RTN","BSDX18",41,0)
+ ;Called by BSDX ADD/EDIT RESOURCEUSER
+"RTN","BSDX18",42,0)
+ ;Add/Edit BSDX RESOURCEUSER entry
+"RTN","BSDX18",43,0)
+ ;BSDXVAL is sResourceUserID|sOverbook|sModifySchedule|ResourceID|UserID|sModifyAppointments
+"RTN","BSDX18",44,0)
+ ;If IEN=0 Then this is a new ResourceUser entry
+"RTN","BSDX18",45,0)
+ ;Test Line:
+"RTN","BSDX18",46,0)
+ ;D ADDRU^BSDX18(.RES,"sResourceUserID|sOverbook|sModifySchedule|sResourceID|sUserID|sModifyAppointments")
+"RTN","BSDX18",47,0)
+ ;
+"RTN","BSDX18",48,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXOVB,BSDXMOD,BSDXI,BSDXUID,BSDXRID
+"RTN","BSDX18",49,0)
+ N BSDXRES,BSDXRSU,BSDXF,BSDXAPPT
+"RTN","BSDX18",50,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX18",51,0)
+ S BSDXI=0
+"RTN","BSDX18",52,0)
+ S ^BSDXTMP($J,BSDXI)="I00020RESOURCEID^I00020ERRORID"_$C(30)
+"RTN","BSDX18",53,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX18",54,0)
+ I +BSDXIEN D
+"RTN","BSDX18",55,0)
+ . S BSDX="EDIT"
+"RTN","BSDX18",56,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",57,0)
+ E  D
+"RTN","BSDX18",58,0)
+ . S BSDX="ADD"
+"RTN","BSDX18",59,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX18",60,0)
+ ;
+"RTN","BSDX18",61,0)
+ I '+$P(BSDXVAL,"|",4) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",62,0)
+ I '+$P(BSDXVAL,"|",5) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",63,0)
+ ;
+"RTN","BSDX18",64,0)
+ S BSDXRID=$P(BSDXVAL,"|",4) ;ResourceID
+"RTN","BSDX18",65,0)
+ S BSDXUID=$P(BSDXVAL,"|",5) ;UserID
+"RTN","BSDX18",66,0)
+ S BSDXRSU=0 ;ResourceUserID
+"RTN","BSDX18",67,0)
+ S BSDXF=0 ;flag
+"RTN","BSDX18",68,0)
+ ;If this is an add, check if the user is already assigned to the resource.
+"RTN","BSDX18",69,0)
+ ;If so, then change to an edit
+"RTN","BSDX18",70,0)
+ I BSDX="ADD" F  S BSDXRSU=$O(^BSDXRSU("AC",BSDXUID,BSDXRSU)) Q:'+BSDXRSU  D  Q:BSDXF
+"RTN","BSDX18",71,0)
+ . S BSDXRES=$G(^BSDXRSU(BSDXRSU,0))
+"RTN","BSDX18",72,0)
+ . S BSDXRES=$P(BSDXRES,U) ;ResourceID
+"RTN","BSDX18",73,0)
+ . S:BSDXRES=BSDXRID BSDXF=1
+"RTN","BSDX18",74,0)
+ I BSDXF S BSDX="EDIT",BSDXIEN=BSDXRSU,BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",75,0)
+ ;
+"RTN","BSDX18",76,0)
+ S BSDXOVB=$P(BSDXVAL,"|",2)
+"RTN","BSDX18",77,0)
+ S BSDXOVB=$S(BSDXOVB="YES":1,1:0)
+"RTN","BSDX18",78,0)
+ S BSDXMOD=$P(BSDXVAL,"|",3)
+"RTN","BSDX18",79,0)
+ S BSDXMOD=$S(BSDXMOD="YES":1,1:0)
+"RTN","BSDX18",80,0)
+ S BSDXAPPT=$P(BSDXVAL,"|",6)
+"RTN","BSDX18",81,0)
+ S BSDXAPPT=$S(BSDXAPPT="YES":1,1:0)
+"RTN","BSDX18",82,0)
+ ;
+"RTN","BSDX18",83,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.01)=$P(BSDXVAL,"|",4) ;RESOURCE ID
+"RTN","BSDX18",84,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.02)=$P(BSDXVAL,"|",5) ;USERID
+"RTN","BSDX18",85,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.03)=BSDXOVB ;OVERBOOK
+"RTN","BSDX18",86,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.04)=BSDXMOD ;MODIFY SCHEDULE
+"RTN","BSDX18",87,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.05)=BSDXAPPT ;ADD, EDIT, DELETE APPOINMENTS
+"RTN","BSDX18",88,0)
+ K BSDXMSG
+"RTN","BSDX18",89,0)
+ I BSDX="ADD" D
+"RTN","BSDX18",90,0)
+ . K BSDXIEN
+"RTN","BSDX18",91,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX18",92,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX18",93,0)
+ E  D
+"RTN","BSDX18",94,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX18",95,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^-1"_$C(31)
+"RTN","BSDX18",96,0)
+ Q
+"RTN","BSDX18",97,0)
+ ;
+"RTN","BSDX18",98,0)
+ERR(BSDXI,BSDXID,BSDXERR) ;Error processing
+"RTN","BSDX18",99,0)
+ S BSDXERR=BSDXERR+134234112 ;vbObjectError
+"RTN","BSDX18",100,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX18",101,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXID_"^"_BSDXERR_$C(30)
+"RTN","BSDX18",102,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX18",103,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX18",104,0)
+ Q
+"RTN","BSDX18",105,0)
+ ;
+"RTN","BSDX18",106,0)
+MADERR(BSDXMSG) ;
+"RTN","BSDX18",107,0)
+ W !,BSDXMSG
+"RTN","BSDX18",108,0)
+ Q
+"RTN","BSDX18",109,0)
+ ;
+"RTN","BSDX18",110,0)
+MADSCR(BSDXDUZ,BSDXZMGR,BSDXZMENU,BSDXZPROG) ;EP - File 200 screening code for MADDRU
+"RTN","BSDX18",111,0)
+ ;Called from DIR to screen for scheduling users
+"RTN","BSDX18",112,0)
+ I $D(^VA(200,BSDXDUZ,51,"B",BSDXZMENU)) Q 1
+"RTN","BSDX18",113,0)
+ I $D(^VA(200,BSDXDUZ,51,"B",BSDXZMGR)) Q 1
+"RTN","BSDX18",114,0)
+ I $D(^VA(200,BSDXDUZ,51,"B",BSDXZPROG)) Q 1
+"RTN","BSDX18",115,0)
+ Q 0
+"RTN","BSDX18",116,0)
+ ;
+"RTN","BSDX18",117,0)
+MADDRU ;EP -Command line utility to bulk-add users and set access rights IHS/HMW 20060420 **1**
+"RTN","BSDX18",118,0)
+ ;Main entry point
+"RTN","BSDX18",119,0)
+ ;
+"RTN","BSDX18",120,0)
+ N BSDX,BSDXZMENU,BSDXZMGR,BSDXZPROG,DIR
+"RTN","BSDX18",121,0)
+ ;
+"RTN","BSDX18",122,0)
+ ;INIT
+"RTN","BSDX18",123,0)
+ K ^TMP($J)
+"RTN","BSDX18",124,0)
+ S BSDXZMENU=$O(^DIC(19.1,"B","BSDXZMENU",0)) I '+BSDXZMENU D MADERR("Error: BSDXZMENU KEY NOT FOUND.") Q
+"RTN","BSDX18",125,0)
+ S BSDXZMGR=$O(^DIC(19.1,"B","BSDXZMGR",0)) I '+BSDXZMGR D MADERR("Error: BSDXZMGR KEY NOT FOUND.") Q
+"RTN","BSDX18",126,0)
+ S BSDXZPROG=$O(^DIC(19.1,"B","XUPROGMODE",0)) I '+BSDXZPROG D MADERR("Error: XUPROGMODE KEY NOT FOUND.") Q
+"RTN","BSDX18",127,0)
+ ;
+"RTN","BSDX18",128,0)
+ D MADUSR
+"RTN","BSDX18",129,0)
+ I '$D(^TMP($J,"BSDX MADDRU","USER")) D MADERR("Cancelled:  No Users selected.") Q
+"RTN","BSDX18",130,0)
+ D MADRES
+"RTN","BSDX18",131,0)
+ I '$D(^TMP($J,"BSDX MADDRU","RESOURCE")) D MADERR("Cancelled:  No Resources selected.") Q
+"RTN","BSDX18",132,0)
+ I '$$MADACC(.BSDX) ;D MADERR("Selected users will have no access to the selected clinics.")
+"RTN","BSDX18",133,0)
+ I '$$MADCONF(.BSDX) W ! D MADERR("--Cancelled") Q
+"RTN","BSDX18",134,0)
+ D MADASS(.BSDX)
+"RTN","BSDX18",135,0)
+ W ! D MADERR("--Done")
+"RTN","BSDX18",136,0)
+ ;
+"RTN","BSDX18",137,0)
+ Q
+"RTN","BSDX18",138,0)
+ ;
+"RTN","BSDX18",139,0)
+MADUSR ;Prompt for users from file 200 who have BSDXUSER key
+"RTN","BSDX18",140,0)
+ ;Store results in ^TMP($J,"BSDX MADDRU","USER",DUZ) array
+"RTN","BSDX18",141,0)
+ N DIRUT,Y,DIR
+"RTN","BSDX18",142,0)
+ S DIR(0)="PO^200:EMZ",DIR("S")="I $$MADSCR^BSDX18(Y,BSDXZMGR,BSDXZMENU,BSDXZPROG)"
+"RTN","BSDX18",143,0)
+ S Y=0
+"RTN","BSDX18",144,0)
+ K ^TMP($J,"BSDX MADDRU","USER")
+"RTN","BSDX18",145,0)
+ W !!,"-------Select Users-------"
+"RTN","BSDX18",146,0)
+ F  D ^DIR Q:$G(DIRUT)  Q:'Y  D
+"RTN","BSDX18",147,0)
+ . S ^TMP($J,"BSDX MADDRU","USER",+Y)=""
+"RTN","BSDX18",148,0)
+ Q
+"RTN","BSDX18",149,0)
+ ;
+"RTN","BSDX18",150,0)
+MADRES ;Prompt for Resources
+"RTN","BSDX18",151,0)
+ ;Store results in ^TMP($J,"BSDX MADDRU","RESOURCE",ResourceID) array
+"RTN","BSDX18",152,0)
+ N DIRUT,Y,DIR
+"RTN","BSDX18",153,0)
+ S DIR(0)="PO^9002018.1:EMZ"
+"RTN","BSDX18",154,0)
+ S Y=0
+"RTN","BSDX18",155,0)
+ K ^TMP($J,"BSDX MADDRU","RESOURCE")
+"RTN","BSDX18",156,0)
+ W !!,"-------Select Resources-------"
+"RTN","BSDX18",157,0)
+ F  D ^DIR Q:$G(DIRUT)  Q:'Y  D
+"RTN","BSDX18",158,0)
+ . S ^TMP($J,"BSDX MADDRU","RESOURCE",+Y)=""
+"RTN","BSDX18",159,0)
+ Q
+"RTN","BSDX18",160,0)
+ ;
+"RTN","BSDX18",161,0)
+MADACC(BSDX) ;Prompt for access level.
+"RTN","BSDX18",162,0)
+ ;Start with Overbook and go to read-only access.
+"RTN","BSDX18",163,0)
+ ;Store results in variables for:
+"RTN","BSDX18",164,0)
+ ;sOverbook, sModifySchedule, sModifyAppointments
+"RTN","BSDX18",165,0)
+ ;
+"RTN","BSDX18",166,0)
+ N DIRUT,Y,DIR,J
+"RTN","BSDX18",167,0)
+ W !!,"-------Select Access Level-------"
+"RTN","BSDX18",168,0)
+ S Y=0
+"RTN","BSDX18",169,0)
+ F J="MODIFY","OVERBOOK","WRITE","READ" S BSDX(J)=1
+"RTN","BSDX18",170,0)
+ S DIR(0)="Y"
+"RTN","BSDX18",171,0)
+ ;
+"RTN","BSDX18",172,0)
+ S DIR("A")="Allow users to Modify Clinic Availability"
+"RTN","BSDX18",173,0)
+ D ^DIR
+"RTN","BSDX18",174,0)
+ Q:$G(DIRUT) 0
+"RTN","BSDX18",175,0)
+ Q:Y 1
+"RTN","BSDX18",176,0)
+ S BSDX("MODIFY")=0
+"RTN","BSDX18",177,0)
+ ;
+"RTN","BSDX18",178,0)
+ S DIR("A")="Allow users to Overbook the selected clinics"
+"RTN","BSDX18",179,0)
+ D ^DIR
+"RTN","BSDX18",180,0)
+ Q:$G(DIRUT) 0
+"RTN","BSDX18",181,0)
+ Q:Y 1
+"RTN","BSDX18",182,0)
+ S BSDX("OVERBOOK")=0
+"RTN","BSDX18",183,0)
+ ;
+"RTN","BSDX18",184,0)
+ S DIR("A")="Allow users to Add, Edit and Delete appointments in the selected resources"
+"RTN","BSDX18",185,0)
+ D ^DIR
+"RTN","BSDX18",186,0)
+ Q:$G(DIRUT)
+"RTN","BSDX18",187,0)
+ Q:Y 1
+"RTN","BSDX18",188,0)
+ S BSDX("WRITE")=0
+"RTN","BSDX18",189,0)
+ ;
+"RTN","BSDX18",190,0)
+ S DIR("A")="Allow users to View appointments in the selected resources"
+"RTN","BSDX18",191,0)
+ D ^DIR
+"RTN","BSDX18",192,0)
+ Q:$G(DIRUT)
+"RTN","BSDX18",193,0)
+ Q:Y 1
+"RTN","BSDX18",194,0)
+ S BSDX("READ")=0
+"RTN","BSDX18",195,0)
+ ;
+"RTN","BSDX18",196,0)
+ Q 0
+"RTN","BSDX18",197,0)
+ ;
+"RTN","BSDX18",198,0)
+MADCONF(BSDX) ;Confirm selections
+"RTN","BSDX18",199,0)
+ N DIR,DIRUT,Y
+"RTN","BSDX18",200,0)
+ S DIR(0)="Y"
+"RTN","BSDX18",201,0)
+ W !!,"-------Confirm Selections-------"
+"RTN","BSDX18",202,0)
+ I BSDX("READ")=0 D
+"RTN","BSDX18",203,0)
+ . S DIR("A")="Are you sure you want to remove all access to these clinics for these users"
+"RTN","BSDX18",204,0)
+ E  D
+"RTN","BSDX18",205,0)
+ . W !,"Selected users will be assigned the following access:"
+"RTN","BSDX18",206,0)
+ . W !,"Modify clinic availability:  ",?50,BSDX("MODIFY")
+"RTN","BSDX18",207,0)
+ . W !,"Overbook Appointments:  ",?50,BSDX("OVERBOOK")
+"RTN","BSDX18",208,0)
+ . W !,"Add, Edit and Delete Appointments:  ",?50,BSDX("WRITE")
+"RTN","BSDX18",209,0)
+ . W !,"View Clinic Appointments:  ",?50,BSDX("READ")
+"RTN","BSDX18",210,0)
+ . S DIR("A")="Are you sure you want to assign these access rights to the selected users"
+"RTN","BSDX18",211,0)
+ D ^DIR
+"RTN","BSDX18",212,0)
+ Q:$G(DIRUT) 0
+"RTN","BSDX18",213,0)
+ Q:$G(Y) 1
+"RTN","BSDX18",214,0)
+ Q 0
+"RTN","BSDX18",215,0)
+ ;
+"RTN","BSDX18",216,0)
+MADASS(BSDX) ;
+"RTN","BSDX18",217,0)
+ ;Assign access level to selected users and resources
+"RTN","BSDX18",218,0)
+ ;Loop through selected users
+"RTN","BSDX18",219,0)
+ ;. Loop through selected resources
+"RTN","BSDX18",220,0)
+ ; . . If an entry in ^BSDXRSU for this user/resource combination exists, then
+"RTN","BSDX18",221,0)
+ ; . . . S sResourceUserID = to it
+"RTN","BSDX18",222,0)
+ ; . . Else
+"RTN","BSDX18",223,0)
+ ; . . . S sResourceUserID = 0
+"RTN","BSDX18",224,0)
+ ; . . Call MADFILE
+"RTN","BSDX18",225,0)
+ N BSDXU,BSDXR,BSDXRUID,BSDXVAL
+"RTN","BSDX18",226,0)
+ S BSDXU=0
+"RTN","BSDX18",227,0)
+ F  S BSDXU=$O(^TMP($J,"BSDX MADDRU","USER",BSDXU)) Q:'+BSDXU  D
+"RTN","BSDX18",228,0)
+ . S BSDXR=0 F  S BSDXR=$O(^TMP($J,"BSDX MADDRU","RESOURCE",BSDXR)) Q:'+BSDXR  D
+"RTN","BSDX18",229,0)
+ . . S BSDXRUID=$$MADEXST(BSDXU,BSDXR)
+"RTN","BSDX18",230,0)
+ . . S BSDXVAL=BSDXRUID_"|"_BSDX("OVERBOOK")_"|"_BSDX("MODIFY")_"|"_BSDXR_"|"_BSDXU_"|"_BSDX("WRITE")
+"RTN","BSDX18",231,0)
+ . . I +BSDXRUID,BSDX("READ")=0 D MADDEL(BSDXRUID)
+"RTN","BSDX18",232,0)
+ . . Q:BSDX("READ")=0
+"RTN","BSDX18",233,0)
+ . . D MADFILE(BSDXVAL)
+"RTN","BSDX18",234,0)
+ . . Q
+"RTN","BSDX18",235,0)
+ . Q
+"RTN","BSDX18",236,0)
+ Q
+"RTN","BSDX18",237,0)
+ ;
+"RTN","BSDX18",238,0)
+MADDEL(BSDXRUID) ;
+"RTN","BSDX18",239,0)
+ ;Delete entry BSDXRUID from BSDX RESOURCE USER file
+"RTN","BSDX18",240,0)
+ N DIK,DA
+"RTN","BSDX18",241,0)
+ Q:'+BSDXRUID
+"RTN","BSDX18",242,0)
+ Q:'$D(^BSDXRSU(BSDXRUID))
+"RTN","BSDX18",243,0)
+ S DIK="^BSDXRSU("
+"RTN","BSDX18",244,0)
+ S DA=BSDXRUID
+"RTN","BSDX18",245,0)
+ D ^DIK
+"RTN","BSDX18",246,0)
+ Q
+"RTN","BSDX18",247,0)
+ ;
+"RTN","BSDX18",248,0)
+MADFILE(BSDXVAL) ;
+"RTN","BSDX18",249,0)
+ ;
+"RTN","BSDX18",250,0)
+ ;Add/Edit BSDX RESOURCEUSER entry
+"RTN","BSDX18",251,0)
+ ;BSDXVAL is sResourceUserID|sOverbook|sModifySchedule|ResourceID|UserID|sModifyAppointments
+"RTN","BSDX18",252,0)
+ ;If sResourceUserID=0 Then this is a new ResourceUser entry
+"RTN","BSDX18",253,0)
+ ;
+"RTN","BSDX18",254,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXOVB,BSDXMOD,BSDXI,BSDXUID,BSDXRID
+"RTN","BSDX18",255,0)
+ N BSDXRES,BSDXRSU,BSDXF,BSDXAPPT
+"RTN","BSDX18",256,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX18",257,0)
+ I +BSDXIEN D
+"RTN","BSDX18",258,0)
+ . S BSDX="EDIT"
+"RTN","BSDX18",259,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",260,0)
+ E  D
+"RTN","BSDX18",261,0)
+ . S BSDX="ADD"
+"RTN","BSDX18",262,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX18",263,0)
+ ;
+"RTN","BSDX18",264,0)
+ I '+$P(BSDXVAL,"|",4) D MADERR("Error in MADFILE^BSDX18: No Resource ID") Q
+"RTN","BSDX18",265,0)
+ I '+$P(BSDXVAL,"|",5) D MADERR("Error in MADFILE^BSDX18: No User ID") Q
+"RTN","BSDX18",266,0)
+ ;
+"RTN","BSDX18",267,0)
+ S BSDXRID=$P(BSDXVAL,"|",4) ;ResourceID
+"RTN","BSDX18",268,0)
+ S BSDXUID=$P(BSDXVAL,"|",5) ;UserID
+"RTN","BSDX18",269,0)
+ S BSDXRSU=0 ;ResourceUserID
+"RTN","BSDX18",270,0)
+ S BSDXF=0 ;flag
+"RTN","BSDX18",271,0)
+ ;If this is an add, check if the user is already assigned to the resource.
+"RTN","BSDX18",272,0)
+ ;If so, then change to an edit
+"RTN","BSDX18",273,0)
+ I BSDX="ADD" F  S BSDXRSU=$O(^BSDXRSU("AC",BSDXUID,BSDXRSU)) Q:'+BSDXRSU  D  Q:BSDXF
+"RTN","BSDX18",274,0)
+ . S BSDXRES=$G(^BSDXRSU(BSDXRSU,0))
+"RTN","BSDX18",275,0)
+ . S BSDXRES=$P(BSDXRES,U) ;ResourceID
+"RTN","BSDX18",276,0)
+ . S:BSDXRES=BSDXRID BSDXF=1
+"RTN","BSDX18",277,0)
+ I BSDXF S BSDX="EDIT",BSDXIEN=BSDXRSU,BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",278,0)
+ ;
+"RTN","BSDX18",279,0)
+ S BSDXOVB=$P(BSDXVAL,"|",2)
+"RTN","BSDX18",280,0)
+ S BSDXMOD=$P(BSDXVAL,"|",3)
+"RTN","BSDX18",281,0)
+ S BSDXAPPT=$P(BSDXVAL,"|",6)
+"RTN","BSDX18",282,0)
+ ;
+"RTN","BSDX18",283,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.01)=$P(BSDXVAL,"|",4) ;RESOURCE ID
+"RTN","BSDX18",284,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.02)=$P(BSDXVAL,"|",5) ;USERID
+"RTN","BSDX18",285,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.03)=BSDXOVB ;OVERBOOK
+"RTN","BSDX18",286,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.04)=BSDXMOD ;MODIFY SCHEDULE
+"RTN","BSDX18",287,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.05)=BSDXAPPT ;ADD, EDIT, DELETE APPOINMENTS
+"RTN","BSDX18",288,0)
+ K BSDXMSG
+"RTN","BSDX18",289,0)
+ I BSDX="ADD" D
+"RTN","BSDX18",290,0)
+ . K BSDXIEN
+"RTN","BSDX18",291,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX18",292,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX18",293,0)
+ E  D
+"RTN","BSDX18",294,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX18",295,0)
+ Q
+"RTN","BSDX18",296,0)
+ ;
+"RTN","BSDX18",297,0)
+MADEXST(BSDXU,BSDXR) ;
+"RTN","BSDX18",298,0)
+ ;Returns BSDX RESOURCE USER ID
+"RTN","BSDX18",299,0)
+ ;if there is a BSDX RESOURCE USER entry for
+"RTN","BSDX18",300,0)
+ ;user BSDXU and resource BSDXR
+"RTN","BSDX18",301,0)
+ ;Otherwise, returns 0
+"RTN","BSDX18",302,0)
+ ;
+"RTN","BSDX18",303,0)
+ N BSDXID,BSDXFOUND,BSDXNOD
+"RTN","BSDX18",304,0)
+ I '$D(^BSDXRSU("AC",BSDXU)) Q 0
+"RTN","BSDX18",305,0)
+ S BSDXID=0,BSDXFOUND=0
+"RTN","BSDX18",306,0)
+ F  S BSDXID=$O(^BSDXRSU("AC",BSDXU,BSDXID)) Q:'+BSDXID  D  Q:BSDXFOUND
+"RTN","BSDX18",307,0)
+ . S BSDXNOD=$G(^BSDXRSU(BSDXID,0))
+"RTN","BSDX18",308,0)
+ . I +BSDXNOD=BSDXR S BSDXFOUND=BSDXID
+"RTN","BSDX18",309,0)
+ . Q
+"RTN","BSDX18",310,0)
+ Q BSDXFOUND
+"RTN","BSDX19")
+0^17^B7890401
+"RTN","BSDX19",1,0)
+BSDX19 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX19",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX19",3,0)
+ ;
+"RTN","BSDX19",4,0)
+ ;
+"RTN","BSDX19",5,0)
+ADDRGD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX19",6,0)
+ ;Entry point for debugging
+"RTN","BSDX19",7,0)
+ ;
+"RTN","BSDX19",8,0)
+ ;D DEBUG^%Serenji("ADDRG^BSDX19(.BSDXY,BSDXVAL)")
+"RTN","BSDX19",9,0)
+ Q
+"RTN","BSDX19",10,0)
+ ;
+"RTN","BSDX19",11,0)
+ADDRG(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX19",12,0)
+ ;Called by BSDX ADD/EDIT RESOURCE GROUP
+"RTN","BSDX19",13,0)
+ ;Add a new BSDX RESOURCE GROUP entry
+"RTN","BSDX19",14,0)
+ ;BSDXVAL is IEN|NAME of the entry
+"RTN","BSDX19",15,0)
+ ;Returns IEN of added/edited entry or 0 if error
+"RTN","BSDX19",16,0)
+ ;
+"RTN","BSDX19",17,0)
+ S X="ERROR^BSDX19",@^%ZOSF("TRAP")
+"RTN","BSDX19",18,0)
+ N BSDXIENS,BSDXFDA,BSDXMSG,BSDXIEN,BSDX,BSDXNAM
+"RTN","BSDX19",19,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX19",20,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX19",21,0)
+ I BSDXVAL="" D ERR(0,"BSDX16: Invalid null input Parameter") Q
+"RTN","BSDX19",22,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX19",23,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX19",24,0)
+ I +BSDXIEN D
+"RTN","BSDX19",25,0)
+ . S BSDX="EDIT"
+"RTN","BSDX19",26,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX19",27,0)
+ E  D
+"RTN","BSDX19",28,0)
+ . S BSDX="ADD"
+"RTN","BSDX19",29,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX19",30,0)
+ ;
+"RTN","BSDX19",31,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX19",32,0)
+ I $D(^BSDXDEPT("B",BSDXNAM)),$O(^BSDXDEPT("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX19",33,0)
+ . D ERR(0,"BSDX19: Cannot have two Resource Groups with the same name.")
+"RTN","BSDX19",34,0)
+ . Q
+"RTN","BSDX19",35,0)
+ ;
+"RTN","BSDX19",36,0)
+ S BSDXFDA(9002018.2,BSDXIENS,.01)=BSDXNAM ;NAME
+"RTN","BSDX19",37,0)
+ I BSDX="ADD" D
+"RTN","BSDX19",38,0)
+ . K BSDXIEN
+"RTN","BSDX19",39,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX19",40,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX19",41,0)
+ E  D
+"RTN","BSDX19",42,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX19",43,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^"_$C(30)_$C(31)
+"RTN","BSDX19",44,0)
+ Q
+"RTN","BSDX19",45,0)
+ ;
+"RTN","BSDX19",46,0)
+DELRGD(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX19",47,0)
+ ;Entry point for debugging
+"RTN","BSDX19",48,0)
+ ;
+"RTN","BSDX19",49,0)
+ ;D DEBUG^%Serenji("DELRG^BSDX19(.BSDXY,BSDXGRP)")
+"RTN","BSDX19",50,0)
+ Q
+"RTN","BSDX19",51,0)
+ ;
+"RTN","BSDX19",52,0)
+DELRG(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX19",53,0)
+ ;Deletes entry name BSDXGRP from BSDX RESOURCE GROUP file
+"RTN","BSDX19",54,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX19",55,0)
+ ;Called by BSDX DELETE RESOURCE GROUP
+"RTN","BSDX19",56,0)
+ ;Test Line:
+"RTN","BSDX19",57,0)
+ ;D DELRU^BSDX18(.RES,99)
+"RTN","BSDX19",58,0)
+ ;
+"RTN","BSDX19",59,0)
+ N BSDXI,DIK,DA,BSDXIEN
+"RTN","BSDX19",60,0)
+ S BSDXI=0
+"RTN","BSDX19",61,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX19",62,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX19",63,0)
+ I BSDXGRP="" D ERR(0,"DELRG~BSDX19: Invalid null Resource Group Name") Q
+"RTN","BSDX19",64,0)
+ S BSDXIEN=$O(^BSDXDEPT("B",BSDXGRP,0))
+"RTN","BSDX19",65,0)
+ I '+BSDXIEN D ERR(0,"DELRG~BSDX19: Invalid Resource Group Name") Q
+"RTN","BSDX19",66,0)
+ I '$D(^BSDXDEPT(BSDXIEN,0)) D ERR(0,"DELRG~BSDX19: Invalid Resource Group IEN") Q
+"RTN","BSDX19",67,0)
+ ;Delete entry BSDXIEN
+"RTN","BSDX19",68,0)
+ S DIK="^BSDXDEPT("
+"RTN","BSDX19",69,0)
+ S DA=BSDXIEN
+"RTN","BSDX19",70,0)
+ D ^DIK
+"RTN","BSDX19",71,0)
+ ;
+"RTN","BSDX19",72,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",73,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_$C(30)_$C(31)
+"RTN","BSDX19",74,0)
+ Q
+"RTN","BSDX19",75,0)
+ ;
+"RTN","BSDX19",76,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX19",77,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX19",78,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",79,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX19",80,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",81,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX19",82,0)
+ Q
+"RTN","BSDX19",83,0)
+ ;
+"RTN","BSDX19",84,0)
+ERROR ;
+"RTN","BSDX19",85,0)
+ D ^%ZTER
+"RTN","BSDX19",86,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX19",87,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",88,0)
+ D ERR(0,"BSDX19 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX19",89,0)
+ Q
+"RTN","BSDX20")
+0^18^B5911607
+"RTN","BSDX20",1,0)
+BSDX20 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX20",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX20",3,0)
+ ;
+"RTN","BSDX20",4,0)
+ ;
+"RTN","BSDX20",5,0)
+DELRGID(BSDXY,BSDXIEN) ;EP
+"RTN","BSDX20",6,0)
+ ;Entry point for debugging
+"RTN","BSDX20",7,0)
+ ;
+"RTN","BSDX20",8,0)
+ ;D DEBUG^%Serenji("DELRGI^BSDX20(.BSDXY,BSDXIEN)")
+"RTN","BSDX20",9,0)
+ Q
+"RTN","BSDX20",10,0)
+ ;
+"RTN","BSDX20",11,0)
+DELRGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX20",12,0)
+ ;Deletes entry BSDXIEN1 from entry BSDXIEN in the RESOURCE GROUP file
+"RTN","BSDX20",13,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX20",14,0)
+ ;Called by BSDX DELETE RES GROUP ITEM
+"RTN","BSDX20",15,0)
+ ;Test Line:
+"RTN","BSDX20",16,0)
+ ;D DELRU^BSDX18(.RES,99)
+"RTN","BSDX20",17,0)
+ ;
+"RTN","BSDX20",18,0)
+ N BSDXI,DIK,DA
+"RTN","BSDX20",19,0)
+ S BSDXI=0
+"RTN","BSDX20",20,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX20",21,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPID^I00020ERRORID"_$C(30)
+"RTN","BSDX20",22,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",23,0)
+ I '+BSDXIEN1 D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",24,0)
+ I '$D(^BSDXDEPT(BSDXIEN,1,BSDXIEN1,0)) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",25,0)
+ ;
+"RTN","BSDX20",26,0)
+ ;Delete entry BSDXIEN1
+"RTN","BSDX20",27,0)
+ S DIK="^BSDXDEPT("_BSDXIEN_",1,"
+"RTN","BSDX20",28,0)
+ S DA=BSDXIEN1,DA(1)=BSDXIEN
+"RTN","BSDX20",29,0)
+ D ^DIK
+"RTN","BSDX20",30,0)
+ ;
+"RTN","BSDX20",31,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",32,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX20",33,0)
+ Q
+"RTN","BSDX20",34,0)
+ ;
+"RTN","BSDX20",35,0)
+ADDRGID(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX20",36,0)
+ ;Entry point for debugging
+"RTN","BSDX20",37,0)
+ ;
+"RTN","BSDX20",38,0)
+ ;D DEBUG^%Serenji("ADDRGI^BSDX20(.BSDXY,BSDXIEN,BSDXIEN1)")
+"RTN","BSDX20",39,0)
+ Q
+"RTN","BSDX20",40,0)
+ ;
+"RTN","BSDX20",41,0)
+ADDRGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX20",42,0)
+ ;Adds RESOURCEID BSEDXIEN1 to RESOURCE GROUP entry BSDXIEN
+"RTN","BSDX20",43,0)
+ ;Return recordset containing added subentry number error message or "" if no error
+"RTN","BSDX20",44,0)
+ ;Called by BSDX ADD RES GROUP ITEM
+"RTN","BSDX20",45,0)
+ ;Test Line:
+"RTN","BSDX20",46,0)
+ ;D ADDRGI^BSDX20(.RES,1,1)
+"RTN","BSDX20",47,0)
+ ;
+"RTN","BSDX20",48,0)
+ N BSDXI,BSDXIENS,BSDXMSG,BSDXFDA
+"RTN","BSDX20",49,0)
+ S X="ETRAP^BSDX20",@^%ZOSF("TRAP")
+"RTN","BSDX20",50,0)
+ S BSDXI=0
+"RTN","BSDX20",51,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX20",52,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPITEMID^I00020ERRORID"_$C(30)
+"RTN","BSDX20",53,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",54,0)
+ I '+BSDXIEN1 D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",55,0)
+ I '$D(^BSDXDEPT(BSDXIEN,0)) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",56,0)
+ I '$D(^BSDXRES(BSDXIEN1,0)) D ERR(BSDXI,BSDXIEN1,70) Q
+"RTN","BSDX20",57,0)
+ I $D(^BSDXDEPT(BSDXIEN,1,"B",BSDXIEN1)) D ERR(BSDXI,0,0) Q
+"RTN","BSDX20",58,0)
+ ;^BSDXDEPT(3,1,"B",3,1)=
+"RTN","BSDX20",59,0)
+ ;
+"RTN","BSDX20",60,0)
+ S BSDXIENS="+1,"_BSDXIEN_","
+"RTN","BSDX20",61,0)
+ S BSDXFDA(9002018.21,BSDXIENS,.01)=BSDXIEN1 ;RESOURCEID
+"RTN","BSDX20",62,0)
+ K BSDXIEN
+"RTN","BSDX20",63,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX20",64,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",65,0)
+ S ^BSDXTMP($J,BSDXI)=+$G(BSDXIEN(1))_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX20",66,0)
+ Q
+"RTN","BSDX20",67,0)
+ ;
+"RTN","BSDX20",68,0)
+ERR(BSDXI,BSDXID,BSDXERR) ;Error processing
+"RTN","BSDX20",69,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",70,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXID_"^"_BSDXERR_$C(30)
+"RTN","BSDX20",71,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",72,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX20",73,0)
+ Q
+"RTN","BSDX20",74,0)
+ ;
+"RTN","BSDX20",75,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX20",76,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX20",77,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",78,0)
+ D ERR(BSDXI,99,70)
+"RTN","BSDX20",79,0)
+ Q
+"RTN","BSDX21")
+0^19^B8672065
+"RTN","BSDX21",1,0)
+BSDX21 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 5/21/10 9:42pm
+"RTN","BSDX21",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX21",3,0)
+ ;
+"RTN","BSDX21",4,0)
+ ;
+"RTN","BSDX21",5,0)
+ADDAGD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX21",6,0)
+ ;Entry point for debugging
+"RTN","BSDX21",7,0)
+ ;
+"RTN","BSDX21",8,0)
+ ;D DEBUG^%Serenji("ADDAG^BSDX21(.BSDXY,BSDXVAL)")
+"RTN","BSDX21",9,0)
+ Q
+"RTN","BSDX21",10,0)
+ ;
+"RTN","BSDX21",11,0)
+ADDAG(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX21",12,0)
+ ;Called by BSDX ADD/EDIT ACCESS GROUP
+"RTN","BSDX21",13,0)
+ ;Add a new BSDX ACCESS GROUP entry
+"RTN","BSDX21",14,0)
+ ;BSDXVAL is NAME of the entry
+"RTN","BSDX21",15,0)
+ ;
+"RTN","BSDX21",16,0)
+ S X="ERROR^BSDX21",@^%ZOSF("TRAP")
+"RTN","BSDX21",17,0)
+ N BSDXIENS,BSDXFDA,BSDXMSG,BSDXIEN,BSDX,BSDXNAM
+"RTN","BSDX21",18,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX21",19,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX21",20,0)
+ I BSDXVAL="" D ERR(0,"BSDX21: Invalid null input Parameter") Q
+"RTN","BSDX21",21,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX21",22,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX21",23,0)
+ I +BSDXIEN D
+"RTN","BSDX21",24,0)
+ . S BSDX="EDIT"
+"RTN","BSDX21",25,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX21",26,0)
+ E  D
+"RTN","BSDX21",27,0)
+ . S BSDX="ADD"
+"RTN","BSDX21",28,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX21",29,0)
+ ;
+"RTN","BSDX21",30,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX21",31,0)
+ I BSDXNAM="" D ERR(0,"BSDX14: Invalid null Access Type name.") Q
+"RTN","BSDX21",32,0)
+ ;
+"RTN","BSDX21",33,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX21",34,0)
+ I $D(^BSDXAGP("B",BSDXNAM)),$O(^BSDXAGP("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX21",35,0)
+ . D ERR(0,"BSDX21: Cannot have two Access Groups with the same name.")
+"RTN","BSDX21",36,0)
+ . Q
+"RTN","BSDX21",37,0)
+ ;
+"RTN","BSDX21",38,0)
+ S BSDXFDA(9002018.38,BSDXIENS,.01)=BSDXNAM ;NAME
+"RTN","BSDX21",39,0)
+ I BSDX="ADD" D
+"RTN","BSDX21",40,0)
+ . K BSDXIEN
+"RTN","BSDX21",41,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX21",42,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX21",43,0)
+ E  D
+"RTN","BSDX21",44,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX21",45,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^"_$C(30)_$C(31)
+"RTN","BSDX21",46,0)
+ Q
+"RTN","BSDX21",47,0)
+ ;
+"RTN","BSDX21",48,0)
+DELAGD(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX21",49,0)
+ ;Entry point for debugging
+"RTN","BSDX21",50,0)
+ ;
+"RTN","BSDX21",51,0)
+ ;D DEBUG^%Serenji("DELAG^BSDX21(.BSDXY,BSDXGRP)")
+"RTN","BSDX21",52,0)
+ Q
+"RTN","BSDX21",53,0)
+ ;
+"RTN","BSDX21",54,0)
+DELAG(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX21",55,0)
+ ;Deletes entry having IEN BSDXGRP from BSDX ACCESS GROUP file
+"RTN","BSDX21",56,0)
+ ;Also deletes all entries in BSDX ACCESS GROUP TYPE that point to this group
+"RTN","BSDX21",57,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX21",58,0)
+ ;Called by BSDX DELETE ACCESS GROUP
+"RTN","BSDX21",59,0)
+ ;Test Line:
+"RTN","BSDX21",60,0)
+ ;D DELAG^BSDX21(.RES,99)
+"RTN","BSDX21",61,0)
+ ;
+"RTN","BSDX21",62,0)
+ S X="ERROR^BSDX21",@^%ZOSF("TRAP")
+"RTN","BSDX21",63,0)
+ N BSDXI,DIK,DA,BSDXIEN,BSDXIEN1
+"RTN","BSDX21",64,0)
+ S BSDXI=0
+"RTN","BSDX21",65,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX21",66,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX21",67,0)
+ S BSDXIEN=BSDXGRP
+"RTN","BSDX21",68,0)
+ ;I '$D(^BSDXAGP("B",BSDXGRP)) D ERR(BSDXI,0,0) Q
+"RTN","BSDX21",69,0)
+ ;S BSDXIEN=$O(^BSDXAGP("B",BSDXGRP,0))
+"RTN","BSDX21",70,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN) Q
+"RTN","BSDX21",71,0)
+ I '$D(^BSDXAGP(BSDXIEN,0)) D ERR(0,"BSDX14: Invalid Access Group ID name.") Q
+"RTN","BSDX21",72,0)
+ ;
+"RTN","BSDX21",73,0)
+ ;Delete BSDXACCESS GROUP TYPE entries
+"RTN","BSDX21",74,0)
+ ;
+"RTN","BSDX21",75,0)
+ S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXAGTP("B",BSDXIEN,BSDXIEN1)) Q:'BSDXIEN1  D
+"RTN","BSDX21",76,0)
+ . S DIK="^BSDXAGTP("
+"RTN","BSDX21",77,0)
+ . S DA=BSDXIEN1
+"RTN","BSDX21",78,0)
+ . D ^DIK
+"RTN","BSDX21",79,0)
+ . Q
+"RTN","BSDX21",80,0)
+ ;
+"RTN","BSDX21",81,0)
+ ;Delete entry BSDXIEN in BSDX ACCESS GROUP
+"RTN","BSDX21",82,0)
+ S DIK="^BSDXAGP("
+"RTN","BSDX21",83,0)
+ S DA=BSDXIEN
+"RTN","BSDX21",84,0)
+ D ^DIK
+"RTN","BSDX21",85,0)
+ ;
+"RTN","BSDX21",86,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",87,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_""_$C(30)_$C(31)
+"RTN","BSDX21",88,0)
+ Q
+"RTN","BSDX21",89,0)
+ ;
+"RTN","BSDX21",90,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX21",91,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX21",92,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",93,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX21",94,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",95,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX21",96,0)
+ Q
+"RTN","BSDX21",97,0)
+ ;
+"RTN","BSDX21",98,0)
+ERROR ;
+"RTN","BSDX21",99,0)
+ D ^%ZTER
+"RTN","BSDX21",100,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX21",101,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",102,0)
+ D ERR(0,"BSDX21 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX21",103,0)
+ Q
+"RTN","BSDX22")
+0^20^B9479861
+"RTN","BSDX22",1,0)
+BSDX22 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX22",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX22",3,0)
+ ;
+"RTN","BSDX22",4,0)
+ ;
+"RTN","BSDX22",5,0)
+DELAGID(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",6,0)
+ ;Entry point for debugging
+"RTN","BSDX22",7,0)
+ ;
+"RTN","BSDX22",8,0)
+ ;D DEBUG^%Serenji("DELAGI^BSDX22(.BSDXY,BSDXIEN,BSDXIEN1)")
+"RTN","BSDX22",9,0)
+ Q
+"RTN","BSDX22",10,0)
+ ;
+"RTN","BSDX22",11,0)
+DELAGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",12,0)
+ ;Deletes entry having Access Group BSDXIEN and Access Type BSDXIEN1 the ACCESS GROUP TYPE file
+"RTN","BSDX22",13,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX22",14,0)
+ ;Called by BSDX DELETE ACCESS GROUP ITEM
+"RTN","BSDX22",15,0)
+ ;Test Line:
+"RTN","BSDX22",16,0)
+ ;D DELAGI^BSDX22(.RES,99)
+"RTN","BSDX22",17,0)
+ ;
+"RTN","BSDX22",18,0)
+ S X="ERROR^BSDX22",@^%ZOSF("TRAP")
+"RTN","BSDX22",19,0)
+ N BSDXI,DIK,DA,BSDXIEN2
+"RTN","BSDX22",20,0)
+ S BSDXI=0
+"RTN","BSDX22",21,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX22",22,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPTYPEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX22",23,0)
+ I '+BSDXIEN D ERR(0,"BSDX22: Invalid null Access Group ID") Q
+"RTN","BSDX22",24,0)
+ I '+BSDXIEN1 D ERR(0,"BSDX22: Invalid null Access Type ID") Q
+"RTN","BSDX22",25,0)
+ I '$D(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1)) D  Q
+"RTN","BSDX22",26,0)
+ . D ERR(0,"BSDX22: Invalid null Access Group Type ID")
+"RTN","BSDX22",27,0)
+ . Q
+"RTN","BSDX22",28,0)
+ S BSDXIEN2=$O(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1,0))
+"RTN","BSDX22",29,0)
+ I '+BSDXIEN2 D ERR(0,"BSDX22: Invalid null Access Group Type ID") Q
+"RTN","BSDX22",30,0)
+ ;
+"RTN","BSDX22",31,0)
+ ;Delete entry
+"RTN","BSDX22",32,0)
+ S DIK="^BSDXAGTP("
+"RTN","BSDX22",33,0)
+ S DA=BSDXIEN2
+"RTN","BSDX22",34,0)
+ D ^DIK
+"RTN","BSDX22",35,0)
+ ;
+"RTN","BSDX22",36,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",37,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN2_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX22",38,0)
+ Q
+"RTN","BSDX22",39,0)
+ ;
+"RTN","BSDX22",40,0)
+ADDAGID(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",41,0)
+ ;Entry point for debugging
+"RTN","BSDX22",42,0)
+ ;
+"RTN","BSDX22",43,0)
+ ;D DEBUG^%Serenji("ADDAGI^BSDX22(.BSDXY,BSDXIEN,BSDXIEN1)")
+"RTN","BSDX22",44,0)
+ Q
+"RTN","BSDX22",45,0)
+ ;
+"RTN","BSDX22",46,0)
+ADDAGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",47,0)
+ ;Adds ACCESS GROUP TYPE file entry having access group BSDXIEN and access type BSDXIEN1
+"RTN","BSDX22",48,0)
+ ;Return recordset containing added entry number error message or "" if no error
+"RTN","BSDX22",49,0)
+ ;Called by BSDX ADD ACCESS GROUP ITEM
+"RTN","BSDX22",50,0)
+ ;Test Line:
+"RTN","BSDX22",51,0)
+ ;D ADDAGI^BSDX22(.RES,1,1)
+"RTN","BSDX22",52,0)
+ ;
+"RTN","BSDX22",53,0)
+ S X="ERROR^BSDX22",@^%ZOSF("TRAP")
+"RTN","BSDX22",54,0)
+ N BSDXI,BSDXIENS,BSDXMSG,BSDXFDA
+"RTN","BSDX22",55,0)
+ S BSDXI=0
+"RTN","BSDX22",56,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX22",57,0)
+ ;S ^BSDXTMP($J,0)="I00020ACCESSGROUPTYPEID^I00020ERRORID"_$C(30)
+"RTN","BSDX22",58,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPTYPEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX22",59,0)
+ I '+BSDXIEN D ERR(0,"BSDX22: Invalid null Access Group ID") Q
+"RTN","BSDX22",60,0)
+ I '+BSDXIEN1 D ERR(0,"BSDX22: Invalid null Access Type ID") Q
+"RTN","BSDX22",61,0)
+ I '$D(^BSDXAGP(BSDXIEN,0)) D ERR(0,"BSDX22: Invalid Access Group ID") Q
+"RTN","BSDX22",62,0)
+ I '$D(^BSDXTYPE(BSDXIEN1,0)) D ERR(0,"BSDX22: Invalid Access Type ID") Q
+"RTN","BSDX22",63,0)
+ I $D(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1)) D  Q
+"RTN","BSDX22",64,0)
+ . S BSDXIENS=$O(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1,0))
+"RTN","BSDX22",65,0)
+ . S ^BSDXTMP($J,BSDXI+1)=+BSDXIENS_"^"_$C(30)_$C(31)
+"RTN","BSDX22",66,0)
+ . Q
+"RTN","BSDX22",67,0)
+ ;
+"RTN","BSDX22",68,0)
+ S BSDXIENS="+1,"
+"RTN","BSDX22",69,0)
+ S BSDXFDA(9002018.39,BSDXIENS,.01)=BSDXIEN ;ACCESS GROUP ID
+"RTN","BSDX22",70,0)
+ S BSDXFDA(9002018.39,BSDXIENS,.02)=BSDXIEN1 ;ACCESS TYPE ID
+"RTN","BSDX22",71,0)
+ K BSDXIEN
+"RTN","BSDX22",72,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX22",73,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",74,0)
+ S ^BSDXTMP($J,BSDXI)=+$G(BSDXIEN(1))_"^"_$C(30)_$C(31)
+"RTN","BSDX22",75,0)
+ Q
+"RTN","BSDX22",76,0)
+ ;
+"RTN","BSDX22",77,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX22",78,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX22",79,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",80,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX22",81,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",82,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX22",83,0)
+ Q
+"RTN","BSDX22",84,0)
+ ;
+"RTN","BSDX22",85,0)
+ERROR ;
+"RTN","BSDX22",86,0)
+ D ^%ZTER
+"RTN","BSDX22",87,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX22",88,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",89,0)
+ D ERR(0,"BSDX22 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX22",90,0)
+ Q
+"RTN","BSDX23")
+0^21^B8488013
+"RTN","BSDX23",1,0)
+BSDX23 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX23",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX23",3,0)
+ ;
+"RTN","BSDX23",4,0)
+ ;
+"RTN","BSDX23",5,0)
+EVENT(BSDXEVENT,BSDXPARAM,BSDXSIP,BSDXSPT) ;EP
+"RTN","BSDX23",6,0)
+ ;Raise event to interested clients
+"RTN","BSDX23",7,0)
+ ;Clients are listed in ^BSDXTMP("EVENT",EVENT_NAME,IP,PORT)
+"RTN","BSDX23",8,0)
+ ;BSDXSIP and BSDXSPT represent the sender's IP and PORT.  
+"RTN","BSDX23",9,0)
+ ;The event will not be raised back to the sender if these are non-null
+"RTN","BSDX23",10,0)
+ ;
+"RTN","BSDX23",11,0)
+ Q:'$D(^BSDXTMP("EVENT",BSDXEVENT))
+"RTN","BSDX23",12,0)
+ S BSDXIP=0 F  S BSDXIP=$O(^BSDXTMP("EVENT",BSDXEVENT,BSDXIP)) Q:BSDXIP=""  D
+"RTN","BSDX23",13,0)
+ . S BSDXPORT=0 F  S BSDXPORT=$O(^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)) Q:'+BSDXPORT  D
+"RTN","BSDX23",14,0)
+ . . I BSDXIP=BSDXSIP Q  ;,BSDXPORT=BSDXSPT Q
+"RTN","BSDX23",15,0)
+ . . D CALL^%ZISTCP(BSDXIP,BSDXPORT,5)
+"RTN","BSDX23",16,0)
+ . . I POP K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT) Q
+"RTN","BSDX23",17,0)
+ . . ;U IO R X#3:5
+"RTN","BSDX23",18,0)
+ . . I X'="ACK" K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT) Q
+"RTN","BSDX23",19,0)
+ . . S BSDXPARAM=$S(BSDXPARAM="":"",1:U_BSDXPARAM)
+"RTN","BSDX23",20,0)
+ . . U IO W BSDXEVENT,BSDXPARAM,!
+"RTN","BSDX23",21,0)
+ . . D ^%ZISC
+"RTN","BSDX23",22,0)
+ . . Q
+"RTN","BSDX23",23,0)
+ . Q
+"RTN","BSDX23",24,0)
+ Q
+"RTN","BSDX23",25,0)
+ ;
+"RTN","BSDX23",26,0)
+EVERR(BSDXEVENT,BSDXIP,BSDXPORT) ;
+"RTN","BSDX23",27,0)
+ ;
+"RTN","BSDX23",28,0)
+ Q:$G(BSDXEVENT)=""
+"RTN","BSDX23",29,0)
+ Q:$G(BSDXIP)=""
+"RTN","BSDX23",30,0)
+ Q:$G(BSDXIP)=""
+"RTN","BSDX23",31,0)
+ K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)
+"RTN","BSDX23",32,0)
+ Q
+"RTN","BSDX23",33,0)
+ ;
+"RTN","BSDX23",34,0)
+REGET ;EP
+"RTN","BSDX23",35,0)
+ ;Error trap from REGEVNT
+"RTN","BSDX23",36,0)
+ ;
+"RTN","BSDX23",37,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX23",38,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",39,0)
+ D REGERR(BSDXI,99)
+"RTN","BSDX23",40,0)
+ Q
+"RTN","BSDX23",41,0)
+ ;
+"RTN","BSDX23",42,0)
+REGERR(BSDXI,BSDXERID) ;Error processing
+"RTN","BSDX23",43,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",44,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_$C(30)
+"RTN","BSDX23",45,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",46,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX23",47,0)
+ Q
+"RTN","BSDX23",48,0)
+ ;
+"RTN","BSDX23",49,0)
+ ;
+"RTN","BSDX23",50,0)
+REGEVNT(BSDXY,BSDXEVENT,BSDXIP,BSDXPORT) ;EP
+"RTN","BSDX23",51,0)
+ ;RPC Called by client to inform RPMS server of client's interest in BSDXEVENT
+"RTN","BSDX23",52,0)
+ ;Returns RECORDSET with field ERRORID.
+"RTN","BSDX23",53,0)
+ ;If everything ok then ERRORID = 0;
+"RTN","BSDX23",54,0)
+ ;
+"RTN","BSDX23",55,0)
+ N BSDXI
+"RTN","BSDX23",56,0)
+ S BSDXI=0
+"RTN","BSDX23",57,0)
+ S X="REGET^BSDX23",@^%ZOSF("TRAP")
+"RTN","BSDX23",58,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX23",59,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID"_$C(30)
+"RTN","BSDX23",60,0)
+ I '+BSDXPORT D REGERR(BSDXI,1) Q
+"RTN","BSDX23",61,0)
+ I BSDXIP="" D REGERR(BSDXI,2) Q
+"RTN","BSDX23",62,0)
+ S ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)=""
+"RTN","BSDX23",63,0)
+ ;
+"RTN","BSDX23",64,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",65,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)_$C(31)
+"RTN","BSDX23",66,0)
+ Q
+"RTN","BSDX23",67,0)
+ ;
+"RTN","BSDX23",68,0)
+UNREG(BSDXY,BSDXEVENT,BSDXIP,BSDXPORT) ;EP
+"RTN","BSDX23",69,0)
+ ;RPC Called by client to Unregister client's interest in BSDXEVENT
+"RTN","BSDX23",70,0)
+ ;Returns RECORDSET with field ERRORID.
+"RTN","BSDX23",71,0)
+ ;If everything ok then ERRORID = 0;
+"RTN","BSDX23",72,0)
+ ;
+"RTN","BSDX23",73,0)
+ N BSDXI
+"RTN","BSDX23",74,0)
+ S BSDXI=0
+"RTN","BSDX23",75,0)
+ S X="REGET^BSDX23",@^%ZOSF("TRAP")
+"RTN","BSDX23",76,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX23",77,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID"_$C(30)
+"RTN","BSDX23",78,0)
+ I '+BSDXPORT D REGERR(BSDXI,1) Q
+"RTN","BSDX23",79,0)
+ I BSDXIP="" D REGERR(BSDXI,2) Q
+"RTN","BSDX23",80,0)
+ K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)
+"RTN","BSDX23",81,0)
+ ;
+"RTN","BSDX23",82,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",83,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)_$C(31)
+"RTN","BSDX23",84,0)
+ Q
+"RTN","BSDX23",85,0)
+ ;
+"RTN","BSDX23",86,0)
+RAISEVNT(BSDXY,BSDXEVENT,BSDXPARAM,BSDXSIP,BSDXSPT) ;EP
+"RTN","BSDX23",87,0)
+ ;RPC Called to raise event BSDXEVENT with parameter BSDXPARAM
+"RTN","BSDX23",88,0)
+ ;BSDXSIP and BSDXSPT represent the sender's IP and PORT.
+"RTN","BSDX23",89,0)
+ ;If not null, these will prevent the event from being raised back
+"RTN","BSDX23",90,0)
+ ;to the sender.
+"RTN","BSDX23",91,0)
+ ;Returns a RECORDSET wit the field ERRORID.
+"RTN","BSDX23",92,0)
+ ;If everything ok then ERRORID = 0;
+"RTN","BSDX23",93,0)
+ ;
+"RTN","BSDX23",94,0)
+ N BSDXI
+"RTN","BSDX23",95,0)
+ S BSDXI=0
+"RTN","BSDX23",96,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX23",97,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID"_$C(30)
+"RTN","BSDX23",98,0)
+ S X="REGET^BSDX23",@^%ZOSF("TRAP")
+"RTN","BSDX23",99,0)
+ ;
+"RTN","BSDX23",100,0)
+ D EVENT(BSDXEVENT,BSDXPARAM,BSDXSIP,BSDXSPT)
+"RTN","BSDX23",101,0)
+ ;
+"RTN","BSDX23",102,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",103,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)_$C(31)
+"RTN","BSDX23",104,0)
+ Q
+"RTN","BSDX24")
+0^22^B13455014
+"RTN","BSDX24",1,0)
+BSDX24 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX24",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX24",3,0)
+ ;
+"RTN","BSDX24",4,0)
+ ;
+"RTN","BSDX24",5,0)
+ Q
+"RTN","BSDX24",6,0)
+CRCONTXT(RESULT,OPTION) ;EP
+"RTN","BSDX24",7,0)
+ ;Entry point for debugging XWBSEC
+"RTN","BSDX24",8,0)
+ ;
+"RTN","BSDX24",9,0)
+ ;D DEBUG^%Serenji("CRCONTXT^XWBSEC(.RESULT,OPTION)")
+"RTN","BSDX24",10,0)
+ ;;H .5
+"RTN","BSDX24",11,0)
+ ;;D CRCONTXT^XWBSEC(.RESULT,OPTION)
+"RTN","BSDX24",12,0)
+ ;;S BSDX="^BSDXTMP($J,"
+"RTN","BSDX24",13,0)
+ ;;S ^BSDXTMP($J,0)=RESULT
+"RTN","BSDX24",14,0)
+ ;;S RESULT=1
+"RTN","BSDX24",15,0)
+ Q
+"RTN","BSDX24",16,0)
+TEST0(BSDX) ;EP Delete user from 200
+"RTN","BSDX24",17,0)
+ S DIK="^VA(200,"
+"RTN","BSDX24",18,0)
+ S DA=BSDX
+"RTN","BSDX24",19,0)
+ D ^DIK
+"RTN","BSDX24",20,0)
+ ;
+"RTN","BSDX24",21,0)
+ Q
+"RTN","BSDX24",22,0)
+KILLM ;EP Delete BMXMENU entry
+"RTN","BSDX24",23,0)
+ S DIK="^DIC(19,"
+"RTN","BSDX24",24,0)
+ S DA=$O(^DIC(19,"B","BMXMENU",0))
+"RTN","BSDX24",25,0)
+ Q:'+DA
+"RTN","BSDX24",26,0)
+ D ^DIK
+"RTN","BSDX24",27,0)
+ Q
+"RTN","BSDX24",28,0)
+ ;
+"RTN","BSDX24",29,0)
+TEST1 ;EP Adding an entry to 200
+"RTN","BSDX24",30,0)
+ ;
+"RTN","BSDX24",31,0)
+ S BSDXFDA(200,"+1,",.01)="BMXNET,APPLICATION"
+"RTN","BSDX24",32,0)
+ K BSDXIEN,BSDXMSG
+"RTN","BSDX24",33,0)
+ S DIC(0)=""
+"RTN","BSDX24",34,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX24",35,0)
+ ;
+"RTN","BSDX24",36,0)
+ Q
+"RTN","BSDX24",37,0)
+TEST2 ;EP
+"RTN","BSDX24",38,0)
+ ;How to change the ACCESS CODE, VERIFY CODE, DATE VERIFY CODE LAST CHANGED field
+"RTN","BSDX24",39,0)
+ ;ACCESS CODE BSDXXX1^1_(a>yr}:3x3ja9\8vbH
+"RTN","BSDX24",40,0)
+ ;VERIFY CODE BSDXXX2^$;HOSs|:3w25lLD}Be=
+"RTN","BSDX24",41,0)
+ N BSDXFDA
+"RTN","BSDX24",42,0)
+ S BSDXFDA(200,"36,",2)="1_(a>yr}:3x3ja9\8vbH"
+"RTN","BSDX24",43,0)
+ S BSDXFDA(200,"36,",11)="$;HOSs|:3w25lLD}Be="
+"RTN","BSDX24",44,0)
+ S BSDXFDA(200,"36,",11.2)="88888,88888"
+"RTN","BSDX24",45,0)
+ S BSDXFDA(200,"36,",201)="BMXRPC"
+"RTN","BSDX24",46,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX24",47,0)
+ Q
+"RTN","BSDX24",48,0)
+ ;
+"RTN","BSDX24",49,0)
+ ;
+"RTN","BSDX24",50,0)
+SEARCHD(BSDXY,BSDXRES,BSDXSTRT,BSDXEND,BSDXTYPES,BSDXAMPM,BSDXWKDY) ;EP
+"RTN","BSDX24",51,0)
+ ;Entry point for debugging
+"RTN","BSDX24",52,0)
+ ;
+"RTN","BSDX24",53,0)
+ ;D DEBUG^%Serenji("SEARCH^BSDX24(.RES,""ROGERS,BUCK|FUNAKOSHI,GICHIN"","""","""","""","""","""")")
+"RTN","BSDX24",54,0)
+ ;D DEBUG^%Serenji("SEARCH^BSDX24(.BSDXY,BSDXRES,BSDXSTRT,BSDXEND,BSDXTYPES,BSDXAMPM,BSDXWKDY)")
+"RTN","BSDX24",55,0)
+ Q
+"RTN","BSDX24",56,0)
+ ;
+"RTN","BSDX24",57,0)
+SEARCH(BSDXY,BSDXRES,BSDXSTRT,BSDXEND,BSDXTYPES,BSDXAMPM,BSDXWKDY) ;EP
+"RTN","BSDX24",58,0)
+ ;Searches availability database for availability blocks between
+"RTN","BSDX24",59,0)
+ ;BSDXSTRT and BSDXEND for each of the resources in BSDXRES.
+"RTN","BSDX24",60,0)
+ ;The av blocks must be one of the types in BSDXTYPES, must be
+"RTN","BSDX24",61,0)
+ ;AM or PM depending on value in BSDXAMPM and
+"RTN","BSDX24",62,0)
+ ;must be on one of the weekdays listed in BSDXWKDY.
+"RTN","BSDX24",63,0)
+ ;
+"RTN","BSDX24",64,0)
+ ;Return recordset containing the start times of availability blocks
+"RTN","BSDX24",65,0)
+ ;meeting the search criteria.
+"RTN","BSDX24",66,0)
+ ;
+"RTN","BSDX24",67,0)
+ ;Variables:
+"RTN","BSDX24",68,0)
+ ;BSDXRES |-Delimited list of resource names
+"RTN","BSDX24",69,0)
+ ;BSDXSTRT FM-formatted beginning date of search
+"RTN","BSDX24",70,0)
+ ;BSDXEND FM-Formatted ending date of search
+"RTN","BSDX24",71,0)
+ ;BSDXTYPES |-Delimited list of access type IENs
+"RTN","BSDX24",72,0)
+ ;BSDXAMPM "AM" for am-only, "PM" for pm-only, "BOTH" for both
+"RTN","BSDX24",73,0)
+ ;BSDXWKDY "" if any weekday, else |-delimited list of weekdays
+"RTN","BSDX24",74,0)
+ ;
+"RTN","BSDX24",75,0)
+ ;NOTE: If BSDXEND="" Then:
+"RTN","BSDX24",76,0)
+ ; either ONE record is returned matching the first available block
+"RTN","BSDX24",77,0)
+ ; -or- NO record is returned indicating no available block exists
+"RTN","BSDX24",78,0)
+ ;
+"RTN","BSDX24",79,0)
+ ;Called by BSDX SEARCH AVAILABILITY
+"RTN","BSDX24",80,0)
+ ;Test Line:
+"RTN","BSDX24",81,0)
+ ;D SEARCH^BSDX24(.RES,"ROGERS,BUCK|FUNAKOSHI,GICHIN","","","","","") ZW RES
+"RTN","BSDX24",82,0)
+ ;
+"RTN","BSDX24",83,0)
+ ;
+"RTN","BSDX24",84,0)
+ S X=BSDXSTRT,%DT="X" D ^%DT S BSDXSTRT=$P(Y,".")
+"RTN","BSDX24",85,0)
+ S:+BSDXSTRT<0 BSDXSTRT=DT
+"RTN","BSDX24",86,0)
+ S X=BSDXEND,%DT="X" D ^%DT S BSDXEND=$P(Y,".")
+"RTN","BSDX24",87,0)
+ S:+BSDXEND<0 BSDXEND=9990101
+"RTN","BSDX24",88,0)
+ S BSDXEND=BSDXEND_".99"
+"RTN","BSDX24",89,0)
+ N BSDXRESN,BSDXRESD,BSDXDATE,BSDXI,BSDXABD,BSDXNOD,BSDXATD,BSDXATN
+"RTN","BSDX24",90,0)
+ N BSDXTYPE
+"RTN","BSDX24",91,0)
+ ;
+"RTN","BSDX24",92,0)
+ ;Set up access types array
+"RTN","BSDX24",93,0)
+ F BSDX=1:1:$L(BSDXTYPES,"|") D
+"RTN","BSDX24",94,0)
+ . S BSDXATD=$P(BSDXTYPES,"|",BSDX)
+"RTN","BSDX24",95,0)
+ . S:+BSDXATD BSDXTYPE(BSDXTYPD)=""
+"RTN","BSDX24",96,0)
+ ;
+"RTN","BSDX24",97,0)
+ S BSDXI=0
+"RTN","BSDX24",98,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX24",99,0)
+ S ^BSDXTMP($J,0)="T00030RESOURCENAME^D00030DATE^T00030ACCESSTYPE^T00030COMMENT"_$C(30)
+"RTN","BSDX24",100,0)
+ F BSDX=1:1:$L(BSDXRES,"|") S BSDXRESN=$P(BSDXRES,"|",BSDX) D
+"RTN","BSDX24",101,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX24",102,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX24",103,0)
+ . Q:'+BSDXRESD
+"RTN","BSDX24",104,0)
+ . Q:'$D(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX24",105,0)
+ . Q:'$D(^BSDXAB("ARSCT",BSDXRESD))
+"RTN","BSDX24",106,0)
+ . S BSDXDATE=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXSTRT))
+"RTN","BSDX24",107,0)
+ . Q:BSDXDATE=""
+"RTN","BSDX24",108,0)
+ . Q:BSDXDATE>BSDXEND
+"RTN","BSDX24",109,0)
+ . ;TODO: Screen for AMPM
+"RTN","BSDX24",110,0)
+ . ;TODO: Screen for Weekday
+"RTN","BSDX24",111,0)
+ . ;
+"RTN","BSDX24",112,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX24",113,0)
+ . S BSDXABD=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXDATE,0))
+"RTN","BSDX24",114,0)
+ . S BSDXNOD=$G(^BSDXAB(BSDXABD,0))
+"RTN","BSDX24",115,0)
+ . Q:BSDXNOD=""
+"RTN","BSDX24",116,0)
+ . S Y=$P(BSDXDATE,".")
+"RTN","BSDX24",117,0)
+ . D DD^%DT
+"RTN","BSDX24",118,0)
+ . S BSDXATD=$P(BSDXNOD,U,5) ;ACCESS TYPE POINTER
+"RTN","BSDX24",119,0)
+ . S BSDXATD=$G(^BSDXTYPE(+BSDXATD,0))
+"RTN","BSDX24",120,0)
+ . S BSDXATN=$P(BSDXATD,U)
+"RTN","BSDX24",121,0)
+ . I +BSDXATD,BSDXTYPES]"" Q:'$D(BSDXTYPES(BSDXATD))
+"RTN","BSDX24",122,0)
+ . ;TODO: Screen for TYPE ----DONE!
+"RTN","BSDX24",123,0)
+ . ;TODO: Comment
+"RTN","BSDX24",124,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXRESN_U_Y_U_BSDXATN_U_$C(30)
+"RTN","BSDX24",125,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX24",126,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX24",127,0)
+ Q
+"RTN","BSDX25")
+0^23^B21230952
+"RTN","BSDX25",1,0)
+BSDX25 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 1/6/11 1:57pm
+"RTN","BSDX25",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX25",3,0)
+    ;
+"RTN","BSDX25",4,0)
+    ; Change Log:
+"RTN","BSDX25",5,0)
+    ; 3110106: SMH -> Changed Check-in EP - Removed unused paramters. Will change C#
+"RTN","BSDX25",6,0)
+ ;
+"RTN","BSDX25",7,0)
+ ;
+"RTN","BSDX25",8,0)
+CHECKIND(BSDXY,BSDXAPTID,BSDXCDT,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG) ;EP
+"RTN","BSDX25",9,0)
+ ;Entry point for debugging
+"RTN","BSDX25",10,0)
+ ;
+"RTN","BSDX25",11,0)
+ ;I +$G(^BSDXDBUG("BREAK","CHECKIN")),+$G(^BSDXDBUG("BREAK"))=DUZ D DEBUG^%Serenji("CHECKIN^BSDX25(.BSDXY,BSDXAPTID,BSDXCDT,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG)",$P(^BSDXDBUG("BREAK"),U,2))
+"RTN","BSDX25",12,0)
+ ;E  G ENDBG
+"RTN","BSDX25",13,0)
+ Q
+"RTN","BSDX25",14,0)
+ ;
+"RTN","BSDX25",15,0)
+CHECKIN(BSDXY,BSDXAPTID,BSDXCDT) ; ,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG)	;EP Check in appointment
+"RTN","BSDX25",16,0)
+ ; Private to GUI; use BSDXAPI for general API to checkin patients
+"RTN","BSDX25",17,0)
+    ; Parameters:
+"RTN","BSDX25",18,0)
+    ; BSDXY: Global Out
+"RTN","BSDX25",19,0)
+    ; BSDXAPTID: Appointment ID in ^BSDXAPPT
+"RTN","BSDX25",20,0)
+    ; BSDXCDT: Checkin Date --> Changed
+"RTN","BSDX25",21,0)
+    ; BSDXCC: Clinic Stop IEN (not used)
+"RTN","BSDX25",22,0)
+    ; BSDXPRV: Provider IEN (not used)
+"RTN","BSDX25",23,0)
+    ; BSDXROU: Print Routing Slip? (not used)
+"RTN","BSDX25",24,0)
+    ; BSDXVCL: PCC+ Clinic IEN (not used)
+"RTN","BSDX25",25,0)
+    ; BSDXVFM: PCC+ Form IEN (not used)
+"RTN","BSDX25",26,0)
+    ; BSDXOG: PCC+ Outguide (true or false)
+"RTN","BSDX25",27,0)
+    ;
+"RTN","BSDX25",28,0)
+    ; Output:
+"RTN","BSDX25",29,0)
+    ; ADO.net table with 1 column ErrorID, 1 row result
+"RTN","BSDX25",30,0)
+    ; - 0 if all okay
+"RTN","BSDX25",31,0)
+    ; - Another number or text if not
+"RTN","BSDX25",32,0)
+ENDBG ;
+"RTN","BSDX25",33,0)
+ N BSDXNOD,BSDXPATID,BSDXSTART,DIK,DA,BSDXID,BSDXI,BSDXZ,BSDXIENS,BSDXVEN
+"RTN","BSDX25",34,0)
+ N BSDXNOEV
+"RTN","BSDX25",35,0)
+ S BSDXNOEV=1 ;Don't execute protocol
+"RTN","BSDX25",36,0)
+ ;
+"RTN","BSDX25",37,0)
+ D ^XBKVAR S X="ERROR^BSDX25",@^%ZOSF("TRAP")
+"RTN","BSDX25",38,0)
+ S BSDXI=0
+"RTN","BSDX25",39,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX25",40,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX25",41,0)
+ S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30)
+"RTN","BSDX25",42,0)
+ I '+BSDXAPTID D ERR("BSDX25: Invalid Appointment ID") Q
+"RTN","BSDX25",43,0)
+ I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR("BSDX08: Invalid Appointment ID") Q
+"RTN","BSDX25",44,0)
+ ; Remove Date formatting v.1.5. Client will send date as FM Date.
+"RTN","BSDX25",45,0)
+ ;S:BSDXCDT["@0000" BSDXCDT=$P(BSDXCDT,"@")
+"RTN","BSDX25",46,0)
+ ;S %DT="T",X=BSDXCDT D ^%DT S BSDXCDT=Y
+"RTN","BSDX25",47,0)
+    S BSDXCDT=+BSDXCDT  ; Strip off zeros if C# sends them
+"RTN","BSDX25",48,0)
+ I BSDXCDT=-1 D ERR(70) Q
+"RTN","BSDX25",49,0)
+ I BSDXCDT>$$NOW^XLFDT S BSDXCDT=$$NOW^XLFDT
+"RTN","BSDX25",50,0)
+ ;Checkin BSDX APPOINTMENT entry
+"RTN","BSDX25",51,0)
+ D BSDXCHK(BSDXAPTID,BSDXCDT)
+"RTN","BSDX25",52,0)
+ S BSDXNOD=^BSDXAPPT(BSDXAPTID,0)
+"RTN","BSDX25",53,0)
+ S BSDXPATID=$P(BSDXNOD,U,5)
+"RTN","BSDX25",54,0)
+ S BSDXSTART=$P(BSDXNOD,U)
+"RTN","BSDX25",55,0)
+ ;
+"RTN","BSDX25",56,0)
+ S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID
+"RTN","BSDX25",57,0)
+ I BSDXSC1]"",$D(^BSDXRES(BSDXSC1,0)) D  I +$G(BSDXZ) D ERR($P(BSDXZ,U,2)) Q
+"RTN","BSDX25",58,0)
+ . S BSDXNOD=^BSDXRES(BSDXSC1,0)
+"RTN","BSDX25",59,0)
+ . S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION
+"RTN","BSDX25",60,0)
+ . I BSDXSC1]"",$D(^SC(BSDXSC1,0)) D APCHK(.BSDXZ,BSDXSC1,BSDXPATID,BSDXCDT,BSDXSTART)
+"RTN","BSDX25",61,0)
+ ;
+"RTN","BSDX25",62,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",63,0)
+ ;S ^BSDXTMP($J,BSDXI)="-1"_$C(30)
+"RTN","BSDX25",64,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)
+"RTN","BSDX25",65,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",66,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX25",67,0)
+ Q
+"RTN","BSDX25",68,0)
+ ;
+"RTN","BSDX25",69,0)
+BSDXCHK(BSDXAPTID,BSDXCDT) ;
+"RTN","BSDX25",70,0)
+ ;
+"RTN","BSDX25",71,0)
+ S BSDXIENS=BSDXAPTID_","
+"RTN","BSDX25",72,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.03)=BSDXCDT
+"RTN","BSDX25",73,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX25",74,0)
+ Q
+"RTN","BSDX25",75,0)
+ ;
+"RTN","BSDX25",76,0)
+APCHK(BSDXZ,BSDXSC1,BSDXDFN,BSDXCDT,BSDXSTART)         ;
+"RTN","BSDX25",77,0)
+ ;Checkin appointment for patient BSDXDFN in clinic BSDXSC1
+"RTN","BSDX25",78,0)
+ ;at time BSDXSTART
+"RTN","BSDX25",79,0)
+ S BSDXZ=$$CHECKIN1^BSDXAPI(BSDXDFN,BSDXSC1,BSDXSTART)
+"RTN","BSDX25",80,0)
+ Q
+"RTN","BSDX25",81,0)
+ ;
+"RTN","BSDX25",82,0)
+CHKEVT(BSDXPAT,BSDXSTART,BSDXSC) ;EP Called by BSDX CHECKIN APPOINTMENT event
+"RTN","BSDX25",83,0)
+ ;when appointments CHECKIN via PIMS interface.
+"RTN","BSDX25",84,0)
+ ;Propagates CHECKIN to BSDXAPPT and raises refresh event to running GUI clients
+"RTN","BSDX25",85,0)
+ ;
+"RTN","BSDX25",86,0)
+ Q:+$G(BSDXNOEV)
+"RTN","BSDX25",87,0)
+ Q:'+$G(BSDXSC)
+"RTN","BSDX25",88,0)
+ N BSDXSTAT,BSDXFOUND,BSDXRES
+"RTN","BSDX25",89,0)
+ S BSDXSTAT=""
+"RTN","BSDX25",90,0)
+ S:$G(SDATA("AFTER","STATUS"))["CHECKED IN" BSDXSTAT=$P(SDATA("AFTER","STATUS"),"^",4)
+"RTN","BSDX25",91,0)
+ S BSDXFOUND=0
+"RTN","BSDX25",92,0)
+ I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$CHKEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX25",93,0)
+ I BSDXFOUND D CHKEVT3(BSDXRES) Q
+"RTN","BSDX25",94,0)
+ I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$CHKEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX25",95,0)
+ I BSDXFOUND D CHKEVT3(BSDXRES)
+"RTN","BSDX25",96,0)
+ Q
+"RTN","BSDX25",97,0)
+ ;
+"RTN","BSDX25",98,0)
+CHKEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT) ;
+"RTN","BSDX25",99,0)
+ ;Get appointment id in BSDXAPT
+"RTN","BSDX25",100,0)
+ ;If found, call BSDXNOS(BSDXAPPT) and return 1
+"RTN","BSDX25",101,0)
+ ;else return 0
+"RTN","BSDX25",102,0)
+ N BSDXFOUND,BSDXAPPT
+"RTN","BSDX25",103,0)
+ S BSDXFOUND=0
+"RTN","BSDX25",104,0)
+ Q:'+$G(BSDXRES) BSDXFOUND
+"RTN","BSDX25",105,0)
+ Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND
+"RTN","BSDX25",106,0)
+ S BSDXAPPT=0 F  S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT  D  Q:BSDXFOUND
+"RTN","BSDX25",107,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""
+"RTN","BSDX25",108,0)
+ . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q
+"RTN","BSDX25",109,0)
+ I BSDXFOUND,+$G(BSDXAPPT) D BSDXCHK(BSDXAPPT,BSDXSTAT)
+"RTN","BSDX25",110,0)
+ Q BSDXFOUND
+"RTN","BSDX25",111,0)
+ ;
+"RTN","BSDX25",112,0)
+CHKEVT3(BSDXRES) ;
+"RTN","BSDX25",113,0)
+ ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX25",114,0)
+ ;
+"RTN","BSDX25",115,0)
+ N BSDXRESN
+"RTN","BSDX25",116,0)
+ S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX25",117,0)
+ Q:BSDXRESN=""
+"RTN","BSDX25",118,0)
+ S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX25",119,0)
+ ;D EVENT^BSDX23("SCHEDULE-"_BSDXRESN,"","","")
+"RTN","BSDX25",120,0)
+ D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX25",121,0)
+ Q
+"RTN","BSDX25",122,0)
+ ;
+"RTN","BSDX25",123,0)
+ERROR ;
+"RTN","BSDX25",124,0)
+ D ERR("RPMS Error")
+"RTN","BSDX25",125,0)
+ Q
+"RTN","BSDX25",126,0)
+ ;
+"RTN","BSDX25",127,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX25",128,0)
+ I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX25",129,0)
+ E  S BSDXERR=ERRNO
+"RTN","BSDX25",130,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",131,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX25",132,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",133,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX25",134,0)
+ Q
+"RTN","BSDX26")
+0^24^B30714245
+"RTN","BSDX26",1,0)
+BSDX26  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:38pm
+"RTN","BSDX26",2,0)
+    ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX26",3,0)
+    ; Change History:
+"RTN","BSDX26",4,0)
+    ; 3101023 - UJO/SMH - Addition of restartable transaction; relocation of tx.
+"RTN","BSDX26",5,0)
+    ; --> Thanks to Zach Gonzalez and Rick Marshall
+"RTN","BSDX26",6,0)
+    ; 3101205 - UJO/SMH - Extensive refactoring.
+"RTN","BSDX26",7,0)
+    ;
+"RTN","BSDX26",8,0)
+    ; Error Reference:
+"RTN","BSDX26",9,0)
+    ; -1: Appt ID is not a number
+"RTN","BSDX26",10,0)
+    ; -2: Appt IEN is not in ^BSDXAPPT
+"RTN","BSDX26",11,0)
+    ; -3: FM Failure to file WP field in ^BSDXAPPT
+"RTN","BSDX26",12,0)
+    ;
+"RTN","BSDX26",13,0)
+EDITAPTD(BSDXY,BSDXAPTID,BSDXNOTE)  ;EP
+"RTN","BSDX26",14,0)
+    ;Entry point for debugging
+"RTN","BSDX26",15,0)
+    ;
+"RTN","BSDX26",16,0)
+    D DEBUG^%Serenji("EDITAPT^BSDX26(.BSDXY,BSDXAPTID,BSDXNOTE)")
+"RTN","BSDX26",17,0)
+    Q
+"RTN","BSDX26",18,0)
+UT ; Unit Tests
+"RTN","BSDX26",19,0)
+    ; Test 1: Make sure this damn thing works
+"RTN","BSDX26",20,0)
+    N ZZZ
+"RTN","BSDX26",21,0)
+    N %H S %H=$H
+"RTN","BSDX26",22,0)
+    N NOTE S NOTE="New Note "_%H
+"RTN","BSDX26",23,0)
+    D EDITAPT(.ZZZ,188,NOTE)
+"RTN","BSDX26",24,0)
+    I ^BSDXAPPT(188,1,1,0)'=NOTE W "ERROR",! B
+"RTN","BSDX26",25,0)
+    ; Test 2: Test Errors -1 and -2
+"RTN","BSDX26",26,0)
+    N ZZZ
+"RTN","BSDX26",27,0)
+    N NOTE S NOTE="Nothing important"
+"RTN","BSDX26",28,0)
+    D EDITAPT(.ZZZ,"BLAHBLAH",NOTE)
+"RTN","BSDX26",29,0)
+    I +^BSDXTMP($J,1)'=-1 W "ERROR IN -1",! B
+"RTN","BSDX26",30,0)
+    D EDITAPT(.ZZZ,298734322,NOTE)
+"RTN","BSDX26",31,0)
+    I +^BSDXTMP($J,1)'=-2 W "ERROR IN -2",! B
+"RTN","BSDX26",32,0)
+    ; Test 4: M Error
+"RTN","BSDX26",33,0)
+    N bsdxdie S bsdxdie=1
+"RTN","BSDX26",34,0)
+    D EDITAPT(.ZZZ,188,NOTE)
+"RTN","BSDX26",35,0)
+    I +^BSDXTMP($J,1)'=-100 W "ERROR IN -100",! B
+"RTN","BSDX26",36,0)
+    k bsdxdie
+"RTN","BSDX26",37,0)
+    ; Test 5: Trestart
+"RTN","BSDX26",38,0)
+    N bsdxrestart S bsdxrestart=1
+"RTN","BSDX26",39,0)
+    N %H S %H=$H
+"RTN","BSDX26",40,0)
+    N NOTE S NOTE="New Note "_%H
+"RTN","BSDX26",41,0)
+    D EDITAPT(.ZZZ,188,NOTE)
+"RTN","BSDX26",42,0)
+    I ^BSDXAPPT(188,1,1,0)'=NOTE W "ERROR in TRESTART",! B
+"RTN","BSDX26",43,0)
+    ; Test 6: for Hosp Location Update
+"RTN","BSDX26",44,0)
+    N DATE S DATE=$$NOW^XLFDT()
+"RTN","BSDX26",45,0)
+    S DATE=$E(DATE,1,12) ; Just get minutes b/c of HL file input transform
+"RTN","BSDX26",46,0)
+    D APPADD^BSDX07(.ZZZ,DATE,DATE+.001,3,"Dr Office",30,"Old Note",1)
+"RTN","BSDX26",47,0)
+    N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX26",48,0)
+    D EDITAPT(.ZZZ,APPID,"New Note")
+"RTN","BSDX26",49,0)
+    I ^BSDXAPPT(APTID,1,1,0)'="New Note" W "Error in HL Section",! B
+"RTN","BSDX26",50,0)
+    I $P(^SC(2,"S",DATE,1,1,0),U,4)'="New Note" W "Error in HL Section",! B
+"RTN","BSDX26",51,0)
+    QUIT
+"RTN","BSDX26",52,0)
+    ;
+"RTN","BSDX26",53,0)
+EDITAPT(BSDXY,BSDXAPTID,BSDXNOTE)   ;EP Edit appointment (only note text can be edited)
+"RTN","BSDX26",54,0)
+    ; Called by RPC: BSDX EDIT APPOINTMENT
+"RTN","BSDX26",55,0)
+    ;
+"RTN","BSDX26",56,0)
+    ; Edits Appointment Text in BSDX APPOINTMENT file & Hosp Location (44) file
+"RTN","BSDX26",57,0)
+    ;
+"RTN","BSDX26",58,0)
+    ; Parameters:
+"RTN","BSDX26",59,0)
+    ; - BSDXY: Global Return (RPC must be set to Global Array)
+"RTN","BSDX26",60,0)
+    ; - BSDXAPTID: Appointment IEN in BSDX APPOINTMENT
+"RTN","BSDX26",61,0)
+    ; - BSDXNOTE: New note
+"RTN","BSDX26",62,0)
+    ;
+"RTN","BSDX26",63,0)
+    ; Return:
+"RTN","BSDX26",64,0)
+    ; ADO.net Recordset having 1 field: ERRORID
+"RTN","BSDX26",65,0)
+    ; If Okay: -1; otherwise, positive integer with message
+"RTN","BSDX26",66,0)
+    ;
+"RTN","BSDX26",67,0)
+    ; Return Array; set Return and clear array
+"RTN","BSDX26",68,0)
+    S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX26",69,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX26",70,0)
+    ; ET
+"RTN","BSDX26",71,0)
+    N $ET S $ET="G ETRAP^BSDX26"
+"RTN","BSDX26",72,0)
+    ; Set up basic DUZ variables
+"RTN","BSDX26",73,0)
+    D ^XBKVAR
+"RTN","BSDX26",74,0)
+    ; Counter
+"RTN","BSDX26",75,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX26",76,0)
+    ; Header Node
+"RTN","BSDX26",77,0)
+    S ^BSDXTMP($J,BSDXI)="T00100ERRORID"_$C(30)
+"RTN","BSDX26",78,0)
+    ; Restartable txn for GT.M. Restored vars are Params + BSDXI.
+"RTN","BSDX26",79,0)
+    TSTART (BSDXY,BSDXAPTID,BSDXNOTE,BSDXI):T="BSDX EDIT APPOINTMENT^BSDX26"
+"RTN","BSDX26",80,0)
+    ;
+"RTN","BSDX26",81,0)
+    ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX26",82,0)
+    I $G(bsdxdie) S X=1/0
+"RTN","BSDX26",83,0)
+    ;;;test
+"RTN","BSDX26",84,0)
+    ;;;test for TRESTART
+"RTN","BSDX26",85,0)
+    I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX26",86,0)
+    ;;;test
+"RTN","BSDX26",87,0)
+    ;
+"RTN","BSDX26",88,0)
+    ; Validate Appointment ID
+"RTN","BSDX26",89,0)
+    I '+BSDXAPTID D ERR(BSDXI,"-1~BSDX26: Invalid Appointment ID") QUIT
+"RTN","BSDX26",90,0)
+    I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(BSDXI,"-2~BSDX26: Invalid Appointment ID") QUIT
+"RTN","BSDX26",91,0)
+    ; Put the WP in decendant fields from the root to file as a WP field
+"RTN","BSDX26",92,0)
+    S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX26",93,0)
+    I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX26",94,0)
+    N BSDXMSG ; Message in case of error in filing.
+"RTN","BSDX26",95,0)
+    I $D(BSDXNOTE(.5)) D
+"RTN","BSDX26",96,0)
+    . D WP^DIE(9002018.4,BSDXAPTID_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX26",97,0)
+    I $D(BSDXMSG) D ERR(BSDXI,"-3~BSDX26: Fileman failure to file data into 9002018.4") QUIT
+"RTN","BSDX26",98,0)
+    ;
+"RTN","BSDX26",99,0)
+    ; Now file in file 44:
+"RTN","BSDX26",100,0)
+    N PTIEN S PTIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".05","I") ; Patient IEN
+"RTN","BSDX26",101,0)
+    N HLIEN S HLIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".07:.04","I") ; HL Location IEN pointed to by Resource ID
+"RTN","BSDX26",102,0)
+    N DATE S DATE=+^BSDXAPPT(BSDXAPTID,0) ; Date of APPT
+"RTN","BSDX26",103,0)
+    N BSDXRES S BSDXRES=0 ; Result
+"RTN","BSDX26",104,0)
+    ; Update Note only if we have a linked hospital location.
+"RTN","BSDX26",105,0)
+    I HLIEN S BSDXRES=$$UPDATENOTE^BSDXAPI(PTIEN,HLIEN,DATE,BSDXNOTE(.5))
+"RTN","BSDX26",106,0)
+    ; If we get an error (denoted by -1 in BSDXRES), return error to client
+"RTN","BSDX26",107,0)
+    I BSDXRES<0 D ERR(BSDXI,"-4~BSDX26: BSDXAPI reports an error: "_BSDXRES) QUIT
+"RTN","BSDX26",108,0)
+    ;Return Recordset
+"RTN","BSDX26",109,0)
+    TCOMMIT
+"RTN","BSDX26",110,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",111,0)
+    S ^BSDXTMP($J,BSDXI)="-1"_$C(30)
+"RTN","BSDX26",112,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",113,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX26",114,0)
+    QUIT
+"RTN","BSDX26",115,0)
+    ;
+"RTN","BSDX26",116,0)
+ERR(BSDXI,BSDXERR)  ;Error processing
+"RTN","BSDX26",117,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",118,0)
+    S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX26",119,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX26",120,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX26",121,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",122,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX26",123,0)
+    QUIT
+"RTN","BSDX26",124,0)
+    ;
+"RTN","BSDX26",125,0)
+ETRAP   ;EP Error trap entry
+"RTN","BSDX26",126,0)
+    N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+"RTN","BSDX26",127,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX26",128,0)
+    D ^%ZTER
+"RTN","BSDX26",129,0)
+    S $EC=""
+"RTN","BSDX26",130,0)
+    I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX26",131,0)
+    D ERR(BSDXI,"-100~BSDX26 Error: "_$G(%ZTERZE))
+"RTN","BSDX26",132,0)
+    Q
+"RTN","BSDX27")
+0^25^B133007616
+"RTN","BSDX27",1,0)
+BSDX27  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 4:52pm
+"RTN","BSDX27",2,0)
+    ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX27",3,0)
+    ; 
+"RTN","BSDX27",4,0)
+    ; Change Log: July 15, 2010
+"RTN","BSDX27",5,0)
+    ; UJO/SMH - i18n: FM Dates passed into routine for Clinic Letters - CLDISP ta
+"RTN","BSDX27",6,0)
+    ; v 1.42 - 3101208 - SMH
+"RTN","BSDX27",7,0)
+    ; - Added check to skip cancelled appointments. Check was forgotten
+"RTN","BSDX27",8,0)
+    ;   in original code.
+"RTN","BSDX27",9,0)
+    ;   . N BSDXFLAGS S BSDXFLAGS=$P(BSDXNOD,U,2)  ; No show and Cancel Flags
+"RTN","BSDX27",10,0)
+    ;   . Q:BSDXFLAGS["C"  ; if appt is cancelled, quit
+"RTN","BSDX27",11,0)
+    ;
+"RTN","BSDX27",12,0)
+    Q
+"RTN","BSDX27",13,0)
+    ;
+"RTN","BSDX27",14,0)
+PADISPD(BSDXY,BSDXPAT)  ;EP
+"RTN","BSDX27",15,0)
+    ;Entry point for debugging
+"RTN","BSDX27",16,0)
+    ;
+"RTN","BSDX27",17,0)
+    ;D DEBUG^%Serenji("PADISP^BSDX27(.BSDXY,BSDXPAT)")
+"RTN","BSDX27",18,0)
+    Q
+"RTN","BSDX27",19,0)
+    ;
+"RTN","BSDX27",20,0)
+PADISP(BSDXY,BSDXPAT)   ;EP
+"RTN","BSDX27",21,0)
+    ;Return recordset of patient appointments used in listing
+"RTN","BSDX27",22,0)
+    ;a patient's appointments and generating patient letters.
+"RTN","BSDX27",23,0)
+    ;Called by rpc BSDX PATIENT APPT DISPLAY
+"RTN","BSDX27",24,0)
+    ;
+"RTN","BSDX27",25,0)
+    ; Sam's Notes:
+"RTN","BSDX27",26,0)
+    ; Relatively complex algorithm.
+"RTN","BSDX27",27,0)
+    ; 1. First, loop through ^DPT(DA,"S", and get all appointments. 
+"RTN","BSDX27",28,0)
+    ;   Exclude cancelled appts. Store in BSDXDPT array.
+"RTN","BSDX27",29,0)
+    ; 2. Go through ^BSDXAPPT("CPAT", (patient index) . 
+"RTN","BSDX27",30,0)
+    ;   Get the info from there and compar with BSDXDPT array. If 
+"RTN","BSDX27",31,0)
+    ;   they are the same, get all info, and rm entry from BSDXDPT array.
+"RTN","BSDX27",32,0)
+    ; 3. If there are any remaining entries in BSDXDPT (PIMS leftovers),
+"RTN","BSDX27",33,0)
+    ;   Get the data from file 2 and 44.
+"RTN","BSDX27",34,0)
+    ;
+"RTN","BSDX27",35,0)
+    N BSDXI,BSDXIEN,BSDXNOD,BSDXNAM,BSDXDOB,BSDXHRN,BSDXSEX,BSDXCNID,BSDXCNOD,BSDXMADE,BSDXCLRK,BSDXNOT,BSDXQ
+"RTN","BSDX27",36,0)
+    N BSDXSTRT
+"RTN","BSDX27",37,0)
+    N BSDXSTRE,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX27",38,0)
+    S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX27",39,0)
+    S BSDXI=0
+"RTN","BSDX27",40,0)
+    S ^BSDXTMP($J,BSDXI)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030ApptDate^T00030Clinic^T00030TypeStatus"
+"RTN","BSDX27",41,0)
+    S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE"_$C(30)
+"RTN","BSDX27",42,0)
+    S X="ERROR^BSDX27",@^%ZOSF("TRAP")
+"RTN","BSDX27",43,0)
+    ;Get patient info
+"RTN","BSDX27",44,0)
+    ;
+"RTN","BSDX27",45,0)
+    I '+BSDXPAT S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX27",46,0)
+    I '$D(^DPT(+BSDXPAT,0)) S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX27",47,0)
+    S BSDXNOD=$$PATINFO(BSDXPAT)
+"RTN","BSDX27",48,0)
+    S BSDXNAM=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX27",49,0)
+    S BSDXSEX=$P(BSDXNOD,U,2) ;SEX
+"RTN","BSDX27",50,0)
+    S BSDXDOB=$P(BSDXNOD,U,3) ;DOB
+"RTN","BSDX27",51,0)
+    S BSDXHRN=$P(BSDXNOD,U,4) ;Health Record Number for location DUZ(2)
+"RTN","BSDX27",52,0)
+    S BSDXSTRE=$P(BSDXNOD,U,5) ;Street
+"RTN","BSDX27",53,0)
+    S BSDXCITY=$P(BSDXNOD,U,6) ;City
+"RTN","BSDX27",54,0)
+    S BSDXST=$P(BSDXNOD,U,7) ;State
+"RTN","BSDX27",55,0)
+    S BSDXZIP=$P(BSDXNOD,U,8) ;zip
+"RTN","BSDX27",56,0)
+    S BSDXPHON=$P(BSDXNOD,U,9) ;homephone
+"RTN","BSDX27",57,0)
+    ;
+"RTN","BSDX27",58,0)
+    ;Organize ^DPT(BSDXPAT,"S," nodes
+"RTN","BSDX27",59,0)
+    ; into BSDXDPT(CLINIC,DATE)
+"RTN","BSDX27",60,0)
+    ;
+"RTN","BSDX27",61,0)
+    I $D(^DPT(BSDXPAT,"S")) S BSDXDT=0 F  S BSDXDT=$O(^DPT(BSDXPAT,"S",BSDXDT)) Q:'+BSDXDT  D
+"RTN","BSDX27",62,0)
+    . S BSDXNOD=$G(^DPT(BSDXPAT,"S",BSDXDT,0))
+"RTN","BSDX27",63,0)
+    . S BSDXCID=$P(BSDXNOD,U)
+"RTN","BSDX27",64,0)
+    . Q:'+BSDXCID
+"RTN","BSDX27",65,0)
+    . Q:'$D(^SC(BSDXCID,0))
+"RTN","BSDX27",66,0)
+    . N BSDXFLAGS S BSDXFLAGS=$P(BSDXNOD,U,2)  ; No show and Cancel Flags
+"RTN","BSDX27",67,0)
+    . Q:BSDXFLAGS["C"  ; if appt is cancelled, quit
+"RTN","BSDX27",68,0)
+    . S BSDXDPT(BSDXCID,BSDXDT)=BSDXNOD
+"RTN","BSDX27",69,0)
+    ;
+"RTN","BSDX27",70,0)
+    ;$O Through ^BSDX("CPAT",
+"RTN","BSDX27",71,0)
+    S BSDXIEN=0
+"RTN","BSDX27",72,0)
+    I $D(^BSDXAPPT("CPAT",BSDXPAT)) F  S BSDXIEN=$O(^BSDXAPPT("CPAT",BSDXPAT,BSDXIEN)) Q:'BSDXIEN  D
+"RTN","BSDX27",73,0)
+    . N BSDXNOD,BSDXAPT,BSDXCID,BSDXCNOD,BSDXCLN,BSDX44,BSDXDNOD,BSDXSTAT,BSDX,BSDXTYPE,BSDXLIN
+"RTN","BSDX27",74,0)
+    . S BSDXNOD=$G(^BSDXAPPT(BSDXIEN,0))
+"RTN","BSDX27",75,0)
+    . Q:BSDXNOD=""
+"RTN","BSDX27",76,0)
+    . Q:$P(BSDXNOD,U,12)]""  ;CANCELLED
+"RTN","BSDX27",77,0)
+    . S Y=$P(BSDXNOD,U)
+"RTN","BSDX27",78,0)
+    . Q:'+Y
+"RTN","BSDX27",79,0)
+    . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",80,0)
+    . S BSDXAPT=Y ;Appointment date time
+"RTN","BSDX27",81,0)
+    . S BSDXCLRK=$P(BSDXNOD,U,8) ;Appointment made by
+"RTN","BSDX27",82,0)
+    . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX27",83,0)
+    . S Y=$P(BSDXNOD,U,9) ;Date Appointment Made
+"RTN","BSDX27",84,0)
+    . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",85,0)
+    . S BSDXMADE=Y
+"RTN","BSDX27",86,0)
+    . ;NOTE
+"RTN","BSDX27",87,0)
+    . S BSDXNOT=""
+"RTN","BSDX27",88,0)
+    . I $D(^BSDXAPPT(BSDXIEN,1,0)) S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXIEN,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX27",89,0)
+    . . S BSDXLIN=$G(^BSDXAPPT(BSDXIEN,1,BSDXQ,0))
+"RTN","BSDX27",90,0)
+    . . S:(BSDXLIN'="")&($E(BSDXLIN,$L(BSDXLIN)-1,$L(BSDXLIN))'=" ") BSDXLIN=BSDXLIN_" "
+"RTN","BSDX27",91,0)
+    . . S BSDXNOT=BSDXNOT_BSDXLIN
+"RTN","BSDX27",92,0)
+    . ;Resource
+"RTN","BSDX27",93,0)
+    . S BSDXCID=$P(BSDXNOD,U,7) ;IEN of BSDX RESOURCE
+"RTN","BSDX27",94,0)
+    . Q:'+BSDXCID
+"RTN","BSDX27",95,0)
+    . Q:'$D(^BSDXRES(BSDXCID,0))
+"RTN","BSDX27",96,0)
+    . S BSDXCNOD=$G(^BSDXRES(BSDXCID,0)) ;BSDX RESOURCE node
+"RTN","BSDX27",97,0)
+    . Q:BSDXCNOD=""
+"RTN","BSDX27",98,0)
+    . S BSDXCLN=$P(BSDXCNOD,U) ;Text name of BSDX Resource
+"RTN","BSDX27",99,0)
+    . S BSDX44=$P(BSDXCNOD,U,4) ;File 44 pointer
+"RTN","BSDX27",100,0)
+    . ;If appt entry in ^DPT(PAT,"S" exists for this clinic, get the TYPE/STATUS info from
+"RTN","BSDX27",101,0)
+    . ;the BSDXDPT array and delete the BSDXDPT node
+"RTN","BSDX27",102,0)
+    . S BSDXTYPE=""
+"RTN","BSDX27",103,0)
+    . I +BSDX44,$D(BSDXDPT(BSDX44,$P(BSDXNOD,U))) D  ;BSDXNOD is the BSDX APPOINTMENT node
+"RTN","BSDX27",104,0)
+    . . S BSDXDNOD=BSDXDPT(BSDX44,$P(BSDXNOD,U)) ;BSDXDNOD is a copy of the ^DPT(PAT,"S" node
+"RTN","BSDX27",105,0)
+    . . S BSDXTYPE=$$STATUS(BSDXPAT,$P(BSDXNOD,U),BSDXDNOD) ;IHS/OIT/HMW 20050208 Added
+"RTN","BSDX27",106,0)
+    . . K BSDXDPT(BSDX44,$P(BSDXNOD,U))
+"RTN","BSDX27",107,0)
+    . S BSDXI=BSDXI+1
+"RTN","BSDX27",108,0)
+    . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXAPT_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_BSDXCID_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_$C(30)
+"RTN","BSDX27",109,0)
+    . Q
+"RTN","BSDX27",110,0)
+    ;
+"RTN","BSDX27",111,0)
+    ;Go through remaining BSDXDPT( entries
+"RTN","BSDX27",112,0)
+    I $D(BSDXDPT) S BSDX44=0 D
+"RTN","BSDX27",113,0)
+    . F  S BSDX44=$O(BSDXDPT(BSDX44)) Q:'+BSDX44  S BSDXDT=0 D
+"RTN","BSDX27",114,0)
+    . . F  S BSDXDT=$O(BSDXDPT(BSDX44,BSDXDT)) Q:'+BSDXDT  D
+"RTN","BSDX27",115,0)
+    . . . S BSDXDNOD=BSDXDPT(BSDX44,BSDXDT)
+"RTN","BSDX27",116,0)
+    . . . S Y=BSDXDT
+"RTN","BSDX27",117,0)
+    . . . Q:'+Y
+"RTN","BSDX27",118,0)
+    . . . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",119,0)
+    . . . S BSDXAPT=Y
+"RTN","BSDX27",120,0)
+    . . . S BSDXTYPE=$$STATUS(BSDXPAT,BSDXDT,BSDXDNOD) ;IHS/OIT/HMW 20050208 Added
+"RTN","BSDX27",121,0)
+    . . . S BSDXCLN=$P($G(^SC(BSDX44,0)),U)
+"RTN","BSDX27",122,0)
+    . . . S BSDXCLRK=$P(BSDXDNOD,U,18)
+"RTN","BSDX27",123,0)
+    . . . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX27",124,0)
+    . . . S Y=$P(BSDXDNOD,U,19)
+"RTN","BSDX27",125,0)
+    . . . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",126,0)
+    . . . S BSDXMADE=Y
+"RTN","BSDX27",127,0)
+    . . . S BSDXNOT=""
+"RTN","BSDX27",128,0)
+    . . . S BSDXI=BSDXI+1
+"RTN","BSDX27",129,0)
+    . . . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXAPT_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_$C(30)
+"RTN","BSDX27",130,0)
+    . . . K BSDXDPT(BSDX44,BSDXDT)
+"RTN","BSDX27",131,0)
+    ;
+"RTN","BSDX27",132,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",133,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX27",134,0)
+    Q
+"RTN","BSDX27",135,0)
+    ;
+"RTN","BSDX27",136,0)
+STATUS(PAT,DATE,NODE)   ; returns appt status
+"RTN","BSDX27",137,0)
+    ;IHS/OIT/HMW 20050208 Added from BSDDPA
+"RTN","BSDX27",138,0)
+    NEW TYP
+"RTN","BSDX27",139,0)
+    S TYP=$$APPTYP^BSDXAPI(PAT,DATE)    ;sched vs. walkin
+"RTN","BSDX27",140,0)
+    I $P(NODE,U,2)["C" Q TYP_" - CANCELLED"
+"RTN","BSDX27",141,0)
+    I $P(NODE,U,2)'="NT",$P(NODE,U,2)["N" Q TYP_" - NO SHOW"
+"RTN","BSDX27",142,0)
+    I $$CO^BSDXAPI(PAT,+NODE,DATE) Q TYP_" - CHECKED OUT"
+"RTN","BSDX27",143,0)
+    I $$CI^BSDXAPI(PAT,+NODE,DATE) Q TYP_" - CHECKED IN"
+"RTN","BSDX27",144,0)
+    Q TYP
+"RTN","BSDX27",145,0)
+    ;
+"RTN","BSDX27",146,0)
+ERROR   ;
+"RTN","BSDX27",147,0)
+    D ERR(BSDXI,"RPMS Error")
+"RTN","BSDX27",148,0)
+    Q
+"RTN","BSDX27",149,0)
+    ;
+"RTN","BSDX27",150,0)
+ERR(BSDXI,ERRNO,MSG)    ;Error processing
+"RTN","BSDX27",151,0)
+    S:'$D(BSDXI) BSDXI=999
+"RTN","BSDX27",152,0)
+    I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX27",153,0)
+    E  S BSDXERR=ERRNO
+"RTN","BSDX27",154,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",155,0)
+    S ^BSDXTMP($J,BSDXI)=MSG_"^^^^^^^^^^^^^^^"_$C(30)
+"RTN","BSDX27",156,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",157,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX27",158,0)
+    Q
+"RTN","BSDX27",159,0)
+PATINFO(BSDXPAT)    ;EP
+"RTN","BSDX27",160,0)
+    ;Intrisic Function returns NAME^SEX^DOB^HRN^STREET^CITY^STATE^ZIP^PHONE for patient ien BSDXPAT
+"RTN","BSDX27",161,0)
+    ;DOB is in external format
+"RTN","BSDX27",162,0)
+    ;HRN depends on existence of DUZ(2)
+"RTN","BSDX27",163,0)
+    ;
+"RTN","BSDX27",164,0)
+    N BSDXNOD,BSDXNAM,BSDXSEX,BSDXDOB,BSDXHRN,BSDXSTRT,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX27",165,0)
+    S BSDXNOD=^DPT(+BSDXPAT,0)
+"RTN","BSDX27",166,0)
+    S BSDXNAM=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX27",167,0)
+    S BSDXSEX=$P(BSDXNOD,U,2)
+"RTN","BSDX27",168,0)
+    S BSDXSEX=$S(BSDXSEX="F":"FEMALE",BSDXSEX="M":"MALE",1:"")
+"RTN","BSDX27",169,0)
+    S Y=$P(BSDXNOD,U,3) I Y]""  X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",170,0)
+    S BSDXDOB=Y ;DOB
+"RTN","BSDX27",171,0)
+    S BSDXHRN=""
+"RTN","BSDX27",172,0)
+    I $D(DUZ(2)) I DUZ(2)>0 S BSDXHRN=$P($G(^AUPNPAT(BSDXPAT,41,DUZ(2),0)),U,2) ;HRN
+"RTN","BSDX27",173,0)
+    ;
+"RTN","BSDX27",174,0)
+    S BSDXNOD=$G(^DPT(+BSDXPAT,.11))
+"RTN","BSDX27",175,0)
+    S (BSDXSTRT,BSDXCITY,BSDXST,BSDXZIP)=""
+"RTN","BSDX27",176,0)
+    I BSDXNOD]"" D
+"RTN","BSDX27",177,0)
+    . S BSDXSTRT=$E($P(BSDXNOD,U),1,50) ;STREET
+"RTN","BSDX27",178,0)
+    . S BSDXCITY=$P(BSDXNOD,U,4) ;CITY
+"RTN","BSDX27",179,0)
+    . S BSDXST=$P(BSDXNOD,U,5) ;STATE
+"RTN","BSDX27",180,0)
+    . I +BSDXST,$D(^DIC(5,+BSDXST,0)) S BSDXST=$P(^DIC(5,+BSDXST,0),U,2)
+"RTN","BSDX27",181,0)
+    . S BSDXZIP=$P(BSDXNOD,U,6) ;ZIP
+"RTN","BSDX27",182,0)
+    ;
+"RTN","BSDX27",183,0)
+    S BSDXNOD=$G(^DPT(+BSDXPAT,.13)) ;PHONE
+"RTN","BSDX27",184,0)
+    S BSDXPHON=$P(BSDXNOD,U)
+"RTN","BSDX27",185,0)
+    ;
+"RTN","BSDX27",186,0)
+    Q BSDXNAM_U_BSDXSEX_U_BSDXDOB_U_BSDXHRN_U_BSDXSTRT_U_BSDXCITY_U_BSDXST_U_BSDXZIP_U_BSDXPHON
+"RTN","BSDX27",187,0)
+    ;
+"RTN","BSDX27",188,0)
+CLDISPD(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX27",189,0)
+    ;Entry point for debugging
+"RTN","BSDX27",190,0)
+    ;
+"RTN","BSDX27",191,0)
+    ;D DEBUG^%Serenji("CLDISP^BSDX27(.BSDXY,BSDXCLST,BSDXBEG,BSDXEND)")
+"RTN","BSDX27",192,0)
+    Q
+"RTN","BSDX27",193,0)
+    ;
+"RTN","BSDX27",194,0)
+CLDISP(BSDXY,BSDXCLST,BSDXBEG,BSDXEND)  ;EP
+"RTN","BSDX27",195,0)
+    ;
+"RTN","BSDX27",196,0)
+    ;Return recordset of patient appointments
+"RTN","BSDX27",197,0)
+    ;between dates BSDXBEG and BSDXEND for each clinic in BSDXCLST.
+"RTN","BSDX27",198,0)
+    ;Used in listing a patient's appointments and generating patient letters.
+"RTN","BSDX27",199,0)
+    ;BSDXCLST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX27",200,0)
+    ;BSDXBEG and BSDXEND are in external date form.
+"RTN","BSDX27",201,0)
+    ;Called by BSDX CLINIC LETTERS
+"RTN","BSDX27",202,0)
+    ;
+"RTN","BSDX27",203,0)
+       ; July 10, 2010 -- to support i18n, we pass dates from client in
+"RTN","BSDX27",204,0)
+       ; locale-neutral Fileman format. No need to convert it.
+"RTN","BSDX27",205,0)
+    N BSDXI,BSDXNOD,BSDXNAM,BSDXDOB,BSDXHRN,BSDXSEX,BSDXCID,BSDXCNOD,BSDXDT
+"RTN","BSDX27",206,0)
+    N BSDXJ,BSDXAID,BSDXPAT,BSDXPNOD,BSDXCLN,BSDXCLRK,BSDXMADE,BSDXNOT,BSDXLIN
+"RTN","BSDX27",207,0)
+    N BSDXSTRT
+"RTN","BSDX27",208,0)
+    N BSDXSTRE,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX27",209,0)
+    S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX27",210,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX27",211,0)
+    S BSDXI=0
+"RTN","BSDX27",212,0)
+    S ^BSDXTMP($J,BSDXI)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030ApptDate^T00030Clinic^T00030TypeStatus"
+"RTN","BSDX27",213,0)
+    S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE"_$C(30)
+"RTN","BSDX27",214,0)
+    S X="ERROR^BSDX27",@^%ZOSF("TRAP")
+"RTN","BSDX27",215,0)
+    ;
+"RTN","BSDX27",216,0)
+    ;Convert beginning and ending dates
+"RTN","BSDX27",217,0)
+    ;
+"RTN","BSDX27",218,0)
+    S BSDXBEG=BSDXBEG-1,BSDXBEG=BSDXBEG_".9999"
+"RTN","BSDX27",219,0)
+    S BSDXEND=BSDXEND_".9999"
+"RTN","BSDX27",220,0)
+    I BSDXCLST="" D ERR(BSDXI,0,"Routine: BSDX27, Error: Null clinic list") Q
+"RTN","BSDX27",221,0)
+    ;
+"RTN","BSDX27",222,0)
+    ;For each clinic in BSDXCLST $O through ^BSDXAPPT("ARSRC",ResourceIEN,FMDate,ApptIEN)
+"RTN","BSDX27",223,0)
+    ;
+"RTN","BSDX27",224,0)
+    F BSDXJ=1:1:$L(BSDXCLST,"|")-1 S BSDXCID=$P(BSDXCLST,"|",BSDXJ) D
+"RTN","BSDX27",225,0)
+    . S BSDXCLN=$G(^BSDXRES(BSDXCID,0)) S BSDXCLN=$P(BSDXCLN,U) Q:BSDXCLN=""
+"RTN","BSDX27",226,0)
+    . S BSDXSTRT=BSDXBEG F  S BSDXSTRT=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT)) Q:'+BSDXSTRT  Q:BSDXSTRT>BSDXEND  D
+"RTN","BSDX27",227,0)
+    . . S BSDXAID=0 F  S BSDXAID=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT,BSDXAID)) Q:'+BSDXAID  D
+"RTN","BSDX27",228,0)
+    . . . S BSDXNOD=$G(^BSDXAPPT(BSDXAID,0))
+"RTN","BSDX27",229,0)
+    . . . Q:BSDXNOD=""
+"RTN","BSDX27",230,0)
+    . . . Q:$P(BSDXNOD,U,12)]""  ;CANCELLED
+"RTN","BSDX27",231,0)
+    . . . Q:$P(BSDXNOD,U,13)="y"  ;WALKIN
+"RTN","BSDX27",232,0)
+    . . . S Y=$P(BSDXNOD,U)
+"RTN","BSDX27",233,0)
+    . . . Q:'+Y
+"RTN","BSDX27",234,0)
+    . . . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",235,0)
+    . . . S BSDXAPT=Y ;Appointment date time
+"RTN","BSDX27",236,0)
+    . . . ;
+"RTN","BSDX27",237,0)
+    . . . ;NOTE
+"RTN","BSDX27",238,0)
+    . . . S BSDXNOT=""
+"RTN","BSDX27",239,0)
+    . . . I $D(^BSDXAPPT(BSDXAID,1,0)) S BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXAID,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX27",240,0)
+    . . . . S BSDXLIN=$G(^BSDXAPPT(BSDXAID,1,BSDXQ,0))
+"RTN","BSDX27",241,0)
+    . . . . S:(BSDXLIN'="")&($E(BSDXLIN,$L(BSDXLIN)-1,$L(BSDXLIN))'=" ") BSDXLIN=BSDXLIN_" "
+"RTN","BSDX27",242,0)
+    . . . . S BSDXNOT=BSDXNOT_BSDXLIN
+"RTN","BSDX27",243,0)
+    . . . ;
+"RTN","BSDX27",244,0)
+    . . . S BSDXPAT=$P(BSDXNOD,U,5)
+"RTN","BSDX27",245,0)
+    . . . S BSDXPNOD=$$PATINFO(BSDXPAT)
+"RTN","BSDX27",246,0)
+    . . . S BSDXNAM=$P(BSDXPNOD,U) ;NAME
+"RTN","BSDX27",247,0)
+    . . . S BSDXSEX=$P(BSDXPNOD,U,2) ;SEX
+"RTN","BSDX27",248,0)
+    . . . S BSDXDOB=$P(BSDXPNOD,U,3) ;DOB
+"RTN","BSDX27",249,0)
+    . . . S BSDXHRN=$P(BSDXPNOD,U,4) ;Health Record Number for location DUZ(2)
+"RTN","BSDX27",250,0)
+    . . . S BSDXSTRE=$P(BSDXPNOD,U,5) ;Street
+"RTN","BSDX27",251,0)
+    . . . S BSDXCITY=$P(BSDXPNOD,U,6) ;City
+"RTN","BSDX27",252,0)
+    . . . S BSDXST=$P(BSDXPNOD,U,7) ;State
+"RTN","BSDX27",253,0)
+    . . . S BSDXZIP=$P(BSDXPNOD,U,8) ;zip
+"RTN","BSDX27",254,0)
+    . . . S BSDXPHON=$P(BSDXPNOD,U,9) ;homephone
+"RTN","BSDX27",255,0)
+    . . . S BSDXTYPE="" ;Type/status doesn't exist for BSDX APPT clinics and it's not needed for clinic letters
+"RTN","BSDX27",256,0)
+    . . . S BSDXCLRK=$P(BSDXNOD,U,8)
+"RTN","BSDX27",257,0)
+    . . . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX27",258,0)
+    . . . S Y=$P(BSDXNOD,U,9)
+"RTN","BSDX27",259,0)
+    . . . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",260,0)
+    . . . S BSDXMADE=Y
+"RTN","BSDX27",261,0)
+    . . . S BSDXI=BSDXI+1
+"RTN","BSDX27",262,0)
+    . . . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXAPT_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_BSDXCID_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_$C(30)
+"RTN","BSDX27",263,0)
+    ;
+"RTN","BSDX27",264,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",265,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX27",266,0)
+    Q
+"RTN","BSDX28")
+0^26^B32389827
+"RTN","BSDX28",1,0)
+BSDX28 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/18/10 2:30pm
+"RTN","BSDX28",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX28",3,0)
+ ; 
+"RTN","BSDX28",4,0)
+    ; Change Log:
+"RTN","BSDX28",5,0)
+ ; HMW 3050721 Added test for inactivated record
+"RTN","BSDX28",6,0)
+    ; V1.3 WV/SMH 3100714 
+"RTN","BSDX28",7,0)
+    ; - add PID search
+"RTN","BSDX28",8,0)
+    ; - return PID instead of SSN (change header and logic)
+"RTN","BSDX28",9,0)
+    ; - Change Error trap to new style.
+"RTN","BSDX28",10,0)
+ ;
+"RTN","BSDX28",11,0)
+PTLOOKRS(BSDXY,BSDXP,BSDXC)  ;EP Patient Lookup
+"RTN","BSDX28",12,0)
+ ;
+"RTN","BSDX28",13,0)
+ ;Find up to BSDXC patients matching BSDXP*
+"RTN","BSDX28",14,0)
+ ;Supports DOB Lookup, Primary Long ID lookup
+"RTN","BSDX28",15,0)
+ ;
+"RTN","BSDX28",16,0)
+ N $ET S $ET="G ERROR^BSDX28"
+"RTN","BSDX28",17,0)
+    ; rm ctrl chars
+"RTN","BSDX28",18,0)
+ S BSDXP=$TR(BSDXP,$C(13),"")
+"RTN","BSDX28",19,0)
+ S BSDXP=$TR(BSDXP,$C(10),"")
+"RTN","BSDX28",20,0)
+ S BSDXP=$TR(BSDXP,$C(9),"")
+"RTN","BSDX28",21,0)
+    ; num of pts to find
+"RTN","BSDX28",22,0)
+ S:BSDXC="" BSDXC=10
+"RTN","BSDX28",23,0)
+ N BSDXHRN,BSDXZ,BSDXDLIM,BSDXRET,BSDXDPT,BSDXRET,BSDXIEN,BSDXFILE
+"RTN","BSDX28",24,0)
+ N BSDXIENS,BSDXFIELDS,BSDXFLAGS,BSDXVALUE,BSDXNUMBER,BSDXINDEXES,BSDXSCREEN
+"RTN","BSDX28",25,0)
+ N BSDXTARG,BSDXMSG,BSDXRSLT
+"RTN","BSDX28",26,0)
+ S BSDXDLIM="^"
+"RTN","BSDX28",27,0)
+ S BSDXRET="T00030NAME^T00030HRN^T00030PID^D00030DOB^T00030IEN"_$C(30)
+"RTN","BSDX28",28,0)
+ I '+$G(DUZ) S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",29,0)
+ I '$D(DUZ(2)) S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",30,0)
+ 
+"RTN","BSDX28",31,0)
+PID ;PID Lookup
+"RTN","BSDX28",32,0)
+    ; If this ID exists, go get it. If "UJOPID" index doesn't exist,
+"RTN","BSDX28",33,0)
+    ; won't work anyways.
+"RTN","BSDX28",34,0)
+    I $D(^DPT("UJOPID",BSDXP)) DO  SET BSDXY=BSDXRET_$C(31) QUIT
+"RTN","BSDX28",35,0)
+    . S BSDXIEN=$O(^DPT("UJOPID",BSDXP,""))
+"RTN","BSDX28",36,0)
+    . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",37,0)
+    . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",38,0)
+    . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",39,0)
+    . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",40,0)
+    . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",41,0)
+    . ; Inactivated Chart get an *
+"RTN","BSDX28",42,0)
+    . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q
+"RTN","BSDX28",43,0)
+    . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",44,0)
+    . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",45,0)
+    . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",46,0)
+    . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",47,0)
+    . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",48,0)
+    . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",49,0)
+ ;
+"RTN","BSDX28",50,0)
+DOB ;DOB Lookup
+"RTN","BSDX28",51,0)
+ I +DUZ(2),((BSDXP?1.2N1"/"1.2N1"/"1.4N)!(BSDXP?1.2N1" "1.2N1" "1.4N)!(BSDXP?1.2N1"-"1.2N1"-"1.4N)) D  S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",52,0)
+ . S X=BSDXP S %DT="P" D ^%DT S BSDXP=Y Q:'+Y
+"RTN","BSDX28",53,0)
+ . Q:'$D(^DPT("ADOB",BSDXP))
+"RTN","BSDX28",54,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^DPT("ADOB",BSDXP,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX28",55,0)
+ . . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",56,0)
+ . . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",57,0)
+ . . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",58,0)
+ . . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",59,0)
+ . . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",60,0)
+ . . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",61,0)
+ . . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",62,0)
+    . . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",63,0)
+ . . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",64,0)
+ . . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",65,0)
+ . . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",66,0)
+ . . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",67,0)
+ . . Q
+"RTN","BSDX28",68,0)
+ . Q
+"RTN","BSDX28",69,0)
+ ;
+"RTN","BSDX28",70,0)
+CHART 
+"RTN","BSDX28",71,0)
+    ;Chart# Lookup
+"RTN","BSDX28",72,0)
+ I +DUZ(2),BSDXP]"",$D(^AUPNPAT("D",BSDXP)) D  S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",73,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^AUPNPAT("D",BSDXP,BSDXIEN)) Q:'+BSDXIEN  I $D(^AUPNPAT("D",BSDXP,BSDXIEN,DUZ(2))) D  Q
+"RTN","BSDX28",74,0)
+ . . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",75,0)
+ . . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",76,0)
+ . . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",77,0)
+ . . S BSDXHRN=BSDXP ;CHART
+"RTN","BSDX28",78,0)
+ . . I $D(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),$P(^(0),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",79,0)
+ . . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",80,0)
+    . . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",81,0)
+ . . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",82,0)
+ . . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",83,0)
+ . . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",84,0)
+ . . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",85,0)
+ . . Q
+"RTN","BSDX28",86,0)
+ . Q
+"RTN","BSDX28",87,0)
+    ;
+"RTN","BSDX28",88,0)
+SSN ;SSN Lookup
+"RTN","BSDX28",89,0)
+ I (BSDXP?9N)!(BSDXP?3N1"-"2N1"-"4N),$D(^DPT("SSN",BSDXP)) D  S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",90,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^DPT("SSN",BSDXP,BSDXIEN)) Q:'+BSDXIEN  D  Q
+"RTN","BSDX28",91,0)
+ . . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",92,0)
+ . . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",93,0)
+ . . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",94,0)
+ . . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",95,0)
+ . . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",96,0)
+ . . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",97,0)
+ . . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",98,0)
+    . . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",99,0)
+ . . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",100,0)
+ . . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",101,0)
+ . . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",102,0)
+ . . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",103,0)
+ . . Q
+"RTN","BSDX28",104,0)
+ . Q
+"RTN","BSDX28",105,0)
+ ;
+"RTN","BSDX28",106,0)
+ S BSDXFILE=9000001
+"RTN","BSDX28",107,0)
+ S BSDXIENS=""
+"RTN","BSDX28",108,0)
+ S BSDXFIELDS=".01"
+"RTN","BSDX28",109,0)
+ S BSDXFLAGS="M"
+"RTN","BSDX28",110,0)
+ S BSDXVALUE=BSDXP
+"RTN","BSDX28",111,0)
+ S BSDXNUMBER=BSDXC
+"RTN","BSDX28",112,0)
+ S BSDXINDEXES=""
+"RTN","BSDX28",113,0)
+ S BSDXSCREEN=$S(+DUZ(2):"I $D(^AUPNPAT(Y,41,DUZ(2),0))",1:"")
+"RTN","BSDX28",114,0)
+ S BSDXIDEN=""
+"RTN","BSDX28",115,0)
+ S BSDXTARG="BSDXRSLT"
+"RTN","BSDX28",116,0)
+ S BSDXMSG=""
+"RTN","BSDX28",117,0)
+ D FIND^DIC(BSDXFILE,BSDXIENS,BSDXFIELDS,BSDXFLAGS,BSDXVALUE,BSDXNUMBER,BSDXINDEXES,BSDXSCREEN,BSDXIDEN,BSDXTARG,BSDXMSG)
+"RTN","BSDX28",118,0)
+ I '+$G(BSDXRSLT("DILIST",0)) S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",119,0)
+ N BSDXCNT S BSDXCNT=2
+"RTN","BSDX28",120,0)
+ F BSDXX=1:1:$P(BSDXRSLT("DILIST",0),U) D
+"RTN","BSDX28",121,0)
+ . S BSDXIEN=BSDXRSLT("DILIST",2,BSDXX)
+"RTN","BSDX28",122,0)
+ . S BSDXZ=BSDXRSLT("DILIST","ID",BSDXX,.01) ;NAME
+"RTN","BSDX28",123,0)
+ . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",124,0)
+ . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",125,0)
+ . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",126,0)
+ . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",127,0)
+ . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",128,0)
+    . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",129,0)
+ . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",130,0)
+ . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",131,0)
+ . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",132,0)
+ . S $P(BSDXRET,$C(30),BSDXCNT)=BSDXZ
+"RTN","BSDX28",133,0)
+ . S BSDXCNT=BSDXCNT+1
+"RTN","BSDX28",134,0)
+ . Q
+"RTN","BSDX28",135,0)
+ S BSDXY=BSDXRET_$C(30)_$C(31)
+"RTN","BSDX28",136,0)
+ Q
+"RTN","BSDX28",137,0)
+ ;
+"RTN","BSDX28",138,0)
+ERROR ;
+"RTN","BSDX28",139,0)
+ D ERR("RPMS Error")
+"RTN","BSDX28",140,0)
+ Q
+"RTN","BSDX28",141,0)
+ ;
+"RTN","BSDX28",142,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX28",143,0)
+ S BSDXRET="T00030NAME^T00030HRN^T00030SSN^D00030DOB^T00030IEN"_$C(30)_"^^^^"_$C(30)_$C(31)
+"RTN","BSDX28",144,0)
+ Q
+"RTN","BSDX29")
+0^27^B51424449
+"RTN","BSDX29",1,0)
+BSDX29 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:39pm
+"RTN","BSDX29",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX29",3,0)
+ ; 
+"RTN","BSDX29",4,0)
+ ; Change Log:
+"RTN","BSDX29",5,0)
+ ; v1.3 by WV/SMH on 3100713
+"RTN","BSDX29",6,0)
+ ; - Beginning and Ending dates passed as FM Dates
+"RTN","BSDX29",7,0)
+    ; v1.42 by WV/SMH on 3101023
+"RTN","BSDX29",8,0)
+    ; - Transaction moved; now restartable too.
+"RTN","BSDX29",9,0)
+    ; --> Thanks to Zach Gonzalez and Rick Marshall.
+"RTN","BSDX29",10,0)
+    ; - Refactoring of major portions of routine
+"RTN","BSDX29",11,0)
+ ;
+"RTN","BSDX29",12,0)
+BSDXCPD(BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX29",13,0)
+ ;Entry point for debugging
+"RTN","BSDX29",14,0)
+ ;
+"RTN","BSDX29",15,0)
+ D DEBUG^%Serenji("BSDXCP^BSDX29(.BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND)")
+"RTN","BSDX29",16,0)
+ Q
+"RTN","BSDX29",17,0)
+ ;
+"RTN","BSDX29",18,0)
+BSDXCP(BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX29",19,0)
+ ;Copy appointments from HOSPITAL LOCATION entry BSDX44 to BSDX RESOURCE entry BSDXRES
+"RTN","BSDX29",20,0)
+ ;Beginning with appointments on day BSDXBEG and ending on BSDXEND, inclusive
+"RTN","BSDX29",21,0)
+    ;Called by RPC: BSDX COPY APPOINTMENTS
+"RTN","BSDX29",22,0)
+ ;
+"RTN","BSDX29",23,0)
+    ; Parameters:
+"RTN","BSDX29",24,0)
+    ; - BSDXY: Global Return
+"RTN","BSDX29",25,0)
+    ; - BSDXRES: BSDX RESOURCE to copy appointments to
+"RTN","BSDX29",26,0)
+    ; - BSDX44: Hospital Location IEN to copy appointments from
+"RTN","BSDX29",27,0)
+    ; - BSDXBEG: Beginning Date in FM Format
+"RTN","BSDX29",28,0)
+    ; - BSDXEND: End Date in FM Format
+"RTN","BSDX29",29,0)
+    ;
+"RTN","BSDX29",30,0)
+ ;Returns ADO Recordset containing TASK_NUMBER and ERRORID
+"RTN","BSDX29",31,0)
+ ;
+"RTN","BSDX29",32,0)
+    ; Return Array
+"RTN","BSDX29",33,0)
+ S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX29",34,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX29",35,0)
+    ; $ET
+"RTN","BSDX29",36,0)
+    N $ET S $ET="G ETRAP^BSDX29"
+"RTN","BSDX29",37,0)
+ ; Counter
+"RTN","BSDX29",38,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX29",39,0)
+    ; Header Node
+"RTN","BSDX29",40,0)
+ S ^BSDXTMP($J,0)="T00010TASK_NUMBER^T00100ERRORID"_$C(30)
+"RTN","BSDX29",41,0)
+ ;
+"RTN","BSDX29",42,0)
+    ; Make dates inclusive; add 1 to FM dates
+"RTN","BSDX29",43,0)
+    S BSDXBEG=BSDXBEG-1
+"RTN","BSDX29",44,0)
+ S BSDXEND=BSDXEND+1
+"RTN","BSDX29",45,0)
+ ;
+"RTN","BSDX29",46,0)
+    ; Taskman variables
+"RTN","BSDX29",47,0)
+    N ZTSK,ZTRTN,ZTDTH,ZTDESC,ZTSAVE 
+"RTN","BSDX29",48,0)
+ ; Task Load
+"RTN","BSDX29",49,0)
+ S ZTRTN="ZTM^BSDX29",ZTDTH=$H,ZTDESC="COPY PATIENT APPTS"
+"RTN","BSDX29",50,0)
+ S ZTSAVE("BSDXBEG")="",ZTSAVE("BSDXEND")="",ZTSAVE("BSDX44")="",ZTSAVE("BSDXRES")=""
+"RTN","BSDX29",51,0)
+ D ^%ZTLOAD
+"RTN","BSDX29",52,0)
+ ; Set up return ADO.net dataset
+"RTN","BSDX29",53,0)
+ N BSDXST S BSDXST=$S($G(ZTSK)>0:"OK",1:"Unable to create task.")
+"RTN","BSDX29",54,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",55,0)
+ S ^BSDXTMP($J,BSDXI)=$G(ZTSK)_"^"_BSDXST_$C(30)_$C(31)
+"RTN","BSDX29",56,0)
+ QUIT
+"RTN","BSDX29",57,0)
+ ;
+"RTN","BSDX29",58,0)
+ZTMD ;EP - Debug entry point
+"RTN","BSDX29",59,0)
+ ;D DEBUG^%Serenji("ZTM^BSDX29")
+"RTN","BSDX29",60,0)
+ Q
+"RTN","BSDX29",61,0)
+ ;
+"RTN","BSDX29",62,0)
+ZTM ;EP - Taskman entry point
+"RTN","BSDX29",63,0)
+    ; Variables set up in ZTSAVE above
+"RTN","BSDX29",64,0)
+    ;
+"RTN","BSDX29",65,0)
+ Q:'$D(ZTSK)
+"RTN","BSDX29",66,0)
+    ; $ET
+"RTN","BSDX29",67,0)
+    N $ET S $ET="G ZTMERR^BSDX29"
+"RTN","BSDX29",68,0)
+ ; Txn
+"RTN","BSDX29",69,0)
+    TSTART (BSDXBEG,BSDXEND,BSDX44,BSDXRES):T="BSDX COPY APPOINTMENT^BSDX29"
+"RTN","BSDX29",70,0)
+ ;$O through ^SC(BSDX44,"S",
+"RTN","BSDX29",71,0)
+ N BSDXCNT S BSDXCNT=0  ; Count of Copied Appointments
+"RTN","BSDX29",72,0)
+    N BSDXQUIT S BSDXQUIT=0  ; Quit Flag to be retrieved from an external proc
+"RTN","BSDX29",73,0)
+ ; Set Count
+"RTN","BSDX29",74,0)
+    S ^BSDXTMP("BSDXCOPY",ZTSK)=BSDXCNT
+"RTN","BSDX29",75,0)
+ ; Loop through dates here.
+"RTN","BSDX29",76,0)
+    F  S BSDXBEG=$O(^SC(BSDX44,"S",BSDXBEG)) Q:'+BSDXBEG  Q:BSDXBEG>BSDXEND  Q:BSDXQUIT  D
+"RTN","BSDX29",77,0)
+    . ; Loop through Entries in each date in the subsubfile.
+"RTN","BSDX29",78,0)
+    . ; Quit if we are at the end or if a remote process requests a quit.
+"RTN","BSDX29",79,0)
+    . N BSDXIEN S BSDXIEN=0
+"RTN","BSDX29",80,0)
+ . F  S BSDXIEN=$O(^SC(BSDX44,"S",BSDXBEG,1,BSDXIEN)) Q:'+BSDXIEN  Q:BSDXQUIT  D
+"RTN","BSDX29",81,0)
+ . . N BSDXNOD S BSDXNOD=$G(^SC(BSDX44,"S",BSDXBEG,1,BSDXIEN,0)) ; Node
+"RTN","BSDX29",82,0)
+ . . Q:'+BSDXNOD  ; Quit if no node
+"RTN","BSDX29",83,0)
+ . . N BSDXCAN S BSDXCAN=$P(BSDXNOD,U,9) ; Cancel flag
+"RTN","BSDX29",84,0)
+ . . Q:BSDXCAN="C"  ; Quit if appt cancelled
+"RTN","BSDX29",85,0)
+    . . N BSDXPAT S BSDXPAT=$P(BSDXNOD,U) ; Patient
+"RTN","BSDX29",86,0)
+    . . N BSDXLEN S BSDXLEN=$P(BSDXNOD,U,2) ;duration in minutes
+"RTN","BSDX29",87,0)
+ . . N BSDXCLRK S BSDXCLRK=$P(BSDXNOD,U,6) ;appt made by (clerk)
+"RTN","BSDX29",88,0)
+ . . N BSDXMADE S BSDXMADE=$P(BSDXNOD,U,7) ;date appt made
+"RTN","BSDX29",89,0)
+ . . N BSDXNOTE S BSDXNOTE=$P(BSDXNOD,U,4) ;'OTHER' field contains note
+"RTN","BSDX29",90,0)
+ . . S BSDXCNT=BSDXCNT+$$XFER(BSDXRES,BSDXBEG,BSDXPAT,BSDXLEN,BSDXCLRK,BSDXMADE,BSDXNOTE)
+"RTN","BSDX29",91,0)
+ . . I +BSDXCNT,BSDXCNT#10=0 S ^BSDXTMP("BSDXCOPY",ZTSK)=BSDXCNT_" records copied." ;every 10th record
+"RTN","BSDX29",92,0)
+ . . I $D(^BSDXTMP("BSDXCOPY",ZTSK,"CANCEL")) S BSDXQUIT=1 ;Check for cancel flag
+"RTN","BSDX29",93,0)
+ . . Q
+"RTN","BSDX29",94,0)
+ . Q
+"RTN","BSDX29",95,0)
+ I 'BSDXQUIT TCOMMIT
+"RTN","BSDX29",96,0)
+ E  TROLLBACK
+"RTN","BSDX29",97,0)
+ S ^BSDXTMP("BSDXCOPY",ZTSK)=$S(BSDXQUIT:"Cancelled.  No records copied.",1:"Finished.  "_BSDXCNT_" records copied.")
+"RTN","BSDX29",98,0)
+ Q
+"RTN","BSDX29",99,0)
+ ;
+"RTN","BSDX29",100,0)
+ZTMERR ; For now, error from TM is only in trap; not returned to client.
+"RTN","BSDX29",101,0)
+ N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+"RTN","BSDX29",102,0)
+    ; Rollback before logging the error
+"RTN","BSDX29",103,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX29",104,0)
+ D ^%ZTER
+"RTN","BSDX29",105,0)
+    S $EC="" ; Clear Error
+"RTN","BSDX29",106,0)
+ QUIT
+"RTN","BSDX29",107,0)
+ ;
+"RTN","BSDX29",108,0)
+XFER(BSDXRES,BSDXBEG,BSDXPAT,BSDXLEN,BSDXCLRK,BSDXMADE,BSDXNOTE) ;EP
+"RTN","BSDX29",109,0)
+ ;
+"RTN","BSDX29",110,0)
+ ;Copy record to BSDX APPOINTMENT file
+"RTN","BSDX29",111,0)
+ ;Return 1 if record copied, otherwise 0
+"RTN","BSDX29",112,0)
+ ;
+"RTN","BSDX29",113,0)
+ ;$O Thru ^BSDXAPPT to determine if this appt already added
+"RTN","BSDX29",114,0)
+ N BSDXEND,BSDXIEN,BSDXFND,BSDXPAT2
+"RTN","BSDX29",115,0)
+ S BSDXIEN=0,BSDXFND=0
+"RTN","BSDX29",116,0)
+ F  S BSDXIEN=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXBEG,BSDXIEN)) Q:'+BSDXIEN  D  Q:BSDXFND
+"RTN","BSDX29",117,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXIEN,0))
+"RTN","BSDX29",118,0)
+ . Q:'+BSDXNOD
+"RTN","BSDX29",119,0)
+ . S BSDXPAT2=$P(BSDXNOD,U,5)
+"RTN","BSDX29",120,0)
+ . S BSDXFND=0
+"RTN","BSDX29",121,0)
+ . I BSDXPAT2=BSDXPAT S BSDXFND=1
+"RTN","BSDX29",122,0)
+ . Q
+"RTN","BSDX29",123,0)
+ Q:BSDXFND 0
+"RTN","BSDX29",124,0)
+ ;
+"RTN","BSDX29",125,0)
+ ;Add to BSDX APPOINTMENT
+"RTN","BSDX29",126,0)
+ S BSDXEND=BSDXBEG
+"RTN","BSDX29",127,0)
+ ;Calculate ending time from beginning time and duration.
+"RTN","BSDX29",128,0)
+ S BSDXEND=$$ADDMIN(BSDXBEG,BSDXLEN)
+"RTN","BSDX29",129,0)
+ S BSDXIENS="+1,"
+"RTN","BSDX29",130,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.01)=BSDXBEG
+"RTN","BSDX29",131,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.02)=BSDXEND
+"RTN","BSDX29",132,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.05)=BSDXPAT
+"RTN","BSDX29",133,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.07)=BSDXRES
+"RTN","BSDX29",134,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.08)=BSDXCLRK
+"RTN","BSDX29",135,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.09)=BSDXMADE
+"RTN","BSDX29",136,0)
+ ;
+"RTN","BSDX29",137,0)
+ K BSDXIEN
+"RTN","BSDX29",138,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX29",139,0)
+ S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX29",140,0)
+ I '+BSDXIEN Q 0
+"RTN","BSDX29",141,0)
+ ;
+"RTN","BSDX29",142,0)
+ ;Add WP field
+"RTN","BSDX29",143,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE="" D
+"RTN","BSDX29",144,0)
+ . D WP^DIE(9002018.4,BSDXIEN_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX29",145,0)
+ ;
+"RTN","BSDX29",146,0)
+ Q 1
+"RTN","BSDX29",147,0)
+ ;
+"RTN","BSDX29",148,0)
+ERR(BSDXI,BSDXCNT,BSDXERR) ;Error processing
+"RTN","BSDX29",149,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",150,0)
+    S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX29",151,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_BSDXERR_$C(30)
+"RTN","BSDX29",152,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",153,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX29",154,0)
+ Q
+"RTN","BSDX29",155,0)
+ ;
+"RTN","BSDX29",156,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX29",157,0)
+ ; No Txn here. So don't rollback anything
+"RTN","BSDX29",158,0)
+    N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+"RTN","BSDX29",159,0)
+    D ^%ZTER
+"RTN","BSDX29",160,0)
+    S $EC="" ; Clear error
+"RTN","BSDX29",161,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX29",162,0)
+ D ERR(BSDXI,$G(BSDXCNT),"~100~BSDX29, Error: "_$G(%ZTERZE))
+"RTN","BSDX29",163,0)
+ Q
+"RTN","BSDX29",164,0)
+ ;
+"RTN","BSDX29",165,0)
+CPSTAT(BSDXY,BSDXTSK) ;EP - Note: As of Dec 6 2010: Inactive Code
+"RTN","BSDX29",166,0)
+ ;Return status (copied record count) of tasked job having ZTSK=BSDXTSK
+"RTN","BSDX29",167,0)
+ ;
+"RTN","BSDX29",168,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX29",169,0)
+ N BSDXI,BSDXCNT
+"RTN","BSDX29",170,0)
+ S BSDXI=0
+"RTN","BSDX29",171,0)
+ S X="ETRAP^BSDX29",@^%ZOSF("TRAP")
+"RTN","BSDX29",172,0)
+ S ^BSDXTMP($J,0)="T00020RECORD_COUNT^T00020ERRORID"_$C(30)
+"RTN","BSDX29",173,0)
+ S BSDXCNT=$G(^BSDXTMP("BSDXCOPY",BSDXTSK))
+"RTN","BSDX29",174,0)
+ I BSDXCNT["Finished" K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",175,0)
+ I BSDXCNT["Cancelled" K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",176,0)
+ ;I $D(^BSDXTMP("BSDXCOPY",BSDXTSK,"CANCEL")) K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",177,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",178,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_"OK"_$C(30)_$C(31)
+"RTN","BSDX29",179,0)
+ Q
+"RTN","BSDX29",180,0)
+ ;
+"RTN","BSDX29",181,0)
+CPCANC(BSDXY,BSDXTSK) ;EP Note: As of Dec 6 2010: Inactive code.
+"RTN","BSDX29",182,0)
+ ;Signal tasked job having ZTSK=BSDXTSK to cancel
+"RTN","BSDX29",183,0)
+ ;Returns current record count of copy process
+"RTN","BSDX29",184,0)
+ ;
+"RTN","BSDX29",185,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX29",186,0)
+ N BSDXI,BSDXCNT
+"RTN","BSDX29",187,0)
+ S BSDXI=0
+"RTN","BSDX29",188,0)
+ S X="ETRAP^BSDX29",@^%ZOSF("TRAP")
+"RTN","BSDX29",189,0)
+ S ^BSDXTMP($J,0)="T00020RECORD_COUNT^T00020ERRORID"_$C(30)
+"RTN","BSDX29",190,0)
+ S BSDXCNT=$G(^BSDXTMP("BSDXCOPY",BSDXTSK))
+"RTN","BSDX29",191,0)
+ I BSDXCNT["FINISHED" K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",192,0)
+ E  S ^BSDXTMP("BSDXCOPY",BSDXTSK,"CANCEL")=""
+"RTN","BSDX29",193,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",194,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_"OK"_$C(30)_$C(31)
+"RTN","BSDX29",195,0)
+ Q
+"RTN","BSDX29",196,0)
+ ;
+"RTN","BSDX29",197,0)
+ADDMIN(BSDXSTRT,BSDXLEN) ;
+"RTN","BSDX29",198,0)
+ ;
+"RTN","BSDX29",199,0)
+ ;Add BSDXLEN minutes to time BSDXSTRT and return end time
+"RTN","BSDX29",200,0)
+ N BSDXEND,BSDXH,BSDXM,BSDXSTIM,BSDXETIM
+"RTN","BSDX29",201,0)
+ S BSDXEND=$P(BSDXSTRT,".")
+"RTN","BSDX29",202,0)
+ ;
+"RTN","BSDX29",203,0)
+ ;Convert start time to minutes past midnight
+"RTN","BSDX29",204,0)
+ S BSDXSTIM=$P(BSDXSTRT,".",2)
+"RTN","BSDX29",205,0)
+ S BSDXSTIM=BSDXSTIM_"0000"
+"RTN","BSDX29",206,0)
+ S BSDXSTIM=$E(BSDXSTIM,1,4)
+"RTN","BSDX29",207,0)
+ S BSDXH=$E(BSDXSTIM,1,2)
+"RTN","BSDX29",208,0)
+ S BSDXH=BSDXH*60
+"RTN","BSDX29",209,0)
+ S BSDXH=BSDXH+$E(BSDXSTIM,3,4)
+"RTN","BSDX29",210,0)
+ ;
+"RTN","BSDX29",211,0)
+ ;Add duration to find minutes past midnight of end time
+"RTN","BSDX29",212,0)
+ S BSDXETIM=BSDXH+BSDXLEN
+"RTN","BSDX29",213,0)
+ ;
+"RTN","BSDX29",214,0)
+ ;Convert back to a time
+"RTN","BSDX29",215,0)
+ S BSDXH=BSDXETIM\60
+"RTN","BSDX29",216,0)
+ S BSDXH="00"_BSDXH
+"RTN","BSDX29",217,0)
+ S BSDXH=$E(BSDXH,$L(BSDXH)-1,$L(BSDXH))
+"RTN","BSDX29",218,0)
+ S BSDXM=BSDXETIM#60
+"RTN","BSDX29",219,0)
+ S BSDXM="00"_BSDXM
+"RTN","BSDX29",220,0)
+ S BSDXM=$E(BSDXM,$L(BSDXM)-1,$L(BSDXM))
+"RTN","BSDX29",221,0)
+ S BSDXETIM=BSDXH_BSDXM
+"RTN","BSDX29",222,0)
+ I BSDXETIM>2400 S BSDXETIM=2400
+"RTN","BSDX29",223,0)
+ S $P(BSDXEND,".",2)=BSDXETIM
+"RTN","BSDX29",224,0)
+ Q BSDXEND
+"RTN","BSDX2E")
+0^^B27292304
+"RTN","BSDX2E",1,0)
+BSDX2E ;IHS/OIT/MJL - ENVIRONMENT CHECK FOR WINDOWS SCHEDULING [7/18/10 4:30pm]
+"RTN","BSDX2E",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX2E",3,0)
+ ;
+"RTN","BSDX2E",4,0)
+ S LINE="",$P(LINE,"*",81)=""
+"RTN","BSDX2E",5,0)
+ S XPDNOQUE="NO QUE"  ;NO QUEUING ALLOWED
+"RTN","BSDX2E",6,0)
+ S XPDABORT=0
+"RTN","BSDX2E",7,0)
+ I '$G(DUZ) D SORRY("DUZ UNDEFINED OR 0") Q
+"RTN","BSDX2E",8,0)
+ ;
+"RTN","BSDX2E",9,0)
+ I '$L($G(DUZ(0))) D SORRY("DUZ(0) UNDEFINED OR NULL") Q
+"RTN","BSDX2E",10,0)
+ ;
+"RTN","BSDX2E",11,0)
+ D HOME^%ZIS,DT^DICRW
+"RTN","BSDX2E",12,0)
+ S X=$P($G(^VA(200,DUZ,0)),U)
+"RTN","BSDX2E",13,0)
+ I $G(X)="" W !,$$C^XBFUNC("Who are you????") D SORRY("Unknown User") Q
+"RTN","BSDX2E",14,0)
+ ;
+"RTN","BSDX2E",15,0)
+VERSION ;
+"RTN","BSDX2E",16,0)
+ W !,$$C^XBFUNC("Hello, "_$P(X,",",2)_" "_$P(X,","))
+"RTN","BSDX2E",17,0)
+ W !!,$$C^XBFUNC("Checking Environment for Install of Version "_$P($T(+2),";",3)_" of "_$P($T(+2),";",4)_".")
+"RTN","BSDX2E",18,0)
+ ;
+"RTN","BSDX2E",19,0)
+ Q:'$$VERCHK("VA FILEMAN",22)
+"RTN","BSDX2E",20,0)
+ Q:'$$VERCHK("KERNEL",8)
+"RTN","BSDX2E",21,0)
+ Q:'$$VERCHK("XB",3)
+"RTN","BSDX2E",22,0)
+ ;Is the PIMS requirement present?
+"RTN","BSDX2E",23,0)
+ Q:'$$VERCHK("SD",5.3)
+"RTN","BSDX2E",24,0)
+ ; Q:'$$PATCHCK("PIMS*5.3*1003") D
+"RTN","BSDX2E",25,0)
+ Q:'$$VERCHK("BMX",2)
+"RTN","BSDX2E",26,0)
+ ;
+"RTN","BSDX2E",27,0)
+OTHER ;
+"RTN","BSDX2E",28,0)
+ ;Other checks
+"RTN","BSDX2E",29,0)
+ ;
+"RTN","BSDX2E",30,0)
+ENVOK ; If this is just an environ check, end here.
+"RTN","BSDX2E",31,0)
+ W !!,$$C^XBFUNC("ENVIRONMENT OK.")
+"RTN","BSDX2E",32,0)
+ ;
+"RTN","BSDX2E",33,0)
+ ; The following line prevents the "Disable Options..." and "Move
+"RTN","BSDX2E",34,0)
+ ; Routines..." questions from being asked during the install.
+"RTN","BSDX2E",35,0)
+ I $G(XPDENV)=1 S (XPDDIQ("XPZ1"),XPDDIQ("XPZ2"))=0
+"RTN","BSDX2E",36,0)
+ ;
+"RTN","BSDX2E",37,0)
+ ;
+"RTN","BSDX2E",38,0)
+ ;VERIFY BACKUPS HAVE BEEN DONE
+"RTN","BSDX2E",39,0)
+ ;W !!
+"RTN","BSDX2E",40,0)
+ ;S DIR(0)="Y"
+"RTN","BSDX2E",41,0)
+ ;S DIR("B")="NO"
+"RTN","BSDX2E",42,0)
+ ;S DIR("A")="Has a SUCCESSFUL system backup been performed??"
+"RTN","BSDX2E",43,0)
+ ;D ^DIR
+"RTN","BSDX2E",44,0)
+ ;I $D(DIRUT)!($G(Y)=0) S XPDABORT=1 S XPX="BACKUP" D SORRY Q
+"RTN","BSDX2E",45,0)
+ ;S ^TMP("BPCPRE",$J,"BACKUPS CONFIRMED BY "_DUZ)=$H
+"RTN","BSDX2E",46,0)
+ ;
+"RTN","BSDX2E",47,0)
+ Q
+"RTN","BSDX2E",48,0)
+ ;
+"RTN","BSDX2E",49,0)
+VERCHK(XPXPKG,XVRMIN) ;
+"RTN","BSDX2E",50,0)
+ S X=$$VERSION^XPDUTL(XPXPKG)
+"RTN","BSDX2E",51,0)
+ W !!,$$C^XBFUNC("Need at least "_XPXPKG_" "_XVRMIN_"....."_XPXPKG_" "_$S(X'="":X,1:"Is Not")_" Present")
+"RTN","BSDX2E",52,0)
+ I X<XVRMIN  D SORRY(XPXPKG_" "_XVRMIN_" Is Not Installed") Q 0
+"RTN","BSDX2E",53,0)
+ Q 1
+"RTN","BSDX2E",54,0)
+ ;
+"RTN","BSDX2E",55,0)
+PATCHCK(XPXPCH) ;
+"RTN","BSDX2E",56,0)
+ S X=$$PATCH^XPDUTL(XPXPCH)
+"RTN","BSDX2E",57,0)
+ W !!,$$C^XBFUNC("Need "_XPXPCH_"....."_XPXPCH_" "_$S(X:"Is",1:"Is Not")_" Present")
+"RTN","BSDX2E",58,0)
+ Q X
+"RTN","BSDX2E",59,0)
+ ;
+"RTN","BSDX2E",60,0)
+V0200 ;EP Version 1.3 PostInit
+"RTN","BSDX2E",61,0)
+ ;Add Protocol items to SDAM APPOINTMENT EVENTS protocol
+"RTN","BSDX2E",62,0)
+    ;Remove protocols known to cause problems from SDAM APPOINTMENT EVENTS
+"RTN","BSDX2E",63,0)
+ ;
+"RTN","BSDX2E",64,0)
+ N BSDXDA,BSDXFDA,BSDXDA1,BSDXSEQ,BSDXDAT,BSDXNOD,BSDXIEN,BSDXMSG
+"RTN","BSDX2E",65,0)
+    ;
+"RTN","BSDX2E",66,0)
+    ; 1st, add the BSDX event protocols
+"RTN","BSDX2E",67,0)
+    ; Get SDAM APPOINTMENT EVENTS IEN in 101
+"RTN","BSDX2E",68,0)
+ S BSDXDA=$O(^ORD(101,"B","SDAM APPOINTMENT EVENTS",0))
+"RTN","BSDX2E",69,0)
+ Q:'+BSDXDA
+"RTN","BSDX2E",70,0)
+    ; Add each of those protocols unless they already exist.
+"RTN","BSDX2E",71,0)
+ S BSDXDAT="BSDX ADD APPOINTMENT;10.2^BSDX CANCEL APPOINTMENT;10.4^BSDX CHECKIN APPOINTMENT;10.6^BSDX NOSHOW APPOINTMENT;10.8"
+"RTN","BSDX2E",72,0)
+    ; For each
+"RTN","BSDX2E",73,0)
+    F J=1:1:$L(BSDXDAT,U) D
+"RTN","BSDX2E",74,0)
+ . K BSDXIEN,BSDXMSG,BSDXFDA
+"RTN","BSDX2E",75,0)
+    . ; Get Item
+"RTN","BSDX2E",76,0)
+ . S BSDXNOD=$P(BSDXDAT,U,J)
+"RTN","BSDX2E",77,0)
+ . ; Get Item Name (BSDX ADD APPOINTMENT)
+"RTN","BSDX2E",78,0)
+    . S BSDXDA1=$P(BSDXNOD,";")
+"RTN","BSDX2E",79,0)
+    . ; Get Item Sequence (10.2)
+"RTN","BSDX2E",80,0)
+ . S BSDXSEQ=$P(BSDXNOD,";",2)
+"RTN","BSDX2E",81,0)
+    . ; Get Item Reference (Item is already in the protocol file)
+"RTN","BSDX2E",82,0)
+ . S BSDXDA1=$O(^ORD(101,"B",BSDXDA1,0))
+"RTN","BSDX2E",83,0)
+    . ; Quit if not found
+"RTN","BSDX2E",84,0)
+ . Q:'+BSDXDA1
+"RTN","BSDX2E",85,0)
+    . ; Quit if already exists in the SDAM protocol
+"RTN","BSDX2E",86,0)
+ . Q:$D(^ORD(101,BSDXDA,10,"B",BSDXDA1))
+"RTN","BSDX2E",87,0)
+    . ; Go ahead and save it.
+"RTN","BSDX2E",88,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",",".01")=BSDXDA1
+"RTN","BSDX2E",89,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",","3")=BSDXSEQ
+"RTN","BSDX2E",90,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX2E",91,0)
+    . ; Error message
+"RTN","BSDX2E",92,0)
+    . I $D(BSDXMSG) W $C(7),"Error: ",BSDXMSG("DIERR",1,"TEXT",1)
+"RTN","BSDX2E",93,0)
+    ;
+"RTN","BSDX2E",94,0)
+    ; Remove nassssty protocols ORU PATIENT MOVMT and DVBA C&P SCHD EVENT
+"RTN","BSDX2E",95,0)
+    ; SDAM APPOINTMENT EVENTS IENS for use in FIND1^DIC
+"RTN","BSDX2E",96,0)
+    N SDEVTIENS S SDEVTIENS=","_BSDXDA_","
+"RTN","BSDX2E",97,0)
+    ; Subfile entry for ORU...
+"RTN","BSDX2E",98,0)
+    N ORUIEN S ORUIEN=$$FIND1^DIC(101.01,SDEVTIENS,"","ORU PATIENT MOVMT")
+"RTN","BSDX2E",99,0)
+    ; Subfile entry for DVBA...
+"RTN","BSDX2E",100,0)
+    N DVBAIEN S DVBAIEN=$$FIND1^DIC(101.01,SDEVTIENS,"","DVBA C&P SCHD EVENT")
+"RTN","BSDX2E",101,0)
+    ; Deletion code
+"RTN","BSDX2E",102,0)
+    N BSDXFDA,BSDXMSG
+"RTN","BSDX2E",103,0)
+    S:ORUIEN>0 BSDXFDA(101.01,ORUIEN_SDEVTIENS,.01)="@"
+"RTN","BSDX2E",104,0)
+    S:DVBAIEN>0 BSDXFDA(101.01,DVBAIEN_SDEVTIENS,.01)="@"
+"RTN","BSDX2E",105,0)
+    D:$D(BSDXFDA) FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX2E",106,0)
+    ; If error
+"RTN","BSDX2E",107,0)
+    I $D(BSDXMSG) W $C(7),"Error: ",BSDXMSG("DIERR",1,"TEXT",1)
+"RTN","BSDX2E",108,0)
+ QUIT
+"RTN","BSDX2E",109,0)
+ ;
+"RTN","BSDX2E",110,0)
+SORRY(XPX) ;
+"RTN","BSDX2E",111,0)
+ K DIFQ
+"RTN","BSDX2E",112,0)
+ S XPDABORT=1
+"RTN","BSDX2E",113,0)
+ W !,$$C^XBFUNC($P($T(+2),";",3)_" of "_$P($T(+2),";",4)_" Cannot Be Installed!")
+"RTN","BSDX2E",114,0)
+ W !,$$C^XBFUNC("Reason: "_XPX_".")
+"RTN","BSDX2E",115,0)
+ W *7,!!!,$$C^XBFUNC("Sorry....something is wrong with your environment")
+"RTN","BSDX2E",116,0)
+ W !,$$C^XBFUNC("Aborting "_XPDNM_" install!")
+"RTN","BSDX2E",117,0)
+ W !,$$C^XBFUNC("Correct error and reinstall otherwise")
+"RTN","BSDX2E",118,0)
+ W !,$$C^XBFUNC("please print/capture this screen and notify")
+"RTN","BSDX2E",119,0)
+ W !,$$C^XBFUNC("technical support")
+"RTN","BSDX2E",120,0)
+ W !!,LINE
+"RTN","BSDX2E",121,0)
+ D BMES^XPDUTL("Sorry....something is wrong with your environment")
+"RTN","BSDX2E",122,0)
+ D BMES^XPDUTL("Enviroment ERROR "_$G(XPX))
+"RTN","BSDX2E",123,0)
+ D BMES^XPDUTL("Aborting "_XPDNM_" install!")
+"RTN","BSDX2E",124,0)
+ D BMES^XPDUTL("Correct error and reinstall otherwise")
+"RTN","BSDX2E",125,0)
+ D BMES^XPDUTL("please print/capture this screen and notify")
+"RTN","BSDX2E",126,0)
+ D BMES^XPDUTL("technical support")
+"RTN","BSDX2E",127,0)
+ Q
+"RTN","BSDX2E",128,0)
+ ;
+"RTN","BSDX30")
+0^28^B6616255
+"RTN","BSDX30",1,0)
+BSDX30 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; [ 09/12/2007  1:54 PM ]
+"RTN","BSDX30",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX30",3,0)
+ ;
+"RTN","BSDX30",4,0)
+ ;
+"RTN","BSDX30",5,0)
+SPACED(BSDXY,BSDXDIC,BSDXVAL) ;EP
+"RTN","BSDX30",6,0)
+ ;Entry point for debugging
+"RTN","BSDX30",7,0)
+ ;
+"RTN","BSDX30",8,0)
+ D DEBUG^%Serenji("SPACE^BSDX30(.BSDXY,BSDXDIC,BSDXVAL)")
+"RTN","BSDX30",9,0)
+ Q
+"RTN","BSDX30",10,0)
+ ;
+"RTN","BSDX30",11,0)
+SPACE(BSDXY,BSDXDIC,BSDXVAL) ;EP
+"RTN","BSDX30",12,0)
+ ;Update ^DISV with most recent lookup value BSDXVAL from file BSDXDIC
+"RTN","BSDX30",13,0)
+ ;BSDXDIC is the data global in the form GLOBAL(
+"RTN","BSDX30",14,0)
+ ;BSDXVAL is the entry number (IEN) in the file
+"RTN","BSDX30",15,0)
+ ;
+"RTN","BSDX30",16,0)
+ ;Return Status = 1 if success, 0 if fail
+"RTN","BSDX30",17,0)
+ ;
+"RTN","BSDX30",18,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX30",19,0)
+ N BSDX1,BSDXRES
+"RTN","BSDX30",20,0)
+ S BSDXI=0
+"RTN","BSDX30",21,0)
+ S X="ETRAP^BSDX30",@^%ZOSF("TRAP")
+"RTN","BSDX30",22,0)
+ I (BSDXDIC="")!('+$G(BSDXVAL)) D ERR(BSDXI+1,99) Q
+"RTN","BSDX30",23,0)
+ S BSDXDIC="^"_BSDXDIC
+"RTN","BSDX30",24,0)
+ S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30)
+"RTN","BSDX30",25,0)
+ ;Note:  Naked reference below is immediately preceded
+"RTN","BSDX30",26,0)
+ ;by the full global reference per SAC 2.2.2.8
+"RTN","BSDX30",27,0)
+ I $D(@(BSDXDIC_"BSDXVAL,0)")),'$D(^(-9)) D
+"RTN","BSDX30",28,0)
+ . S ^DISV(DUZ,BSDXDIC)=BSDXVAL
+"RTN","BSDX30",29,0)
+ . S BSDXRES=1
+"RTN","BSDX30",30,0)
+ E  S BSDXRES=0
+"RTN","BSDX30",31,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",32,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXRES_$C(30)_$C(31)
+"RTN","BSDX30",33,0)
+ Q
+"RTN","BSDX30",34,0)
+ ;
+"RTN","BSDX30",35,0)
+ERR(BSDXI,BSDXERR) ;Error processing
+"RTN","BSDX30",36,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",37,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX30",38,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",39,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX30",40,0)
+ Q
+"RTN","BSDX30",41,0)
+ ;
+"RTN","BSDX30",42,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX30",43,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX30",44,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",45,0)
+ D ERR(99,0)
+"RTN","BSDX30",46,0)
+ Q
+"RTN","BSDX30",47,0)
+ ;
+"RTN","BSDX30",48,0)
+EHRPTD(BSDXY,BSDXWID,BSDXDFN) ;
+"RTN","BSDX30",49,0)
+ ;
+"RTN","BSDX30",50,0)
+ D DEBUG^%Serenji("EHRPT^BSDX30(.BSDXY,BSDXWID,BSDXDFN)")
+"RTN","BSDX30",51,0)
+ Q
+"RTN","BSDX30",52,0)
+ ;
+"RTN","BSDX30",53,0)
+EHRPT(BSDXY,BSDXWID,BSDXDFN) ;
+"RTN","BSDX30",54,0)
+ ;
+"RTN","BSDX30",55,0)
+ ;Return Status = 1 if success, 0 if error
+"RTN","BSDX30",56,0)
+ ;
+"RTN","BSDX30",57,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX30",58,0)
+ N BSDX1,BSDXRES
+"RTN","BSDX30",59,0)
+ S BSDXI=0,BSDXRES=1
+"RTN","BSDX30",60,0)
+ S X="ETRAP^BSDX30",@^%ZOSF("TRAP")
+"RTN","BSDX30",61,0)
+ S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30)
+"RTN","BSDX30",62,0)
+ I '+BSDXDFN D ERR(BSDXI+1,0) Q
+"RTN","BSDX30",63,0)
+ ;
+"RTN","BSDX30",64,0)
+ D PEVENT(BSDXWID,BSDXDFN) ;Raise patient selected event
+"RTN","BSDX30",65,0)
+ ;
+"RTN","BSDX30",66,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",67,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXRES_$C(30)_$C(31)
+"RTN","BSDX30",68,0)
+ Q
+"RTN","BSDX30",69,0)
+ ;
+"RTN","BSDX30",70,0)
+PEVENT(BSDXWID,DFN) ;EP - Raise patient selection event to EHR
+"RTN","BSDX30",71,0)
+ ;
+"RTN","BSDX30",72,0)
+ ;Change patient context to patient DFN
+"RTN","BSDX30",73,0)
+ ;on all EHR client sessions associated with user DUZ
+"RTN","BSDX30",74,0)
+ ;and workstation BSDXWID.
+"RTN","BSDX30",75,0)
+ ;
+"RTN","BSDX30",76,0)
+ ;If BSDXWID is "", the context change is sent to
+"RTN","BSDX30",77,0)
+ ;all EHR client sessions belonging to user DUZ.
+"RTN","BSDX30",78,0)
+ ;
+"RTN","BSDX30",79,0)
+ Q:'$G(DUZ)
+"RTN","BSDX30",80,0)
+ ;N X
+"RTN","BSDX30",81,0)
+ ;S X="CIANBUTL" X ^%ZOSF("TEST") Q:'$T
+"RTN","BSDX30",82,0)
+ ;S X="CIANBEVT" X ^%ZOSF("TEST") Q:'$T
+"RTN","BSDX30",83,0)
+ N UID,BRET
+"RTN","BSDX30",84,0)
+ S BRET=0,UID=0
+"RTN","BSDX30",85,0)
+ F  S BRET=$$NXTUID^CIANBUTL(.UID,1) Q:'UID  D
+"RTN","BSDX30",86,0)
+ . Q:DUZ'=$$GETVAR^CIANBUTL("DUZ",,,UID)
+"RTN","BSDX30",87,0)
+ . I BSDXWID'="" Q:BSDXWID'=$TR($$GETVAR^CIANBUTL("WID",,,UID),"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
+"RTN","BSDX30",88,0)
+ . D QUEUE^CIANBEVT("CONTEXT.PATIENT",+DFN,UID)
+"RTN","BSDX30",89,0)
+ Q
+"RTN","BSDX31")
+0^29^B67823338
+"RTN","BSDX31",1,0)
+BSDX31  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:39pm
+"RTN","BSDX31",2,0)
+    ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX31",3,0)
+    ; Change Log:
+"RTN","BSDX31",4,0)
+    ; v1.42 Oct 23 2010 WV/SMH
+"RTN","BSDX31",5,0)
+    ; - Change transaction to restartable. Thanks to Zach Gonzalez
+"RTN","BSDX31",6,0)
+    ; --> and Rick Marshall for their help.
+"RTN","BSDX31",7,0)
+    ; v1.42 Dec 6 2010: Extensive refactoring
+"RTN","BSDX31",8,0)
+    ; 
+"RTN","BSDX31",9,0)
+    ; Error Reference:
+"RTN","BSDX31",10,0)
+    ; -1: zero or null Appt ID
+"RTN","BSDX31",11,0)
+    ; -2: Invalid APPT ID (doesn't exist in ^BSDXAPPT)
+"RTN","BSDX31",12,0)
+    ; -3: No-show flag is invalid
+"RTN","BSDX31",13,0)
+    ; -4: Filing of No-show in ^BSDXAPPT failed
+"RTN","BSDX31",14,0)
+    ; -5: Filing of No-show in ^DPT failed (BSDXAPI error)
+"RTN","BSDX31",15,0)
+    ; -100: M Error
+"RTN","BSDX31",16,0)
+    ;
+"RTN","BSDX31",17,0)
+    ;
+"RTN","BSDX31",18,0)
+NOSHOWD(BSDXY,BSDXAPTID,BSDXNS) ;EP
+"RTN","BSDX31",19,0)
+    ;Entry point for debugging
+"RTN","BSDX31",20,0)
+    ;
+"RTN","BSDX31",21,0)
+    D DEBUG^%Serenji("NOSHOW^BSDX31(.BSDXY,BSDXAPTID,BSDXNS)")
+"RTN","BSDX31",22,0)
+    Q
+"RTN","BSDX31",23,0)
+    ;
+"RTN","BSDX31",24,0)
+UT ; Unit Tests
+"RTN","BSDX31",25,0)
+    ; Test 1: Sanity Check
+"RTN","BSDX31",26,0)
+    N ZZZ ; Garbage return variable
+"RTN","BSDX31",27,0)
+    N DATE S DATE=$$NOW^XLFDT()
+"RTN","BSDX31",28,0)
+    S DATE=$E(DATE,1,12) ; Just get minutes b/c of HL file input transform
+"RTN","BSDX31",29,0)
+    D APPADD^BSDX07(.ZZZ,DATE,DATE+.0001,3,"Dr Office",30,"Old Note",1)
+"RTN","BSDX31",30,0)
+    N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX31",31,0)
+    D NOSHOW(.ZZZ,APPID,1)
+"RTN","BSDX31",32,0)
+    I $P(^BSDXAPPT(APPID,0),U,10)'=1 W "ERROR T1",! B
+"RTN","BSDX31",33,0)
+    I $P(^DPT(3,"S",DATE,0),U,2)'="N" W "ERROR T1",! B
+"RTN","BSDX31",34,0)
+    ; Test 2: Undo noshow
+"RTN","BSDX31",35,0)
+    D NOSHOW(.ZZZ,APPID,0)
+"RTN","BSDX31",36,0)
+    I $P(^BSDXAPPT(APPID,0),U,10)'="0" W "ERROR T2",! B
+"RTN","BSDX31",37,0)
+    I $P(^DPT(3,"S",DATE,0),U,2)'="" W "ERROR T2",! B
+"RTN","BSDX31",38,0)
+    ; Test 3: -1
+"RTN","BSDX31",39,0)
+    D NOSHOW(.ZZZ,"",0)
+"RTN","BSDX31",40,0)
+    I $P(^BSDXTMP($J,1),U)'=-1 W "ERROR T3",! B
+"RTN","BSDX31",41,0)
+    ; Test 4: -2
+"RTN","BSDX31",42,0)
+    D NOSHOW(.ZZZ,2938748233,0)
+"RTN","BSDX31",43,0)
+    I $P(^BSDXTMP($J,1),U)'=-2 W "ERROR T4",! B
+"RTN","BSDX31",44,0)
+    ; Test 5: -3
+"RTN","BSDX31",45,0)
+    D NOSHOW(.ZZZ,APPID,3)
+"RTN","BSDX31",46,0)
+    I $P(^BSDXTMP($J,1),U)'=-3 W "ERROR T5",! B
+"RTN","BSDX31",47,0)
+    ; Test 6: Mumps error (-100)
+"RTN","BSDX31",48,0)
+    s bsdxdie=1
+"RTN","BSDX31",49,0)
+    D NOSHOW(.ZZZ,APPID,1)
+"RTN","BSDX31",50,0)
+    I $P(^BSDXTMP($J,1),U)'=-100 W "ERROR T6",! B
+"RTN","BSDX31",51,0)
+    k bsdxdie
+"RTN","BSDX31",52,0)
+    ; Test 7: Restartable transaction
+"RTN","BSDX31",53,0)
+    s bsdxrestart=1
+"RTN","BSDX31",54,0)
+    D NOSHOW(.ZZZ,APPID,1)
+"RTN","BSDX31",55,0)
+    I $P(^BSDXAPPT(APPID,0),U,10)'=1 W "ERROR T7",! B
+"RTN","BSDX31",56,0)
+    QUIT
+"RTN","BSDX31",57,0)
+NOSHOW(BSDXY,BSDXAPTID,BSDXNS)         ;EP - No show a patient
+"RTN","BSDX31",58,0)
+    ; Called by RPC: BSDX NOSHOW
+"RTN","BSDX31",59,0)
+    ; Sets appointment noshow flag in BSDX APPOINTMENT file and "S" node in File 2
+"RTN","BSDX31",60,0)
+    ;
+"RTN","BSDX31",61,0)
+    ; Parameters:
+"RTN","BSDX31",62,0)
+    ; BSDXY: Global Return
+"RTN","BSDX31",63,0)
+    ; BSDXAPTID is entry number in BSDX APPOINTMENT file
+"RTN","BSDX31",64,0)
+    ; BSDXNS = 1: NOSHOW, 0: CANCEL NOSHO
+"RTN","BSDX31",65,0)
+    ; 
+"RTN","BSDX31",66,0)
+    ; Returns ADO.net record set with fields
+"RTN","BSDX31",67,0)
+    ; - ERRORID; ERRORTEXT
+"RTN","BSDX31",68,0)
+    ; ERRORID of 1 is okay
+"RTN","BSDX31",69,0)
+    ; Anything else is an error.
+"RTN","BSDX31",70,0)
+    ;
+"RTN","BSDX31",71,0)
+    ; Return Array; set and clear
+"RTN","BSDX31",72,0)
+    S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX31",73,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX31",74,0)
+    ; $ET
+"RTN","BSDX31",75,0)
+    N $ET S $ET="G ETRAP^BSDX31"
+"RTN","BSDX31",76,0)
+    ; Basline vars
+"RTN","BSDX31",77,0)
+    D ^XBKVAR  ; Set up baseline variables (DUZ, DUZ(2)) if they don't exist
+"RTN","BSDX31",78,0)
+    ; Counter
+"RTN","BSDX31",79,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX31",80,0)
+    ; Header Node
+"RTN","BSDX31",81,0)
+    S ^BSDXTMP($J,BSDXI)="I00100ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX31",82,0)
+    ; Begin transaction
+"RTN","BSDX31",83,0)
+    TSTART (BSDXI,BSDXY,BSDXAPTID,BSDXNS):T="BSDX NOSHOW CANCEL^BSDX29"
+"RTN","BSDX31",84,0)
+    ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX31",85,0)
+    I $G(bsdxdie) S X=1/0
+"RTN","BSDX31",86,0)
+    ;;;TEST
+"RTN","BSDX31",87,0)
+    ;;;test for TRESTART
+"RTN","BSDX31",88,0)
+    I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX31",89,0)
+    ;;;test
+"RTN","BSDX31",90,0)
+    ; Turn off SDAM APPT PROTOCOL BSDX Entries
+"RTN","BSDX31",91,0)
+    N BSDXNOEV S BSDXNOEV=1 ;Don't execute protocol
+"RTN","BSDX31",92,0)
+    ; Appointment ID check
+"RTN","BSDX31",93,0)
+    I '+BSDXAPTID D ERR(-1,"BSDX31: Invalid Appointment ID") Q
+"RTN","BSDX31",94,0)
+    I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(-2,"BSDX31: Invalid Appointment ID") Q
+"RTN","BSDX31",95,0)
+    ; Noshow value check - Must be 1 or 0
+"RTN","BSDX31",96,0)
+    S BSDXNS=+BSDXNS
+"RTN","BSDX31",97,0)
+    I BSDXNS'=1&(BSDXNS'=0) D ERR(-3,"BSDX31: Invalid No Show value") Q
+"RTN","BSDX31",98,0)
+    ; Get Some data
+"RTN","BSDX31",99,0)
+    N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPTID,0) ; Node
+"RTN","BSDX31",100,0)
+    N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) ; DFN
+"RTN","BSDX31",101,0)
+    N BSDXSTART S BSDXSTART=$P(BSDXNOD,U)  ; Start Date/Time
+"RTN","BSDX31",102,0)
+    ; Edit BSDX APPOINTMENT entry
+"RTN","BSDX31",103,0)
+    N BSDXMSG  ; 
+"RTN","BSDX31",104,0)
+    D BSDXNOS(BSDXAPTID,BSDXNS,.BSDXMSG)  ;Edit BSDX APPOINTMENT entry NOSHOW field 
+"RTN","BSDX31",105,0)
+    I $D(BSDXMSG("DIERR")) S BSDXMSG=$G(BSDXMSG("DIERR",1,"TEXT",1)) D ERR(-4,"BSDX31: "_BSDXMSG) Q
+"RTN","BSDX31",106,0)
+    ; Edit File 2 "S" node entry
+"RTN","BSDX31",107,0)
+    N BSDXZ,BSDXERR ; Error variables to control looping
+"RTN","BSDX31",108,0)
+    S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID
+"RTN","BSDX31",109,0)
+    ; If Resource ID exists, and HL exists (means that Resource is linked), No show in File 2
+"RTN","BSDX31",110,0)
+    I BSDXSC1]"",$D(^BSDXRES(BSDXSC1,0)) D  I $G(BSDXZ)]"" S BSDXERR="BSDX31: APNOSHO Returned: "_BSDXZ D ERR(-5,BSDXERR) Q
+"RTN","BSDX31",111,0)
+    . S BSDXNOD=^BSDXRES(BSDXSC1,0)
+"RTN","BSDX31",112,0)
+    . S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION
+"RTN","BSDX31",113,0)
+    . I BSDXSC1]"",$D(^SC(BSDXSC1,0)) D APNOSHO(.BSDXZ,BSDXSC1,BSDXPATID,BSDXSTART,BSDXNS)
+"RTN","BSDX31",114,0)
+    ;
+"RTN","BSDX31",115,0)
+    TCOMMIT
+"RTN","BSDX31",116,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",117,0)
+    S ^BSDXTMP($J,BSDXI)="1^"_$C(30) ; 1 means everything okay
+"RTN","BSDX31",118,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",119,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX31",120,0)
+    QUIT
+"RTN","BSDX31",121,0)
+    ;
+"RTN","BSDX31",122,0)
+APNOSHO(BSDXZ,BSDXSC1,BSDXDFN,BSDXSD,BSDXNS)            ;
+"RTN","BSDX31",123,0)
+    ; update file 2 info
+"RTN","BSDX31",124,0)
+    ;Set noshow for patient BSDXDFN in clinic BSDXSC1
+"RTN","BSDX31",125,0)
+    ;at time BSDXSD
+"RTN","BSDX31",126,0)
+    N BSDXC,%H,BSDXCDT,BSDXIEN
+"RTN","BSDX31",127,0)
+    N BSDXIENS,BSDXFDA,BSDXMSG
+"RTN","BSDX31",128,0)
+    S %H=$H D YMD^%DTC
+"RTN","BSDX31",129,0)
+    S BSDXCDT=X+%
+"RTN","BSDX31",130,0)
+    ;
+"RTN","BSDX31",131,0)
+    S BSDXIENS=BSDXSD_","_BSDXDFN_","
+"RTN","BSDX31",132,0)
+    I +BSDXNS D
+"RTN","BSDX31",133,0)
+    . S BSDXFDA(2.98,BSDXIENS,3)="N"
+"RTN","BSDX31",134,0)
+    . S BSDXFDA(2.98,BSDXIENS,14)=DUZ
+"RTN","BSDX31",135,0)
+    . S BSDXFDA(2.98,BSDXIENS,15)=BSDXCDT
+"RTN","BSDX31",136,0)
+    E  D
+"RTN","BSDX31",137,0)
+    . S BSDXFDA(2.98,BSDXIENS,3)=""
+"RTN","BSDX31",138,0)
+    . S BSDXFDA(2.98,BSDXIENS,14)=""
+"RTN","BSDX31",139,0)
+    . S BSDXFDA(2.98,BSDXIENS,15)=""
+"RTN","BSDX31",140,0)
+    K BSDXIEN
+"RTN","BSDX31",141,0)
+    D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX31",142,0)
+    S BSDXZ=$G(BSDXMSG("DIERR",1,"TEXT",1))
+"RTN","BSDX31",143,0)
+    Q
+"RTN","BSDX31",144,0)
+    ;
+"RTN","BSDX31",145,0)
+BSDXNOS(BSDXAPTID,BSDXNS,BSDXMSG)   ;
+"RTN","BSDX31",146,0)
+    ;
+"RTN","BSDX31",147,0)
+    N BSDXFDA,BSDXIENS
+"RTN","BSDX31",148,0)
+    S BSDXIENS=BSDXAPTID_","
+"RTN","BSDX31",149,0)
+    S BSDXFDA(9002018.4,BSDXIENS,.1)=BSDXNS ;NOSHOW
+"RTN","BSDX31",150,0)
+    D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX31",151,0)
+    QUIT
+"RTN","BSDX31",152,0)
+    ;
+"RTN","BSDX31",153,0)
+NOSEVT(BSDXPAT,BSDXSTART,BSDXSC)    ;EP Called by BSDX NOSHOW APPOINTMENT event
+"RTN","BSDX31",154,0)
+    ;when appointments NOSHOW via PIMS interface.
+"RTN","BSDX31",155,0)
+    ;Propagates NOSHOW to BSDXAPPT and raises refresh event to running GUI clients
+"RTN","BSDX31",156,0)
+    ;
+"RTN","BSDX31",157,0)
+    Q:+$G(BSDXNOEV)
+"RTN","BSDX31",158,0)
+    Q:'+$G(BSDXSC)
+"RTN","BSDX31",159,0)
+    Q:$G(SDATA("AFTER","STATUS"))["AUTO RE-BOOK"
+"RTN","BSDX31",160,0)
+    N BSDXSTAT,BSDXFOUND,BSDXRES
+"RTN","BSDX31",161,0)
+    S BSDXSTAT=1
+"RTN","BSDX31",162,0)
+    S:$G(SDATA("BEFORE","STATUS"))["NO-SHOW" BSDXSTAT=0
+"RTN","BSDX31",163,0)
+    S BSDXFOUND=0
+"RTN","BSDX31",164,0)
+    I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX31",165,0)
+    I BSDXFOUND D NOSEVT3(BSDXRES) Q
+"RTN","BSDX31",166,0)
+    I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX31",167,0)
+    I BSDXFOUND D NOSEVT3(BSDXRES)
+"RTN","BSDX31",168,0)
+    Q
+"RTN","BSDX31",169,0)
+    ;
+"RTN","BSDX31",170,0)
+NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT) ;
+"RTN","BSDX31",171,0)
+    ;Get appointment id in BSDXAPT
+"RTN","BSDX31",172,0)
+    ;If found, call BSDXNOS(BSDXAPPT) and return 1
+"RTN","BSDX31",173,0)
+    ;else return 0
+"RTN","BSDX31",174,0)
+    N BSDXFOUND,BSDXAPPT
+"RTN","BSDX31",175,0)
+    S BSDXFOUND=0
+"RTN","BSDX31",176,0)
+    Q:'+$G(BSDXRES) BSDXFOUND
+"RTN","BSDX31",177,0)
+    Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND
+"RTN","BSDX31",178,0)
+    S BSDXAPPT=0 F  S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT  D  Q:BSDXFOUND
+"RTN","BSDX31",179,0)
+    . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""
+"RTN","BSDX31",180,0)
+    . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q
+"RTN","BSDX31",181,0)
+    I BSDXFOUND,+$G(BSDXAPPT) D BSDXNOS(BSDXAPPT,BSDXSTAT)
+"RTN","BSDX31",182,0)
+    Q BSDXFOUND
+"RTN","BSDX31",183,0)
+    ;
+"RTN","BSDX31",184,0)
+NOSEVT3(BSDXRES)    ;
+"RTN","BSDX31",185,0)
+    ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX31",186,0)
+    ;
+"RTN","BSDX31",187,0)
+    N BSDXRESN
+"RTN","BSDX31",188,0)
+    S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX31",189,0)
+    Q:BSDXRESN=""
+"RTN","BSDX31",190,0)
+    S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX31",191,0)
+    D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX31",192,0)
+    Q
+"RTN","BSDX31",193,0)
+    ;
+"RTN","BSDX31",194,0)
+    ;
+"RTN","BSDX31",195,0)
+ERR(BSDXERID,ERRTXT)    ;Error processing
+"RTN","BSDX31",196,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",197,0)
+    S ERRTXT=$TR(ERRTXT,"^","~")
+"RTN","BSDX31",198,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX31",199,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX31",200,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",201,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX31",202,0)
+    QUIT
+"RTN","BSDX31",203,0)
+    ;
+"RTN","BSDX31",204,0)
+ETRAP   ;EP Error trap entry
+"RTN","BSDX31",205,0)
+    N $ET S $ET="D ^%ZTER HALT"  ; Emergency Error Trap
+"RTN","BSDX31",206,0)
+    ; Rollback, otherwise ^XTER will be empty from future rollback
+"RTN","BSDX31",207,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX31",208,0)
+    D ^%ZTER
+"RTN","BSDX31",209,0)
+    S $EC="" ; Clear Error
+"RTN","BSDX31",210,0)
+    ; Send to client
+"RTN","BSDX31",211,0)
+    I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX31",212,0)
+    D ERR(-100,"BSDX31 Error: "_$G(%ZTERZE))
+"RTN","BSDX31",213,0)
+    QUIT
+"RTN","BSDX31",214,0)
+    ;
+"RTN","BSDX31",215,0)
+IMHERE(BSDXRES) ;EP
+"RTN","BSDX31",216,0)
+    ;Entry point for BSDX IM HERE remote procedure
+"RTN","BSDX31",217,0)
+    S BSDXRES=1
+"RTN","BSDX31",218,0)
+    Q
+"RTN","BSDX31",219,0)
+    ;
+"RTN","BSDX32")
+0^30^B17196738
+"RTN","BSDX32",1,0)
+BSDX32 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 9/29/10 10:21am
+"RTN","BSDX32",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX32",3,0)
+ ;
+"RTN","BSDX32",4,0)
+ ;
+"RTN","BSDX32",5,0)
+ERROR ;
+"RTN","BSDX32",6,0)
+ D ERR("RPMS Error")
+"RTN","BSDX32",7,0)
+ Q
+"RTN","BSDX32",8,0)
+ ;
+"RTN","BSDX32",9,0)
+ERR(BSDXERR) ;Error processing
+"RTN","BSDX32",10,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX32",11,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX32",12,0)
+ Q
+"RTN","BSDX32",13,0)
+ ;
+"RTN","BSDX32",14,0)
+HOSPLOCD(BSDXY) ;EP Debugging entry point
+"RTN","BSDX32",15,0)
+ ;
+"RTN","BSDX32",16,0)
+ ;D DEBUG^%Serenji("HOSPLOC^BSDX32(.BSDXY)")
+"RTN","BSDX32",17,0)
+ ;
+"RTN","BSDX32",18,0)
+ Q
+"RTN","BSDX32",19,0)
+ ;
+"RTN","BSDX32",20,0)
+HOSPLOC(BSDXY) ;EP
+"RTN","BSDX32",21,0)
+ ;Called by BSDX HOSPITAL LOCATION
+"RTN","BSDX32",22,0)
+    ;Returns all hospital locations that are active 
+"RTN","BSDX32",23,0)
+ ;
+"RTN","BSDX32",24,0)
+ N BSDXI,BSDXIEN,BSDXNOD,BSDXNAM,BSDXINA,BSDXREA,BSDXSCOD
+"RTN","BSDX32",25,0)
+ D ^XBKVAR S X="ERROR^BSDX32",@^%ZOSF("TRAP")
+"RTN","BSDX32",26,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX32",27,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX32",28,0)
+ S BSDXI=0
+"RTN","BSDX32",29,0)
+ ;"SELECT BSDXIEN 'HOSPITAL_LOCATION_ID', NAME 'HOSPITAL_LOCATION', DEFAULT_PROVIDER, STOP_CODE_NUMBER, INACTIVATE_DATE, REACTIVATE_DATE FROM HOSPITAL_LOCATION";
+"RTN","BSDX32",30,0)
+ S ^BSDXTMP($J,BSDXI)="I00020HOSPITAL_LOCATION_ID^T00040HOSPITAL_LOCATION^T00030DEFAULT_PROVIDER^T00030STOP_CODE_NUMBER^D00020INACTIVATE_DATE^D00020REACTIVATE_DATE"_$C(30)
+"RTN","BSDX32",31,0)
+ ;
+"RTN","BSDX32",32,0)
+ S BSDXNAM="" F  S BSDXNAM=$O(^SC("B",BSDXNAM)) Q:BSDXNAM=""  D
+"RTN","BSDX32",33,0)
+ . S BSDXIEN=$O(^SC("B",BSDXNAM,0))
+"RTN","BSDX32",34,0)
+ . Q:'+BSDXIEN>0
+"RTN","BSDX32",35,0)
+ . Q:'$D(^SC(+BSDXIEN,0))
+"RTN","BSDX32",36,0)
+    . ;Q:'$$INDIV^BSDX01(+BSDXIEN)  ; if not in the same division, quit
+"RTN","BSDX32",37,0)
+ . S BSDXINA=$$GET1^DIQ(44,BSDXIEN_",",2505) ;INACTIVATE
+"RTN","BSDX32",38,0)
+ . S BSDXREA=$$GET1^DIQ(44,BSDXIEN_",",2506) ;REACTIVATE
+"RTN","BSDX32",39,0)
+ . I BSDXINA]""&(BSDXREA="") Q  ;Clinic is inactivated and has no reactivate date
+"RTN","BSDX32",40,0)
+ . S BSDXNOD=^SC(BSDXIEN,0)
+"RTN","BSDX32",41,0)
+ . S BSDXNAM=$P(BSDXNOD,U)
+"RTN","BSDX32",42,0)
+ . S BSDXSCOD=$$GET1^DIQ(44,BSDXIEN_",",8) ;STOP CODE
+"RTN","BSDX32",43,0)
+ . ;Calculate default provider
+"RTN","BSDX32",44,0)
+ . S BSDXPRV=""
+"RTN","BSDX32",45,0)
+ . I $D(^SC(BSDXIEN,"PR")) D
+"RTN","BSDX32",46,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^SC(BSDXIEN,"PR",BSDXIEN1)) Q:'+BSDXIEN1  Q:BSDXPRV]""  D
+"RTN","BSDX32",47,0)
+ . . . S BSDXNOD1=$G(^SC(BSDXIEN,"PR",BSDXIEN1,0))
+"RTN","BSDX32",48,0)
+ . . . S:$P(BSDXNOD1,U,2)="1" BSDXPRV=$$GET1^DIQ(200,$P(BSDXNOD1,U),.01)
+"RTN","BSDX32",49,0)
+ . . . Q
+"RTN","BSDX32",50,0)
+ . . Q
+"RTN","BSDX32",51,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX32",52,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXNAM_U_BSDXPRV_U_BSDXSCOD_U_BSDXINA_U_BSDXREA_$C(30)
+"RTN","BSDX32",53,0)
+ . Q
+"RTN","BSDX32",54,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX32",55,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX32",56,0)
+ Q
+"RTN","BSDX32",57,0)
+ ;
+"RTN","BSDX32",58,0)
+CLNSETD(BSDXY) ;EP Debugging entry point
+"RTN","BSDX32",59,0)
+ ;
+"RTN","BSDX32",60,0)
+ ;D DEBUG^%Serenji("CLNSET^BSDX32(.BSDXY)")
+"RTN","BSDX32",61,0)
+ ;
+"RTN","BSDX32",62,0)
+ Q
+"RTN","BSDX32",63,0)
+ ;
+"RTN","BSDX32",64,0)
+CLNSET(BSDXY) ;EP
+"RTN","BSDX32",65,0)
+ ;Called by BSDX CLINIC SETUP
+"RTN","BSDX32",66,0)
+ ;Returns CLINIC SETUP file entries for clinics which
+"RTN","BSDX32",67,0)
+ ;are active in ^SC
+"RTN","BSDX32",68,0)
+ N BSDXI,BSDXIEN,BSDXNOD,BSDXNAM,BSDXINA,BSDXREA
+"RTN","BSDX32",69,0)
+ N BSDXCRV,BSDXVSC,BSDXMULT,BSDXREQ,BSDXPCC
+"RTN","BSDX32",70,0)
+ D ^XBKVAR S X="ERROR^BSDX32",@^%ZOSF("TRAP")
+"RTN","BSDX32",71,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX32",72,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX32",73,0)
+ S BSDXI=0
+"RTN","BSDX32",74,0)
+ ;SELECT BMXIEN 'HOSPITAL_LOCATION_ID', CLINIC_NAME 'HOSPITAL_LOCATION', CREATE_VISIT_AT_CHECK-IN? 'CREATE_VISIT', VISIT_SERVICE_CATEGORY,  MULTIPLE_CLINIC_CODES_USED?, VISIT_PROVIDER_REQUIRED,
+"RTN","BSDX32",75,0)
+ ;GENERATE_PCCPLUS_FORMS? FROM CLINIC_SETUP_PARAMETERS
+"RTN","BSDX32",76,0)
+ S ^BSDXTMP($J,BSDXI)="I00020HOSPITAL_LOCATION_ID^T00040HOSPITAL_LOCATION^T00030CREATE_VISIT^T00030VISIT_SERVICE_CATEGORY^T00030MULTIPLE_CLINIC_CODES_USED?^T00030VISIT_PROVIDER_REQUIRED^T00030GENERATE_PCCPLUS_FORMS?"_$C(30)
+"RTN","BSDX32",77,0)
+ ;
+"RTN","BSDX32",78,0)
+ S BSDXIEN=0 F  S BSDXIEN=$O(^BSDSC(BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX32",79,0)
+ . Q:'$D(^SC(+BSDXIEN,0))
+"RTN","BSDX32",80,0)
+ . Q:'$D(^BSDSC(+BSDXIEN,0))
+"RTN","BSDX32",81,0)
+ . S BSDXINA=$$GET1^DIQ(44,BSDXIEN_",",2505) ;INACTIVATE
+"RTN","BSDX32",82,0)
+ . S BSDXREA=$$GET1^DIQ(44,BSDXIEN_",",2506) ;REACTIVATE
+"RTN","BSDX32",83,0)
+ . I BSDXINA]""&(BSDXREA="") Q  ;Clinic is inactivated and has no reactivate date
+"RTN","BSDX32",84,0)
+ . S BSDXNOD=^BSDSC(BSDXIEN,0)
+"RTN","BSDX32",85,0)
+ . S BSDXNAM=$$GET1^DIQ(44,BSDXIEN_",",.01)
+"RTN","BSDX32",86,0)
+ . S BSDXCRV=$$GET1^DIQ(9009017.2,BSDXIEN_",",.09)
+"RTN","BSDX32",87,0)
+ . S BSDXVSC=$$GET1^DIQ(9009017.2,BSDXIEN_",",.12)
+"RTN","BSDX32",88,0)
+ . S BSDXMULT=$$GET1^DIQ(9009017.2,BSDXIEN_",",.13)
+"RTN","BSDX32",89,0)
+ . S BSDXREQ=$$GET1^DIQ(9009017.2,BSDXIEN_",",.14)
+"RTN","BSDX32",90,0)
+ . S BSDXPCC=$$GET1^DIQ(9009017.2,BSDXIEN_",",.15)
+"RTN","BSDX32",91,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX32",92,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXNAM_U_BSDXCRV_U_BSDXVSC_U_BSDXMULT_U_BSDXREQ_U_BSDXPCC_$C(30)
+"RTN","BSDX32",93,0)
+ . Q
+"RTN","BSDX32",94,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX32",95,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX32",96,0)
+ Q
+"RTN","BSDX33")
+0^31^B14923306
+"RTN","BSDX33",1,0)
+BSDX33 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 12:33pm
+"RTN","BSDX33",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX33",3,0)
+    ; Mods by WV/STAR
+"RTN","BSDX33",4,0)
+    ;
+"RTN","BSDX33",5,0)
+    ; Change Log:
+"RTN","BSDX33",6,0)
+    ; July 13, 2010
+"RTN","BSDX33",7,0)
+    ; v 1.3 adds fixes Rebooking behavior in application (see RBNEXT)
+"RTN","BSDX33",8,0)
+    ; also adds i18 support - Dates passed in FM format from application
+"RTN","BSDX33",9,0)
+    ; in tag SETRBK and RBNEXT
+"RTN","BSDX33",10,0)
+ ;
+"RTN","BSDX33",11,0)
+ ;
+"RTN","BSDX33",12,0)
+ Q
+"RTN","BSDX33",13,0)
+RBNEXTD(BSDXY,BSDXDATE,BSDXRES,BSDXTPID) ;EP
+"RTN","BSDX33",14,0)
+ ;Entry point for debugging
+"RTN","BSDX33",15,0)
+ ;
+"RTN","BSDX33",16,0)
+ ;D DEBUG^%Serenji("RBNEXT^BSDX33(.BSDXY,BSDXDATE,BSDXRES,BSDXTPID)")
+"RTN","BSDX33",17,0)
+ Q
+"RTN","BSDX33",18,0)
+ ;
+"RTN","BSDX33",19,0)
+RBNEXT(BSDXY,BSDXDATE,BSDXRES,BSDXTPID) ;EP
+"RTN","BSDX33",20,0)
+ ;Called by BSDX REBOOK NEXT BLOCK to find
+"RTN","BSDX33",21,0)
+ ;the next ACCESS BLOCK in resource BSDXRES after BSDXDATE
+"RTN","BSDX33",22,0)
+ ;Returns 1 in ERRORID and date in NEXTBLOCK if a block was found or NULL in NEXTBLOCK of no date found
+"RTN","BSDX33",23,0)
+ ;Otherwise, returns 0 and error message in ERRORTEXT
+"RTN","BSDX33",24,0)
+ ;If BSDXTPID = 0 then any access type match
+"RTN","BSDX33",25,0)
+ ;
+"RTN","BSDX33",26,0)
+ S X="ERROR2^BSDX33",@^%ZOSF("TRAP")
+"RTN","BSDX33",27,0)
+ N BSDXI,BSDXIENS,%DT,BSDXMSG,Y,BSDXRESD,BSDXFND,BSDXIEN,BSDXNOD,BSDXATID
+"RTN","BSDX33",28,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX33",29,0)
+ S BSDXI=0
+"RTN","BSDX33",30,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ERRORID^D00010NEXTBLOCK^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX33",31,0)
+ ;
+"RTN","BSDX33",32,0)
+ I BSDXRES="" D ERR2("BSDX REBOOK NEXT BLOCK: Invalid resource name") Q
+"RTN","BSDX33",33,0)
+ I '$D(^BSDXRES("B",BSDXRES)) D ERR2("BSDX REBOOK NEXT BLOCK: Invalid resource name") Q
+"RTN","BSDX33",34,0)
+ S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0))
+"RTN","BSDX33",35,0)
+ I '+BSDXRESD D ERR2("BSDX REBOOK NEXT BLOCK: Invalid resource name") Q
+"RTN","BSDX33",36,0)
+ ;
+"RTN","BSDX33",37,0)
+    ; i18n fix
+"RTN","BSDX33",38,0)
+    ; S X=BSDXDATE,%DT="XT" D ^%DT
+"RTN","BSDX33",39,0)
+ ; I Y=-1 D ERR2(1,"BSDX REBOOK NEXT BLOCK: Invalid datetime") Q
+"RTN","BSDX33",40,0)
+ ;
+"RTN","BSDX33",41,0)
+    ; S BSDXDATE=$P(Y,".")
+"RTN","BSDX33",42,0)
+ ;
+"RTN","BSDX33",43,0)
+ S BSDXFND=0
+"RTN","BSDX33",44,0)
+ F  S BSDXDATE=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXDATE)) Q:'+BSDXDATE  D  Q:BSDXFND
+"RTN","BSDX33",45,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXDATE,BSDXIEN)) Q:'+BSDXIEN  D  Q:BSDXFND
+"RTN","BSDX33",46,0)
+ . . Q:'$D(^BSDXAB(BSDXIEN,0))
+"RTN","BSDX33",47,0)
+ . . S BSDXNOD=^BSDXAB(BSDXIEN,0)
+"RTN","BSDX33",48,0)
+ . . Q:+$P(BSDXNOD,U,4)=0  ;Slots
+"RTN","BSDX33",49,0)
+ . . S BSDXATID=$P(BSDXNOD,U,5)
+"RTN","BSDX33",50,0)
+ . . I BSDXTPID=0!(BSDXATID=BSDXTPID) S BSDXFND=$P(BSDXNOD,U,2) Q
+"RTN","BSDX33",51,0)
+ ;
+"RTN","BSDX33",52,0)
+ I BSDXFND=0 S BSDXFND=""
+"RTN","BSDX33",53,0)
+ E  S Y=BSDXFND X ^DD("DD") S BSDXFND=Y
+"RTN","BSDX33",54,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",55,0)
+    ;//smh - bug (V 1.3): Need to replace @ in FM date for C# to recognize it
+"RTN","BSDX33",56,0)
+    S BSDXFND=$TR(BSDXFND,"@"," ")
+"RTN","BSDX33",57,0)
+    ;//smh end fix
+"RTN","BSDX33",58,0)
+ S ^BSDXTMP($J,BSDXI)="1^"_BSDXFND_"^"_$C(30)_$C(31)
+"RTN","BSDX33",59,0)
+ Q
+"RTN","BSDX33",60,0)
+SETRBKD(BSDXY,BSDXAPPT,BSDXDATE) ;EP
+"RTN","BSDX33",61,0)
+ ;Entry point for debugging
+"RTN","BSDX33",62,0)
+ ;
+"RTN","BSDX33",63,0)
+ ;D DEBUG^%Serenji("SETRBK^BSDX33(.BSDXY,BSDXAPPT,BSDXDATE)")
+"RTN","BSDX33",64,0)
+ Q
+"RTN","BSDX33",65,0)
+ ;
+"RTN","BSDX33",66,0)
+SETRBK(BSDXY,BSDXAPPT,BSDXDATE) ;EP
+"RTN","BSDX33",67,0)
+ ;
+"RTN","BSDX33",68,0)
+ ;Sets rebook date into appointment
+"RTN","BSDX33",69,0)
+ ;BSDXAPPT - Appointment ID
+"RTN","BSDX33",70,0)
+ ;BSDXDATE - Rebook Datetime in internal format
+"RTN","BSDX33",71,0)
+ ;Called by BSDX REBOOK SET
+"RTN","BSDX33",72,0)
+ ;
+"RTN","BSDX33",73,0)
+ ;ErrorID:
+"RTN","BSDX33",74,0)
+ ; 0 if a problem.  Message in ERRORTEXT
+"RTN","BSDX33",75,0)
+ ; 1 if OK
+"RTN","BSDX33",76,0)
+ ;
+"RTN","BSDX33",77,0)
+ S X="ERROR^BSDX33",@^%ZOSF("TRAP")
+"RTN","BSDX33",78,0)
+ N BSDXI,BSDXIENS,%DT,BSDXMSG,Y
+"RTN","BSDX33",79,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX33",80,0)
+ S BSDXI=0
+"RTN","BSDX33",81,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX33",82,0)
+ ;
+"RTN","BSDX33",83,0)
+ I '+BSDXAPPT
+"RTN","BSDX33",84,0)
+ I '$D(^BSDXAPPT(BSDXAPPT,0)) D ERR(1,"BSDX REBOOK SET: Invalid appointment ID") Q
+"RTN","BSDX33",85,0)
+ ; i18n (v 1.3)
+"RTN","BSDX33",86,0)
+    ;S X=BSDXDATE,%DT="XT" D ^%DT
+"RTN","BSDX33",87,0)
+ ;I Y=-1 D ERR(1,"BSDX REBOOK SET: Invalid rebook datetime") Q
+"RTN","BSDX33",88,0)
+ ;S BSDXDATE=Y
+"RTN","BSDX33",89,0)
+ S BSDXIENS=BSDXAPPT_","
+"RTN","BSDX33",90,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.11)=+BSDXDATE
+"RTN","BSDX33",91,0)
+ ;
+"RTN","BSDX33",92,0)
+ K BSDXMSG
+"RTN","BSDX33",93,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX33",94,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",95,0)
+ S ^BSDXTMP($J,BSDXI)="1^"_$C(31)
+"RTN","BSDX33",96,0)
+ ;
+"RTN","BSDX33",97,0)
+ Q
+"RTN","BSDX33",98,0)
+ ;
+"RTN","BSDX33",99,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX33",100,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX33",101,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",102,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX33",103,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",104,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX33",105,0)
+ Q
+"RTN","BSDX33",106,0)
+ ;
+"RTN","BSDX33",107,0)
+ERROR ;
+"RTN","BSDX33",108,0)
+ D ^%ZTER
+"RTN","BSDX33",109,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX33",110,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",111,0)
+ D ERR(0,"BSDX33 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX33",112,0)
+ Q
+"RTN","BSDX33",113,0)
+ ;
+"RTN","BSDX33",114,0)
+ERR2(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX33",115,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX33",116,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",117,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^^"_ERRTXT_$C(30)
+"RTN","BSDX33",118,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",119,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX33",120,0)
+ Q
+"RTN","BSDX33",121,0)
+ ;
+"RTN","BSDX33",122,0)
+ERROR2 ;
+"RTN","BSDX33",123,0)
+ D ^%ZTER
+"RTN","BSDX33",124,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX33",125,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",126,0)
+ D ERR2(0,"BSDX33 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX33",127,0)
+ Q
+"RTN","BSDX34")
+0^32^B43182525
+"RTN","BSDX34",1,0)
+BSDX34 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 12:37pm
+"RTN","BSDX34",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX34",3,0)
+    ;
+"RTN","BSDX34",4,0)
+    ; Change Log:
+"RTN","BSDX34",5,0)
+    ; July 10 2010: 
+"RTN","BSDX34",6,0)
+ ; CANCLIN AND RBCLIN: Dates passed in FM format for i18n
+"RTN","BSDX34",7,0)
+ ;
+"RTN","BSDX34",8,0)
+ Q
+"RTN","BSDX34",9,0)
+ ;
+"RTN","BSDX34",10,0)
+RBCLIND(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX34",11,0)
+ ;Entry point for debugging
+"RTN","BSDX34",12,0)
+ ;
+"RTN","BSDX34",13,0)
+ ;D DEBUG^%Serenji("RBCLIN^BSDX34(.BSDXY,BSDXCLST,BSDXBEG,BSDXEND)")
+"RTN","BSDX34",14,0)
+ Q
+"RTN","BSDX34",15,0)
+ ;
+"RTN","BSDX34",16,0)
+RBERR ;
+"RTN","BSDX34",17,0)
+ ;Called from RBCLIN on error to set up header
+"RTN","BSDX34",18,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX34",19,0)
+ S ^BSDXTMP($J,0)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030NewApptDate^T00030Clinic^T00030TypeStatus^I00010RESOURCEID"
+"RTN","BSDX34",20,0)
+ S ^BSDXTMP($J,0)=^(0)_"^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE^D00030OldApptDate"_$C(30)
+"RTN","BSDX34",21,0)
+ D ERR(999)
+"RTN","BSDX34",22,0)
+ Q
+"RTN","BSDX34",23,0)
+ ;
+"RTN","BSDX34",24,0)
+CANCLIN(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX34",25,0)
+ ;
+"RTN","BSDX34",26,0)
+ ;Return recordset of CANCELLED patient appointments
+"RTN","BSDX34",27,0)
+ ;between dates BSDXBEG and BSDXEND for each clinic in BSDXCLST.
+"RTN","BSDX34",28,0)
+ ;Used in generating cancellation letters for a clinic
+"RTN","BSDX34",29,0)
+ ;BSDXCLST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX34",30,0)
+    ;v 1.3 BSDXBEG and BSDXEND are in fm format
+"RTN","BSDX34",31,0)
+ ;Called by BSDX CANCEL CLINIC LIST
+"RTN","BSDX34",32,0)
+ N BSDXCAN
+"RTN","BSDX34",33,0)
+ S BSDXCAN=1
+"RTN","BSDX34",34,0)
+ D RBCLIN(.BSDXY,BSDXCLST,BSDXBEG,BSDXEND)
+"RTN","BSDX34",35,0)
+ ;
+"RTN","BSDX34",36,0)
+ Q
+"RTN","BSDX34",37,0)
+ ;
+"RTN","BSDX34",38,0)
+RBCLIN(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX34",39,0)
+ ;
+"RTN","BSDX34",40,0)
+ ;Return recordset of rebooked patient appointments
+"RTN","BSDX34",41,0)
+ ;between dates BSDXBEG and BSDXEND for each clinic in BSDXCLST.
+"RTN","BSDX34",42,0)
+ ;Used in generating rebook letters for a clinic
+"RTN","BSDX34",43,0)
+ ;BSDXCLST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX34",44,0)
+ ;Called by BSDX REBOOK CLINIC LIST and BSDX CANCEL CLINIC LIST via entry point CANCLIN above
+"RTN","BSDX34",45,0)
+ ;Jul 11 2010 (smh):
+"RTN","BSDX34",46,0)
+    ;for i18n, pass BSDXBEG and BSDXEND in FM format.
+"RTN","BSDX34",47,0)
+ ;
+"RTN","BSDX34",48,0)
+ S X="RBERR^BSDX34",@^%ZOSF("TRAP")
+"RTN","BSDX34",49,0)
+ ;
+"RTN","BSDX34",50,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX34",51,0)
+ N %DT,Y,BSDXJ,BSDXCID,BSDXCLN,BSDXSTRT,BSDXAID,BSDXNOD,BSDXLIST,BSDX,BSDY
+"RTN","BSDX34",52,0)
+ ;Convert beginning and ending dates
+"RTN","BSDX34",53,0)
+ ;TODO: Validation of date to make sure it's a right FM Date
+"RTN","BSDX34",54,0)
+    S BSDXBEG=$P(BSDXBEG,".")
+"RTN","BSDX34",55,0)
+    S BSDXEND=$P(BSDXEND,".")
+"RTN","BSDX34",56,0)
+ S BSDXBEG=BSDXBEG-1,BSDXBEG=BSDXBEG_".9999"
+"RTN","BSDX34",57,0)
+ S BSDXEND=BSDXEND_".9999"
+"RTN","BSDX34",58,0)
+    ;
+"RTN","BSDX34",59,0)
+ I BSDXCLST="" D RBERR Q
+"RTN","BSDX34",60,0)
+ ;
+"RTN","BSDX34",61,0)
+ ;
+"RTN","BSDX34",62,0)
+ ;If BSDXCLST is a list of resource NAMES, look up each name and convert to IEN
+"RTN","BSDX34",63,0)
+ F BSDXJ=1:1:$L(BSDXCLST,"|")-1 S BSDX=$P(BSDXCLST,"|",BSDXJ) D  S $P(BSDXCLST,"|",BSDXJ)=BSDY
+"RTN","BSDX34",64,0)
+ . S BSDY=""
+"RTN","BSDX34",65,0)
+ . I BSDX]"",$D(^BSDXRES(BSDX,0)) S BSDY=BSDX Q
+"RTN","BSDX34",66,0)
+ . I BSDX]"",$D(^BSDXRES("B",BSDX)) S BSDY=$O(^BSDXRES("B",BSDX,0)) Q
+"RTN","BSDX34",67,0)
+ . Q
+"RTN","BSDX34",68,0)
+ ;
+"RTN","BSDX34",69,0)
+ ;For each clinic in BSDXCLST $O through ^BSDXAPPT("ARSRC",ResourceIEN,FMDate,ApptIEN)
+"RTN","BSDX34",70,0)
+ ;
+"RTN","BSDX34",71,0)
+ S BSDXLIST=""
+"RTN","BSDX34",72,0)
+ F BSDXJ=1:1:$L(BSDXCLST,"|")-1 S BSDXCID=$P(BSDXCLST,"|",BSDXJ) D:+BSDXCID
+"RTN","BSDX34",73,0)
+ . S BSDXCLN=$G(^BSDXRES(BSDXCID,0)) S BSDXCLN=$P(BSDXCLN,U) Q:BSDXCLN=""
+"RTN","BSDX34",74,0)
+ . S BSDXSTRT=BSDXBEG F  S BSDXSTRT=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT)) Q:'+BSDXSTRT  Q:BSDXSTRT>BSDXEND  D
+"RTN","BSDX34",75,0)
+ . . S BSDXAID=0 F  S BSDXAID=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT,BSDXAID)) Q:'+BSDXAID  D
+"RTN","BSDX34",76,0)
+ . . . S BSDXNOD=$G(^BSDXAPPT(BSDXAID,0))
+"RTN","BSDX34",77,0)
+ . . . I $D(BSDXCAN) D  Q
+"RTN","BSDX34",78,0)
+ . . . . I $P(BSDXNOD,U,12) S BSDXLIST=BSDXLIST_BSDXAID_"|" ;Cancelled appt
+"RTN","BSDX34",79,0)
+ . . . I $P(BSDXNOD,U,11) S BSDXLIST=BSDXLIST_BSDXAID_"|" ;Rebooked appt
+"RTN","BSDX34",80,0)
+ D RBLETT(.BSDXY,BSDXLIST)
+"RTN","BSDX34",81,0)
+ Q
+"RTN","BSDX34",82,0)
+ ;
+"RTN","BSDX34",83,0)
+RBLETTD(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX34",84,0)
+ ;Entry point for debugging
+"RTN","BSDX34",85,0)
+ ;
+"RTN","BSDX34",86,0)
+ ;D DEBUG^%Serenji("RBLETT^BSDX34(.BSDXY,BSDXLIST)")
+"RTN","BSDX34",87,0)
+ Q
+"RTN","BSDX34",88,0)
+ ;
+"RTN","BSDX34",89,0)
+RBLETT(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX34",90,0)
+ ;Return recordset of patient appointments used in listing
+"RTN","BSDX34",91,0)
+ ;REBOOKED appointments for a list of appointmentIDs.
+"RTN","BSDX34",92,0)
+ ;Called by rpc BSDX REBOOK LIST
+"RTN","BSDX34",93,0)
+ ;BSDXLIST is a |-delimited list of BSDX APPOINTMENT iens (the last |-piece is null)
+"RTN","BSDX34",94,0)
+ ;
+"RTN","BSDX34",95,0)
+ N BSDXI,BSDXIEN,BSDXNOD,BSDXCNID,BSDXCNOD,BSDXMADE,BSDXCLRK,BSDXNOT,BSDXQ,BSDX
+"RTN","BSDX34",96,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX34",97,0)
+ S BSDXI=0
+"RTN","BSDX34",98,0)
+ S ^BSDXTMP($J,BSDXI)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030NewApptDate^T00030Clinic^T00030TypeStatus"
+"RTN","BSDX34",99,0)
+ S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE^D00030OldApptDate"_$C(30)
+"RTN","BSDX34",100,0)
+ S X="ERROR^BSDX34",@^%ZOSF("TRAP")
+"RTN","BSDX34",101,0)
+ ;
+"RTN","BSDX34",102,0)
+ ;Iterate through BSDXLIST
+"RTN","BSDX34",103,0)
+ S BSDXIEN=0
+"RTN","BSDX34",104,0)
+ F BSDX=1:1:$L(BSDXLIST,"|")-1 S BSDXIEN=$P(BSDXLIST,"|",BSDX) D
+"RTN","BSDX34",105,0)
+ . N BSDXNOD,BSDXAPT,BSDXCID,BSDXCNOD,BSDXCLN,BSDX44,BSDXDNOD,BSDXSTAT,BSDX,BSDXTYPE,BSDXLIN,BSDXPAT
+"RTN","BSDX34",106,0)
+ . N BSDXSTRE,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX34",107,0)
+ . N BSDXNAM,BSDXDOB,BSDXHRN,BSDXSEX
+"RTN","BSDX34",108,0)
+ . N BSDXREBK
+"RTN","BSDX34",109,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXIEN,0))
+"RTN","BSDX34",110,0)
+ . Q:BSDXNOD=""
+"RTN","BSDX34",111,0)
+ . S BSDXPAT=$P(BSDXNOD,U,5) ;PATIENT ien
+"RTN","BSDX34",112,0)
+ . Q:'+BSDXPAT
+"RTN","BSDX34",113,0)
+ . Q:'$D(^DPT(BSDXPAT))
+"RTN","BSDX34",114,0)
+ . D PINFO(BSDXPAT)
+"RTN","BSDX34",115,0)
+ . S Y=$P(BSDXNOD,U)
+"RTN","BSDX34",116,0)
+ . Q:'+Y
+"RTN","BSDX34",117,0)
+ . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX34",118,0)
+ . S BSDXAPT=Y ;Appointment date time
+"RTN","BSDX34",119,0)
+ . S BSDXREBK=""
+"RTN","BSDX34",120,0)
+ . S Y=$P(BSDXNOD,U,11)
+"RTN","BSDX34",121,0)
+ . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ") S BSDXREBK=Y ;Rebook date time
+"RTN","BSDX34",122,0)
+ . S BSDXCLRK=$P(BSDXNOD,U,8) ;Appointment made by
+"RTN","BSDX34",123,0)
+ . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX34",124,0)
+ . S Y=$P(BSDXNOD,U,9) ;Date Appointment Made
+"RTN","BSDX34",125,0)
+ . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX34",126,0)
+ . S BSDXMADE=Y
+"RTN","BSDX34",127,0)
+ . ;NOTE
+"RTN","BSDX34",128,0)
+ . S BSDXNOT=""
+"RTN","BSDX34",129,0)
+ . I $D(^BSDXAPPT(BSDXIEN,1,0)) S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXIEN,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX34",130,0)
+ . . S BSDXLIN=$G(^BSDXAPPT(BSDXIEN,1,BSDXQ,0))
+"RTN","BSDX34",131,0)
+ . . S:(BSDXLIN'="")&($E(BSDXLIN,$L(BSDXLIN)-1,$L(BSDXLIN))'=" ") BSDXLIN=BSDXLIN_" "
+"RTN","BSDX34",132,0)
+ . . S BSDXNOT=BSDXNOT_BSDXLIN
+"RTN","BSDX34",133,0)
+ . ;Resource
+"RTN","BSDX34",134,0)
+ . S BSDXCID=$P(BSDXNOD,U,7) ;IEN of BSDX RESOURCE
+"RTN","BSDX34",135,0)
+ . Q:'+BSDXCID
+"RTN","BSDX34",136,0)
+ . Q:'$D(^BSDXRES(BSDXCID,0))
+"RTN","BSDX34",137,0)
+ . S BSDXCNOD=$G(^BSDXRES(BSDXCID,0)) ;BSDX RESOURCE node
+"RTN","BSDX34",138,0)
+ . Q:BSDXCNOD=""
+"RTN","BSDX34",139,0)
+ . S BSDXCLN=$P(BSDXCNOD,U) ;Text name of BSDX Resource
+"RTN","BSDX34",140,0)
+ . S BSDXTYPE="" ;Unused in this recordset
+"RTN","BSDX34",141,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX34",142,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXREBK_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_BSDXCID_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_"^"_BSDXAPT_$C(30)
+"RTN","BSDX34",143,0)
+ . Q
+"RTN","BSDX34",144,0)
+ ;
+"RTN","BSDX34",145,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX34",146,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX34",147,0)
+ Q
+"RTN","BSDX34",148,0)
+ ;
+"RTN","BSDX34",149,0)
+PINFO(BSDXPAT) ;
+"RTN","BSDX34",150,0)
+ ;Get patient info
+"RTN","BSDX34",151,0)
+ N BSDXNOD
+"RTN","BSDX34",152,0)
+ S BSDXNOD=$$PATINFO^BSDX27(BSDXPAT)
+"RTN","BSDX34",153,0)
+ S BSDXNAM=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX34",154,0)
+ S BSDXSEX=$P(BSDXNOD,U,2) ;SEX
+"RTN","BSDX34",155,0)
+ S BSDXDOB=$P(BSDXNOD,U,3) ;DOB
+"RTN","BSDX34",156,0)
+ S BSDXHRN=$P(BSDXNOD,U,4) ;Health Record Number for location DUZ(2)
+"RTN","BSDX34",157,0)
+ S BSDXSTRE=$P(BSDXNOD,U,5) ;Street
+"RTN","BSDX34",158,0)
+ S BSDXCITY=$P(BSDXNOD,U,6) ;City
+"RTN","BSDX34",159,0)
+ S BSDXST=$P(BSDXNOD,U,7) ;State
+"RTN","BSDX34",160,0)
+ S BSDXZIP=$P(BSDXNOD,U,8) ;zip
+"RTN","BSDX34",161,0)
+ S BSDXPHON=$P(BSDXNOD,U,9) ;homephone
+"RTN","BSDX34",162,0)
+ Q
+"RTN","BSDX34",163,0)
+ ;
+"RTN","BSDX34",164,0)
+ERROR ;
+"RTN","BSDX34",165,0)
+ D ERR("RPMS Error")
+"RTN","BSDX34",166,0)
+ Q
+"RTN","BSDX34",167,0)
+ ;
+"RTN","BSDX34",168,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX34",169,0)
+ S:'$D(BSDXI) BSDXI=999
+"RTN","BSDX34",170,0)
+ I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX34",171,0)
+ E  S BSDXERR=ERRNO
+"RTN","BSDX34",172,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX34",173,0)
+ S ^BSDXTMP($J,BSDXI)="^^^^^^^^^^^^^^^^"_$C(30)
+"RTN","BSDX34",174,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX34",175,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX34",176,0)
+ Q
+"RTN","BSDX35")
+0^33^B8147998
+"RTN","BSDX35",1,0)
+BSDX35 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX35",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDX35",3,0)
+ ;
+"RTN","BSDX35",4,0)
+ ;
+"RTN","BSDX35",5,0)
+ Q
+"RTN","BSDX35",6,0)
+ ;
+"RTN","BSDX35",7,0)
+RSRCLTRD(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX35",8,0)
+ ;Entry point for debugging
+"RTN","BSDX35",9,0)
+ ;
+"RTN","BSDX35",10,0)
+ ;D DEBUG^%Serenji("RSRCLTR^BSDX35(.BSDXY,BSDXLIST)")
+"RTN","BSDX35",11,0)
+ Q
+"RTN","BSDX35",12,0)
+ ;
+"RTN","BSDX35",13,0)
+RSRCLTR(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX35",14,0)
+ ;
+"RTN","BSDX35",15,0)
+ ;Return recordset of RESOURCES and associated LETTERS
+"RTN","BSDX35",16,0)
+ ;Used in generating rebook letters for a clinic
+"RTN","BSDX35",17,0)
+ ;BSDXLIST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX35",18,0)
+ ;Called by BSDX RESOURCE LETTERS
+"RTN","BSDX35",19,0)
+ ;
+"RTN","BSDX35",20,0)
+ ;
+"RTN","BSDX35",21,0)
+ S X="ERROR^BSDX35",@^%ZOSF("TRAP")
+"RTN","BSDX35",22,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX35",23,0)
+ N BSDXIEN,BSDX,BSDXLTR,BSDXNOS,BSDXCAN,BSDXIEN1
+"RTN","BSDX35",24,0)
+ S BSDXI=0
+"RTN","BSDX35",25,0)
+ S ^BSDXTMP($J,BSDXI)="I00010RESOURCEID^T00030RESOURCE_NAME^T00030LETTER_TEXT^T00030NO_SHOW_LETTER^T00030CLINIC_CANCELLATION_LETTER"_$C(30)
+"RTN","BSDX35",26,0)
+ ;
+"RTN","BSDX35",27,0)
+ ;
+"RTN","BSDX35",28,0)
+ ;If BSDXLIST is a list of resource NAMES, look up each name and convert to IEN
+"RTN","BSDX35",29,0)
+ F BSDXJ=1:1:$L(BSDXLIST,"|")-1 S BSDX=$P(BSDXLIST,"|",BSDXJ) D  S $P(BSDXLIST,"|",BSDXJ)=BSDY
+"RTN","BSDX35",30,0)
+ . S BSDY=""
+"RTN","BSDX35",31,0)
+ . I BSDX]"",$D(^BSDXRES(BSDX,0)) S BSDY=BSDX Q
+"RTN","BSDX35",32,0)
+ . I BSDX]"",$D(^BSDXRES("B",BSDX)) S BSDY=$O(^BSDXRES("B",BSDX,0)) Q
+"RTN","BSDX35",33,0)
+ . Q
+"RTN","BSDX35",34,0)
+ ;
+"RTN","BSDX35",35,0)
+ ;Get letter text from wp fields
+"RTN","BSDX35",36,0)
+ S BSDXIEN=0
+"RTN","BSDX35",37,0)
+ F BSDX=1:1:$L(BSDXLIST,"|")-1 S BSDXIEN=$P(BSDXLIST,"|",BSDX) D
+"RTN","BSDX35",38,0)
+ . Q:'$D(^BSDXRES(BSDXIEN))
+"RTN","BSDX35",39,0)
+ . S BSDXNAM=$P(^BSDXRES(BSDXIEN,0),U)
+"RTN","BSDX35",40,0)
+ . S BSDXLTR=""
+"RTN","BSDX35",41,0)
+ . I $D(^BSDXRES(BSDXIEN,1)) D
+"RTN","BSDX35",42,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXRES(BSDXIEN,1,BSDXIEN1)) Q:'+BSDXIEN1  D
+"RTN","BSDX35",43,0)
+ . . . S BSDXLTR=BSDXLTR_$G(^BSDXRES(BSDXIEN,1,BSDXIEN1,0))
+"RTN","BSDX35",44,0)
+ . . . S BSDXLTR=BSDXLTR_$C(13)_$C(10)
+"RTN","BSDX35",45,0)
+ . S BSDXNOS=""
+"RTN","BSDX35",46,0)
+ . I $D(^BSDXRES(BSDXIEN,12)) D
+"RTN","BSDX35",47,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXRES(BSDXIEN,12,BSDXIEN1)) Q:'+BSDXIEN1  D
+"RTN","BSDX35",48,0)
+ . . . S BSDXNOS=BSDXNOS_$G(^BSDXRES(BSDXIEN,12,BSDXIEN1,0))
+"RTN","BSDX35",49,0)
+ . . . S BSDXNOS=BSDXNOS_$C(13)_$C(10)
+"RTN","BSDX35",50,0)
+ . S BSDXCAN=""
+"RTN","BSDX35",51,0)
+ . I $D(^BSDXRES(BSDXIEN,13)) D
+"RTN","BSDX35",52,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXRES(BSDXIEN,13,BSDXIEN1)) Q:'+BSDXIEN1  D
+"RTN","BSDX35",53,0)
+ . . . S BSDXCAN=BSDXCAN_$G(^BSDXRES(BSDXIEN,13,BSDXIEN1,0))
+"RTN","BSDX35",54,0)
+ . . . S BSDXCAN=BSDXCAN_$C(13)_$C(10)
+"RTN","BSDX35",55,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX35",56,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXNAM_U_BSDXLTR_U_BSDXNOS_U_BSDXCAN_$C(30)
+"RTN","BSDX35",57,0)
+ ;
+"RTN","BSDX35",58,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX35",59,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX35",60,0)
+ Q
+"RTN","BSDX35",61,0)
+ ;
+"RTN","BSDX35",62,0)
+ERROR ;
+"RTN","BSDX35",63,0)
+ D ERR("RPMS Error")
+"RTN","BSDX35",64,0)
+ Q
+"RTN","BSDX35",65,0)
+ ;
+"RTN","BSDX35",66,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX35",67,0)
+ S:'$D(BSDXI) BSDXI=999
+"RTN","BSDX35",68,0)
+ I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX35",69,0)
+ E  S BSDXERR=ERRNO
+"RTN","BSDX35",70,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX35",71,0)
+ S ^BSDXTMP($J,BSDXI)="^^^^"_$C(30)
+"RTN","BSDX35",72,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX35",73,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX35",74,0)
+ Q
+"RTN","BSDXAPI")
+0^35^B148584022
+"RTN","BSDXAPI",1,0)
+BSDXAPI ; IHS/ANMC/LJF - SCHEDULING APIs ; 1/26/11 11:47am
+"RTN","BSDXAPI",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDXAPI",3,0)
+ ;Orignal routine is BSDAPI by IHS/LJF, HMW, and MAW
+"RTN","BSDXAPI",4,0)
+ ;local mods (many) by WV/SMH
+"RTN","BSDXAPI",5,0)
+ ;Move to BSDX namespace as BSDXAPI from BSDAPI by WV/SMH
+"RTN","BSDXAPI",6,0)
+ ; Change History:
+"RTN","BSDXAPI",7,0)
+ ; 2010-11-5: (1.42)
+"RTN","BSDXAPI",8,0)
+ ; - Fixed errors having to do uncanceling patient appointments if it was a patient cancelled appointment.
+"RTN","BSDXAPI",9,0)
+ ; - Use new style Fileman API for storing appointments in file 44 in $$MAKE due to problems with legacy API.
+"RTN","BSDXAPI",10,0)
+ ; 2010-11-12: (1.42)
+"RTN","BSDXAPI",11,0)
+ ; - Changed ="C" to ["C" in SCIEN. Cancelled appointments can be "PC" as well. 
+"RTN","BSDXAPI",12,0)
+ ; 2010-12-5 (1.42)
+"RTN","BSDXAPI",13,0)
+ ; Added an entry point to update the patient note in file 44.
+"RTN","BSDXAPI",14,0)
+ ; 2010-12-6 (1.42)
+"RTN","BSDXAPI",15,0)
+ ; MAKE1 incorrectly put info field in BSDR("INFO") rather than BSDR("OI")
+"RTN","BSDXAPI",16,0)
+ ; 2010-12-8 (1.42)
+"RTN","BSDXAPI",17,0)
+ ; Removed restriction on max appt length. Even though this restriction
+"RTN","BSDXAPI",18,0)
+ ; exists in fileman (120 minutes), PIMS ignores it. Therefore, I 
+"RTN","BSDXAPI",19,0)
+ ; will ignore it here too.
+"RTN","BSDXAPI",20,0)
+ ; 2011-01-25 (v.1.5)
+"RTN","BSDXAPI",21,0)
+ ; Added entry point $$RMCI to remove checked in appointments.
+"RTN","BSDXAPI",22,0)
+ ; In $$CANCEL, if the appointment is checked in, delete check-in rather than
+"RTN","BSDXAPI",23,0)
+ ;  spitting an error message to the user saying 'Delete the check-in'
+"RTN","BSDXAPI",24,0)
+ ; Changed all lines that look like this:
+"RTN","BSDXAPI",25,0)
+ ;  I $G(BSDR("ADT"))'?7N1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",26,0)
+ ; to:
+"RTN","BSDXAPI",27,0)
+ ;  I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",28,0)
+ ; to allow for date at midnight which does not have a dot at the end.
+"RTN","BSDXAPI",29,0)
+ ; 2011-01-26 (v.1.5)
+"RTN","BSDXAPI",30,0)
+ ; More user friendly message if patient already has appointment in $$MAKE:
+"RTN","BSDXAPI",31,0)
+ ;  Spits out pt name and user friendly date.
+"RTN","BSDXAPI",32,0)
+ ;  
+"RTN","BSDXAPI",33,0)
+ ;
+"RTN","BSDXAPI",34,0)
+MAKE1(DFN,CLIN,TYP,DATE,LEN,INFO) ; Simplified PEP w/ parameters for $$MAKE - making appointment
+"RTN","BSDXAPI",35,0)
+ ; Call like this for DFN 23435 having an appointment at Hospital Location 33
+"RTN","BSDXAPI",36,0)
+ ; have 3 (scheduled) or 4 (walkin) appt at Dec 20, 2009 @ 10:11:59 for 30 minutes appt
+"RTN","BSDXAPI",37,0)
+ ; for Baby foxes hallucinations.
+"RTN","BSDXAPI",38,0)
+ ; S RESULT=$$MAKE1^BSDXAPI(23435,33,(3 or 4),3091220.221159,30,"I see Baby foxes")
+"RTN","BSDXAPI",39,0)
+ S BSDR("PAT")=DFN       ;DFN
+"RTN","BSDXAPI",40,0)
+ S BSDR("CLN")=CLIN      ;Hosp Loc IEN
+"RTN","BSDXAPI",41,0)
+ S BSDR("TYP")=TYP       ;3 sched or 4 walkin
+"RTN","BSDXAPI",42,0)
+ S BSDR("ADT")=DATE      ;Appointment date in FM format
+"RTN","BSDXAPI",43,0)
+ S BSDR("LEN")=LEN       ;Appt len upto 240 (min)
+"RTN","BSDXAPI",44,0)
+ S BSDR("OI")=INFO     ;Reason for appt - up to 150 char
+"RTN","BSDXAPI",45,0)
+ S BSDR("USR")=DUZ       ;Person who made appt - current user
+"RTN","BSDXAPI",46,0)
+ Q $$MAKE(.BSDR)
+"RTN","BSDXAPI",47,0)
+ ;
+"RTN","BSDXAPI",48,0)
+MAKE(BSDR) ;PEP; call to store appt made
+"RTN","BSDXAPI",49,0)
+ ;
+"RTN","BSDXAPI",50,0)
+ ; Make call using: S ERR=$$MAKE^BSDXAPI(.ARRAY)
+"RTN","BSDXAPI",51,0)
+ ;
+"RTN","BSDXAPI",52,0)
+ ; Input Array -
+"RTN","BSDXAPI",53,0)
+ ; BSDR("PAT") = ien of patient in file 2
+"RTN","BSDXAPI",54,0)
+ ; BSDR("CLN") = ien of clinic in file 44
+"RTN","BSDXAPI",55,0)
+ ; BSDR("TYP") = 3 for scheduled appts, 4 for walkins
+"RTN","BSDXAPI",56,0)
+ ; BSDR("ADT") = appointment date and time
+"RTN","BSDXAPI",57,0)
+ ; BSDR("LEN") = appointment length in minutes (*1.42 limit removed)
+"RTN","BSDXAPI",58,0)
+ ; BSDR("OI")  = reason for appt - up to 150 characters
+"RTN","BSDXAPI",59,0)
+ ; BSDR("USR") = user who made appt
+"RTN","BSDXAPI",60,0)
+ ;
+"RTN","BSDXAPI",61,0)
+ ;Output: error status and message
+"RTN","BSDXAPI",62,0)
+ ;   = 0 or null:  everything okay
+"RTN","BSDXAPI",63,0)
+ ;   = 1^message:  error and reason
+"RTN","BSDXAPI",64,0)
+ ;
+"RTN","BSDXAPI",65,0)
+ I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT"))
+"RTN","BSDXAPI",66,0)
+ I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN"))
+"RTN","BSDXAPI",67,0)
+ I ($G(BSDR("TYP"))<3)!($G(BSDR("TYP"))>4) Q 1_U_"Appt Type error: "_$G(BSDR("TYP"))
+"RTN","BSDXAPI",68,0)
+ I $G(BSDR("ADT")) S BSDR("ADT")=+$E(BSDR("ADT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",69,0)
+ I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",70,0)
+ ;
+"RTN","BSDXAPI",71,0)
+ ;I ($G(BSDR("LEN"))<5)!($G(BSDR("LEN"))>240) Q 1_U_"Appt Length error: "_$G(BSDR("LEN")) ; v 1.42 - no check on length is done anymore. see top comments for details.
+"RTN","BSDXAPI",72,0)
+ I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Made Appt Error: "_$G(BSDR("USR"))
+"RTN","BSDXAPI",73,0)
+ ;I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)'["C" Q 1_U_"Patient "_BSDR("PAT")_" already has appt at "_BSDR("ADT") ; v.1.5 more user friendly err msg
+"RTN","BSDXAPI",74,0)
+ ;
+"RTN","BSDXAPI",75,0)
+ ; Following block to give an error message to user if there is already an appointment for patient. More verbose than others.
+"RTN","BSDXAPI",76,0)
+ N BSDXERR ; place to store error message
+"RTN","BSDXAPI",77,0)
+ I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)'["C" DO  QUIT BSDXERR  ; If there's an appt in the "S" node of file 2 and it's not cancelled
+"RTN","BSDXAPI",78,0)
+ . S BSDXERR=1_U_"Patient "_$P(^DPT(BSDR("PAT"),0),U)_" ("_BSDR("PAT")_") "
+"RTN","BSDXAPI",79,0)
+ . S BSDXERR=BSDXERR_"already has appt at "_$$FMTE^XLFDT(BSDR("ADT"))
+"RTN","BSDXAPI",80,0)
+ . N BSDXSCIEN S BSDXSCIEN=$P(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0),U)  ; Clinic IEN in ^SC (0 piece of 0 node of "S" multiple in file 2)
+"RTN","BSDXAPI",81,0)
+ . N BSDXSCNAM S BSDXSCNAM=$P(^SC(BSDXSCIEN,0),U) ; PIMS Name of Clinic
+"RTN","BSDXAPI",82,0)
+ . S BSDXERR=BSDXERR_$C(13,10)_"PIMS clinic: "_BSDXSCNAM ; tell the user of the PIMS clinic
+"RTN","BSDXAPI",83,0)
+ . I $D(^BSDXRES("ALOC",BSDXSCIEN)) DO  ; if the Clinic is linked to a BSDX Resource (we find out using the index ALOC in the BSDX RESOURCE file)
+"RTN","BSDXAPI",84,0)
+ . . N BSDXRESIEN S BSDXRESIEN=$O(^BSDXRES("ALOC",BSDXSCIEN,""))
+"RTN","BSDXAPI",85,0)
+ . . QUIT:'BSDXRESIEN  ; Safeguard if index is corrupt
+"RTN","BSDXAPI",86,0)
+ . . N BSDXRESNAM S BSDXRESNAM=$P(^BSDXRES(BSDXRESIEN,0),U)
+"RTN","BSDXAPI",87,0)
+ . . S BSDXERR=BSDXERR_$C(13,10)_"Scheduling GUI clinic: "_BSDXRESNAM ; tell the user of the BSDX clinic
+"RTN","BSDXAPI",88,0)
+ ;
+"RTN","BSDXAPI",89,0)
+ NEW DIC,DA,Y,X,DD,DO,DLAYGO
+"RTN","BSDXAPI",90,0)
+ ;
+"RTN","BSDXAPI",91,0)
+ I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)["C" D
+"RTN","BSDXAPI",92,0)
+ . ; "un-cancel" existing appt in file 2
+"RTN","BSDXAPI",93,0)
+ . N BSDXFDA,BSDXIENS,BSDXMSG
+"RTN","BSDXAPI",94,0)
+ . S BSDXIENS=BSDR("ADT")_","_BSDR("PAT")_","
+"RTN","BSDXAPI",95,0)
+ . S BSDXFDA(2.98,BSDXIENS,".01")=BSDR("CLN")
+"RTN","BSDXAPI",96,0)
+ . S BSDXFDA(2.98,BSDXIENS,"3")=""
+"RTN","BSDXAPI",97,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9")=BSDR("TYP")
+"RTN","BSDXAPI",98,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9.5")=9
+"RTN","BSDXAPI",99,0)
+ . S BSDXFDA(2.98,BSDXIENS,"14")=""
+"RTN","BSDXAPI",100,0)
+ . S BSDXFDA(2.98,BSDXIENS,"15")=""
+"RTN","BSDXAPI",101,0)
+ . S BSDXFDA(2.98,BSDXIENS,"16")=""
+"RTN","BSDXAPI",102,0)
+ . S BSDXFDA(2.98,BSDXIENS,"19")=""
+"RTN","BSDXAPI",103,0)
+ . S BSDXFDA(2.98,BSDXIENS,"20")=$$NOW^XLFDT
+"RTN","BSDXAPI",104,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDXAPI",105,0)
+ . N BSDXTEMP S BSDXTEMP=$G(BSDXMSG)
+"RTN","BSDXAPI",106,0)
+ E  D  I $G(BSDXERR(1)) Q 1_U_"FileMan add to DPT error: Patient="_BSDR("PAT")_" Appt="_BSDR("ADT")  
+"RTN","BSDXAPI",107,0)
+ . N BSDXFDA,BSDXIENS,BSDXMSG
+"RTN","BSDXAPI",108,0)
+ . S BSDXIENS="?+2,"_BSDR("PAT")_","
+"RTN","BSDXAPI",109,0)
+ . S BSDXIENS(2)=BSDR("ADT")
+"RTN","BSDXAPI",110,0)
+ . S BSDXFDA(2.98,BSDXIENS,.01)=BSDR("CLN")
+"RTN","BSDXAPI",111,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9")=BSDR("TYP")
+"RTN","BSDXAPI",112,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9.5")=9
+"RTN","BSDXAPI",113,0)
+ . S BSDXFDA(2.98,BSDXIENS,"20")=$$NOW^XLFDT
+"RTN","BSDXAPI",114,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIENS","BSDXERR(1)")
+"RTN","BSDXAPI",115,0)
+ ; add appt to file 44
+"RTN","BSDXAPI",116,0)
+ K DIC,DA,X,Y,DLAYGO,DD,DO
+"RTN","BSDXAPI",117,0)
+ I '$D(^SC(BSDR("CLN"),"S",0)) S ^SC(BSDR("CLN"),"S",0)="^44.001DA^^"
+"RTN","BSDXAPI",118,0)
+ I '$D(^SC(BSDR("CLN"),"S",BSDR("ADT"),0)) D  I Y<1 Q 1_U_"Error adding date to file 44: Clinic="_BSDR("CLN")_" Date="_BSDR("ADT")
+"RTN","BSDXAPI",119,0)
+ . S DIC="^SC("_BSDR("CLN")_",""S"",",DA(1)=BSDR("CLN"),(X,DINUM)=BSDR("ADT")
+"RTN","BSDXAPI",120,0)
+ . S DIC("P")="44.001DA",DIC(0)="L",DLAYGO=44.001
+"RTN","BSDXAPI",121,0)
+ . S Y=1 I '$D(@(DIC_X_")")) D FILE^DICN
+"RTN","BSDXAPI",122,0)
+ ;
+"RTN","BSDXAPI",123,0)
+ ; Sep 28 2010: Changed old style API to new style API. Keep for reference //smh
+"RTN","BSDXAPI",124,0)
+ ;K DIC,DA,X,Y,DLAYGO,DD,DO,DINUM
+"RTN","BSDXAPI",125,0)
+ ;S DIC="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"
+"RTN","BSDXAPI",126,0)
+ ;S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),X=BSDR("PAT")
+"RTN","BSDXAPI",127,0)
+ ;S DIC("DR")="1///"_BSDR("LEN")_";3///"_$E($G(BSDR("OI")),1,150)_";7///`"_BSDR("USR")_";8///"_$P($$NOW^XLFDT,".")
+"RTN","BSDXAPI",128,0)
+ ;S DIC("P")="44.003PA",DIC(0)="L",DLAYGO=44.003
+"RTN","BSDXAPI",129,0)
+ ;D FILE^DICN
+"RTN","BSDXAPI",130,0)
+ ;
+"RTN","BSDXAPI",131,0)
+ N BSDXIENS S BSDXIENS="?+1,"_BSDR("ADT")_","_BSDR("CLN")_","
+"RTN","BSDXAPI",132,0)
+ N BSDXFDA
+"RTN","BSDXAPI",133,0)
+ S BSDXFDA(44.003,BSDXIENS,.01)=BSDR("PAT")
+"RTN","BSDXAPI",134,0)
+ S BSDXFDA(44.003,BSDXIENS,1)=BSDR("LEN")
+"RTN","BSDXAPI",135,0)
+ S BSDXFDA(44.003,BSDXIENS,3)=$E($G(BSDR("OI")),1,150)
+"RTN","BSDXAPI",136,0)
+ S BSDXFDA(44.003,BSDXIENS,7)=BSDR("USR")
+"RTN","BSDXAPI",137,0)
+ S BSDXFDA(44.003,BSDXIENS,8)=$P($$NOW^XLFDT,".")
+"RTN","BSDXAPI",138,0)
+ N BSDXERR
+"RTN","BSDXAPI",139,0)
+ D UPDATE^DIE("","BSDXFDA","","BSDXERR")
+"RTN","BSDXAPI",140,0)
+ ;
+"RTN","BSDXAPI",141,0)
+ I $D(BSDXERR) Q 1_U_"Error adding appt to file 44: Clinic="_BSDR("CLN")_" Date="_BSDR("ADT")_" Patient="_BSDR("PAT")_" Error: "_BSDXERR("DIERR",1,"TEXT",1)
+"RTN","BSDXAPI",142,0)
+ ;
+"RTN","BSDXAPI",143,0)
+ ; call event driver
+"RTN","BSDXAPI",144,0)
+ NEW DFN,SDT,SDCL,SDDA,SDMODE
+"RTN","BSDXAPI",145,0)
+ S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2
+"RTN","BSDXAPI",146,0)
+ S SDDA=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",147,0)
+ D MAKE^SDAMEVT(DFN,SDT,SDCL,SDDA,SDMODE)
+"RTN","BSDXAPI",148,0)
+ Q 0
+"RTN","BSDXAPI",149,0)
+ ;
+"RTN","BSDXAPI",150,0)
+CHECKIN1(DFN,CLIN,APDATE) ; Simplified PEP w/ parameters for $$CHECKIN - Checking in
+"RTN","BSDXAPI",151,0)
+ ; Call like this for DFN 23435 checking in now at Hospital Location 33
+"RTN","BSDXAPI",152,0)
+ ; for appt at Dec 20, 2009 @ 10:11:59 
+"RTN","BSDXAPI",153,0)
+ ; S RESULT=$$CHECKIN1^BSDXAPI(23435,33,3091220.221159)
+"RTN","BSDXAPI",154,0)
+ S BSDR("PAT")=DFN          ;DFN
+"RTN","BSDXAPI",155,0)
+ S BSDR("CLN")=CLIN         ;Hosp Loc IEN
+"RTN","BSDXAPI",156,0)
+ S BSDR("ADT")=APDATE       ;Appt Date
+"RTN","BSDXAPI",157,0)
+ S BSDR("CDT")=$$NOW^XLFDT  ;Check-in date defaults to now
+"RTN","BSDXAPI",158,0)
+ S BSDR("USR")=DUZ          ;Check-in user defaults to current
+"RTN","BSDXAPI",159,0)
+ Q $$CHECKIN(.BSDR)
+"RTN","BSDXAPI",160,0)
+ ;
+"RTN","BSDXAPI",161,0)
+CHECKIN(BSDR) ;EP; call to add checkin info to appt; IHS/ITSC/LJF 12/23/2004 PATCH 1002
+"RTN","BSDXAPI",162,0)
+ ;
+"RTN","BSDXAPI",163,0)
+ ; Make call by using:  S ERR=$$CHECKIN^BSDXAPI(.ARRAY)
+"RTN","BSDXAPI",164,0)
+ ;
+"RTN","BSDXAPI",165,0)
+ ; Input array -
+"RTN","BSDXAPI",166,0)
+ ;  BSDR("PAT") = ien of patient in file 2
+"RTN","BSDXAPI",167,0)
+ ;  BSDR("CLN") = ien of clinic in file 44
+"RTN","BSDXAPI",168,0)
+ ;  BSDR("ADT") = appt date/time
+"RTN","BSDXAPI",169,0)
+ ;  BSDR("CDT") = checkin date/time
+"RTN","BSDXAPI",170,0)
+ ;  BSDR("USR") = checkin user
+"RTN","BSDXAPI",171,0)
+ ;
+"RTN","BSDXAPI",172,0)
+ ; Output value -
+"RTN","BSDXAPI",173,0)
+ ;              = 0 means everything worked
+"RTN","BSDXAPI",174,0)
+ ;              = 1^message means error with reason message
+"RTN","BSDXAPI",175,0)
+ ;
+"RTN","BSDXAPI",176,0)
+ I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT"))
+"RTN","BSDXAPI",177,0)
+ I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN"))
+"RTN","BSDXAPI",178,0)
+ I $G(BSDR("ADT")) S BSDR("ADT")=+$E(BSDR("ADT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",179,0)
+ I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",180,0)
+ I $G(BSDR("CDT")) S BSDR("CDT")=+$E(BSDR("CDT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",181,0)
+ I $G(BSDR("CDT"))'?7N.1".".4N Q 1_U_"Checkin Date/Time error: "_$G(BSDR("CDT"))
+"RTN","BSDXAPI",182,0)
+ I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Made Appt Error: "_$G(BSDR("USR"))
+"RTN","BSDXAPI",183,0)
+ ;
+"RTN","BSDXAPI",184,0)
+ ; find ien for appt in file 44
+"RTN","BSDXAPI",185,0)
+ NEW IEN,DIE,DA,DR
+"RTN","BSDXAPI",186,0)
+ S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",187,0)
+ I 'IEN Q 1_U_"Error trying to find appointment for checkin: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT")
+"RTN","BSDXAPI",188,0)
+ ;
+"RTN","BSDXAPI",189,0)
+ ; remember before status
+"RTN","BSDXAPI",190,0)
+ NEW SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL
+"RTN","BSDXAPI",191,0)
+ S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2,SDDA=IEN
+"RTN","BSDXAPI",192,0)
+ S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",193,0)
+ D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+"RTN","BSDXAPI",194,0)
+ ;
+"RTN","BSDXAPI",195,0)
+ ; set checkin
+"RTN","BSDXAPI",196,0)
+ S DIE="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"
+"RTN","BSDXAPI",197,0)
+ S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),DA=IEN
+"RTN","BSDXAPI",198,0)
+ S DR="309///"_BSDR("CDT")_";302///`"_BSDR("USR")_";305///"_$$NOW^XLFDT
+"RTN","BSDXAPI",199,0)
+ D ^DIE
+"RTN","BSDXAPI",200,0)
+ ;
+"RTN","BSDXAPI",201,0)
+ ; set after status
+"RTN","BSDXAPI",202,0)
+ S SDDA=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",203,0)
+ S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",204,0)
+ D AFTER^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+"RTN","BSDXAPI",205,0)
+ ;
+"RTN","BSDXAPI",206,0)
+ ; call event driver
+"RTN","BSDXAPI",207,0)
+ D EVT^SDAMEVT(.SDATA,4,SDMODE,SDCIHDL)
+"RTN","BSDXAPI",208,0)
+ Q 0
+"RTN","BSDXAPI",209,0)
+ ;
+"RTN","BSDXAPI",210,0)
+CANCEL1(DFN,CLIN,TYP,APDATE,REASON,INFO) ; PEP w/ parameters for $$CANCEL - cancelling appointment
+"RTN","BSDXAPI",211,0)
+ ; Call like this for DFN 23435 cancelling an appointment at Hospital Location 33,
+"RTN","BSDXAPI",212,0)
+ ; cancellation initiated by patient ("PC" rather than clinic "C"),
+"RTN","BSDXAPI",213,0)
+ ; cancelling appt at Dec 20, 2009 @ 10:11:59 because of reason 1 in file 409.2 IEN (weather)
+"RTN","BSDXAPI",214,0)
+ ; because foxes come out during bad weather.
+"RTN","BSDXAPI",215,0)
+ ; S RESULT=$$CANCEL1^BSDXAPI(23435,33,"PC",3091220.221159,1,"Afraid of foxes")
+"RTN","BSDXAPI",216,0)
+ S BSDR("PAT")=DFN
+"RTN","BSDXAPI",217,0)
+ S BSDR("CLN")=CLIN
+"RTN","BSDXAPI",218,0)
+ S BSDR("TYP")=TYP
+"RTN","BSDXAPI",219,0)
+ S BSDR("ADT")=APDATE
+"RTN","BSDXAPI",220,0)
+ S BSDR("CDT")=$$NOW^XLFDT
+"RTN","BSDXAPI",221,0)
+ S BSDR("USR")=DUZ
+"RTN","BSDXAPI",222,0)
+ S BSDR("CR")=REASON
+"RTN","BSDXAPI",223,0)
+ S BSDR("NOT")=INFO
+"RTN","BSDXAPI",224,0)
+ Q $$CANCEL(.BSDR)
+"RTN","BSDXAPI",225,0)
+ ;
+"RTN","BSDXAPI",226,0)
+CANCEL(BSDR) ;PEP; called to cancel appt
+"RTN","BSDXAPI",227,0)
+ ;
+"RTN","BSDXAPI",228,0)
+ ; Make call using: S ERR=$$CANCEL^BSDXAPI(.ARRAY)
+"RTN","BSDXAPI",229,0)
+ ;
+"RTN","BSDXAPI",230,0)
+ ; Input Array -
+"RTN","BSDXAPI",231,0)
+ ; BSDR("PAT") = ien of patient in file 2
+"RTN","BSDXAPI",232,0)
+ ; BSDR("CLN") = ien of clinic in file 44
+"RTN","BSDXAPI",233,0)
+ ; BSDR("TYP") = C for canceled by clinic; PC for patient canceled
+"RTN","BSDXAPI",234,0)
+ ; BSDR("ADT") = appointment date and time
+"RTN","BSDXAPI",235,0)
+ ; BSDR("CDT") = cancel date and time
+"RTN","BSDXAPI",236,0)
+ ; BSDR("USR") = user who canceled appt
+"RTN","BSDXAPI",237,0)
+ ; BSDR("CR")  = cancel reason - pointer to file 409.2
+"RTN","BSDXAPI",238,0)
+ ; BSDR("NOT") = cancel remarks - optional notes to 160 characters
+"RTN","BSDXAPI",239,0)
+ ;
+"RTN","BSDXAPI",240,0)
+ ;Output: error status and message
+"RTN","BSDXAPI",241,0)
+ ;   = 0 or null:  everything okay
+"RTN","BSDXAPI",242,0)
+ ;   = 1^message:  error and reason
+"RTN","BSDXAPI",243,0)
+ ;
+"RTN","BSDXAPI",244,0)
+ I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT"))
+"RTN","BSDXAPI",245,0)
+ I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN"))
+"RTN","BSDXAPI",246,0)
+ I ($G(BSDR("TYP"))'="C"),($G(BSDR("TYP"))'="PC") Q 1_U_"Cancel Status error: "_$G(BSDR("TYP"))
+"RTN","BSDXAPI",247,0)
+ I $G(BSDR("ADT")) S BSDR("ADT")=+$E(BSDR("ADT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",248,0)
+ I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",249,0)
+ I $G(BSDR("CDT")) S BSDR("CDT")=+$E(BSDR("CDT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",250,0)
+ I $G(BSDR("CDT"))'?7N.1".".4N Q 1_U_"Cancel Date/Time error: "_$G(BSDR("CDT"))
+"RTN","BSDXAPI",251,0)
+ I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Canceled Appt Error: "_$G(BSDR("USR"))
+"RTN","BSDXAPI",252,0)
+ I '$D(^SD(409.2,+$G(BSDR("CR")))) Q 1_U_"Cancel Reason error: "_$G(BSDR("CR"))
+"RTN","BSDXAPI",253,0)
+ ;
+"RTN","BSDXAPI",254,0)
+ NEW IEN,DIE,DA,DR
+"RTN","BSDXAPI",255,0)
+ S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",256,0)
+ I 'IEN Q 1_U_"Error trying to find appointment for cancel: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT")
+"RTN","BSDXAPI",257,0)
+ ;
+"RTN","BSDXAPI",258,0)
+ ; BSDX 1.5 3110125
+"RTN","BSDXAPI",259,0)
+ ; UJO/SMH - Add ability to remove check-in if the patient is checked in
+"RTN","BSDXAPI",260,0)
+ ; I $$CI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"),IEN) Q 1_U_"Patient already checked in; cannot cancel until checkin deleted: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT")
+"RTN","BSDXAPI",261,0)
+ ; Remove check-in if the patient is checked in.
+"RTN","BSDXAPI",262,0)
+ N BSDXRESULT S BSDXRESULT=0 ; Result; should be zero if success; -1 + message if failure
+"RTN","BSDXAPI",263,0)
+ I $$CI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"),IEN) SET BSDXRESULT=$$RMCI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",264,0)
+ I BSDXRESULT Q BSDXRESULT
+"RTN","BSDXAPI",265,0)
+ ;
+"RTN","BSDXAPI",266,0)
+ ; remember before status
+"RTN","BSDXAPI",267,0)
+ NEW SDATA,DFN,SDT,SDCL,SDDA,SDCPHDL
+"RTN","BSDXAPI",268,0)
+ S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2,SDDA=IEN
+"RTN","BSDXAPI",269,0)
+ S SDCPHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",270,0)
+ D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCPHDL)
+"RTN","BSDXAPI",271,0)
+ ;
+"RTN","BSDXAPI",272,0)
+ ; get user who made appt and date appt made from ^SC
+"RTN","BSDXAPI",273,0)
+ ;    because data in ^SC will be deleted
+"RTN","BSDXAPI",274,0)
+ NEW USER,DATE
+"RTN","BSDXAPI",275,0)
+ S USER=$P($G(^SC(SDCL,"S",SDT,1,IEN,0)),U,6)
+"RTN","BSDXAPI",276,0)
+ S DATE=$P($G(^SC(SDCL,"S",SDT,1,IEN,0)),U,7)
+"RTN","BSDXAPI",277,0)
+ ;
+"RTN","BSDXAPI",278,0)
+ ; update file 2 info
+"RTN","BSDXAPI",279,0)
+ NEW DIE,DA,DR
+"RTN","BSDXAPI",280,0)
+ S DIE="^DPT("_DFN_",""S"",",DA(1)=DFN,DA=SDT
+"RTN","BSDXAPI",281,0)
+ S DR="3///"_BSDR("TYP")_";14///`"_BSDR("USR")_";15///"_BSDR("CDT")_";16///`"_BSDR("CR")_";19///`"_USER_";20///"_DATE
+"RTN","BSDXAPI",282,0)
+ S:$G(BSDR("NOT"))]"" DR=DR_";17///"_$E(BSDR("NOT"),1,160)
+"RTN","BSDXAPI",283,0)
+ D ^DIE
+"RTN","BSDXAPI",284,0)
+ ;
+"RTN","BSDXAPI",285,0)
+ ; delete data in ^SC
+"RTN","BSDXAPI",286,0)
+ NEW DIK,DA
+"RTN","BSDXAPI",287,0)
+ S DIK="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"
+"RTN","BSDXAPI",288,0)
+ S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),DA=IEN
+"RTN","BSDXAPI",289,0)
+ D ^DIK
+"RTN","BSDXAPI",290,0)
+ ;
+"RTN","BSDXAPI",291,0)
+ ; call event driver
+"RTN","BSDXAPI",292,0)
+ D CANCEL^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDMODE,SDCPHDL)
+"RTN","BSDXAPI",293,0)
+ Q 0
+"RTN","BSDXAPI",294,0)
+ ;
+"RTN","BSDXAPI",295,0)
+CI(PAT,CLINIC,DATE,SDIEN) ;PEP; -- returns 1 if appt already checked-in
+"RTN","BSDXAPI",296,0)
+ NEW X
+"RTN","BSDXAPI",297,0)
+ S X=$G(SDIEN)   ;ien sent in call
+"RTN","BSDXAPI",298,0)
+ I 'X S X=$$SCIEN(PAT,CLINIC,DATE) I 'X Q 0
+"RTN","BSDXAPI",299,0)
+ S X=$P($G(^SC(CLINIC,"S",DATE,1,X,"C")),U)
+"RTN","BSDXAPI",300,0)
+ Q $S(X:1,1:0)
+"RTN","BSDXAPI",301,0)
+ ;
+"RTN","BSDXAPI",302,0)
+RMCI(PAT,CLINIC,DATE)  ;PEP; -- Remove Check-in; $$
+"RTN","BSDXAPI",303,0)
+ ; PAT = DFN
+"RTN","BSDXAPI",304,0)
+ ; CLINIC = SC IEN
+"RTN","BSDXAPI",305,0)
+ ; DATE = FM Date/Time of Appointment
+"RTN","BSDXAPI",306,0)
+ ;
+"RTN","BSDXAPI",307,0)
+ ; Returns:
+"RTN","BSDXAPI",308,0)
+ ; 0 if okay
+"RTN","BSDXAPI",309,0)
+ ; -1 if failure
+"RTN","BSDXAPI",310,0)
+ ;
+"RTN","BSDXAPI",311,0)
+ ; Call like this: $$RMCI(233,33,3110102.1130)
+"RTN","BSDXAPI",312,0)
+ ;
+"RTN","BSDXAPI",313,0)
+ ; Move my variables into the ones used by SDAPIs (just a convenience)
+"RTN","BSDXAPI",314,0)
+ NEW SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL
+"RTN","BSDXAPI",315,0)
+ S DFN=PAT,SDT=DATE,SDCL=CLINIC,SDMODE=2,SDDA=$$SCIEN(DFN,SDCL,SDT)
+"RTN","BSDXAPI",316,0)
+ ;
+"RTN","BSDXAPI",317,0)
+ I SDDA<1 QUIT 0    ; Appt cancelled; cancelled appts rm'ed from file 44
+"RTN","BSDXAPI",318,0)
+ ;
+"RTN","BSDXAPI",319,0)
+ ; remember before status
+"RTN","BSDXAPI",320,0)
+ S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",321,0)
+ D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+"RTN","BSDXAPI",322,0)
+ ;
+"RTN","BSDXAPI",323,0)
+ ; remove check-in using filer.
+"RTN","BSDXAPI",324,0)
+ N BSDXIENS S BSDXIENS=SDDA_","_DATE_","_CLINIC_","
+"RTN","BSDXAPI",325,0)
+ S BSDXFDA(44.003,BSDXIENS,309)="@"	; CHECKED-IN
+"RTN","BSDXAPI",326,0)
+ S BSDXFDA(44.003,BSDXIENS,302)="@"	; CHECK IN USER
+"RTN","BSDXAPI",327,0)
+ S BSDXFDA(44.003,BSDXIENS,305)="@"	; CHECK IN ENTERED
+"RTN","BSDXAPI",328,0)
+ N BSDXERR
+"RTN","BSDXAPI",329,0)
+ D FILE^DIE("","BSDXFDA","BSDXERR")
+"RTN","BSDXAPI",330,0)
+ I $D(BSDXERR) QUIT "-1~Can't file for Pat "_PAT_" in Clinic "_CLINIC_" at "_DATE_". Fileman reported an error: "_BSDXERR("DIERR",1,"TEXT",1)
+"RTN","BSDXAPI",331,0)
+ ;
+"RTN","BSDXAPI",332,0)
+ ; set after status
+"RTN","BSDXAPI",333,0)
+ S SDDA=$$SCIEN(DFN,SDCL,SDT)
+"RTN","BSDXAPI",334,0)
+ S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",335,0)
+ D AFTER^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+"RTN","BSDXAPI",336,0)
+ ;
+"RTN","BSDXAPI",337,0)
+ ; call event driver
+"RTN","BSDXAPI",338,0)
+ D EVT^SDAMEVT(.SDATA,4,SDMODE,SDCIHDL)
+"RTN","BSDXAPI",339,0)
+ QUIT 0
+"RTN","BSDXAPI",340,0)
+ ;
+"RTN","BSDXAPI",341,0)
+SCIEN(PAT,CLINIC,DATE) ;PEP; returns ien for appt in ^SC
+"RTN","BSDXAPI",342,0)
+ NEW X,IEN
+"RTN","BSDXAPI",343,0)
+ S X=0 F  S X=$O(^SC(CLINIC,"S",DATE,1,X)) Q:'X  Q:$G(IEN)  D
+"RTN","BSDXAPI",344,0)
+ . Q:$P($G(^SC(CLINIC,"S",DATE,1,X,0)),U,9)["C"  ;cancelled
+"RTN","BSDXAPI",345,0)
+  . I +$G(^SC(CLINIC,"S",DATE,1,X,0))=PAT S IEN=X
+"RTN","BSDXAPI",346,0)
+ Q $G(IEN)
+"RTN","BSDXAPI",347,0)
+ ;
+"RTN","BSDXAPI",348,0)
+APPTYP(PAT,DATE) ;PEP; -- returns type of appt (scheduled or walk-in)
+"RTN","BSDXAPI",349,0)
+ NEW X S X=$P($G(^DPT(PAT,"S",DATE,0)),U,7)
+"RTN","BSDXAPI",350,0)
+ Q $S(X=3:"SCHED",X=4:"WALK-IN",1:"??")
+"RTN","BSDXAPI",351,0)
+ ;
+"RTN","BSDXAPI",352,0)
+CO(PAT,CLINIC,DATE,SDIEN) ;PEP; -- returns 1 if appt already checked-out
+"RTN","BSDXAPI",353,0)
+ NEW X
+"RTN","BSDXAPI",354,0)
+ S X=$G(SDIEN)   ;ien sent in call
+"RTN","BSDXAPI",355,0)
+ I 'X S X=$$SCIEN(PAT,CLINIC,DATE) I 'X Q 0
+"RTN","BSDXAPI",356,0)
+ S X=$P($G(^SC(CLINIC,"S",DATE,1,X,"C")),U,3)
+"RTN","BSDXAPI",357,0)
+ Q $S(X:1,1:0)
+"RTN","BSDXAPI",358,0)
+ ;
+"RTN","BSDXAPI",359,0)
+UPDATENOTE(PAT,CLINIC,DATE,NOTE) ; PEP; Update Note in ^SC for patient's appointment @ DATE
+"RTN","BSDXAPI",360,0)
+ ; PAT = DFN
+"RTN","BSDXAPI",361,0)
+ ; CLINIC = SC IEN
+"RTN","BSDXAPI",362,0)
+ ; DATE = FM Date/Time of Appointment
+"RTN","BSDXAPI",363,0)
+ ;
+"RTN","BSDXAPI",364,0)
+ ; Returns:
+"RTN","BSDXAPI",365,0)
+ ; 0 if okay
+"RTN","BSDXAPI",366,0)
+ ; -1 if failure
+"RTN","BSDXAPI",367,0)
+ N SCIEN S SCIEN=$$SCIEN(PAT,CLINIC,DATE) ; ien of appt in ^SC
+"RTN","BSDXAPI",368,0)
+ I SCIEN<1 QUIT 0    ; Appt cancelled; cancelled appts rm'ed from file 44
+"RTN","BSDXAPI",369,0)
+ N BSDXIENS S BSDXIENS=SCIEN_","_DATE_","_CLINIC_","
+"RTN","BSDXAPI",370,0)
+ S BSDXFDA(44.003,BSDXIENS,3)=$E(NOTE,1,150)
+"RTN","BSDXAPI",371,0)
+ N BSDXERR
+"RTN","BSDXAPI",372,0)
+ D FILE^DIE("","BSDXFDA","BSDXERR")
+"RTN","BSDXAPI",373,0)
+ I $D(BSDXERR) QUIT "-1~Can't file for Pat "_PAT_" in Clinic "_CLINIC_" at "_DATE_". Fileman reported an error: "_BSDXERR("DIERR",1,"TEXT",1)
+"RTN","BSDXAPI",374,0)
+ QUIT 0
+"RTN","BSDXGPRV")
+0^36^B4804670
+"RTN","BSDXGPRV",1,0)
+BSDXGPRV ; WV/SMH - WINDOWS SCHEDULING RPCS ; 11/2/10 4:27pm
+"RTN","BSDXGPRV",2,0)
+ ;;1.5V2;BSDX;;Mar 03, 2011;Build 12
+"RTN","BSDXGPRV",3,0)
+ ;
+"RTN","BSDXGPRV",4,0)
+ ;
+"RTN","BSDXGPRV",5,0)
+ERROR ;
+"RTN","BSDXGPRV",6,0)
+ D ERR("RPMS Error")
+"RTN","BSDXGPRV",7,0)
+ Q
+"RTN","BSDXGPRV",8,0)
+ ;
+"RTN","BSDXGPRV",9,0)
+ERR(BSDXERR) ;Error processing
+"RTN","BSDXGPRV",10,0)
+ D ^%ZTER
+"RTN","BSDXGPRV",11,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",12,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR
+"RTN","BSDXGPRV",13,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",14,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDXGPRV",15,0)
+ Q
+"RTN","BSDXGPRV",16,0)
+ ;
+"RTN","BSDXGPRV",17,0)
+PD(BSDXY,HLIEN) ;EP Debugging entry point
+"RTN","BSDXGPRV",18,0)
+ ;
+"RTN","BSDXGPRV",19,0)
+ D DEBUG^%Serenji("P^BSDXGPRV(.BSDXY,HLIEN)","192.168.254.130")
+"RTN","BSDXGPRV",20,0)
+ ;
+"RTN","BSDXGPRV",21,0)
+ Q
+"RTN","BSDXGPRV",22,0)
+ ;
+"RTN","BSDXGPRV",23,0)
+P(BSDXY,HLIEN) ; Public Entry point; Get Providers for Hosp Location
+"RTN","BSDXGPRV",24,0)
+ ; Input: HLIEN - Hospital Location IEN
+"RTN","BSDXGPRV",25,0)
+ ; Output: ADO Datatable with columns:
+"RTN","BSDXGPRV",26,0)
+ ; - HOSPITAL_LOCATION_ID, BMXIEN, PROV_NAME, DEFAULT
+"RTN","BSDXGPRV",27,0)
+ ; If there are providers in the PROVIDER multiple of file 44 
+"RTN","BSDXGPRV",28,0)
+ ; (Hospital Location) return them;
+"RTN","BSDXGPRV",29,0)
+ ; If no providers in PROVIDER multiple of file 44, return nothing
+"RTN","BSDXGPRV",30,0)
+ ; Called by BSDX HOSP LOC PROVIDERS
+"RTN","BSDXGPRV",31,0)
+ ;
+"RTN","BSDXGPRV",32,0)
+ S BSDXI=0
+"RTN","BSDXGPRV",33,0)
+ I '$D(^SC(HLIEN,0)) D ERR("HOSPITAL LOCATION NOT FOUND") QUIT
+"RTN","BSDXGPRV",34,0)
+ D ^XBKVAR 
+"RTN","BSDXGPRV",35,0)
+ N $ET S $ET="G ERROR^BSDXGPRV"
+"RTN","BSDXGPRV",36,0)
+ K ^BSDXTMP($J)
+"RTN","BSDXGPRV",37,0)
+ S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDXGPRV",38,0)
+ S $P(^BSDXTMP($J,BSDXI),U,1)="I00020HOSPITAL_LOCATION_ID"
+"RTN","BSDXGPRV",39,0)
+ S $P(^BSDXTMP($J,BSDXI),U,2)="I00020BMXIEN"
+"RTN","BSDXGPRV",40,0)
+ S $P(^BSDXTMP($J,BSDXI),U,3)="T00030NAME"
+"RTN","BSDXGPRV",41,0)
+ S $P(^BSDXTMP($J,BSDXI),U,4)="T00005DEFAULT"
+"RTN","BSDXGPRV",42,0)
+ S ^BSDXTMP($J,BSDXI)=^BSDXTMP($J,BSDXI)_$C(30)
+"RTN","BSDXGPRV",43,0)
+ ;
+"RTN","BSDXGPRV",44,0)
+ N OUTPUT
+"RTN","BSDXGPRV",45,0)
+ D GETS^DIQ(44,HLIEN_",","2600*","IE","OUTPUT") ; Provider Multiple
+"RTN","BSDXGPRV",46,0)
+ ; No results
+"RTN","BSDXGPRV",47,0)
+ I '$D(OUTPUT) S ^BSDXTMP($J,BSDXI+1)=$C(31) QUIT
+"RTN","BSDXGPRV",48,0)
+ ; if results, get them
+"RTN","BSDXGPRV",49,0)
+ N I S I=""
+"RTN","BSDXGPRV",50,0)
+ F  S I=$O(OUTPUT(44.1,I)) Q:I=""  D
+"RTN","BSDXGPRV",51,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",52,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,1)=HLIEN                  ; HL IEN
+"RTN","BSDXGPRV",53,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,2)=$P(OUTPUT(44.1,I,.01,"I"),",") ; PROV IEN
+"RTN","BSDXGPRV",54,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,3)=$E(OUTPUT(44.1,I,.01,"E"),1,30) ; PROV NAME
+"RTN","BSDXGPRV",55,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,4)=OUTPUT(44.1,I,.02,"E") ; Default - YES, NO
+"RTN","BSDXGPRV",56,0)
+ . S ^BSDXTMP($J,BSDXI)=^BSDXTMP($J,BSDXI)_$C(30)
+"RTN","BSDXGPRV",57,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",58,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDXGPRV",59,0)
+ QUIT
+"SEC","^DIC",9002018.1,9002018.1,0,"AUDIT")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"DD")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"DEL")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"LAYGO")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"RD")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"WR")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"AUDIT")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"DD")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"DEL")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"LAYGO")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"RD")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"WR")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"AUDIT")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"DD")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"DEL")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"LAYGO")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"RD")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"WR")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"AUDIT")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"DD")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"DEL")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"LAYGO")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"RD")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"WR")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"AUDIT")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"DD")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"DEL")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"LAYGO")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"RD")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"WR")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"AUDIT")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"DD")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"DEL")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"LAYGO")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"RD")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"WR")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"AUDIT")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"DD")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"DEL")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"LAYGO")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"RD")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"WR")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"AUDIT")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"DD")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"DEL")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"LAYGO")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"RD")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"WR")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"AUDIT")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"DD")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"DEL")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"LAYGO")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"RD")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"WR")
+@
+"VER")
+8.0^22.0
+"^DD",9002018.1,9002018.1,0)
+FIELD^^2001^8
+"^DD",9002018.1,9002018.1,0,"DT")
+3040820
+"^DD",9002018.1,9002018.1,0,"IX","ALOC",9002018.1,.04)
+
+"^DD",9002018.1,9002018.1,0,"IX","ASSOC",9002018.12001,.01)
+
+"^DD",9002018.1,9002018.1,0,"IX","B",9002018.1,.01)
+
+"^DD",9002018.1,9002018.1,0,"NM","BSDX RESOURCE")
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.15,.01)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.21,.01)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.25,.02)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.3,.01)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.4,.07)
+
+"^DD",9002018.1,9002018.1,0,"VRPK")
+BSDX
+"^DD",9002018.1,9002018.1,.01,0)
+NAME^RF^^0;1^K:$L(X)>30!($L(X)<1)!'(X'?1P.E) X
+"^DD",9002018.1,9002018.1,.01,1,0)
+^.1
+"^DD",9002018.1,9002018.1,.01,1,1,0)
+9002018.1^B
+"^DD",9002018.1,9002018.1,.01,1,1,1)
+S ^BSDXRES("B",$E(X,1,30),DA)=""
+"^DD",9002018.1,9002018.1,.01,1,1,2)
+K ^BSDXRES("B",$E(X,1,30),DA)
+"^DD",9002018.1,9002018.1,.01,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.1,9002018.1,.01,"DT")
+3040719
+"^DD",9002018.1,9002018.1,.02,0)
+INACTIVE^S^1:YES;0:NO;^0;2^Q
+"^DD",9002018.1,9002018.1,.02,3)
+
+"^DD",9002018.1,9002018.1,.02,"DT")
+3030520
+"^DD",9002018.1,9002018.1,.03,0)
+TIME SCALE^S^5:5;10:10;15:15;20:20;30:30;60:60;^0;3^Q
+"^DD",9002018.1,9002018.1,.03,"DT")
+3040212
+"^DD",9002018.1,9002018.1,.04,0)
+HOSPITAL LOCATION^P44'^SC(^0;4^Q
+"^DD",9002018.1,9002018.1,.04,1,0)
+^.1
+"^DD",9002018.1,9002018.1,.04,1,1,0)
+9002018.1^ALOC
+"^DD",9002018.1,9002018.1,.04,1,1,1)
+S ^BSDXRES("ALOC",$E(X,1,30),DA)=""
+"^DD",9002018.1,9002018.1,.04,1,1,2)
+K ^BSDXRES("ALOC",$E(X,1,30),DA)
+"^DD",9002018.1,9002018.1,.04,1,1,"%D",0)
+^^1^1^3040915^
+"^DD",9002018.1,9002018.1,.04,1,1,"%D",1,0)
+Cross reference on hospital location.
+"^DD",9002018.1,9002018.1,.04,1,1,"DT")
+3040915
+"^DD",9002018.1,9002018.1,.04,"DT")
+3040915
+"^DD",9002018.1,9002018.1,1,0)
+LETTER TEXT^9002018.11^^1;0
+"^DD",9002018.1,9002018.1,1201,0)
+NO SHOW LETTER^9002018.11201^^12;0
+"^DD",9002018.1,9002018.1,1301,0)
+CLINIC CANCELLATION LETTER^9002018.11301^^13;0
+"^DD",9002018.1,9002018.1,2001,0)
+ASSOCIATED RPMS CLINICS^9002018.12001P^^20;0
+"^DD",9002018.1,9002018.11,0)
+LETTER TEXT SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.11,0,"DT")
+3040212
+"^DD",9002018.1,9002018.11,0,"NM","LETTER TEXT")
+
+"^DD",9002018.1,9002018.11,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.11,.01,0)
+LETTER TEXT^W^^0;1^Q
+"^DD",9002018.1,9002018.11,.01,3)
+Enter the text of reminder letters sent to patients with appointments with this resource.
+"^DD",9002018.1,9002018.11,.01,"DT")
+3040212
+"^DD",9002018.1,9002018.11201,0)
+NO SHOW LETTER SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.11201,0,"DT")
+3040613
+"^DD",9002018.1,9002018.11201,0,"NM","NO SHOW LETTER")
+
+"^DD",9002018.1,9002018.11201,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.11201,.01,0)
+NO SHOW LETTER^W^^0;1^Q
+"^DD",9002018.1,9002018.11201,.01,"DT")
+3040613
+"^DD",9002018.1,9002018.11301,0)
+CLINIC CANCELLATION LETTER SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.11301,0,"DT")
+3040613
+"^DD",9002018.1,9002018.11301,0,"NM","CLINIC CANCELLATION LETTER")
+
+"^DD",9002018.1,9002018.11301,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.11301,.01,0)
+CLINIC CANCELLATION LETTER^W^^0;1^Q
+"^DD",9002018.1,9002018.11301,.01,"DT")
+3040613
+"^DD",9002018.1,9002018.12001,0)
+ASSOCIATED RPMS CLINICS SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.12001,0,"DT")
+3040820
+"^DD",9002018.1,9002018.12001,0,"IX","B",9002018.12001,.01)
+
+"^DD",9002018.1,9002018.12001,0,"NM","ASSOCIATED RPMS CLINICS")
+
+"^DD",9002018.1,9002018.12001,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.12001,.01,0)
+ASSOCIATED RPMS CLINICS^MP44'^SC(^0;1^Q
+"^DD",9002018.1,9002018.12001,.01,1,0)
+^.1
+"^DD",9002018.1,9002018.12001,.01,1,1,0)
+9002018.12001^B
+"^DD",9002018.1,9002018.12001,.01,1,1,1)
+S ^BSDXRES(DA(1),20,"B",$E(X,1,30),DA)=""
+"^DD",9002018.1,9002018.12001,.01,1,1,2)
+K ^BSDXRES(DA(1),20,"B",$E(X,1,30),DA)
+"^DD",9002018.1,9002018.12001,.01,1,2,0)
+9002018.1^ASSOC
+"^DD",9002018.1,9002018.12001,.01,1,2,1)
+S ^BSDXRES("ASSOC",$E(X,1,30),DA(1),DA)=""
+"^DD",9002018.1,9002018.12001,.01,1,2,2)
+K ^BSDXRES("ASSOC",$E(X,1,30),DA(1),DA)
+"^DD",9002018.1,9002018.12001,.01,1,2,"%D",0)
+^^1^1^3040915^
+"^DD",9002018.1,9002018.12001,.01,1,2,"%D",1,0)
+Cross reference on ASSOCIATED RPMS CLINICS
+"^DD",9002018.1,9002018.12001,.01,1,2,"DT")
+3040915
+"^DD",9002018.1,9002018.12001,.01,3)
+ENTER ASSOCIATED RPMS CLINIC
+"^DD",9002018.1,9002018.12001,.01,"DT")
+3040915
+"^DD",9002018.15,9002018.15,0)
+FIELD^^.05^5
+"^DD",9002018.15,9002018.15,0,"DT")
+3030703
+"^DD",9002018.15,9002018.15,0,"IX","AC",9002018.15,.02)
+
+"^DD",9002018.15,9002018.15,0,"IX","B",9002018.15,.01)
+
+"^DD",9002018.15,9002018.15,0,"NM","BSDX RESOURCE USER")
+
+"^DD",9002018.15,9002018.15,0,"VRPK")
+BSDX
+"^DD",9002018.15,9002018.15,.01,0)
+RESOURCENAME^RP9002018.1'^BSDXRES(^0;1^Q
+"^DD",9002018.15,9002018.15,.01,1,0)
+^.1
+"^DD",9002018.15,9002018.15,.01,1,1,0)
+9002018.15^B
+"^DD",9002018.15,9002018.15,.01,1,1,1)
+S ^BSDXRSU("B",$E(X,1,30),DA)=""
+"^DD",9002018.15,9002018.15,.01,1,1,2)
+K ^BSDXRSU("B",$E(X,1,30),DA)
+"^DD",9002018.15,9002018.15,.01,3)
+
+"^DD",9002018.15,9002018.15,.01,"DT")
+3030508
+"^DD",9002018.15,9002018.15,.02,0)
+USERNAME^P200'^VA(200,^0;2^Q
+"^DD",9002018.15,9002018.15,.02,1,0)
+^.1
+"^DD",9002018.15,9002018.15,.02,1,1,0)
+9002018.15^AC
+"^DD",9002018.15,9002018.15,.02,1,1,1)
+S ^BSDXRSU("AC",$E(X,1,30),DA)=""
+"^DD",9002018.15,9002018.15,.02,1,1,2)
+K ^BSDXRSU("AC",$E(X,1,30),DA)
+"^DD",9002018.15,9002018.15,.02,1,1,"DT")
+3030508
+"^DD",9002018.15,9002018.15,.02,"DT")
+3030508
+"^DD",9002018.15,9002018.15,.03,0)
+OVERBOOK^S^1:YES;0:NO;^0;3^Q
+"^DD",9002018.15,9002018.15,.03,3)
+
+"^DD",9002018.15,9002018.15,.03,"DT")
+3030703
+"^DD",9002018.15,9002018.15,.04,0)
+MODIFY SCHEDULE^S^1:YES;0:NO;^0;4^Q
+"^DD",9002018.15,9002018.15,.04,"DT")
+3030701
+"^DD",9002018.15,9002018.15,.05,0)
+MODIFY APPOINTMENTS^S^1:YES;0:NO;^0;5^Q
+"^DD",9002018.15,9002018.15,.05,3)
+
+"^DD",9002018.15,9002018.15,.05,"DT")
+3040722
+"^DD",9002018.2,9002018.2,0)
+FIELD^^1^3
+"^DD",9002018.2,9002018.2,0,"DDA")
+N
+"^DD",9002018.2,9002018.2,0,"DT")
+3030508
+"^DD",9002018.2,9002018.2,0,"IX","AB",9002018.21,.01)
+
+"^DD",9002018.2,9002018.2,0,"IX","B",9002018.2,.01)
+
+"^DD",9002018.2,9002018.2,0,"NM","BSDX RESOURCE GROUP")
+
+"^DD",9002018.2,9002018.2,0,"PT",9002018.25,.01)
+
+"^DD",9002018.2,9002018.2,0,"PT",9002018.35,.03)
+
+"^DD",9002018.2,9002018.2,0,"VRPK")
+BSDX
+"^DD",9002018.2,9002018.2,.01,0)
+NAME^RF^^0;1^K:$L(X)>30!(X?.N)!($L(X)<3)!'(X'?1P.E) X
+"^DD",9002018.2,9002018.2,.01,1,0)
+^.1
+"^DD",9002018.2,9002018.2,.01,1,1,0)
+9002018.2^B
+"^DD",9002018.2,9002018.2,.01,1,1,1)
+S ^BSDXDEPT("B",$E(X,1,30),DA)=""
+"^DD",9002018.2,9002018.2,.01,1,1,2)
+K ^BSDXDEPT("B",$E(X,1,30),DA)
+"^DD",9002018.2,9002018.2,.01,3)
+NAME MUST BE 3-30 CHARACTERS, NOT NUMERIC OR STARTING WITH PUNCTUATION
+"^DD",9002018.2,9002018.2,.02,0)
+INACTIVATION DATE^D^^0;2^S %DT="E" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.2,9002018.2,.02,"DT")
+3030508
+"^DD",9002018.2,9002018.2,1,0)
+RESOURCE^9002018.21P^^1;0
+"^DD",9002018.2,9002018.21,0)
+RESOURCE SUB-FIELD^^.01^1
+"^DD",9002018.2,9002018.21,0,"DT")
+3030508
+"^DD",9002018.2,9002018.21,0,"IX","B",9002018.21,.01)
+
+"^DD",9002018.2,9002018.21,0,"NM","RESOURCE")
+
+"^DD",9002018.2,9002018.21,0,"UP")
+9002018.2
+"^DD",9002018.2,9002018.21,.01,0)
+RESOURCE^MP9002018.1'^BSDXRES(^0;1^Q
+"^DD",9002018.2,9002018.21,.01,1,0)
+^.1
+"^DD",9002018.2,9002018.21,.01,1,1,0)
+9002018.21^B
+"^DD",9002018.2,9002018.21,.01,1,1,1)
+S ^BSDXDEPT(DA(1),1,"B",$E(X,1,30),DA)=""
+"^DD",9002018.2,9002018.21,.01,1,1,2)
+K ^BSDXDEPT(DA(1),1,"B",$E(X,1,30),DA)
+"^DD",9002018.2,9002018.21,.01,1,2,0)
+9002018.2^AB
+"^DD",9002018.2,9002018.21,.01,1,2,1)
+S ^BSDXDEPT("AB",$E(X,1,30),DA(1),DA)=""
+"^DD",9002018.2,9002018.21,.01,1,2,2)
+K ^BSDXDEPT("AB",$E(X,1,30),DA(1),DA)
+"^DD",9002018.2,9002018.21,.01,1,2,"DT")
+3030508
+"^DD",9002018.2,9002018.21,.01,"DT")
+3030508
+"^DD",9002018.3,9002018.3,0)
+FIELD^^1^6
+"^DD",9002018.3,9002018.3,0,"DT")
+3030508
+"^DD",9002018.3,9002018.3,0,"IX","ARSCT",9002018.3,.02)
+
+"^DD",9002018.3,9002018.3,0,"IX","B",9002018.3,.01)
+
+"^DD",9002018.3,9002018.3,0,"NM","BSDX ACCESS BLOCK")
+
+"^DD",9002018.3,9002018.3,0,"VRPK")
+BSDX
+"^DD",9002018.3,9002018.3,.01,0)
+RESOURCE^RP9002018.1'^BSDXRES(^0;1^Q
+"^DD",9002018.3,9002018.3,.01,1,0)
+^.1
+"^DD",9002018.3,9002018.3,.01,1,1,0)
+9002018.3^B
+"^DD",9002018.3,9002018.3,.01,1,1,1)
+S ^BSDXAB("B",$E(X,1,30),DA)=""
+"^DD",9002018.3,9002018.3,.01,1,1,2)
+K ^BSDXAB("B",$E(X,1,30),DA)
+"^DD",9002018.3,9002018.3,.01,3)
+
+"^DD",9002018.3,9002018.3,.01,"DT")
+3030508
+"^DD",9002018.3,9002018.3,.02,0)
+STARTTIME^D^^0;2^S %DT="ET" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.3,9002018.3,.02,1,0)
+^.1
+"^DD",9002018.3,9002018.3,.02,1,1,0)
+9002018.3^ARSCT^MUMPS
+"^DD",9002018.3,9002018.3,.02,1,1,1)
+D XR4S^BSDX03(DA)
+"^DD",9002018.3,9002018.3,.02,1,1,2)
+D XR4K^BSDX03(DA)
+"^DD",9002018.3,9002018.3,.02,1,1,"%D",0)
+^^1^1^3030512^
+"^DD",9002018.3,9002018.3,.02,1,1,"%D",1,0)
+Supports lookup of all access blocks for a given resource during a given time period
+"^DD",9002018.3,9002018.3,.02,1,1,"DT")
+3030512
+"^DD",9002018.3,9002018.3,.02,"DT")
+3030512
+"^DD",9002018.3,9002018.3,.03,0)
+ENDTIME^D^^0;3^S %DT="ET" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.3,9002018.3,.03,3)
+
+"^DD",9002018.3,9002018.3,.03,"DT")
+3030508
+"^DD",9002018.3,9002018.3,.04,0)
+SLOTS^NJ2,0^^0;4^K:+X'=X!(X>99)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.3,9002018.3,.04,3)
+Type a Number between 0 and 99, 0 Decimal Digits
+"^DD",9002018.3,9002018.3,.04,"DT")
+3030508
+"^DD",9002018.3,9002018.3,.05,0)
+ACCESS TYPE^P9002018.35'^BSDXTYPE(^0;5^Q
+"^DD",9002018.3,9002018.3,.05,"DT")
+3030508
+"^DD",9002018.3,9002018.3,1,0)
+NOTE^9002018.31^^1;0
+"^DD",9002018.3,9002018.31,0)
+NOTE SUB-FIELD^^.01^1
+"^DD",9002018.3,9002018.31,0,"DT")
+3030508
+"^DD",9002018.3,9002018.31,0,"NM","NOTE")
+
+"^DD",9002018.3,9002018.31,0,"UP")
+9002018.3
+"^DD",9002018.3,9002018.31,.01,0)
+NOTE^W^^0;1^Q
+"^DD",9002018.3,9002018.31,.01,"DT")
+3030508
+"^DD",9002018.35,9002018.35,0)
+FIELD^^.07^7
+"^DD",9002018.35,9002018.35,0,"DT")
+3030521
+"^DD",9002018.35,9002018.35,0,"IX","B",9002018.35,.01)
+
+"^DD",9002018.35,9002018.35,0,"NM","BSDX ACCESS TYPE")
+
+"^DD",9002018.35,9002018.35,0,"PT",9002018.3,.05)
+
+"^DD",9002018.35,9002018.35,0,"PT",9002018.39,.02)
+
+"^DD",9002018.35,9002018.35,0,"VRPK")
+BSDX
+"^DD",9002018.35,9002018.35,.01,0)
+ACCESS TYPE NAME^RF^^0;1^K:$L(X)>30!($L(X)<3)!'(X'?1P.E) X
+"^DD",9002018.35,9002018.35,.01,1,0)
+^.1
+"^DD",9002018.35,9002018.35,.01,1,1,0)
+9002018.35^B
+"^DD",9002018.35,9002018.35,.01,1,1,1)
+S ^BSDXTYPE("B",$E(X,1,30),DA)=""
+"^DD",9002018.35,9002018.35,.01,1,1,2)
+K ^BSDXTYPE("B",$E(X,1,30),DA)
+"^DD",9002018.35,9002018.35,.01,3)
+Answer must be 3-30 characters in length.
+"^DD",9002018.35,9002018.35,.01,"DT")
+3030508
+"^DD",9002018.35,9002018.35,.02,0)
+INACTIVE^S^1:YES;0:NO;^0;2^Q
+"^DD",9002018.35,9002018.35,.02,3)
+
+"^DD",9002018.35,9002018.35,.02,"DT")
+3030520
+"^DD",9002018.35,9002018.35,.03,0)
+DEPARTMENT NAME^P9002018.2'^BSDXDEPT(^0;3^Q
+"^DD",9002018.35,9002018.35,.03,"DT")
+3030508
+"^DD",9002018.35,9002018.35,.04,0)
+DISPLAY COLOR^F^^0;4^K:$L(X)>30!($L(X)<1) X
+"^DD",9002018.35,9002018.35,.04,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.35,9002018.35,.04,"DT")
+3030508
+"^DD",9002018.35,9002018.35,.05,0)
+RED^NJ3,0^^0;5^K:+X'=X!(X>255)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.35,9002018.35,.05,3)
+Type a Number between 0 and 255, 0 Decimal Digits
+"^DD",9002018.35,9002018.35,.05,"DT")
+3030521
+"^DD",9002018.35,9002018.35,.06,0)
+GREEN^NJ3,0^^0;6^K:+X'=X!(X>255)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.35,9002018.35,.06,3)
+Type a Number between 0 and 255, 0 Decimal Digits
+"^DD",9002018.35,9002018.35,.06,"DT")
+3030521
+"^DD",9002018.35,9002018.35,.07,0)
+BLUE^NJ3,0^^0;7^K:+X'=X!(X>255)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.35,9002018.35,.07,3)
+Type a Number between 0 and 255, 0 Decimal Digits
+"^DD",9002018.35,9002018.35,.07,"DT")
+3030521
+"^DD",9002018.38,9002018.38,0)
+FIELD^^.01^1
+"^DD",9002018.38,9002018.38,0,"DT")
+3030527
+"^DD",9002018.38,9002018.38,0,"IX","B",9002018.38,.01)
+
+"^DD",9002018.38,9002018.38,0,"NM","BSDX ACCESS GROUP")
+
+"^DD",9002018.38,9002018.38,0,"PT",9002018.39,.01)
+
+"^DD",9002018.38,9002018.38,0,"VRPK")
+BSDX
+"^DD",9002018.38,9002018.38,.01,0)
+ACCESS GROUP^RF^^0;1^K:$L(X)>30!($L(X)<3)!'(X'?1P.E) X
+"^DD",9002018.38,9002018.38,.01,1,0)
+^.1
+"^DD",9002018.38,9002018.38,.01,1,1,0)
+9002018.38^B
+"^DD",9002018.38,9002018.38,.01,1,1,1)
+S ^BSDXAGP("B",$E(X,1,30),DA)=""
+"^DD",9002018.38,9002018.38,.01,1,1,2)
+K ^BSDXAGP("B",$E(X,1,30),DA)
+"^DD",9002018.38,9002018.38,.01,3)
+Answer must be 3-30 characters in length.
+"^DD",9002018.38,9002018.38,.01,"DT")
+3030527
+"^DD",9002018.39,9002018.39,0)
+FIELD^^.02^2
+"^DD",9002018.39,9002018.39,0,"DDA")
+N
+"^DD",9002018.39,9002018.39,0,"DT")
+3030527
+"^DD",9002018.39,9002018.39,0,"IX","B",9002018.39,.01)
+
+"^DD",9002018.39,9002018.39,0,"NM","BSDX ACCESS GROUP TYPE")
+
+"^DD",9002018.39,9002018.39,0,"VRPK")
+BSDX
+"^DD",9002018.39,9002018.39,.01,0)
+ACCESS GROUP^RP9002018.38'^BSDXAGP(^0;1^Q
+"^DD",9002018.39,9002018.39,.01,1,0)
+^.1
+"^DD",9002018.39,9002018.39,.01,1,1,0)
+9002018.39^B
+"^DD",9002018.39,9002018.39,.01,1,1,1)
+S ^BSDXAGTP("B",$E(X,1,30),DA)=""
+"^DD",9002018.39,9002018.39,.01,1,1,2)
+K ^BSDXAGTP("B",$E(X,1,30),DA)
+"^DD",9002018.39,9002018.39,.01,3)
+
+"^DD",9002018.39,9002018.39,.01,"DT")
+3030720
+"^DD",9002018.39,9002018.39,.02,0)
+ACCESS TYPE^P9002018.35'^BSDXTYPE(^0;2^Q
+"^DD",9002018.39,9002018.39,.02,"DT")
+3030720
+"^DD",9002018.4,9002018.4,0)
+FIELD^^1^14
+"^DD",9002018.4,9002018.4,0,"DT")
+3040615
+"^DD",9002018.4,9002018.4,0,"IX","ARSRC",9002018.4,.07)
+
+"^DD",9002018.4,9002018.4,0,"IX","B",9002018.4,.01)
+
+"^DD",9002018.4,9002018.4,0,"IX","CPAT",9002018.4,.05)
+
+"^DD",9002018.4,9002018.4,0,"NM","BSDX APPOINTMENT")
+
+"^DD",9002018.4,9002018.4,0,"VRPK")
+BSDX
+"^DD",9002018.4,9002018.4,.01,0)
+STARTTIME^RD^^0;1^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.01,1,0)
+^.1
+"^DD",9002018.4,9002018.4,.01,1,1,0)
+9002018.4^B
+"^DD",9002018.4,9002018.4,.01,1,1,1)
+S ^BSDXAPPT("B",$E(X,1,30),DA)=""
+"^DD",9002018.4,9002018.4,.01,1,1,2)
+K ^BSDXAPPT("B",$E(X,1,30),DA)
+"^DD",9002018.4,9002018.4,.01,3)
+
+"^DD",9002018.4,9002018.4,.01,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.02,0)
+ENDTIME^RD^^0;2^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.02,3)
+
+"^DD",9002018.4,9002018.4,.02,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.03,0)
+CHECKIN^RD^^0;3^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.03,3)
+
+"^DD",9002018.4,9002018.4,.03,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.04,0)
+AUXTIME^RD^^0;4^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.04,3)
+
+"^DD",9002018.4,9002018.4,.04,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.05,0)
+PATIENT^P9000001'^AUPNPAT(^0;5^Q
+"^DD",9002018.4,9002018.4,.05,1,0)
+^.1
+"^DD",9002018.4,9002018.4,.05,1,1,0)
+9002018.4^CPAT
+"^DD",9002018.4,9002018.4,.05,1,1,1)
+S ^BSDXAPPT("CPAT",$E(X,1,30),DA)=""
+"^DD",9002018.4,9002018.4,.05,1,1,2)
+K ^BSDXAPPT("CPAT",$E(X,1,30),DA)
+"^DD",9002018.4,9002018.4,.05,1,1,"%D",0)
+^^1^1^3040109^
+"^DD",9002018.4,9002018.4,.05,1,1,"%D",1,0)
+Cross reference of PATIENT field for lookup and sorting
+"^DD",9002018.4,9002018.4,.05,1,1,"DT")
+3040109
+"^DD",9002018.4,9002018.4,.05,"DT")
+3040109
+"^DD",9002018.4,9002018.4,.06,0)
+ACCESS TYPE ID^NJ6,0^^0;6^K:+X'=X!(X>999999)!(X<1)!(X?.E1"."1N.N) X
+"^DD",9002018.4,9002018.4,.06,3)
+Type a Number between 1 and 999999, 0 Decimal Digits
+"^DD",9002018.4,9002018.4,.06,"DT")
+3040614
+"^DD",9002018.4,9002018.4,.07,0)
+RESOURCE^P9002018.1'^BSDXRES(^0;7^Q
+"^DD",9002018.4,9002018.4,.07,1,0)
+^.1
+"^DD",9002018.4,9002018.4,.07,1,1,0)
+9002018.4^ARSRC^MUMPS
+"^DD",9002018.4,9002018.4,.07,1,1,1)
+D XR2S^BSDX03(DA)
+"^DD",9002018.4,9002018.4,.07,1,1,2)
+D XR2K^BSDX03(DA)
+"^DD",9002018.4,9002018.4,.07,1,1,"%D",0)
+^^1^1^3030512^
+"^DD",9002018.4,9002018.4,.07,1,1,"%D",1,0)
+This index is used to find all appointments for a given resource during a given time period
+"^DD",9002018.4,9002018.4,.07,1,1,"DT")
+3030512
+"^DD",9002018.4,9002018.4,.07,"DT")
+3030512
+"^DD",9002018.4,9002018.4,.08,0)
+DATA ENTRY CLERK^P200'^VA(200,^0;8^Q
+"^DD",9002018.4,9002018.4,.08,3)
+Enter the name of the clerk who made the appointment.
+"^DD",9002018.4,9002018.4,.08,21,0)
+^^1^1^3040214^
+"^DD",9002018.4,9002018.4,.08,21,1,0)
+Field contains the name of the clerk who made the appointment.
+"^DD",9002018.4,9002018.4,.08,"DT")
+3040214
+"^DD",9002018.4,9002018.4,.09,0)
+DATE APPT MADE^D^^0;9^S %DT="ETX" D ^%DT S X=Y K:X<1 X
+"^DD",9002018.4,9002018.4,.09,3)
+Enter the date the appointment was made.
+"^DD",9002018.4,9002018.4,.09,21,0)
+^^1^1^3040214^
+"^DD",9002018.4,9002018.4,.09,21,1,0)
+Field contains the date the appointment was made.
+"^DD",9002018.4,9002018.4,.09,"DT")
+3040214
+"^DD",9002018.4,9002018.4,.1,0)
+NOSHOW^S^1:YES;0:NO;^0;10^Q
+"^DD",9002018.4,9002018.4,.1,"DT")
+3040223
+"^DD",9002018.4,9002018.4,.11,0)
+REBOOK DATETIME^D^^0;11^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.11,"DT")
+3040613
+"^DD",9002018.4,9002018.4,.12,0)
+CANCEL DATETIME^D^^0;12^S %DT="ET" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.12,"DT")
+3040613
+"^DD",9002018.4,9002018.4,.13,0)
+WALKIN^S^y:YES;n:NO;^0;13^Q
+"^DD",9002018.4,9002018.4,.13,"DT")
+3040615
+"^DD",9002018.4,9002018.4,1,0)
+NOTE^9002018.41^^1;0
+"^DD",9002018.4,9002018.41,0)
+NOTE SUB-FIELD^^.01^1
+"^DD",9002018.4,9002018.41,0,"DT")
+3030508
+"^DD",9002018.4,9002018.41,0,"NM","NOTE")
+
+"^DD",9002018.4,9002018.41,0,"UP")
+9002018.4
+"^DD",9002018.4,9002018.41,.01,0)
+NOTE^W^^0;1^Q
+"^DD",9002018.4,9002018.41,.01,"DT")
+3030508
+"^DD",9002018.5,9002018.5,0)
+FIELD^^.03^3
+"^DD",9002018.5,9002018.5,0,"DT")
+3040226
+"^DD",9002018.5,9002018.5,0,"IX","B",9002018.5,.01)
+
+"^DD",9002018.5,9002018.5,0,"NM","BSDX APPLICATION")
+
+"^DD",9002018.5,9002018.5,0,"VRPK")
+BSDX
+"^DD",9002018.5,9002018.5,.01,0)
+MAJOR VERSION^RF^^0;1^K:$L(X)>30!($L(X)<1)!'(X'?1P.E) X
+"^DD",9002018.5,9002018.5,.01,1,0)
+^.1
+"^DD",9002018.5,9002018.5,.01,1,1,0)
+9002018.5^B
+"^DD",9002018.5,9002018.5,.01,1,1,1)
+S ^BSDXAPPL("B",$E(X,1,30),DA)=""
+"^DD",9002018.5,9002018.5,.01,1,1,2)
+K ^BSDXAPPL("B",$E(X,1,30),DA)
+"^DD",9002018.5,9002018.5,.01,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.5,9002018.5,.01,"DT")
+3040226
+"^DD",9002018.5,9002018.5,.02,0)
+MINOR VERSION^RF^^0;2^K:$L(X)>30!($L(X)<1)!'(X'?1P.E) X
+"^DD",9002018.5,9002018.5,.02,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.5,9002018.5,.02,"DT")
+3040226
+"^DD",9002018.5,9002018.5,.03,0)
+BUILD^D^^0;3^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.5,9002018.5,.03,"DT")
+3040226
+"^DIC",9002018.1,9002018.1,0)
+BSDX RESOURCE^9002018.1
+"^DIC",9002018.1,9002018.1,0,"GL")
+^BSDXRES(
+"^DIC",9002018.1,"B","BSDX RESOURCE",9002018.1)
+
+"^DIC",9002018.15,9002018.15,0)
+BSDX RESOURCE USER^9002018.15
+"^DIC",9002018.15,9002018.15,0,"GL")
+^BSDXRSU(
+"^DIC",9002018.15,"B","BSDX RESOURCE USER",9002018.15)
+
+"^DIC",9002018.2,9002018.2,0)
+BSDX RESOURCE GROUP^9002018.2
+"^DIC",9002018.2,9002018.2,0,"GL")
+^BSDXDEPT(
+"^DIC",9002018.2,"B","BSDX RESOURCE GROUP",9002018.2)
+
+"^DIC",9002018.3,9002018.3,0)
+BSDX ACCESS BLOCK^9002018.3
+"^DIC",9002018.3,9002018.3,0,"GL")
+^BSDXAB(
+"^DIC",9002018.3,"B","BSDX ACCESS BLOCK",9002018.3)
+
+"^DIC",9002018.35,9002018.35,0)
+BSDX ACCESS TYPE^9002018.35
+"^DIC",9002018.35,9002018.35,0,"GL")
+^BSDXTYPE(
+"^DIC",9002018.35,"B","BSDX ACCESS TYPE",9002018.35)
+
+"^DIC",9002018.38,9002018.38,0)
+BSDX ACCESS GROUP^9002018.38
+"^DIC",9002018.38,9002018.38,0,"GL")
+^BSDXAGP(
+"^DIC",9002018.38,"B","BSDX ACCESS GROUP",9002018.38)
+
+"^DIC",9002018.39,9002018.39,0)
+BSDX ACCESS GROUP TYPE^9002018.39
+"^DIC",9002018.39,9002018.39,0,"GL")
+^BSDXAGTP(
+"^DIC",9002018.39,"B","BSDX ACCESS GROUP TYPE",9002018.39)
+
+"^DIC",9002018.4,9002018.4,0)
+BSDX APPOINTMENT^9002018.4
+"^DIC",9002018.4,9002018.4,0,"GL")
+^BSDXAPPT(
+"^DIC",9002018.4,"B","BSDX APPOINTMENT",9002018.4)
+
+"^DIC",9002018.5,9002018.5,0)
+BSDX APPLICATION^9002018.5
+"^DIC",9002018.5,9002018.5,0,"GL")
+^BSDXAPPL(
+"^DIC",9002018.5,"B","BSDX APPLICATION",9002018.5)
+
+**END**
+**END**
Index: Scheduling/branches/Radiology-Support/kids/bsdx0150.v3.k
===================================================================
--- Scheduling/branches/Radiology-Support/kids/bsdx0150.v3.k	(revision 1134)
+++ Scheduling/branches/Radiology-Support/kids/bsdx0150.v3.k	(revision 1134)
@@ -0,0 +1,13806 @@
+KIDS Distribution saved on Mar 16, 2011@10:06:29
+WV Scheduling GUI v 1.5
+**KIDS**:BSDX 1.5V3^
+
+**INSTALL NAME**
+BSDX 1.5V3
+"BLD",7659,0)
+BSDX 1.5V3^IHS Windows Scheduling^^3110316^n
+"BLD",7659,1,0)
+^^1^1^3110125^^^^
+"BLD",7659,1,1,0)
+Clinical Scheduling M Server support routines, files, options and RPCs.
+"BLD",7659,4,0)
+^9.64PA^9002018.5^9
+"BLD",7659,4,9002018.1,0)
+9002018.1
+"BLD",7659,4,9002018.1,222)
+y^y^f^^n^^n^o^n
+"BLD",7659,4,9002018.15,0)
+9002018.15
+"BLD",7659,4,9002018.15,222)
+y^y^f^^n^^n^o^n
+"BLD",7659,4,9002018.2,0)
+9002018.2
+"BLD",7659,4,9002018.2,222)
+y^y^f^^n^^n^o^n
+"BLD",7659,4,9002018.3,0)
+9002018.3
+"BLD",7659,4,9002018.3,222)
+y^y^f^^n^^n^o^n
+"BLD",7659,4,9002018.35,0)
+9002018.35
+"BLD",7659,4,9002018.35,222)
+y^y^f^^n^^n^o^n
+"BLD",7659,4,9002018.38,0)
+9002018.38
+"BLD",7659,4,9002018.38,222)
+y^y^f^^n^^n^o^n
+"BLD",7659,4,9002018.39,0)
+9002018.39
+"BLD",7659,4,9002018.39,222)
+y^y^f^^n^^n^o^n
+"BLD",7659,4,9002018.4,0)
+9002018.4
+"BLD",7659,4,9002018.4,222)
+y^y^f^^n^^n^o^n
+"BLD",7659,4,9002018.5,0)
+9002018.5
+"BLD",7659,4,9002018.5,222)
+y^y^f^^n^^y^o^n
+"BLD",7659,4,"B",9002018.1,9002018.1)
+
+"BLD",7659,4,"B",9002018.15,9002018.15)
+
+"BLD",7659,4,"B",9002018.2,9002018.2)
+
+"BLD",7659,4,"B",9002018.3,9002018.3)
+
+"BLD",7659,4,"B",9002018.35,9002018.35)
+
+"BLD",7659,4,"B",9002018.38,9002018.38)
+
+"BLD",7659,4,"B",9002018.39,9002018.39)
+
+"BLD",7659,4,"B",9002018.4,9002018.4)
+
+"BLD",7659,4,"B",9002018.5,9002018.5)
+
+"BLD",7659,6.3)
+13
+"BLD",7659,"ABPKG")
+n
+"BLD",7659,"INIT")
+V0200^BSDX2E
+"BLD",7659,"KRN",0)
+^9.67PA^8989.52^19
+"BLD",7659,"KRN",.4,0)
+.4
+"BLD",7659,"KRN",.4,"NM",0)
+^9.68A^^
+"BLD",7659,"KRN",.401,0)
+.401
+"BLD",7659,"KRN",.402,0)
+.402
+"BLD",7659,"KRN",.403,0)
+.403
+"BLD",7659,"KRN",.5,0)
+.5
+"BLD",7659,"KRN",.84,0)
+.84
+"BLD",7659,"KRN",3.6,0)
+3.6
+"BLD",7659,"KRN",3.8,0)
+3.8
+"BLD",7659,"KRN",9.2,0)
+9.2
+"BLD",7659,"KRN",9.8,0)
+9.8
+"BLD",7659,"KRN",9.8,"NM",0)
+^9.68A^36^36
+"BLD",7659,"KRN",9.8,"NM",1,0)
+BSDX01^^0^B114081753
+"BLD",7659,"KRN",9.8,"NM",2,0)
+BSDX02^^0^B19595009
+"BLD",7659,"KRN",9.8,"NM",3,0)
+BSDX03^^0^B2855259
+"BLD",7659,"KRN",9.8,"NM",4,0)
+BSDX04^^0^B24350739
+"BLD",7659,"KRN",9.8,"NM",5,0)
+BSDX05^^0^B10878471
+"BLD",7659,"KRN",9.8,"NM",6,0)
+BSDX06^^0^B6812445
+"BLD",7659,"KRN",9.8,"NM",7,0)
+BSDX07^^0^B192418956
+"BLD",7659,"KRN",9.8,"NM",8,0)
+BSDX08^^0^B118482818
+"BLD",7659,"KRN",9.8,"NM",9,0)
+BSDX09^^0^B35707298
+"BLD",7659,"KRN",9.8,"NM",10,0)
+BSDX12^^0^B7203579
+"BLD",7659,"KRN",9.8,"NM",11,0)
+BSDX13^^0^B9772451
+"BLD",7659,"KRN",9.8,"NM",12,0)
+BSDX14^^0^B6450810
+"BLD",7659,"KRN",9.8,"NM",13,0)
+BSDX15^^0^B5327807
+"BLD",7659,"KRN",9.8,"NM",14,0)
+BSDX16^^0^B11948965
+"BLD",7659,"KRN",9.8,"NM",15,0)
+BSDX17^^0^B2072173
+"BLD",7659,"KRN",9.8,"NM",16,0)
+BSDX18^^0^B87953431
+"BLD",7659,"KRN",9.8,"NM",17,0)
+BSDX19^^0^B7890401
+"BLD",7659,"KRN",9.8,"NM",18,0)
+BSDX20^^0^B5911607
+"BLD",7659,"KRN",9.8,"NM",19,0)
+BSDX21^^0^B8672065
+"BLD",7659,"KRN",9.8,"NM",20,0)
+BSDX22^^0^B9479861
+"BLD",7659,"KRN",9.8,"NM",21,0)
+BSDX23^^0^B8488013
+"BLD",7659,"KRN",9.8,"NM",22,0)
+BSDX24^^0^B13455014
+"BLD",7659,"KRN",9.8,"NM",23,0)
+BSDX25^^0^B57972087
+"BLD",7659,"KRN",9.8,"NM",24,0)
+BSDX26^^0^B30714245
+"BLD",7659,"KRN",9.8,"NM",25,0)
+BSDX27^^0^B133007616
+"BLD",7659,"KRN",9.8,"NM",26,0)
+BSDX28^^0^B32389827
+"BLD",7659,"KRN",9.8,"NM",27,0)
+BSDX29^^0^B51424449
+"BLD",7659,"KRN",9.8,"NM",28,0)
+BSDX30^^0^B6616255
+"BLD",7659,"KRN",9.8,"NM",29,0)
+BSDX31^^0^B67823338
+"BLD",7659,"KRN",9.8,"NM",30,0)
+BSDX32^^0^B17196738
+"BLD",7659,"KRN",9.8,"NM",31,0)
+BSDX33^^0^B14923306
+"BLD",7659,"KRN",9.8,"NM",32,0)
+BSDX34^^0^B43182525
+"BLD",7659,"KRN",9.8,"NM",33,0)
+BSDX35^^0^B8147998
+"BLD",7659,"KRN",9.8,"NM",34,0)
+BSDX11^^0^B6358791
+"BLD",7659,"KRN",9.8,"NM",35,0)
+BSDXAPI^^0^B148584022
+"BLD",7659,"KRN",9.8,"NM",36,0)
+BSDXGPRV^^0^B4804670
+"BLD",7659,"KRN",9.8,"NM","B","BSDX01",1)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX02",2)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX03",3)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX04",4)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX05",5)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX06",6)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX07",7)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX08",8)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX09",9)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX11",34)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX12",10)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX13",11)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX14",12)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX15",13)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX16",14)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX17",15)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX18",16)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX19",17)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX20",18)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX21",19)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX22",20)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX23",21)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX24",22)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX25",23)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX26",24)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX27",25)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX28",26)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX29",27)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX30",28)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX31",29)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX32",30)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX33",31)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX34",32)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDX35",33)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDXAPI",35)
+
+"BLD",7659,"KRN",9.8,"NM","B","BSDXGPRV",36)
+
+"BLD",7659,"KRN",19,0)
+19
+"BLD",7659,"KRN",19,"NM",0)
+^9.68A^1^1
+"BLD",7659,"KRN",19,"NM",1,0)
+BSDXRPC^^0
+"BLD",7659,"KRN",19,"NM","B","BSDXRPC",1)
+
+"BLD",7659,"KRN",19.1,0)
+19.1
+"BLD",7659,"KRN",19.1,"NM",0)
+^9.68A^2^2
+"BLD",7659,"KRN",19.1,"NM",1,0)
+BSDXZMENU^^0
+"BLD",7659,"KRN",19.1,"NM",2,0)
+BSDXZMGR^^0
+"BLD",7659,"KRN",19.1,"NM","B","BSDXZMENU",1)
+
+"BLD",7659,"KRN",19.1,"NM","B","BSDXZMGR",2)
+
+"BLD",7659,"KRN",101,0)
+101
+"BLD",7659,"KRN",101,"NM",0)
+^9.68A^4^4
+"BLD",7659,"KRN",101,"NM",1,0)
+BSDX ADD APPOINTMENT^^0
+"BLD",7659,"KRN",101,"NM",2,0)
+BSDX CANCEL APPOINTMENT^^0
+"BLD",7659,"KRN",101,"NM",3,0)
+BSDX CHECKIN APPOINTMENT^^0
+"BLD",7659,"KRN",101,"NM",4,0)
+BSDX NOSHOW APPOINTMENT^^0
+"BLD",7659,"KRN",101,"NM","B","BSDX ADD APPOINTMENT",1)
+
+"BLD",7659,"KRN",101,"NM","B","BSDX CANCEL APPOINTMENT",2)
+
+"BLD",7659,"KRN",101,"NM","B","BSDX CHECKIN APPOINTMENT",3)
+
+"BLD",7659,"KRN",101,"NM","B","BSDX NOSHOW APPOINTMENT",4)
+
+"BLD",7659,"KRN",409.61,0)
+409.61
+"BLD",7659,"KRN",771,0)
+771
+"BLD",7659,"KRN",870,0)
+870
+"BLD",7659,"KRN",8989.51,0)
+8989.51
+"BLD",7659,"KRN",8989.51,"NM",0)
+^9.68A^2^2
+"BLD",7659,"KRN",8989.51,"NM",1,0)
+BSDX AUTO PRINT AS^^0
+"BLD",7659,"KRN",8989.51,"NM",2,0)
+BSDX AUTO PRINT RS^^0
+"BLD",7659,"KRN",8989.51,"NM","B","BSDX AUTO PRINT AS",1)
+
+"BLD",7659,"KRN",8989.51,"NM","B","BSDX AUTO PRINT RS",2)
+
+"BLD",7659,"KRN",8989.52,0)
+8989.52
+"BLD",7659,"KRN",8994,0)
+8994
+"BLD",7659,"KRN",8994,"NM",0)
+^9.68A^107^104
+"BLD",7659,"KRN",8994,"NM",1,0)
+BSDX ADD NEW APPOINTMENT^^0
+"BLD",7659,"KRN",8994,"NM",2,0)
+BSDX ADD NEW AVAILABILITY^^0
+"BLD",7659,"KRN",8994,"NM",3,0)
+BSDX APPT BLOCKS OVERLAP^^0
+"BLD",7659,"KRN",8994,"NM",4,0)
+BSDX CANCEL APPOINTMENT^^0
+"BLD",7659,"KRN",8994,"NM",5,0)
+BSDX CANCEL AVAILABILITY^^0
+"BLD",7659,"KRN",8994,"NM",6,0)
+BSDX CREATE APPT SCHEDULE^^0
+"BLD",7659,"KRN",8994,"NM",7,0)
+BSDX CREATE ASGND SLOT SCHED^^0
+"BLD",7659,"KRN",8994,"NM",10,0)
+BSDX GET BASIC REG INFO^^0
+"BLD",7659,"KRN",8994,"NM",12,0)
+BSDX TYPE BLOCKS OVERLAP^^0
+"BLD",7659,"KRN",8994,"NM",13,0)
+BSDX ADD/EDIT ACCESS TYPE^^0
+"BLD",7659,"KRN",8994,"NM",14,0)
+BSDX GET ACCESS GROUP TYPES^^0
+"BLD",7659,"KRN",8994,"NM",15,0)
+BSDX GROUP RESOURCE^^0
+"BLD",7659,"KRN",8994,"NM",16,0)
+BSDX RESOURCE GROUPS BY USER^^0
+"BLD",7659,"KRN",8994,"NM",17,0)
+BSDX ADD/EDIT RESOURCEUSER^^0
+"BLD",7659,"KRN",8994,"NM",18,0)
+BSDX DELETE RESOURCEUSER^^0
+"BLD",7659,"KRN",8994,"NM",19,0)
+BSDX SCHEDULE USER^^0
+"BLD",7659,"KRN",8994,"NM",20,0)
+BSDX ADD/EDIT RESOURCE^^0
+"BLD",7659,"KRN",8994,"NM",21,0)
+BSDX SCHEDULING USER INFO^^0
+"BLD",7659,"KRN",8994,"NM",22,0)
+BSDX RESOURCES^^0
+"BLD",7659,"KRN",8994,"NM",23,0)
+BSDX ADD/EDIT RESOURCE GROUP^^0
+"BLD",7659,"KRN",8994,"NM",24,0)
+BSDX DELETE RESOURCE GROUP^^0
+"BLD",7659,"KRN",8994,"NM",25,0)
+BSDX DELETE RES GROUP ITEM^^0
+"BLD",7659,"KRN",8994,"NM",26,0)
+BSDX DEPARTMENT RESOURCE^^0
+"BLD",7659,"KRN",8994,"NM",27,0)
+BSDX DEPARTMENTS BY USER^^0
+"BLD",7659,"KRN",8994,"NM",28,0)
+BSDX RESOURCES BY USER^^0
+"BLD",7659,"KRN",8994,"NM",29,0)
+BSDX ADD ACCESS GROUP ITEM^^0
+"BLD",7659,"KRN",8994,"NM",30,0)
+BSDX ADD RES GROUP ITEM^^0
+"BLD",7659,"KRN",8994,"NM",31,0)
+BSDX ADD/EDIT ACCESS GROUP^^0
+"BLD",7659,"KRN",8994,"NM",32,0)
+BSDX DELETE ACCESS GROUP^^0
+"BLD",7659,"KRN",8994,"NM",33,0)
+BSDX DELETE ACCESS GROUP ITEM^^0
+"BLD",7659,"KRN",8994,"NM",34,0)
+BSDX REGISTER EVENT^^0
+"BLD",7659,"KRN",8994,"NM",35,0)
+BSDX UNREGISTER EVENT^^0
+"BLD",7659,"KRN",8994,"NM",36,0)
+BSDX RAISE EVENT^^0
+"BLD",7659,"KRN",8994,"NM",37,0)
+BSDX SEARCH AVAILABILITY^^0
+"BLD",7659,"KRN",8994,"NM",38,0)
+BSDX CHECKIN APPOINTMENT^^0
+"BLD",7659,"KRN",8994,"NM",39,0)
+BSDX EDIT APPOINTMENT^^0
+"BLD",7659,"KRN",8994,"NM",40,0)
+BSDX PATIENT APPT DISPLAY^^0
+"BLD",7659,"KRN",8994,"NM",41,0)
+BSDXPatientLookupRS^^0
+"BLD",7659,"KRN",8994,"NM",42,0)
+BSDX SPACEBAR SET^^0
+"BLD",7659,"KRN",8994,"NM",43,0)
+BSDX COPY APPOINTMENT CANCEL^^0
+"BLD",7659,"KRN",8994,"NM",44,0)
+BSDX COPY APPOINTMENT STATUS^^0
+"BLD",7659,"KRN",8994,"NM",45,0)
+BSDX COPY APPOINTMENTS^^0
+"BLD",7659,"KRN",8994,"NM",46,0)
+BSDX CLINIC LETTERS^^0
+"BLD",7659,"KRN",8994,"NM",47,0)
+BSDX NOSHOW^^0
+"BLD",7659,"KRN",8994,"NM",48,0)
+BSDX IM HERE^^0
+"BLD",7659,"KRN",8994,"NM",49,0)
+BSDX HOSPITAL LOCATION^^0
+"BLD",7659,"KRN",8994,"NM",50,0)
+BSDX CLINIC SETUP^^0
+"BLD",7659,"KRN",8994,"NM",51,0)
+BSDX REBOOK LIST^^0
+"BLD",7659,"KRN",8994,"NM",52,0)
+BSDX REBOOK CLINIC LIST^^0
+"BLD",7659,"KRN",8994,"NM",53,0)
+BSDX REBOOK SET^^0
+"BLD",7659,"KRN",8994,"NM",54,0)
+BSDX RESOURCE LETTERS^^0
+"BLD",7659,"KRN",8994,"NM",55,0)
+BSDX CANCEL CLINIC LIST^^0
+"BLD",7659,"KRN",8994,"NM",56,0)
+BSDX CANCEL AV BY DATE^^0
+"BLD",7659,"KRN",8994,"NM",57,0)
+BSDX REBOOK NEXT BLOCK^^0
+"BLD",7659,"KRN",8994,"NM",58,0)
+BSDX EHR PATIENT^^0
+"BLD",7659,"KRN",8994,"NM",59,0)
+BSDX HOSP LOC PROVIDERS^^0
+"BLD",7659,"KRN",8994,"NM",60,0)
+BMX ADO SS^^0
+"BLD",7659,"KRN",8994,"NM",61,0)
+BMX ASYNC GET^^0
+"BLD",7659,"KRN",8994,"NM",62,0)
+BMX ASYNC QUEUE^^0
+"BLD",7659,"KRN",8994,"NM",63,0)
+BMX AV CODE^^0
+"BLD",7659,"KRN",8994,"NM",64,0)
+BMX DEMO^^0
+"BLD",7659,"KRN",8994,"NM",65,0)
+BMX DENTAL REPORT 1^^0
+"BLD",7659,"KRN",8994,"NM",66,0)
+BMX DENTAL REPORT 2^^0
+"BLD",7659,"KRN",8994,"NM",67,0)
+BMX EVENT POLL^^0
+"BLD",7659,"KRN",8994,"NM",68,0)
+BMX EVENT RAISE^^0
+"BLD",7659,"KRN",8994,"NM",69,0)
+BMX EVENT REGISTER^^0
+"BLD",7659,"KRN",8994,"NM",70,0)
+BMX EVENT UNREGISTER^^0
+"BLD",7659,"KRN",8994,"NM",71,0)
+BMX FIELD LIST^^0
+"BLD",7659,"KRN",8994,"NM",72,0)
+BMX FIND^^0
+"BLD",7659,"KRN",8994,"NM",73,0)
+BMX GET VARIABLE VALUE^^0
+"BLD",7659,"KRN",8994,"NM",74,0)
+BMX HEALTH SUMMARY^^0
+"BLD",7659,"KRN",8994,"NM",75,0)
+BMX IM HERE^^0
+"BLD",7659,"KRN",8994,"NM",76,0)
+BMX LOCK^^0
+"BLD",7659,"KRN",8994,"NM",77,0)
+BMX LOOKUP^^0
+"BLD",7659,"KRN",8994,"NM",78,0)
+BMX MULT LIST^^0
+"BLD",7659,"KRN",8994,"NM",79,0)
+BMX NTUSER^^0
+"BLD",7659,"KRN",8994,"NM",80,0)
+BMX PATIENT DEMOG DATA GET^^0
+"BLD",7659,"KRN",8994,"NM",81,0)
+BMX PDATA CHART^^0
+"BLD",7659,"KRN",8994,"NM",82,0)
+BMX SCHEMA ONLY^^0
+"BLD",7659,"KRN",8994,"NM",83,0)
+BMX SECURITY KEY^^0
+"BLD",7659,"KRN",8994,"NM",84,0)
+BMX SIGNATURE^^0
+"BLD",7659,"KRN",8994,"NM",85,0)
+BMX SQL^^0
+"BLD",7659,"KRN",8994,"NM",86,0)
+BMX SQL COLINFO^^0
+"BLD",7659,"KRN",8994,"NM",87,0)
+BMX TABLE^^0
+"BLD",7659,"KRN",8994,"NM",88,0)
+BMX TEST^^0
+"BLD",7659,"KRN",8994,"NM",89,0)
+BMX TIMER TEST^^0
+"BLD",7659,"KRN",8994,"NM",90,0)
+BMX TLIST^^0
+"BLD",7659,"KRN",8994,"NM",91,0)
+BMX UPDATE^^0
+"BLD",7659,"KRN",8994,"NM",92,0)
+BMX USER^^0
+"BLD",7659,"KRN",8994,"NM",93,0)
+BMX UTF-8^^0
+"BLD",7659,"KRN",8994,"NM",94,0)
+BMX VERSION INFO^^0
+"BLD",7659,"KRN",8994,"NM",95,0)
+BMXGetFac^^0
+"BLD",7659,"KRN",8994,"NM",96,0)
+BMXGetFacRS^^0
+"BLD",7659,"KRN",8994,"NM",97,0)
+BMXNRC^^0
+"BLD",7659,"KRN",8994,"NM",98,0)
+BMXNetGetCodes^^0
+"BLD",7659,"KRN",8994,"NM",99,0)
+BMXNetSetUser^^0
+"BLD",7659,"KRN",8994,"NM",100,0)
+BMXPatientInfoRS^^0
+"BLD",7659,"KRN",8994,"NM",101,0)
+BMXPatientLookupRS^^0
+"BLD",7659,"KRN",8994,"NM",102,0)
+BMXProviderLookupRS^^0
+"BLD",7659,"KRN",8994,"NM",103,0)
+BMXSetFac^^0
+"BLD",7659,"KRN",8994,"NM",104,0)
+BMXUserKeyRS^^0
+"BLD",7659,"KRN",8994,"NM",105,0)
+BSDX SET PARAM^^0
+"BLD",7659,"KRN",8994,"NM",106,0)
+BSDX GET PARAM^^0
+"BLD",7659,"KRN",8994,"NM",107,0)
+BSDX REMOVE CHECK-IN^^0
+"BLD",7659,"KRN",8994,"NM","B","BMX ADO SS",60)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX ASYNC GET",61)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX ASYNC QUEUE",62)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX AV CODE",63)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX DEMO",64)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX DENTAL REPORT 1",65)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX DENTAL REPORT 2",66)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX EVENT POLL",67)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX EVENT RAISE",68)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX EVENT REGISTER",69)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX EVENT UNREGISTER",70)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX FIELD LIST",71)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX FIND",72)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX GET VARIABLE VALUE",73)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX HEALTH SUMMARY",74)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX IM HERE",75)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX LOCK",76)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX LOOKUP",77)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX MULT LIST",78)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX NTUSER",79)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX PATIENT DEMOG DATA GET",80)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX PDATA CHART",81)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX SCHEMA ONLY",82)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX SECURITY KEY",83)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX SIGNATURE",84)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX SQL",85)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX SQL COLINFO",86)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX TABLE",87)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX TEST",88)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX TIMER TEST",89)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX TLIST",90)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX UPDATE",91)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX USER",92)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX UTF-8",93)
+
+"BLD",7659,"KRN",8994,"NM","B","BMX VERSION INFO",94)
+
+"BLD",7659,"KRN",8994,"NM","B","BMXGetFac",95)
+
+"BLD",7659,"KRN",8994,"NM","B","BMXGetFacRS",96)
+
+"BLD",7659,"KRN",8994,"NM","B","BMXNRC",97)
+
+"BLD",7659,"KRN",8994,"NM","B","BMXNetGetCodes",98)
+
+"BLD",7659,"KRN",8994,"NM","B","BMXNetSetUser",99)
+
+"BLD",7659,"KRN",8994,"NM","B","BMXPatientInfoRS",100)
+
+"BLD",7659,"KRN",8994,"NM","B","BMXPatientLookupRS",101)
+
+"BLD",7659,"KRN",8994,"NM","B","BMXProviderLookupRS",102)
+
+"BLD",7659,"KRN",8994,"NM","B","BMXSetFac",103)
+
+"BLD",7659,"KRN",8994,"NM","B","BMXUserKeyRS",104)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX ADD ACCESS GROUP ITEM",29)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX ADD NEW APPOINTMENT",1)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX ADD NEW AVAILABILITY",2)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX ADD RES GROUP ITEM",30)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX ADD/EDIT ACCESS GROUP",31)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX ADD/EDIT ACCESS TYPE",13)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX ADD/EDIT RESOURCE",20)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX ADD/EDIT RESOURCE GROUP",23)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX ADD/EDIT RESOURCEUSER",17)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX APPT BLOCKS OVERLAP",3)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX CANCEL APPOINTMENT",4)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX CANCEL AV BY DATE",56)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX CANCEL AVAILABILITY",5)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX CANCEL CLINIC LIST",55)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX CHECKIN APPOINTMENT",38)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX CLINIC LETTERS",46)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX CLINIC SETUP",50)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX COPY APPOINTMENT CANCEL",43)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX COPY APPOINTMENT STATUS",44)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX COPY APPOINTMENTS",45)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX CREATE APPT SCHEDULE",6)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX CREATE ASGND SLOT SCHED",7)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX DELETE ACCESS GROUP",32)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX DELETE ACCESS GROUP ITEM",33)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX DELETE RES GROUP ITEM",25)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX DELETE RESOURCE GROUP",24)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX DELETE RESOURCEUSER",18)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX DEPARTMENT RESOURCE",26)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX DEPARTMENTS BY USER",27)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX EDIT APPOINTMENT",39)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX EHR PATIENT",58)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX GET ACCESS GROUP TYPES",14)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX GET BASIC REG INFO",10)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX GET PARAM",106)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX GROUP RESOURCE",15)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX HOSP LOC PROVIDERS",59)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX HOSPITAL LOCATION",49)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX IM HERE",48)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX NOSHOW",47)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX PATIENT APPT DISPLAY",40)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX RAISE EVENT",36)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX REBOOK CLINIC LIST",52)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX REBOOK LIST",51)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX REBOOK NEXT BLOCK",57)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX REBOOK SET",53)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX REGISTER EVENT",34)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX REMOVE CHECK-IN",107)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX RESOURCE GROUPS BY USER",16)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX RESOURCE LETTERS",54)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX RESOURCES",22)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX RESOURCES BY USER",28)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX SCHEDULE USER",19)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX SCHEDULING USER INFO",21)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX SEARCH AVAILABILITY",37)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX SET PARAM",105)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX SPACEBAR SET",42)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX TYPE BLOCKS OVERLAP",12)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDX UNREGISTER EVENT",35)
+
+"BLD",7659,"KRN",8994,"NM","B","BSDXPatientLookupRS",41)
+
+"BLD",7659,"KRN","B",.4,.4)
+
+"BLD",7659,"KRN","B",.401,.401)
+
+"BLD",7659,"KRN","B",.402,.402)
+
+"BLD",7659,"KRN","B",.403,.403)
+
+"BLD",7659,"KRN","B",.5,.5)
+
+"BLD",7659,"KRN","B",.84,.84)
+
+"BLD",7659,"KRN","B",3.6,3.6)
+
+"BLD",7659,"KRN","B",3.8,3.8)
+
+"BLD",7659,"KRN","B",9.2,9.2)
+
+"BLD",7659,"KRN","B",9.8,9.8)
+
+"BLD",7659,"KRN","B",19,19)
+
+"BLD",7659,"KRN","B",19.1,19.1)
+
+"BLD",7659,"KRN","B",101,101)
+
+"BLD",7659,"KRN","B",409.61,409.61)
+
+"BLD",7659,"KRN","B",771,771)
+
+"BLD",7659,"KRN","B",870,870)
+
+"BLD",7659,"KRN","B",8989.51,8989.51)
+
+"BLD",7659,"KRN","B",8989.52,8989.52)
+
+"BLD",7659,"KRN","B",8994,8994)
+
+"BLD",7659,"PRE")
+BSDX2E
+"BLD",7659,"QUES",0)
+^9.62^^
+"BLD",7659,"REQB",0)
+^9.611^^
+"DATA",9002018.5,1,0)
+1^5^3110316.1003
+"FIA",9002018.1)
+BSDX RESOURCE
+"FIA",9002018.1,0)
+^BSDXRES(
+"FIA",9002018.1,0,0)
+9002018.1
+"FIA",9002018.1,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.1,0,10)
+
+"FIA",9002018.1,0,11)
+
+"FIA",9002018.1,0,"RLRO")
+
+"FIA",9002018.1,0,"VR")
+1.5V3^BSDX
+"FIA",9002018.1,9002018.1)
+0
+"FIA",9002018.1,9002018.11)
+0
+"FIA",9002018.1,9002018.11201)
+0
+"FIA",9002018.1,9002018.11301)
+0
+"FIA",9002018.1,9002018.12001)
+0
+"FIA",9002018.15)
+BSDX RESOURCE USER
+"FIA",9002018.15,0)
+^BSDXRSU(
+"FIA",9002018.15,0,0)
+9002018.15P
+"FIA",9002018.15,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.15,0,10)
+
+"FIA",9002018.15,0,11)
+
+"FIA",9002018.15,0,"RLRO")
+
+"FIA",9002018.15,0,"VR")
+1.5V3^BSDX
+"FIA",9002018.15,9002018.15)
+0
+"FIA",9002018.2)
+BSDX RESOURCE GROUP
+"FIA",9002018.2,0)
+^BSDXDEPT(
+"FIA",9002018.2,0,0)
+9002018.2
+"FIA",9002018.2,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.2,0,10)
+
+"FIA",9002018.2,0,11)
+
+"FIA",9002018.2,0,"RLRO")
+
+"FIA",9002018.2,0,"VR")
+1.5V3^BSDX
+"FIA",9002018.2,9002018.2)
+0
+"FIA",9002018.2,9002018.21)
+0
+"FIA",9002018.3)
+BSDX ACCESS BLOCK
+"FIA",9002018.3,0)
+^BSDXAB(
+"FIA",9002018.3,0,0)
+9002018.3PA
+"FIA",9002018.3,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.3,0,10)
+
+"FIA",9002018.3,0,11)
+
+"FIA",9002018.3,0,"RLRO")
+
+"FIA",9002018.3,0,"VR")
+1.5V3^BSDX
+"FIA",9002018.3,9002018.3)
+0
+"FIA",9002018.3,9002018.31)
+0
+"FIA",9002018.35)
+BSDX ACCESS TYPE
+"FIA",9002018.35,0)
+^BSDXTYPE(
+"FIA",9002018.35,0,0)
+9002018.35
+"FIA",9002018.35,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.35,0,10)
+
+"FIA",9002018.35,0,11)
+
+"FIA",9002018.35,0,"RLRO")
+
+"FIA",9002018.35,0,"VR")
+1.5V3^BSDX
+"FIA",9002018.35,9002018.35)
+0
+"FIA",9002018.38)
+BSDX ACCESS GROUP
+"FIA",9002018.38,0)
+^BSDXAGP(
+"FIA",9002018.38,0,0)
+9002018.38
+"FIA",9002018.38,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.38,0,10)
+
+"FIA",9002018.38,0,11)
+
+"FIA",9002018.38,0,"RLRO")
+
+"FIA",9002018.38,0,"VR")
+1.5V3^BSDX
+"FIA",9002018.38,9002018.38)
+0
+"FIA",9002018.39)
+BSDX ACCESS GROUP TYPE
+"FIA",9002018.39,0)
+^BSDXAGTP(
+"FIA",9002018.39,0,0)
+9002018.39P
+"FIA",9002018.39,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.39,0,10)
+
+"FIA",9002018.39,0,11)
+
+"FIA",9002018.39,0,"RLRO")
+
+"FIA",9002018.39,0,"VR")
+1.5V3^BSDX
+"FIA",9002018.39,9002018.39)
+0
+"FIA",9002018.4)
+BSDX APPOINTMENT
+"FIA",9002018.4,0)
+^BSDXAPPT(
+"FIA",9002018.4,0,0)
+9002018.4DA
+"FIA",9002018.4,0,1)
+y^y^f^^n^^n^o^n
+"FIA",9002018.4,0,10)
+
+"FIA",9002018.4,0,11)
+
+"FIA",9002018.4,0,"RLRO")
+
+"FIA",9002018.4,0,"VR")
+1.5V3^BSDX
+"FIA",9002018.4,9002018.4)
+0
+"FIA",9002018.4,9002018.41)
+0
+"FIA",9002018.5)
+BSDX APPLICATION
+"FIA",9002018.5,0)
+^BSDXAPPL(
+"FIA",9002018.5,0,0)
+9002018.5
+"FIA",9002018.5,0,1)
+y^y^f^^n^^y^o^n
+"FIA",9002018.5,0,10)
+
+"FIA",9002018.5,0,11)
+
+"FIA",9002018.5,0,"RLRO")
+
+"FIA",9002018.5,0,"VR")
+1.5V3^BSDX
+"FIA",9002018.5,9002018.5)
+0
+"INIT")
+V0200^BSDX2E
+"IX",9002018.39,9002018.39,"AC",0)
+9002018.39^AC^INDEX OF ACCESS GROUP, ACCESS TYPE^R^^R^IR^I^9002018.39^^^^^S
+"IX",9002018.39,9002018.39,"AC",1)
+S ^BSDXAGTP("AC",$E(X(1),1,30),$E(X(2),1,30),DA)=""
+"IX",9002018.39,9002018.39,"AC",2)
+K ^BSDXAGTP("AC",$E(X(1),1,30),$E(X(2),1,30),DA)
+"IX",9002018.39,9002018.39,"AC",2.5)
+K ^BSDXAGTP("AC")
+"IX",9002018.39,9002018.39,"AC",11.1,0)
+^.114IA^2^2
+"IX",9002018.39,9002018.39,"AC",11.1,1,0)
+1^F^9002018.39^.01^30^1^F
+"IX",9002018.39,9002018.39,"AC",11.1,1,3)
+
+"IX",9002018.39,9002018.39,"AC",11.1,2,0)
+2^F^9002018.39^.02^30^2^F
+"IX",9002018.39,9002018.39,"AC",11.1,2,3)
+
+"KRN",19,10987,-1)
+0^1
+"KRN",19,10987,0)
+BSDXRPC^WINDOWS SCHEDULING PROCEDURE CALLS^^B^^^^^^^^IHS Windows Scheduling
+"KRN",19,10987,1,0)
+^19.06^4^4^3100618^^
+"KRN",19,10987,1,1,0)
+This option hosts RPCs in the BSDX namespace.  Windows Scheduling users
+"KRN",19,10987,1,2,0)
+ mustg have access to this option
+"KRN",19,10987,1,3,0)
+ 
+"KRN",19,10987,1,4,0)
+in order to use Windows Scheduling.
+"KRN",19,10987,99.1)
+61545,63078
+"KRN",19,10987,"RPC",0)
+^19.05P^104^104
+"KRN",19,10987,"RPC",1,0)
+BSDX ADD ACCESS GROUP ITEM
+"KRN",19,10987,"RPC",2,0)
+BSDX ADD NEW APPOINTMENT
+"KRN",19,10987,"RPC",3,0)
+BSDX ADD NEW AVAILABILITY
+"KRN",19,10987,"RPC",4,0)
+BSDX ADD RES GROUP ITEM
+"KRN",19,10987,"RPC",5,0)
+BSDX ADD/EDIT ACCESS GROUP
+"KRN",19,10987,"RPC",6,0)
+BSDX ADD/EDIT ACCESS TYPE
+"KRN",19,10987,"RPC",7,0)
+BSDX ADD/EDIT RESOURCE
+"KRN",19,10987,"RPC",8,0)
+BSDX ADD/EDIT RESOURCE GROUP
+"KRN",19,10987,"RPC",9,0)
+BSDX ADD/EDIT RESOURCEUSER
+"KRN",19,10987,"RPC",10,0)
+BSDX APPT BLOCKS OVERLAP
+"KRN",19,10987,"RPC",11,0)
+BSDX CANCEL APPOINTMENT
+"KRN",19,10987,"RPC",12,0)
+BSDX CANCEL AVAILABILITY
+"KRN",19,10987,"RPC",13,0)
+BSDX CHECKIN APPOINTMENT
+"KRN",19,10987,"RPC",14,0)
+BSDX CREATE APPT SCHEDULE
+"KRN",19,10987,"RPC",15,0)
+BSDX CREATE ASGND SLOT SCHED
+"KRN",19,10987,"RPC",16,0)
+BSDX DELETE ACCESS GROUP
+"KRN",19,10987,"RPC",17,0)
+BSDX DELETE ACCESS GROUP ITEM
+"KRN",19,10987,"RPC",18,0)
+BSDX DELETE RES GROUP ITEM
+"KRN",19,10987,"RPC",19,0)
+BSDX DELETE RESOURCE GROUP
+"KRN",19,10987,"RPC",20,0)
+BSDX DELETE RESOURCEUSER
+"KRN",19,10987,"RPC",21,0)
+BSDX DEPARTMENT RESOURCE
+"KRN",19,10987,"RPC",22,0)
+BSDX DEPARTMENTS BY USER
+"KRN",19,10987,"RPC",23,0)
+BSDX EDIT APPOINTMENT
+"KRN",19,10987,"RPC",24,0)
+BSDX GET ACCESS GROUP TYPES
+"KRN",19,10987,"RPC",25,0)
+BSDX GET BASIC REG INFO
+"KRN",19,10987,"RPC",26,0)
+BSDX GROUP RESOURCE
+"KRN",19,10987,"RPC",27,0)
+BSDX PATIENT APPT DISPLAY
+"KRN",19,10987,"RPC",28,0)
+BSDX RAISE EVENT
+"KRN",19,10987,"RPC",29,0)
+BSDX REGISTER EVENT
+"KRN",19,10987,"RPC",30,0)
+BSDX RESOURCE GROUPS BY USER
+"KRN",19,10987,"RPC",31,0)
+BSDX RESOURCES
+"KRN",19,10987,"RPC",32,0)
+BSDX RESOURCES BY USER
+"KRN",19,10987,"RPC",33,0)
+BSDX SCHEDULE USER
+"KRN",19,10987,"RPC",34,0)
+BSDX SCHEDULING USER INFO
+"KRN",19,10987,"RPC",35,0)
+BSDX SEARCH AVAILABILITY
+"KRN",19,10987,"RPC",36,0)
+BSDX TYPE BLOCKS OVERLAP
+"KRN",19,10987,"RPC",37,0)
+BSDX UNREGISTER EVENT
+"KRN",19,10987,"RPC",38,0)
+BSDXPatientLookupRS
+"KRN",19,10987,"RPC",39,0)
+BSDX SPACEBAR SET
+"KRN",19,10987,"RPC",40,0)
+BSDX COPY APPOINTMENTS
+"KRN",19,10987,"RPC",41,0)
+BSDX COPY APPOINTMENT CANCEL
+"KRN",19,10987,"RPC",42,0)
+BSDX COPY APPOINTMENT STATUS
+"KRN",19,10987,"RPC",43,0)
+BSDX CLINIC LETTERS
+"KRN",19,10987,"RPC",44,0)
+BSDX NOSHOW
+"KRN",19,10987,"RPC",45,0)
+BSDX IM HERE
+"KRN",19,10987,"RPC",46,0)
+BSDX HOSPITAL LOCATION
+"KRN",19,10987,"RPC",47,0)
+BSDX CLINIC SETUP
+"KRN",19,10987,"RPC",49,0)
+BSDX REBOOK LIST
+"KRN",19,10987,"RPC",50,0)
+BSDX REBOOK CLINIC LIST
+"KRN",19,10987,"RPC",51,0)
+BSDX REBOOK SET
+"KRN",19,10987,"RPC",52,0)
+BSDX RESOURCE LETTERS
+"KRN",19,10987,"RPC",53,0)
+BSDX CANCEL CLINIC LIST
+"KRN",19,10987,"RPC",54,0)
+BSDX CANCEL AV BY DATE
+"KRN",19,10987,"RPC",55,0)
+BSDX REBOOK NEXT BLOCK
+"KRN",19,10987,"RPC",56,0)
+BSDX HOSP LOC PROVIDERS
+"KRN",19,10987,"RPC",57,0)
+BMX ADO SS
+"KRN",19,10987,"RPC",58,0)
+BMX ASYNC GET
+"KRN",19,10987,"RPC",59,0)
+BMX ASYNC QUEUE
+"KRN",19,10987,"RPC",60,0)
+BMX AV CODE
+"KRN",19,10987,"RPC",61,0)
+BMX DEMO
+"KRN",19,10987,"RPC",62,0)
+BMX DENTAL REPORT 1
+"KRN",19,10987,"RPC",63,0)
+BMX DENTAL REPORT 2
+"KRN",19,10987,"RPC",64,0)
+BMX EVENT POLL
+"KRN",19,10987,"RPC",65,0)
+BMX EVENT RAISE
+"KRN",19,10987,"RPC",66,0)
+BMX EVENT REGISTER
+"KRN",19,10987,"RPC",67,0)
+BMX EVENT UNREGISTER
+"KRN",19,10987,"RPC",68,0)
+BMX FIELD LIST
+"KRN",19,10987,"RPC",69,0)
+BMX FIND
+"KRN",19,10987,"RPC",70,0)
+BMX GET VARIABLE VALUE
+"KRN",19,10987,"RPC",71,0)
+BMX HEALTH SUMMARY
+"KRN",19,10987,"RPC",72,0)
+BMX IM HERE
+"KRN",19,10987,"RPC",73,0)
+BMX LOCK
+"KRN",19,10987,"RPC",74,0)
+BMX LOOKUP
+"KRN",19,10987,"RPC",75,0)
+BMX MULT LIST
+"KRN",19,10987,"RPC",76,0)
+BMX NTUSER
+"KRN",19,10987,"RPC",77,0)
+BMX PATIENT DEMOG DATA GET
+"KRN",19,10987,"RPC",78,0)
+BMX PDATA CHART
+"KRN",19,10987,"RPC",79,0)
+BMX SCHEMA ONLY
+"KRN",19,10987,"RPC",80,0)
+BMX SECURITY KEY
+"KRN",19,10987,"RPC",81,0)
+BMX SIGNATURE
+"KRN",19,10987,"RPC",82,0)
+BMX SQL
+"KRN",19,10987,"RPC",83,0)
+BMX SQL COLINFO
+"KRN",19,10987,"RPC",84,0)
+BMX TABLE
+"KRN",19,10987,"RPC",85,0)
+BMX TEST
+"KRN",19,10987,"RPC",86,0)
+BMX TIMER TEST
+"KRN",19,10987,"RPC",87,0)
+BMX TLIST
+"KRN",19,10987,"RPC",88,0)
+BMX UPDATE
+"KRN",19,10987,"RPC",89,0)
+BMX USER
+"KRN",19,10987,"RPC",90,0)
+BMX UTF-8
+"KRN",19,10987,"RPC",91,0)
+BMX VERSION INFO
+"KRN",19,10987,"RPC",92,0)
+BMXGetFac
+"KRN",19,10987,"RPC",93,0)
+BMXGetFacRS
+"KRN",19,10987,"RPC",94,0)
+BMXNRC
+"KRN",19,10987,"RPC",95,0)
+BMXNetGetCodes
+"KRN",19,10987,"RPC",96,0)
+BMXNetSetUser
+"KRN",19,10987,"RPC",97,0)
+BMXPatientInfoRS
+"KRN",19,10987,"RPC",98,0)
+BMXPatientLookupRS
+"KRN",19,10987,"RPC",99,0)
+BMXProviderLookupRS
+"KRN",19,10987,"RPC",100,0)
+BMXSetFac
+"KRN",19,10987,"RPC",101,0)
+BMXUserKeyRS
+"KRN",19,10987,"RPC",102,0)
+BSDX REMOVE CHECK-IN
+"KRN",19,10987,"RPC",103,0)
+BSDX SET PARAM
+"KRN",19,10987,"RPC",104,0)
+BSDX GET PARAM
+"KRN",19,10987,"U")
+WINDOWS SCHEDULING PROCEDURE C
+"KRN",19.1,480,-1)
+0^1
+"KRN",19.1,480,0)
+BSDXZMENU^IHS Windows Scheduling
+"KRN",19.1,481,-1)
+0^2
+"KRN",19.1,481,0)
+BSDXZMGR^IHS Windows Scheduling Manager
+"KRN",101,4262,-1)
+0^2
+"KRN",101,4262,0)
+BSDX CANCEL APPOINTMENT^BSDX CANCEL APPOINTMENT^^A^^^^^^^^
+"KRN",101,4262,1,0)
+^^4^4^3040915^
+"KRN",101,4262,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4262,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4262,1,3,0)
+cancel an appointment in the IHS Windows Scheduling package
+"KRN",101,4262,1,4,0)
+when the corresponding appointment in RPMS Scheduling is cancelled.
+"KRN",101,4262,4)
+^^^BSDX CANCEL APPOINTMENT
+"KRN",101,4262,20)
+I $G(SDAMEVT)=2,$D(^BSDXAPPL) D CANEVT^BSDX08($G(DFN),$G(SDT),$G(SDCL))
+"KRN",101,4262,99)
+61598,46412
+"KRN",101,4263,-1)
+0^1
+"KRN",101,4263,0)
+BSDX ADD APPOINTMENT^BSDX ADD APPOINTMENT^^A^^^^^^^^
+"KRN",101,4263,1,0)
+^101.06^4^4^3040915^^
+"KRN",101,4263,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4263,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4263,1,3,0)
+add an appointment in the IHS Windows Scheduling package
+"KRN",101,4263,1,4,0)
+when the corresponding appointment in RPMS Scheduling is added.
+"KRN",101,4263,4)
+^^^BSDX ADD APPOINTMENT
+"KRN",101,4263,20)
+I $G(SDAMEVT)=1,$D(^BSDXAPPL) D ADDEVT^BSDX07($G(DFN),$G(SDT),$G(SDCL),$G(SDDA))
+"KRN",101,4263,99)
+61598,46412
+"KRN",101,4264,-1)
+0^4
+"KRN",101,4264,0)
+BSDX NOSHOW APPOINTMENT^BSDX NOSHOW APPOINTMENT^^A^^^^^^^^
+"KRN",101,4264,1,0)
+^101.06^4^4^3040915^^
+"KRN",101,4264,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4264,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4264,1,3,0)
+no-show an appointment in the IHS Windows Scheduling package
+"KRN",101,4264,1,4,0)
+when the corresponding appointment in RPMS Scheduling is no-showed.
+"KRN",101,4264,4)
+^^^BSDX NOSHOW APPOINTMENT
+"KRN",101,4264,20)
+I $G(SDAMEVT)=3,$D(^BSDXAPPL) D NOSEVT^BSDX31($G(DFN),$G(SDT),$G(SDCL))
+"KRN",101,4264,99)
+61598,46412
+"KRN",101,4265,-1)
+0^3
+"KRN",101,4265,0)
+BSDX CHECKIN APPOINTMENT^BSDX CHECKIN APPOINTMENT^^A^^^^^^^^
+"KRN",101,4265,1,0)
+^101.06^4^4^3040915^^^
+"KRN",101,4265,1,1,0)
+IHS protocol called by the PIMS v5.3 Scheduling Event Driver
+"KRN",101,4265,1,2,0)
+(BSDAM APPOINTMENT EVENTS).  This protocol will
+"KRN",101,4265,1,3,0)
+check in an appointment in the IHS Windows Scheduling package
+"KRN",101,4265,1,4,0)
+when the corresponding appointment in RPMS Scheduling is checked in.
+"KRN",101,4265,4)
+^^^BSDX CHECKIN APPOINTMENT
+"KRN",101,4265,20)
+I $G(SDAMEVT)=4,$D(^BSDXAPPL) D CHKEVT^BSDX25($G(DFN),$G(SDT),$G(SDCL))
+"KRN",101,4265,99)
+61598,46412
+"KRN",8989.5,1933,0)
+211;DIC(9.4,^BSDX AUTO PRINT RS^1
+"KRN",8989.5,1933,1)
+0
+"KRN",8989.5,1934,0)
+211;DIC(9.4,^BSDX AUTO PRINT AS^1
+"KRN",8989.5,1934,1)
+0
+"KRN",8989.51,294,-1)
+0^2
+"KRN",8989.51,294,0)
+BSDX AUTO PRINT RS^Auto Print Routing Slip?^0
+"KRN",8989.51,294,1)
+Y^^Should Routing Slip in BSDX GUI be printed automatically? (yes/no)
+"KRN",8989.51,294,4,0)
+^8989.514^4^4
+"KRN",8989.51,294,4,1,0)
+ROUTING
+"KRN",8989.51,294,4,2,0)
+SLIP
+"KRN",8989.51,294,4,3,0)
+SCHEDULING
+"KRN",8989.51,294,4,4,0)
+PRINTING
+"KRN",8989.51,294,4,"B","PRINTING",4)
+
+"KRN",8989.51,294,4,"B","ROUTING",1)
+
+"KRN",8989.51,294,4,"B","SCHEDULING",3)
+
+"KRN",8989.51,294,4,"B","SLIP",2)
+
+"KRN",8989.51,294,30,0)
+^8989.513I^4^4
+"KRN",8989.51,294,30,1,0)
+1^200
+"KRN",8989.51,294,30,2,0)
+2^44
+"KRN",8989.51,294,30,3,0)
+3^4.2
+"KRN",8989.51,294,30,4,0)
+4^9.4
+"KRN",8989.51,295,-1)
+0^1
+"KRN",8989.51,295,0)
+BSDX AUTO PRINT AS^Auto Print Appointment Slip?^0
+"KRN",8989.51,295,1)
+Y^^Should Appointment Slip in BSDX GUI by printed automatically? (yes/no)
+"KRN",8989.51,295,4,0)
+^8989.514^4^4
+"KRN",8989.51,295,4,1,0)
+APPOINTMENT
+"KRN",8989.51,295,4,2,0)
+SLIP
+"KRN",8989.51,295,4,3,0)
+SCHEDULING
+"KRN",8989.51,295,4,4,0)
+PRINTING
+"KRN",8989.51,295,4,"B","APPOINTMENT",1)
+
+"KRN",8989.51,295,4,"B","PRINTING",4)
+
+"KRN",8989.51,295,4,"B","SCHEDULING",3)
+
+"KRN",8989.51,295,4,"B","SLIP",2)
+
+"KRN",8989.51,295,30,0)
+^8989.513I^4^4
+"KRN",8989.51,295,30,1,0)
+1^200
+"KRN",8989.51,295,30,2,0)
+2^44
+"KRN",8989.51,295,30,3,0)
+3^4.2
+"KRN",8989.51,295,30,4,0)
+4^9.4
+"KRN",8994,2396,-1)
+0^80
+"KRN",8994,2396,0)
+BMX PATIENT DEMOG DATA GET^PDATA^BMXRPC1^1
+"KRN",8994,2397,-1)
+0^77
+"KRN",8994,2397,0)
+BMX LOOKUP^LOOKUP^BMXRPC^4
+"KRN",8994,2398,-1)
+0^71
+"KRN",8994,2398,0)
+BMX FIELD LIST^FLDLIST^BMXRPC2^4
+"KRN",8994,2399,-1)
+0^72
+"KRN",8994,2399,0)
+BMX FIND^FIND^BMXFIND^4
+"KRN",8994,2400,-1)
+0^87
+"KRN",8994,2400,0)
+BMX TABLE^TABLE^BMXFIND^4
+"KRN",8994,2401,-1)
+0^85
+"KRN",8994,2401,0)
+BMX SQL^SQL^BMXSQL^4
+"KRN",8994,2402,-1)
+0^90
+"KRN",8994,2402,0)
+BMX TLIST^TLIST^BMXSQL^4
+"KRN",8994,2403,-1)
+0^86
+"KRN",8994,2403,0)
+BMX SQL COLINFO^SQLCOL^BMXSQL^4
+"KRN",8994,2404,-1)
+0^73
+"KRN",8994,2404,0)
+BMX GET VARIABLE VALUE^VARVAL^BMXRPC3^1
+"KRN",8994,2405,-1)
+0^92
+"KRN",8994,2405,0)
+BMX USER^USER^BMXRPC3^1
+"KRN",8994,2406,-1)
+0^79
+"KRN",8994,2406,0)
+BMX NTUSER^NTUSER^BMXRPC3^1
+"KRN",8994,2407,-1)
+0^103
+"KRN",8994,2407,0)
+BMXSetFac^SETFCRS^BMXRPC3^1
+"KRN",8994,2408,-1)
+0^95
+"KRN",8994,2408,0)
+BMXGetFac^GETFC^BMXRPC3^1
+"KRN",8994,2409,-1)
+0^83
+"KRN",8994,2409,0)
+BMX SECURITY KEY^APSEC^BMXRPC3^1
+"KRN",8994,2410,-1)
+0^84
+"KRN",8994,2410,0)
+BMX SIGNATURE^SIGCHK^BMXRPC3^1
+"KRN",8994,2411,-1)
+0^78
+"KRN",8994,2411,0)
+BMX MULT LIST^MLTLIST^BMXRPC2^4
+"KRN",8994,2412,-1)
+0^96
+"KRN",8994,2412,0)
+BMXGetFacRS^GETFCRS^BMXRPC3^1
+"KRN",8994,2413,-1)
+0^101
+"KRN",8994,2413,0)
+BMXPatientLookupRS^PTLOOKRS^BMXRPC4^1
+"KRN",8994,2414,-1)
+0^100
+"KRN",8994,2414,0)
+BMXPatientInfoRS^PTINFORS^BMXRPC4^1
+"KRN",8994,2415,-1)
+0^74
+"KRN",8994,2415,0)
+BMX HEALTH SUMMARY^HS^BMXRPC5^4
+"KRN",8994,2416,-1)
+0^65
+"KRN",8994,2416,0)
+BMX DENTAL REPORT 1^BMXADE^BMXADE1^4
+"KRN",8994,2417,-1)
+0^104
+"KRN",8994,2417,0)
+BMXUserKeyRS^USRKEYRS^BMXRPC6^1
+"KRN",8994,2418,-1)
+0^102
+"KRN",8994,2418,0)
+BMXProviderLookupRS^PRVLKRS^BMXQA2^1
+"KRN",8994,2419,-1)
+0^81
+"KRN",8994,2419,0)
+BMX PDATA CHART^PDATA^BMXRPC6^4
+"KRN",8994,2420,-1)
+0^66
+"KRN",8994,2420,0)
+BMX DENTAL REPORT 2^BMXADE^BMXADE2^4
+"KRN",8994,2421,-1)
+0^97
+"KRN",8994,2421,0)
+BMXNRC^ZTM^BMXNRC^4
+"KRN",8994,2422,-1)
+0^98
+"KRN",8994,2422,0)
+BMXNetGetCodes^NTUGET^BMXRPC3^4
+"KRN",8994,2423,-1)
+0^99
+"KRN",8994,2423,0)
+BMXNetSetUser^NTUSET^BMXRPC3^4
+"KRN",8994,2424,-1)
+0^64
+"KRN",8994,2424,0)
+BMX DEMO^PDEMO^BMXRPC6^4
+"KRN",8994,2425,-1)
+0^63
+"KRN",8994,2425,0)
+BMX AV CODE^WINVAL^BMXRPC7^2
+"KRN",8994,2426,-1)
+0^76
+"KRN",8994,2426,0)
+BMX LOCK^BMXLOCK^BMXRPC8^1
+"KRN",8994,2427,-1)
+0^94
+"KRN",8994,2427,0)
+BMX VERSION INFO^BMXVER^BMXRPC8^4
+"KRN",8994,2428,-1)
+0^75
+"KRN",8994,2428,0)
+BMX IM HERE^IMHERE^BMXRPC8^1^P
+"KRN",8994,2428,1,0)
+^8994.01^2^2^3040304^^^
+"KRN",8994,2428,1,1,0)
+Returns a simple value to client.  Used to establish continued existence
+"KRN",8994,2428,1,2,0)
+of the client to the server; resets the server READ timeout.
+"KRN",8994,2429,-1)
+0^91
+"KRN",8994,2429,0)
+BMX UPDATE^FILE^BMXADOF^1
+"KRN",8994,2430,-1)
+0^88
+"KRN",8994,2430,0)
+BMX TEST^TESTRPC^BMXRPC9^4
+"KRN",8994,2431,-1)
+0^82
+"KRN",8994,2431,0)
+BMX SCHEMA ONLY^SONLY^BMXRPC9^1
+"KRN",8994,2432,-1)
+0^60
+"KRN",8994,2432,0)
+BMX ADO SS^SS^BMXADO^4
+"KRN",8994,2433,-1)
+0^68
+"KRN",8994,2433,0)
+BMX EVENT RAISE^RAISEVNT^BMXMEVN^4
+"KRN",8994,2434,-1)
+0^69
+"KRN",8994,2434,0)
+BMX EVENT REGISTER^REGEVNT^BMXMEVN^4
+"KRN",8994,2435,-1)
+0^70
+"KRN",8994,2435,0)
+BMX EVENT UNREGISTER^UNREG^BMXMEVN^4
+"KRN",8994,2436,-1)
+0^67
+"KRN",8994,2436,0)
+BMX EVENT POLL^POLL^BMXMEVN^4
+"KRN",8994,2437,-1)
+0^89
+"KRN",8994,2437,0)
+BMX TIMER TEST^TTEST^BMXMEVN^4
+"KRN",8994,2438,-1)
+0^61
+"KRN",8994,2438,0)
+BMX ASYNC GET^ASYNCGET^BMXMEVN^4
+"KRN",8994,2439,-1)
+0^62
+"KRN",8994,2439,0)
+BMX ASYNC QUEUE^ASYNCQUE^BMXMEVN^4
+"KRN",8994,2440,-1)
+0^16
+"KRN",8994,2440,0)
+BSDX RESOURCE GROUPS BY USER^DEPUSR^BSDX01^4
+"KRN",8994,2441,-1)
+0^22
+"KRN",8994,2441,0)
+BSDX RESOURCES^RESUSR^BSDX01^4
+"KRN",8994,2442,-1)
+0^6
+"KRN",8994,2442,0)
+BSDX CREATE APPT SCHEDULE^CRSCH^BSDX02^4
+"KRN",8994,2443,-1)
+0^1
+"KRN",8994,2443,0)
+BSDX ADD NEW APPOINTMENT^APPADD^BSDX07^4
+"KRN",8994,2444,-1)
+0^4
+"KRN",8994,2444,0)
+BSDX CANCEL APPOINTMENT^APPDEL^BSDX08^4
+"KRN",8994,2445,-1)
+0^7
+"KRN",8994,2445,0)
+BSDX CREATE ASGND SLOT SCHED^CASSCH^BSDX04^4
+"KRN",8994,2446,-1)
+0^2
+"KRN",8994,2446,0)
+BSDX ADD NEW AVAILABILITY^AVADD^BSDX12^4
+"KRN",8994,2447,-1)
+0^5
+"KRN",8994,2447,0)
+BSDX CANCEL AVAILABILITY^AVDEL^BSDX13^4
+"KRN",8994,2448,-1)
+0^3
+"KRN",8994,2448,0)
+BSDX APPT BLOCKS OVERLAP^APBLKOV^BSDX05^4
+"KRN",8994,2449,-1)
+0^12
+"KRN",8994,2449,0)
+BSDX TYPE BLOCKS OVERLAP^TPBLKOV^BSDX06^4
+"KRN",8994,2450,-1)
+0^10
+"KRN",8994,2450,0)
+BSDX GET BASIC REG INFO^GETREGA^BSDX09^4
+"KRN",8994,2451,-1)
+0^15
+"KRN",8994,2451,0)
+BSDX GROUP RESOURCE^DEPRES^BSDX01^4
+"KRN",8994,2452,-1)
+0^13
+"KRN",8994,2452,0)
+BSDX ADD/EDIT ACCESS TYPE^ACCTYP^BSDX14^4
+"KRN",8994,2453,-1)
+0^14
+"KRN",8994,2453,0)
+BSDX GET ACCESS GROUP TYPES^GRPTYP^BSDX15^4
+"KRN",8994,2454,-1)
+0^20
+"KRN",8994,2454,0)
+BSDX ADD/EDIT RESOURCE^RSRC^BSDX16^4
+"KRN",8994,2455,-1)
+0^19
+"KRN",8994,2455,0)
+BSDX SCHEDULE USER^SCHUSR^BSDX17^4
+"KRN",8994,2456,-1)
+0^18
+"KRN",8994,2456,0)
+BSDX DELETE RESOURCEUSER^DELRU^BSDX18^4
+"KRN",8994,2457,-1)
+0^17
+"KRN",8994,2457,0)
+BSDX ADD/EDIT RESOURCEUSER^ADDRU^BSDX18^4
+"KRN",8994,2458,-1)
+0^21
+"KRN",8994,2458,0)
+BSDX SCHEDULING USER INFO^SUINFO^BSDX01^4
+"KRN",8994,2459,-1)
+0^23
+"KRN",8994,2459,0)
+BSDX ADD/EDIT RESOURCE GROUP^ADDRG^BSDX19^4
+"KRN",8994,2460,-1)
+0^24
+"KRN",8994,2460,0)
+BSDX DELETE RESOURCE GROUP^DELRG^BSDX19^4
+"KRN",8994,2461,-1)
+0^27
+"KRN",8994,2461,0)
+BSDX DEPARTMENTS BY USER^DEPUSR^BSDX01^4
+"KRN",8994,2462,-1)
+0^28
+"KRN",8994,2462,0)
+BSDX RESOURCES BY USER^RESUSR^BSDX01^4
+"KRN",8994,2463,-1)
+0^26
+"KRN",8994,2463,0)
+BSDX DEPARTMENT RESOURCE^DEPRES^BSDX01^4
+"KRN",8994,2464,-1)
+0^25
+"KRN",8994,2464,0)
+BSDX DELETE RES GROUP ITEM^DELRGI^BSDX20^4
+"KRN",8994,2465,-1)
+0^30
+"KRN",8994,2465,0)
+BSDX ADD RES GROUP ITEM^ADDRGI^BSDX20^4
+"KRN",8994,2466,-1)
+0^31
+"KRN",8994,2466,0)
+BSDX ADD/EDIT ACCESS GROUP^ADDAG^BSDX21^4
+"KRN",8994,2467,-1)
+0^32
+"KRN",8994,2467,0)
+BSDX DELETE ACCESS GROUP^DELAG^BSDX21^4
+"KRN",8994,2468,-1)
+0^29
+"KRN",8994,2468,0)
+BSDX ADD ACCESS GROUP ITEM^ADDAGI^BSDX22^4
+"KRN",8994,2469,-1)
+0^33
+"KRN",8994,2469,0)
+BSDX DELETE ACCESS GROUP ITEM^DELAGI^BSDX22^4
+"KRN",8994,2470,-1)
+0^34
+"KRN",8994,2470,0)
+BSDX REGISTER EVENT^REGEVNT^BSDX23^4
+"KRN",8994,2471,-1)
+0^35
+"KRN",8994,2471,0)
+BSDX UNREGISTER EVENT^UNREG^BSDX23^4
+"KRN",8994,2472,-1)
+0^36
+"KRN",8994,2472,0)
+BSDX RAISE EVENT^RAISEVNT^BSDX23^4
+"KRN",8994,2473,-1)
+0^37
+"KRN",8994,2473,0)
+BSDX SEARCH AVAILABILITY^SEARCH^BSDX24^4
+"KRN",8994,2474,-1)
+0^38
+"KRN",8994,2474,0)
+BSDX CHECKIN APPOINTMENT^CHECKIN^BSDX25^4
+"KRN",8994,2475,-1)
+0^39
+"KRN",8994,2475,0)
+BSDX EDIT APPOINTMENT^EDITAPT^BSDX26^4
+"KRN",8994,2476,-1)
+0^40
+"KRN",8994,2476,0)
+BSDX PATIENT APPT DISPLAY^PADISP^BSDX27^4
+"KRN",8994,2477,-1)
+0^41
+"KRN",8994,2477,0)
+BSDXPatientLookupRS^PTLOOKRS^BSDX28^1
+"KRN",8994,2478,-1)
+0^42
+"KRN",8994,2478,0)
+BSDX SPACEBAR SET^SPACE^BSDX30^4
+"KRN",8994,2479,-1)
+0^45
+"KRN",8994,2479,0)
+BSDX COPY APPOINTMENTS^BSDXCP^BSDX29^4
+"KRN",8994,2480,-1)
+0^44
+"KRN",8994,2480,0)
+BSDX COPY APPOINTMENT STATUS^CPSTAT^BSDX29^4
+"KRN",8994,2481,-1)
+0^43
+"KRN",8994,2481,0)
+BSDX COPY APPOINTMENT CANCEL^CPCANC^BSDX29^4
+"KRN",8994,2482,-1)
+0^46
+"KRN",8994,2482,0)
+BSDX CLINIC LETTERS^CLDISP^BSDX27^4
+"KRN",8994,2483,-1)
+0^47
+"KRN",8994,2483,0)
+BSDX NOSHOW^NOSHOW^BSDX31^4
+"KRN",8994,2484,-1)
+0^48
+"KRN",8994,2484,0)
+BSDX IM HERE^IMHERE^BSDX31^1
+"KRN",8994,2484,1,0)
+^^2^2^3040304^
+"KRN",8994,2484,1,1,0)
+Returns a simple value to client.  Used to establish continued existence
+"KRN",8994,2484,1,2,0)
+of the client to the server; resets the server READ timeout.
+"KRN",8994,2485,-1)
+0^49
+"KRN",8994,2485,0)
+BSDX HOSPITAL LOCATION^HOSPLOC^BSDX32^4
+"KRN",8994,2486,-1)
+0^50
+"KRN",8994,2486,0)
+BSDX CLINIC SETUP^CLNSET^BSDX32^4
+"KRN",8994,2487,-1)
+0^51
+"KRN",8994,2487,0)
+BSDX REBOOK LIST^RBLETT^BSDX34^4
+"KRN",8994,2488,-1)
+0^52
+"KRN",8994,2488,0)
+BSDX REBOOK CLINIC LIST^RBCLIN^BSDX34^4
+"KRN",8994,2489,-1)
+0^53
+"KRN",8994,2489,0)
+BSDX REBOOK SET^SETRBK^BSDX33^4
+"KRN",8994,2490,-1)
+0^54
+"KRN",8994,2490,0)
+BSDX RESOURCE LETTERS^RSRCLTR^BSDX35^4
+"KRN",8994,2491,-1)
+0^55
+"KRN",8994,2491,0)
+BSDX CANCEL CLINIC LIST^CANCLIN^BSDX34^4
+"KRN",8994,2492,-1)
+0^56
+"KRN",8994,2492,0)
+BSDX CANCEL AV BY DATE^AVDELDT^BSDX13^4
+"KRN",8994,2493,-1)
+0^57
+"KRN",8994,2493,0)
+BSDX REBOOK NEXT BLOCK^RBNEXT^BSDX33^4
+"KRN",8994,2494,-1)
+0^58
+"KRN",8994,2494,0)
+BSDX EHR PATIENT^EHRPT^BSDX30^4
+"KRN",8994,2501,-1)
+0^59
+"KRN",8994,2501,0)
+BSDX HOSP LOC PROVIDERS^P^BSDXGPRV^4
+"KRN",8994,2502,-1)
+0^93
+"KRN",8994,2502,0)
+BMX UTF-8^UTF8^BMXRPC^1^P
+"KRN",8994,2502,1,0)
+^^4^4^3100907^
+"KRN",8994,2502,1,1,0)
+This RPC returns a single value of 1 if database supports UTF-8; 0 if 
+"KRN",8994,2502,1,2,0)
+not. Only works on GT.M.
+"KRN",8994,2502,1,3,0)
+ 
+"KRN",8994,2502,1,4,0)
+Doesn't take any parameters.
+"KRN",8994,2503,-1)
+0^107
+"KRN",8994,2503,0)
+BSDX REMOVE CHECK-IN^RMCI^BSDX25^4^
+"KRN",8994,2504,-1)
+0^105
+"KRN",8994,2504,0)
+BSDX SET PARAM^SP^BSDX01^1
+"KRN",8994,2505,-1)
+0^106
+"KRN",8994,2505,0)
+BSDX GET PARAM^GP^BSDX01^1
+"MBREQ")
+0
+"ORD",3,19.1)
+19.1;3;1;;KEY^XPDTA1;;;KEYF2^XPDIA1;;KEYDEL^XPDIA1
+"ORD",3,19.1,0)
+SECURITY KEY
+"ORD",15,101)
+101;15;;;PRO^XPDTA;PROF1^XPDIA;PROE1^XPDIA;PROF2^XPDIA;;PRODEL^XPDIA
+"ORD",15,101,0)
+PROTOCOL
+"ORD",16,8994)
+8994;16;1;;;;;;;RPCDEL^XPDIA1
+"ORD",16,8994,0)
+REMOTE PROCEDURE
+"ORD",18,19)
+19;18;;;OPT^XPDTA;OPTF1^XPDIA;OPTE1^XPDIA;OPTF2^XPDIA;;OPTDEL^XPDIA
+"ORD",18,19,0)
+OPTION
+"ORD",20,8989.51)
+8989.51;20;;;PAR1E1^XPDTA2;PAR1F1^XPDIA3;PAR1E1^XPDIA3;PAR1F2^XPDIA3;;PAR1DEL^XPDIA3(%)
+"ORD",20,8989.51,0)
+PARAMETER DEFINITION
+"PKG",211,-1)
+1^1
+"PKG",211,0)
+IHS Windows Scheduling^BSDX^IHS Windows Scheduling Extensions
+"PKG",211,20,0)
+^9.402P^^
+"PKG",211,22,0)
+^9.49I^1^1
+"PKG",211,22,1,0)
+1.5V3^3110316
+"PKG",211,22,1,1,0)
+^^1^1^3110316
+"PKG",211,22,1,1,1,0)
+Clinical Scheduling M Server support routines, files, options and RPCs.
+"PKG",211,"VERSION")
+1.5V3
+"PRE")
+BSDX2E
+"QUES","XPF1",0)
+Y
+"QUES","XPF1","??")
+^D REP^XPDH
+"QUES","XPF1","A")
+Shall I write over your |FLAG| File
+"QUES","XPF1","B")
+YES
+"QUES","XPF1","M")
+D XPF1^XPDIQ
+"QUES","XPF2",0)
+Y
+"QUES","XPF2","??")
+^D DTA^XPDH
+"QUES","XPF2","A")
+Want my data |FLAG| yours
+"QUES","XPF2","B")
+YES
+"QUES","XPF2","M")
+D XPF2^XPDIQ
+"QUES","XPI1",0)
+YO
+"QUES","XPI1","??")
+^D INHIBIT^XPDH
+"QUES","XPI1","A")
+Want KIDS to INHIBIT LOGONs during the install
+"QUES","XPI1","B")
+NO
+"QUES","XPI1","M")
+D XPI1^XPDIQ
+"QUES","XPM1",0)
+PO^VA(200,:EM
+"QUES","XPM1","??")
+^D MG^XPDH
+"QUES","XPM1","A")
+Enter the Coordinator for Mail Group '|FLAG|'
+"QUES","XPM1","B")
+
+"QUES","XPM1","M")
+D XPM1^XPDIQ
+"QUES","XPO1",0)
+Y
+"QUES","XPO1","??")
+^D MENU^XPDH
+"QUES","XPO1","A")
+Want KIDS to Rebuild Menu Trees Upon Completion of Install
+"QUES","XPO1","B")
+NO
+"QUES","XPO1","M")
+D XPO1^XPDIQ
+"QUES","XPZ1",0)
+Y
+"QUES","XPZ1","??")
+^D OPT^XPDH
+"QUES","XPZ1","A")
+Want to DISABLE Scheduled Options, Menu Options, and Protocols
+"QUES","XPZ1","B")
+NO
+"QUES","XPZ1","M")
+D XPZ1^XPDIQ
+"QUES","XPZ2",0)
+Y
+"QUES","XPZ2","??")
+^D RTN^XPDH
+"QUES","XPZ2","A")
+Want to MOVE routines to other CPUs
+"QUES","XPZ2","B")
+NO
+"QUES","XPZ2","M")
+D XPZ2^XPDIQ
+"RTN")
+37
+"RTN","BSDX01")
+0^1^B114081753
+"RTN","BSDX01",1,0)
+BSDX01 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 3/16/11 7:08am
+"RTN","BSDX01",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX01",3,0)
+ ;
+"RTN","BSDX01",4,0)
+SUINFOD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",5,0)
+ ;D DEBUG^%Serenji("SUINFO^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",6,0)
+ ;
+"RTN","BSDX01",7,0)
+ Q
+"RTN","BSDX01",8,0)
+ ;
+"RTN","BSDX01",9,0)
+SUINFO(BSDXY,BSDXDUZ)  ;EP
+"RTN","BSDX01",10,0)
+ ;Called by BSDX SCHEDULING USER INFO
+"RTN","BSDX01",11,0)
+ ;Returns ADO Recordset having column MANAGER
+"RTN","BSDX01",12,0)
+ ;MANAGER = YES if user has keys BSDXZMGR or XUPROGMODE
+"RTN","BSDX01",13,0)
+ ;
+"RTN","BSDX01",14,0)
+ N BSDXMGR,BSDXERR
+"RTN","BSDX01",15,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",16,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",17,0)
+ S BSDXI=0
+"RTN","BSDX01",18,0)
+ S BSDXERR=""
+"RTN","BSDX01",19,0)
+ S ^BSDXTMP($J,BSDXI)="T00010MANAGER"_$C(30)
+"RTN","BSDX01",20,0)
+ ;Check SECURITY KEY file for BSDXZMGR or XUPROGMODE keys
+"RTN","BSDX01",21,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",22,0)
+ S BSDXMGR=$$APSEC("BSDXZMGR",BSDXDUZ)
+"RTN","BSDX01",23,0)
+ S BSDXMGR=$S(BSDXMGR=1:"YES",1:"NO")
+"RTN","BSDX01",24,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX01",25,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXMGR_$C(30)
+"RTN","BSDX01",26,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",27,0)
+ Q
+"RTN","BSDX01",28,0)
+DEPUSRD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",29,0)
+ ;
+"RTN","BSDX01",30,0)
+ ;
+"RTN","BSDX01",31,0)
+ ;D DEBUG^%Serenji("DEPUSR^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",32,0)
+ ;
+"RTN","BSDX01",33,0)
+ Q
+"RTN","BSDX01",34,0)
+ ;
+"RTN","BSDX01",35,0)
+DEPUSR(BSDXY,BSDXDUZ)  ;EP
+"RTN","BSDX01",36,0)
+ ;Called by BSDX RESOURCE GROUPS BY USER
+"RTN","BSDX01",37,0)
+ ;Returns ADO Recordset with all ACTIVE resource group names to which user has access
+"RTN","BSDX01",38,0)
+ ;based on entries in BSDX RESOURCE USER file (Say this again for myself: Groups ONLY!!)
+"RTN","BSDX01",39,0)
+ ;If BSDXDUZ=0 then returns all department names for current DUZ
+"RTN","BSDX01",40,0)
+    ;if not linked, always returned.
+"RTN","BSDX01",41,0)
+ ;If user BSDXDUZ possesses the key BSDXZMGR or XUPROGMODE
+"RTN","BSDX01",42,0)
+ ;then ALL resource group names are returned regardless of whether any active resources
+"RTN","BSDX01",43,0)
+ ;are associated with the group or not.
+"RTN","BSDX01",44,0)
+ ;
+"RTN","BSDX01",45,0)
+ ;
+"RTN","BSDX01",46,0)
+ N BSDXERR,BSDXRET,BSDXIEN,BSDXRES,BSDXDEP,BSDXDDR,BSDXDEPN,BSDXRDAT,BSDXRNOD,BSDXI
+"RTN","BSDX01",47,0)
+ N BSDXMGR,BSDXNOD
+"RTN","BSDX01",48,0)
+ K ^BSDXTEMP($J)
+"RTN","BSDX01",49,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",50,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",51,0)
+ S BSDXI=0
+"RTN","BSDX01",52,0)
+ S BSDXERR=""
+"RTN","BSDX01",53,0)
+ S ^BSDXTMP($J,BSDXI)="I00020RESOURCE_GROUPID^T00030RESOURCE_GROUP"_$C(30)
+"RTN","BSDX01",54,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",55,0)
+ ;Check SECURITY KEY file for BSDXZMGR or XUPROGMODE keys
+"RTN","BSDX01",56,0)
+ S BSDXMGR=$$APSEC("BSDXZMGR",BSDXDUZ)
+"RTN","BSDX01",57,0)
+ ;
+"RTN","BSDX01",58,0)
+ ;User does not have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",59,0)
+ ;$O THRU AC XREF OF BSDX RESOURCE USER
+"RTN","BSDX01",60,0)
+ I 'BSDXMGR,$D(^BSDXRSU("AC",BSDXDUZ)) S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRSU("AC",BSDXDUZ,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",61,0)
+ . S BSDXRES=$P(^BSDXRSU(BSDXIEN,0),U)
+"RTN","BSDX01",62,0)
+ . Q:'$D(^BSDXDEPT("AB",BSDXRES))  ; If not part of a group, quit ("AB" is the whole file index for the resource multiple in Group file)
+"RTN","BSDX01",63,0)
+    . ; Q:'$$INDIV2(BSDXRES)  ; If not in the same division as user, quit
+"RTN","BSDX01",64,0)
+ . S BSDXRNOD=^BSDXRES(BSDXRES,0)
+"RTN","BSDX01",65,0)
+ . ;QUIT if the resource is inactive
+"RTN","BSDX01",66,0)
+ . Q:$P(BSDXRNOD,U,2)=1
+"RTN","BSDX01",67,0)
+ . S BSDXDEP=0 F  S BSDXDEP=$O(^BSDXDEPT("AB",BSDXRES,BSDXDEP)) Q:'+BSDXDEP  D
+"RTN","BSDX01",68,0)
+ . . Q:'$D(^BSDXDEPT(BSDXDEP,0))
+"RTN","BSDX01",69,0)
+ . . Q:$D(^BSDXTEMP($J,BSDXDEP))
+"RTN","BSDX01",70,0)
+ . . S ^BSDXTEMP($J,BSDXDEP)=""
+"RTN","BSDX01",71,0)
+ . . S BSDXDEPN=$P(^BSDXDEPT(BSDXDEP,0),U)
+"RTN","BSDX01",72,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX01",73,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXDEP_U_BSDXDEPN_$C(30)
+"RTN","BSDX01",74,0)
+ . . Q
+"RTN","BSDX01",75,0)
+ . Q
+"RTN","BSDX01",76,0)
+ ;
+"RTN","BSDX01",77,0)
+ ;User does have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",78,0)
+ ;$O THRU BSDX RESOURCE GROUP file directly
+"RTN","BSDX01",79,0)
+ I BSDXMGR S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXDEPT(BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",80,0)
+ . Q:'$D(^BSDXDEPT(BSDXIEN,0))
+"RTN","BSDX01",81,0)
+ . S BSDXNOD=^BSDXDEPT(BSDXIEN,0)
+"RTN","BSDX01",82,0)
+ . S BSDXDEPN=$P(BSDXNOD,U)
+"RTN","BSDX01",83,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX01",84,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXDEPN_$C(30)
+"RTN","BSDX01",85,0)
+ . Q
+"RTN","BSDX01",86,0)
+ ;
+"RTN","BSDX01",87,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",88,0)
+ Q
+"RTN","BSDX01",89,0)
+ ;
+"RTN","BSDX01",90,0)
+ ;
+"RTN","BSDX01",91,0)
+RESUSRD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",92,0)
+ ;
+"RTN","BSDX01",93,0)
+ ;
+"RTN","BSDX01",94,0)
+ ;D DEBUG^%Serenji("RESUSR^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",95,0)
+ ;
+"RTN","BSDX01",96,0)
+ Q
+"RTN","BSDX01",97,0)
+ ;
+"RTN","BSDX01",98,0)
+RESUSR(BSDXY,BSDXDUZ) ;EP
+"RTN","BSDX01",99,0)
+ ;Returns ADO Recordset with ALL RESOURCE names
+"RTN","BSDX01",100,0)
+ ;Inactive RESOURCES are NOT filtered out
+"RTN","BSDX01",101,0)
+ ;Called by BSDX RESOURCES BY USER
+"RTN","BSDX01",102,0)
+ ;
+"RTN","BSDX01",103,0)
+ N BSDXERR,BSDXRET,BSDXIEN,BSDXRES,BSDXDEP,BSDXDDR,BSDXDEPN,BSDXRDAT,BSDXRNOD,BSDXI,BSDX,BSDXLTR
+"RTN","BSDX01",104,0)
+ N BSDXNOS,BSDXCAN
+"RTN","BSDX01",105,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",106,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",107,0)
+ S BSDXI=0
+"RTN","BSDX01",108,0)
+ S BSDXERR=""
+"RTN","BSDX01",109,0)
+ S ^BSDXTMP($J,BSDXI)="I00010RESOURCEID^T00030RESOURCE_NAME^T00010INACTIVE^I00010TIMESCALE^I00010HOSPITAL_LOCATION_ID^T00030LETTER_TEXT^T00030NO_SHOW_LETTER"
+"RTN","BSDX01",110,0)
+ S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^T00030CLINIC_CANCELLATION_LETTER^I00010VIEW^I00010OVERBOOK^I00010MODIFY_SCHEDULE^I00010MODIFY_APPOINTMENTS"_$C(30)
+"RTN","BSDX01",111,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",112,0)
+ ;$O THRU AC XREF OF BSDX RESOURCE USER
+"RTN","BSDX01",113,0)
+ ;Rmoved these lines in order to just return all resource names
+"RTN","BSDX01",114,0)
+ ;I $D(^BSDXRSU("AC",BSDXDUZ)) S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRSU("AC",BSDXDUZ,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",115,0)
+ ;. S BSDXRES=$P(^BSDXRSU(BSDXIEN,0),U)
+"RTN","BSDX01",116,0)
+ ;
+"RTN","BSDX01",117,0)
+ ;$O THRU BSDX RESOURCE File
+"RTN","BSDX01",118,0)
+ S BSDXRES=0 F  S BSDXRES=$O(^BSDXRES(BSDXRES)) Q:'+BSDXRES  D
+"RTN","BSDX01",119,0)
+ . Q:'$D(^BSDXRES(BSDXRES,0))
+"RTN","BSDX01",120,0)
+ . S BSDXRNOD=^BSDXRES(BSDXRES,0)
+"RTN","BSDX01",121,0)
+ . N BSDXSC S BSDXSC=$P(BSDXRNOD,U,4)  ; Hospital Location
+"RTN","BSDX01",122,0)
+    . ;Q:$P(BSDXRNOD,U,2)=1  ;Inactive resources not filtered
+"RTN","BSDX01",123,0)
+ . ;S BSDXRDAT=$P(BSDXRNOD,U,1,4)
+"RTN","BSDX01",124,0)
+ . ;I '$$INDIV(BSDXSC) QUIT  ; If not in division, quit
+"RTN","BSDX01",125,0)
+    . K BSDXRDAT
+"RTN","BSDX01",126,0)
+ . F BSDX=1:1:4 S $P(BSDXRDAT,U,BSDX)=$P(BSDXRNOD,U,BSDX)
+"RTN","BSDX01",127,0)
+ . S BSDXRDAT=BSDXRES_U_BSDXRDAT
+"RTN","BSDX01",128,0)
+ . ;Get letter text from wp field
+"RTN","BSDX01",129,0)
+ . S BSDXLTR=""
+"RTN","BSDX01",130,0)
+ . I $D(^BSDXRES(BSDXRES,1)) D
+"RTN","BSDX01",131,0)
+ . . S BSDXIEN=0
+"RTN","BSDX01",132,0)
+ . . F  S BSDXIEN=$O(^BSDXRES(BSDXRES,1,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",133,0)
+ . . . S BSDXLTR=BSDXLTR_$G(^BSDXRES(BSDXRES,1,BSDXIEN,0))
+"RTN","BSDX01",134,0)
+ . . . S BSDXLTR=BSDXLTR_$C(13)_$C(10)
+"RTN","BSDX01",135,0)
+ . S BSDXNOS=""
+"RTN","BSDX01",136,0)
+ . I $D(^BSDXRES(BSDXRES,12)) D
+"RTN","BSDX01",137,0)
+ . . S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRES(BSDXRES,12,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",138,0)
+ . . . S BSDXNOS=BSDXNOS_$G(^BSDXRES(BSDXRES,12,BSDXIEN,0))
+"RTN","BSDX01",139,0)
+ . . . S BSDXNOS=BSDXNOS_$C(13)_$C(10)
+"RTN","BSDX01",140,0)
+ . S BSDXCAN=""
+"RTN","BSDX01",141,0)
+ . I $D(^BSDXRES(BSDXRES,13)) D
+"RTN","BSDX01",142,0)
+ . . S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRES(BSDXRES,13,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",143,0)
+ . . . S BSDXCAN=BSDXCAN_$G(^BSDXRES(BSDXRES,13,BSDXIEN,0))
+"RTN","BSDX01",144,0)
+ . . . S BSDXCAN=BSDXCAN_$C(13)_$C(10)
+"RTN","BSDX01",145,0)
+ . N BSDXACC,BSDXMGR
+"RTN","BSDX01",146,0)
+ . S BSDXACC="0^0^0^0"
+"RTN","BSDX01",147,0)
+ . S BSDXMGR=$O(^DIC(19.1,"B","BSDXZMGR",0))
+"RTN","BSDX01",148,0)
+ . I +BSDXMGR,$D(^VA(200,BSDXDUZ,51,BSDXMGR)) S BSDXACC="1^1^1^1"
+"RTN","BSDX01",149,0)
+ . S BSDXMGR=$O(^DIC(19.1,"B","XUPROGMODE",0))
+"RTN","BSDX01",150,0)
+ . I +BSDXMGR,$D(^VA(200,BSDXDUZ,51,BSDXMGR)) S BSDXACC="1^1^1^1"
+"RTN","BSDX01",151,0)
+ . I BSDXACC="0^0^0^0" D
+"RTN","BSDX01",152,0)
+ . . N BSDXNOD,BSDXRUID
+"RTN","BSDX01",153,0)
+ . . S BSDXRUID=0
+"RTN","BSDX01",154,0)
+ . . ;Get entry for this user and resource
+"RTN","BSDX01",155,0)
+ . . F  S BSDXRUID=$O(^BSDXRSU("AC",BSDXDUZ,BSDXRUID)) Q:'+BSDXRUID  I $D(^BSDXRSU(BSDXRUID,0)),$P(^(0),U)=BSDXRES Q
+"RTN","BSDX01",156,0)
+ . . Q:'+BSDXRUID
+"RTN","BSDX01",157,0)
+ . . S $P(BSDXACC,U)=1
+"RTN","BSDX01",158,0)
+ . . S BSDXNOD=$G(^BSDXRSU(BSDXRUID,0))
+"RTN","BSDX01",159,0)
+ . . S $P(BSDXACC,U,2)=+$P(BSDXNOD,U,3)
+"RTN","BSDX01",160,0)
+ . . S $P(BSDXACC,U,3)=+$P(BSDXNOD,U,4)
+"RTN","BSDX01",161,0)
+ . . S $P(BSDXACC,U,4)=+$P(BSDXNOD,U,5)
+"RTN","BSDX01",162,0)
+ . S BSDXRDAT=BSDXRDAT_U_BSDXLTR_U_BSDXNOS_U_BSDXCAN_U_BSDXACC
+"RTN","BSDX01",163,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX01",164,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXRDAT_$C(30)
+"RTN","BSDX01",165,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",166,0)
+ Q
+"RTN","BSDX01",167,0)
+ ;
+"RTN","BSDX01",168,0)
+DEPRESD(BSDXY,BSDXDUZ) ;EP Debugging entry point
+"RTN","BSDX01",169,0)
+ ;
+"RTN","BSDX01",170,0)
+ ;
+"RTN","BSDX01",171,0)
+ ;D DEBUG^%Serenji("DEPRES^BSDX01(.BSDXY,BSDXDUZ)")
+"RTN","BSDX01",172,0)
+ ;
+"RTN","BSDX01",173,0)
+ Q
+"RTN","BSDX01",174,0)
+ ;
+"RTN","BSDX01",175,0)
+DEPRES(BSDXY,BSDXDUZ) ;EP
+"RTN","BSDX01",176,0)
+ ;Called by BSDX GROUP RESOURCE
+"RTN","BSDX01",177,0)
+ ;Returns ADO Recordset with all ACTIVE GROUP/RESOURCE combinations
+"RTN","BSDX01",178,0)
+ ;to which user has access based on entries in BSDX RESOURCE USER file
+"RTN","BSDX01",179,0)
+ ;If BSDXDUZ=0 then returns all ACTIVE GROUP/RESOURCE combinations for current DUZ
+"RTN","BSDX01",180,0)
+ ;If user BSDXDUZ possesses the key BSDXZMGR or XUPROGMODE
+"RTN","BSDX01",181,0)
+ ;then ALL ACTIVE resource group names are returned
+"RTN","BSDX01",182,0)
+ ;
+"RTN","BSDX01",183,0)
+ N BSDXERR,BSDXRET,BSDXIEN,BSDXRES,BSDXDEP,BSDXDDR,BSDXDEPN,BSDXRDAT,BSDXRNOD,BSDXI
+"RTN","BSDX01",184,0)
+ N BSDXRESN,BSDXMGR,BSDXRESD,BSDXNOD,BSDXSUBID
+"RTN","BSDX01",185,0)
+ K ^BSDXTEMP($J)
+"RTN","BSDX01",186,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX01",187,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX01",188,0)
+ S BSDXI=0
+"RTN","BSDX01",189,0)
+ S BSDXERR=""
+"RTN","BSDX01",190,0)
+ S ^BSDXTMP($J,BSDXI)="I00020RESOURCE_GROUPID^T00030RESOURCE_GROUP^I00020RESOURCE_GROUP_ITEMID^T00030RESOURCE_NAME^I00020RESOURCEID"_$C(30)
+"RTN","BSDX01",191,0)
+ I '+BSDXDUZ S BSDXDUZ=DUZ
+"RTN","BSDX01",192,0)
+ ;Check SECURITY KEY file for BSDXZMGR or XUPROGMODE keys
+"RTN","BSDX01",193,0)
+ S BSDXMGR=$$APSEC("BSDXZMGR",BSDXDUZ)
+"RTN","BSDX01",194,0)
+ ;
+"RTN","BSDX01",195,0)
+ ;User does not have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",196,0)
+ ;$O THRU AC XREF OF BSDX RESOURCE USER
+"RTN","BSDX01",197,0)
+ I 'BSDXMGR,$D(^BSDXRSU("AC",BSDXDUZ))  S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRSU("AC",BSDXDUZ,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",198,0)
+ . S BSDXRES=$P(^BSDXRSU(BSDXIEN,0),U)
+"RTN","BSDX01",199,0)
+ . Q:'$D(^BSDXDEPT("AB",BSDXRES))  ; Quit if Resource isn't part of any Group
+"RTN","BSDX01",200,0)
+    . ;Q:'$$INDIV2(BSDXRES)  ; Quit if Resource isn't in same division as user.
+"RTN","BSDX01",201,0)
+ . S BSDXRNOD=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX01",202,0)
+ . Q:BSDXRNOD=""
+"RTN","BSDX01",203,0)
+ . ;QUIT if the resource is inactive
+"RTN","BSDX01",204,0)
+ . Q:$P(BSDXRNOD,U,2)=1
+"RTN","BSDX01",205,0)
+ . S BSDXRESN=$P(BSDXRNOD,U)
+"RTN","BSDX01",206,0)
+ . S BSDXDEP=0 F  S BSDXDEP=$O(^BSDXDEPT("AB",BSDXRES,BSDXDEP)) Q:'+BSDXDEP  D
+"RTN","BSDX01",207,0)
+ . . Q:'$D(^BSDXDEPT(BSDXDEP,0))
+"RTN","BSDX01",208,0)
+ . . S BSDXDEPN=$P(^BSDXDEPT(BSDXDEP,0),U)
+"RTN","BSDX01",209,0)
+ . . S BSDXSUBID=$O(^BSDXDEPT(BSDXDEP,1,"B",BSDXRES,0))
+"RTN","BSDX01",210,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX01",211,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXDEP_U_BSDXDEPN_U_BSDXSUBID_U_BSDXRESN_U_BSDXRES_$C(30)
+"RTN","BSDX01",212,0)
+ . Q
+"RTN","BSDX01",213,0)
+ ;
+"RTN","BSDX01",214,0)
+ ;User does have BSDXZMGR or XUPROGMODE keys, so
+"RTN","BSDX01",215,0)
+ ;$O THRU BSDX RESOURCE GROUP file directly
+"RTN","BSDX01",216,0)
+ I BSDXMGR S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXDEPT(BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX01",217,0)
+ . Q:'$D(^BSDXDEPT(BSDXIEN,0))
+"RTN","BSDX01",218,0)
+ . S BSDXNOD=^BSDXDEPT(BSDXIEN,0)
+"RTN","BSDX01",219,0)
+ . S BSDXDEPN=$P(BSDXNOD,U)
+"RTN","BSDX01",220,0)
+ . S BSDXRES=0 F  S BSDXRES=$O(^BSDXDEPT(BSDXIEN,1,BSDXRES)) Q:'+BSDXRES  D
+"RTN","BSDX01",221,0)
+ . . N BSDXRESD
+"RTN","BSDX01",222,0)
+ . . Q:'$D(^BSDXDEPT(BSDXIEN,1,BSDXRES,0))  ; Quit if zero node is invalid in multiple
+"RTN","BSDX01",223,0)
+ . . S BSDXRESD=$P(^BSDXDEPT(BSDXIEN,1,BSDXRES,0),"^")
+"RTN","BSDX01",224,0)
+ . . Q:'$D(^BSDXRES(BSDXRESD,0))  ; Quit if zero node of resouce file is invalid
+"RTN","BSDX01",225,0)
+    . . ;Q:'$$INDIV2(BSDXRESD)  ; Quit if resource is not in the same division
+"RTN","BSDX01",226,0)
+ . . S BSDXRNOD=$G(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX01",227,0)
+ . . Q:BSDXRNOD=""
+"RTN","BSDX01",228,0)
+ . . ;QUIT if the resource is inactive
+"RTN","BSDX01",229,0)
+ . . Q:$P(BSDXRNOD,U,2)=1
+"RTN","BSDX01",230,0)
+ . . S BSDXRESN=$P(BSDXRNOD,U)
+"RTN","BSDX01",231,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX01",232,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXDEPN_U_BSDXRES_U_BSDXRESN_U_BSDXRESD_$C(30)
+"RTN","BSDX01",233,0)
+ . . Q
+"RTN","BSDX01",234,0)
+ . Q
+"RTN","BSDX01",235,0)
+ ;
+"RTN","BSDX01",236,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+"RTN","BSDX01",237,0)
+ Q
+"RTN","BSDX01",238,0)
+ ;
+"RTN","BSDX01",239,0)
+APSEC(BSDXKEY,BSDXDUZ) ;EP - Return TRUE (1) if user has keys BSDXKEY or XUPROGMODE, otherwise, returns FALSE (0)
+"RTN","BSDX01",240,0)
+ ;
+"RTN","BSDX01",241,0)
+ N BSDXIEN,BSDXPROG,BSDXPKEY
+"RTN","BSDX01",242,0)
+ I '$G(BSDXDUZ) Q 0
+"RTN","BSDX01",243,0)
+ ;
+"RTN","BSDX01",244,0)
+ ;Test for programmer mode key
+"RTN","BSDX01",245,0)
+ S BSDXPROG=0
+"RTN","BSDX01",246,0)
+ I $D(^DIC(19.1,"B","XUPROGMODE")) D
+"RTN","BSDX01",247,0)
+ . S BSDXPKEY=$O(^DIC(19.1,"B","XUPROGMODE",0))
+"RTN","BSDX01",248,0)
+ . I '+BSDXPKEY Q
+"RTN","BSDX01",249,0)
+ . I '$D(^VA(200,BSDXDUZ,51,BSDXPKEY,0)) Q
+"RTN","BSDX01",250,0)
+ . S BSDXPROG=1
+"RTN","BSDX01",251,0)
+ I BSDXPROG Q 1
+"RTN","BSDX01",252,0)
+ ;
+"RTN","BSDX01",253,0)
+ I BSDXKEY="" Q 0
+"RTN","BSDX01",254,0)
+ I '$D(^DIC(19.1,"B",BSDXKEY)) Q 0
+"RTN","BSDX01",255,0)
+ S BSDXIEN=$O(^DIC(19.1,"B",BSDXKEY,0))
+"RTN","BSDX01",256,0)
+ I '+BSDXIEN Q 0
+"RTN","BSDX01",257,0)
+ I '$D(^VA(200,BSDXDUZ,51,BSDXIEN,0)) Q 0
+"RTN","BSDX01",258,0)
+ Q 1
+"RTN","BSDX01",259,0)
+SP(BSDXY,PARAM,YESNO) ; Save Param at User Level - EP
+"RTN","BSDX01",260,0)
+ ; Called by RPC: BSDX SET PARAM
+"RTN","BSDX01",261,0)
+ ; Input:
+"RTN","BSDX01",262,0)
+ ; - Param: Name of Parameter (prog name of course)
+"RTN","BSDX01",263,0)
+ ; - Yes/No: 1 or 0
+"RTN","BSDX01",264,0)
+ ; Output: Error Code as string; 0 is good
+"RTN","BSDX01",265,0)
+ ;
+"RTN","BSDX01",266,0)
+ ; Security Protection
+"RTN","BSDX01",267,0)
+ IF $EXTRACT(PARAM,1,4)'="BSDX" S BSDXY="-1^BSDX Params only allowed" QUIT
+"RTN","BSDX01",268,0)
+ ;
+"RTN","BSDX01",269,0)
+ N ERROR
+"RTN","BSDX01",270,0)
+ D PUT^XPAR("USR",PARAM,1,YESNO,.ERROR)
+"RTN","BSDX01",271,0)
+ S BSDXY=$G(ERROR)
+"RTN","BSDX01",272,0)
+ QUIT
+"RTN","BSDX01",273,0)
+ ;
+"RTN","BSDX01",274,0)
+GP(BSDXY,PARAM) ; Get Param - EP
+"RTN","BSDX01",275,0)
+ ; Called by RPC: BSDX GET PARAM
+"RTN","BSDX01",276,0)
+ ; Input: Name of Parameter
+"RTN","BSDX01",277,0)
+ ; Output: Value of parameter: 0 or 1, for now.
+"RTN","BSDX01",278,0)
+ ;
+"RTN","BSDX01",279,0)
+ S BSDXY=$$GET^XPAR("USR^LOC^SYS^PKG",PARAM,1,"I")
+"RTN","BSDX01",280,0)
+ QUIT
+"RTN","BSDX01",281,0)
+ ;
+"RTN","BSDX01",282,0)
+INDIV(BSDXSC) ; PEP - Is ^SC clinic in the same DUZ(2) as user?
+"RTN","BSDX01",283,0)
+    ; Input: BSDXSC - Hospital Location IEN
+"RTN","BSDX01",284,0)
+    ; Output: True or False
+"RTN","BSDX01",285,0)
+    I '+BSDXSC QUIT 1  ;If not tied to clinic, yes
+"RTN","BSDX01",286,0)
+    I '$D(^SC(BSDXSC,0)) QUIT 1 ; If Clinic does not exist, yes
+"RTN","BSDX01",287,0)
+    ; Jump to Division:Medical Center Division:Inst File Pointer for
+"RTN","BSDX01",288,0)
+    ; Institution IEN (and get its internal value)
+"RTN","BSDX01",289,0)
+    N DIV S DIV=$$GET1^DIQ(44,BSDXSC_",","3.5:.07","I")
+"RTN","BSDX01",290,0)
+    I DIV="" Q 1 ; If clinic has no division, consider it avial to user.
+"RTN","BSDX01",291,0)
+    I DIV=DUZ(2) Q 1 ; If same, then User is in same Div as Clinic
+"RTN","BSDX01",292,0)
+    E  Q 0 ; Otherwise, no
+"RTN","BSDX01",293,0)
+    QUIT
+"RTN","BSDX01",294,0)
+INDIV2(BSDXRES) ; PEP - Is Resource in the same DUZ(2) as user?
+"RTN","BSDX01",295,0)
+    ; Input BSDXRES - BSDX RESOURCE IEN
+"RTN","BSDX01",296,0)
+    ; Output: True of False
+"RTN","BSDX01",297,0)
+    Q $$INDIV($P($G(^BSDXRES(BSDXRES,0)),U,4)) ; Extract Hospital Location and send to $$INDIV
+"RTN","BSDX01",298,0)
+UnitTestINDIV 
+"RTN","BSDX01",299,0)
+    W "Testing if they are the same",!
+"RTN","BSDX01",300,0)
+    S DUZ(2)=67
+"RTN","BSDX01",301,0)
+    I '$$INDIV(1) W "ERROR",!
+"RTN","BSDX01",302,0)
+    I '$$INDIV(2) W "ERROR",!
+"RTN","BSDX01",303,0)
+    W "Testing if Div not defined in 44, should be true",!
+"RTN","BSDX01",304,0)
+    I '$$INDIV(3) W "ERROR",!
+"RTN","BSDX01",305,0)
+    W "Testing empty string. Should be true",!
+"RTN","BSDX01",306,0)
+    I '$$INDIV("") W "ERROR",!
+"RTN","BSDX01",307,0)
+    W "Testing if they are different",!
+"RTN","BSDX01",308,0)
+    S DUZ(2)=899
+"RTN","BSDX01",309,0)
+    I $$INDIV(1) W "ERROR",!
+"RTN","BSDX01",310,0)
+    I $$INDIV(2) W "ERROR",!
+"RTN","BSDX01",311,0)
+    QUIT
+"RTN","BSDX01",312,0)
+UnitTestINDIV2 
+"RTN","BSDX01",313,0)
+    W "Testing if they are the same",!
+"RTN","BSDX01",314,0)
+    S DUZ(2)=69
+"RTN","BSDX01",315,0)
+    I $$INDIV2(22)'=0 W "ERROR",!
+"RTN","BSDX01",316,0)
+    I $$INDIV2(25)'=1 W "ERROR",!
+"RTN","BSDX01",317,0)
+    I $$INDIV2(26)'=1 W "ERROR",!
+"RTN","BSDX01",318,0)
+    I $$INDIV2(27)'=1 W "ERROR",!
+"RTN","BSDX01",319,0)
+    QUIT
+"RTN","BSDX02")
+0^2^B19595009
+"RTN","BSDX02",1,0)
+BSDX02 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 3/21/11 11:49am
+"RTN","BSDX02",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX02",3,0)
+    ; 
+"RTN","BSDX02",4,0)
+    ; Change Log
+"RTN","BSDX02",5,0)
+    ; July 15 2010: UJO/SMH - Pass FM dates in instead of US dates for i18n
+"RTN","BSDX02",6,0)
+ ; March 21 2011: UJO/SMH (v 1.5) - Return new fields: Patient SEX, PID, and DOB
+"RTN","BSDX02",7,0)
+ ;
+"RTN","BSDX02",8,0)
+ ;
+"RTN","BSDX02",9,0)
+CRSCHD(BSDXY,BSDXRES,BSDXSTART,BSDXEND) ;EP
+"RTN","BSDX02",10,0)
+ ;Entry point for debugging
+"RTN","BSDX02",11,0)
+ ;
+"RTN","BSDX02",12,0)
+ ;D DEBUG^%Serenji("CRSCH^BSDX02(.BSDXY,BSDXRES,BSDXSTART,BSDXEND)")
+"RTN","BSDX02",13,0)
+ Q
+"RTN","BSDX02",14,0)
+ ;
+"RTN","BSDX02",15,0)
+CRSCH(BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXWKIN)     ;
+"RTN","BSDX02",16,0)
+ ;Called by BSDX CREATE APPT SCHEDULE
+"RTN","BSDX02",17,0)
+ ;Create Resource Appointment Schedule recordset
+"RTN","BSDX02",18,0)
+ ;On error, returns 0 in APPOINTMENTID field and error text in NOTE field
+"RTN","BSDX02",19,0)
+ ;
+"RTN","BSDX02",20,0)
+ ;$O Thru ^BSDXAPPT("ARSRC", RESOURCE, STARTTIME, APPTID)
+"RTN","BSDX02",21,0)
+ ;BMXRES is a | delimited list of resource names
+"RTN","BSDX02",22,0)
+ ;BSDXWKIN - If 1, then return walkins, otherwise skip them
+"RTN","BSDX02",23,0)
+ ;9-27-2004 Added walkin to returned datatable
+"RTN","BSDX02",24,0)
+ ;TODO: Change BSDXRES from names to IDs
+"RTN","BSDX02",25,0)
+ ;
+"RTN","BSDX02",26,0)
+ N BSDXERR,BSDXIEN,BSDXDEPD,BSDXDEPN,BSDXRESD,BSDXI,BSDXJ,BSDXRESN,BSDXS,BSDXAD,BSDXZ,BSDXQ,BSDXNOD
+"RTN","BSDX02",27,0)
+ N BSDXPAT,BSDXNOT,BSDXZPCD,BSDXPCD
+"RTN","BSDX02",28,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX02",29,0)
+ S BSDXERR=""
+"RTN","BSDX02",30,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX02",31,0)
+ S ^BSDXTMP($J,0)="I00020APPOINTMENTID^D00030START_TIME^D00030END_TIME^D00030CHECKIN^D00030AUXTIME^I00020PATIENTID^T00030PATIENTNAME^T00030RESOURCENAME^I00005NOSHOW^T00020HRN^I00005ACCESSTYPEID^I00005WALKIN^T00250NOTE^T00006SEX^T00040PID^D00030DOB"_$C(30)
+"RTN","BSDX02",32,0)
+ D ^XBKVAR S X="ETRAP^BSDX02",@^%ZOSF("TRAP")
+"RTN","BSDX02",33,0)
+ ;
+"RTN","BSDX02",34,0)
+ ; S %DT="T",X=BSDXSTART D ^%DT S BSDXSTART=Y
+"RTN","BSDX02",35,0)
+ ; I BSDXSTART=-1 S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX02",36,0)
+ ; S %DT="T",X=BSDXEND D ^%DT S BSDXEND=Y
+"RTN","BSDX02",37,0)
+ ; I BSDXEND=-1 S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX02",38,0)
+    ;
+"RTN","BSDX02",39,0)
+ S BSDXI=0
+"RTN","BSDX02",40,0)
+ D STRES
+"RTN","BSDX02",41,0)
+ ;
+"RTN","BSDX02",42,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",43,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX02",44,0)
+ Q
+"RTN","BSDX02",45,0)
+ ;
+"RTN","BSDX02",46,0)
+STRES ;
+"RTN","BSDX02",47,0)
+ F BSDXJ=1:1:$L(BSDXRES,"|") S BSDXRESN=$P(BSDXRES,"|",BSDXJ) D
+"RTN","BSDX02",48,0)
+ . Q:BSDXRESN=""
+"RTN","BSDX02",49,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX02",50,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX02",51,0)
+ . Q:'+BSDXRESD
+"RTN","BSDX02",52,0)
+ . Q:'$D(^BSDXAPPT("ARSRC",BSDXRESD))
+"RTN","BSDX02",53,0)
+ . S BSDXS=BSDXSTART-.0001
+"RTN","BSDX02",54,0)
+ . F  S BSDXS=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX02",55,0)
+ . . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D STCOMM(BSDXAD,BSDXRESN)
+"RTN","BSDX02",56,0)
+ Q
+"RTN","BSDX02",57,0)
+ ;
+"RTN","BSDX02",58,0)
+STCOMM(BSDXAD,BSDXRESN)      ;
+"RTN","BSDX02",59,0)
+ ;BSDXAD is the appointment IEN
+"RTN","BSDX02",60,0)
+ N BSDXC,BSDXQ,BSDXZ,BSDXSUBC,BSDXHRN,BSDXPATD,BSDXATID,BSDXISWK
+"RTN","BSDX02",61,0)
+ Q:'$D(^BSDXAPPT(BSDXAD,0))
+"RTN","BSDX02",62,0)
+ S BSDXNOD=^BSDXAPPT(BSDXAD,0)
+"RTN","BSDX02",63,0)
+ Q:$P(BSDXNOD,U,12)]""  ;CANCELLED
+"RTN","BSDX02",64,0)
+ S BSDXISWK=0
+"RTN","BSDX02",65,0)
+ S:$P(BSDXNOD,U,13)="y" BSDXISWK=1
+"RTN","BSDX02",66,0)
+ I +$G(BSDXWKIN) Q:BSDXISWK  ;Don't return walkins if appt is WALKIN and BSDXWKIN is 1
+"RTN","BSDX02",67,0)
+ S BSDXZ=BSDXAD_"^"
+"RTN","BSDX02",68,0)
+ F BSDXQ=1:1:4 D
+"RTN","BSDX02",69,0)
+ . S Y=$P(BSDXNOD,U,BSDXQ)
+"RTN","BSDX02",70,0)
+ . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX02",71,0)
+ . S BSDXZ=BSDXZ_Y_"^"
+"RTN","BSDX02",72,0)
+ S BSDXPATD=$P(BSDXNOD,U,5)
+"RTN","BSDX02",73,0)
+ S BSDXZ=BSDXZ_BSDXPATD_"^" ;PATIENT ID
+"RTN","BSDX02",74,0)
+ S BSDXPAT=""
+"RTN","BSDX02",75,0)
+ I BSDXPATD]"",$D(^DPT(BSDXPATD,0)) S BSDXPAT=$P(^DPT(BSDXPATD,0),U)
+"RTN","BSDX02",76,0)
+ S BSDXZ=BSDXZ_BSDXPAT_"^" ;PATIENT NAME
+"RTN","BSDX02",77,0)
+ S BSDXZ=BSDXZ_BSDXRESN_"^" ;RESOURCENAME
+"RTN","BSDX02",78,0)
+ S BSDXZ=BSDXZ_+$P(BSDXNOD,U,10)_"^" ;NOSHOW
+"RTN","BSDX02",79,0)
+ S BSDXHRN=""
+"RTN","BSDX02",80,0)
+ I $D(DUZ(2)),DUZ(2)>0 S BSDXHRN=$P($G(^AUPNPAT(BSDXPATD,41,DUZ(2),0)),U,2) ;HRN
+"RTN","BSDX02",81,0)
+ S BSDXZ=BSDXZ_BSDXHRN_"^"
+"RTN","BSDX02",82,0)
+ S BSDXATID=$P(BSDXNOD,U,6)
+"RTN","BSDX02",83,0)
+ S:'+BSDXATID BSDXATID=0 ;UNKNOWN TYPE
+"RTN","BSDX02",84,0)
+ S BSDXZ=BSDXZ_BSDXATID_"^"_BSDXISWK_"^"
+"RTN","BSDX02",85,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",86,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXZ
+"RTN","BSDX02",87,0)
+ ;NOTE
+"RTN","BSDX02",88,0)
+ S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXAD,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX02",89,0)
+ . S BSDXNOT=$G(^BSDXAPPT(BSDXAD,1,BSDXQ,0))
+"RTN","BSDX02",90,0)
+ . S:$E(BSDXNOT,$L(BSDXNOT)-1,$L(BSDXNOT))'=" " BSDXNOT=BSDXNOT_" "
+"RTN","BSDX02",91,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX02",92,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXNOT
+"RTN","BSDX02",93,0)
+ S ^BSDXTMP($J,BSDXI)=^BSDXTMP($J,BSDXI)_U ; Add "^" to separate note from next fields.
+"RTN","BSDX02",94,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",95,0)
+ ; new code for V1.5. Extra fields to return.
+"RTN","BSDX02",96,0)
+ N SEX S SEX=$$GET1^DIQ(2,BSDXPATD,.02)  ; SEX
+"RTN","BSDX02",97,0)
+ N PID S PID=$$GET1^DIQ(2,BSDXPATD,.363) ; PRIMARY LONG ID
+"RTN","BSDX02",98,0)
+ ; Note strange way I retrieve the value. B/c DOB Output Transform
+"RTN","BSDX02",99,0)
+ ; Outputs it in MM/DD/YYYY format, which is ambigous for C#.
+"RTN","BSDX02",100,0)
+ N DOB S DOB=$$FMTE^XLFDT($$GET1^DIQ(2,BSDXPATD,.03,"I"))  ; DOB
+"RTN","BSDX02",101,0)
+ S ^BSDXTMP($J,BSDXI)=SEX_U_PID_U_DOB_$C(30)
+"RTN","BSDX02",102,0)
+ ; end new code
+"RTN","BSDX02",103,0)
+ Q
+"RTN","BSDX02",104,0)
+ ;
+"RTN","BSDX02",105,0)
+ERR(BSDXI,BSDXERR) ;Error processing
+"RTN","BSDX02",106,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",107,0)
+ S ^BSDXTMP($J,BSDXI)="0^^^^^^^^^^^"_BSDXERR_$C(30)
+"RTN","BSDX02",108,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",109,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX02",110,0)
+ Q
+"RTN","BSDX02",111,0)
+ ;
+"RTN","BSDX02",112,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX02",113,0)
+ D ^%ZTER
+"RTN","BSDX02",114,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX02",115,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX02",116,0)
+ D ERR(BSDXI,"BSDX31 Error: "_$G(%ZTERROR))
+"RTN","BSDX02",117,0)
+ Q
+"RTN","BSDX03")
+0^3^B2855259
+"RTN","BSDX03",1,0)
+BSDX03 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX03",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX03",3,0)
+ ;
+"RTN","BSDX03",4,0)
+ ;
+"RTN","BSDX03",5,0)
+ Q
+"RTN","BSDX03",6,0)
+ ;
+"RTN","BSDX03",7,0)
+XR2S(BSDXDA) ;EP
+"RTN","BSDX03",8,0)
+ ;XR2 is the ARSRC xref for the
+"RTN","BSDX03",9,0)
+ ;RESOURCE field of the BSDX APPOINTMENT file
+"RTN","BSDX03",10,0)
+ ;Format is ^BSDXAPPT("ARSRC",RESOURCEID,STARTTIME,APPTID)
+"RTN","BSDX03",11,0)
+ Q:'$D(^BSDXAPPT(BSDXDA,0))
+"RTN","BSDX03",12,0)
+ N BSDXNOD,BSDXAPPID,BSDXRSID,BSDXS
+"RTN","BSDX03",13,0)
+ S BSDXNOD=^BSDXAPPT(BSDXDA,0)
+"RTN","BSDX03",14,0)
+ S BSDXAPPID=BSDXDA
+"RTN","BSDX03",15,0)
+ S BSDXRSID=$P(BSDXNOD,U,7)
+"RTN","BSDX03",16,0)
+ Q:'+BSDXAPPID>0
+"RTN","BSDX03",17,0)
+ Q:'+BSDXRSID>0
+"RTN","BSDX03",18,0)
+ S BSDXS=$P(BSDXNOD,U)
+"RTN","BSDX03",19,0)
+ Q:'+BSDXS
+"RTN","BSDX03",20,0)
+ S ^BSDXAPPT("ARSRC",BSDXRSID,BSDXS,BSDXAPPID)=""
+"RTN","BSDX03",21,0)
+ Q
+"RTN","BSDX03",22,0)
+ ;
+"RTN","BSDX03",23,0)
+XR2K(BSDXA) ;EP
+"RTN","BSDX03",24,0)
+ Q:'$D(^BSDXAPPT(BSDXA,0))
+"RTN","BSDX03",25,0)
+ N BSDXNOD,BSDXAPPID,BSDXRSID,BSDXS
+"RTN","BSDX03",26,0)
+ S BSDXNOD=^BSDXAPPT(BSDXA,0)
+"RTN","BSDX03",27,0)
+ S BSDXAPPID=BSDXA
+"RTN","BSDX03",28,0)
+ S BSDXRSID=$P(BSDXNOD,U,7)
+"RTN","BSDX03",29,0)
+ S BSDXS=$P(BSDXNOD,U)
+"RTN","BSDX03",30,0)
+ Q:'+BSDXAPPID>0
+"RTN","BSDX03",31,0)
+ Q:'+BSDXRSID>0
+"RTN","BSDX03",32,0)
+ Q:'+BSDXS>0
+"RTN","BSDX03",33,0)
+ K ^BSDXAPPT("ARSRC",BSDXRSID,BSDXS,BSDXAPPID)
+"RTN","BSDX03",34,0)
+ Q
+"RTN","BSDX03",35,0)
+XR4S(BSDXDA) ;EP
+"RTN","BSDX03",36,0)
+ ;XR4 is the ARSCT xref for the
+"RTN","BSDX03",37,0)
+ ;STARTTIME field of the BSDX ACCESS BLOCK file
+"RTN","BSDX03",38,0)
+ ;Format is ^BSDXAB("ARSCT",RESOURCEID,STARTTIME,DA)
+"RTN","BSDX03",39,0)
+ Q:'$D(^BSDXAB(BSDXDA,0))
+"RTN","BSDX03",40,0)
+ N BSDXNOD,BSDXR,BSDXS
+"RTN","BSDX03",41,0)
+ S BSDXNOD=^BSDXAB(BSDXDA,0)
+"RTN","BSDX03",42,0)
+ S BSDXR=$P(BSDXNOD,U)
+"RTN","BSDX03",43,0)
+ S BSDXS=$P(BSDXNOD,U,2)
+"RTN","BSDX03",44,0)
+ Q:'+BSDXR>0
+"RTN","BSDX03",45,0)
+ Q:'+BSDXS>0
+"RTN","BSDX03",46,0)
+ S ^BSDXAB("ARSCT",BSDXR,BSDXS,BSDXDA)=""
+"RTN","BSDX03",47,0)
+ Q
+"RTN","BSDX03",48,0)
+ ;
+"RTN","BSDX03",49,0)
+XR4K(BSDXDA) ;EP
+"RTN","BSDX03",50,0)
+ Q:'$D(^BSDXAB(BSDXDA,0))
+"RTN","BSDX03",51,0)
+ N BSDXNOD,BSDXR,BSDXS
+"RTN","BSDX03",52,0)
+ S BSDXNOD=^BSDXAB(BSDXDA,0)
+"RTN","BSDX03",53,0)
+ S BSDXR=$P(BSDXNOD,U)
+"RTN","BSDX03",54,0)
+ S BSDXS=$P(BSDXNOD,U,2)
+"RTN","BSDX03",55,0)
+ Q:'+BSDXR>0
+"RTN","BSDX03",56,0)
+ Q:'+BSDXS>0
+"RTN","BSDX03",57,0)
+ K ^BSDXAB("ARSCT",BSDXR,BSDXS,BSDXDA)
+"RTN","BSDX03",58,0)
+ Q
+"RTN","BSDX04")
+0^4^B24350739
+"RTN","BSDX04",1,0)
+BSDX04 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;  ; 2/27/11 6:32am
+"RTN","BSDX04",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX04",3,0)
+ ; Change Log:
+"RTN","BSDX04",4,0)
+ ; July 11 2010: Pass BSDXSTART and END as FM dates rather than US formatted dates
+"RTN","BSDX04",5,0)
+ ;       for i18n
+"RTN","BSDX04",6,0)
+ ; Feb 27 2010 (v. 1.5) SMH
+"RTN","BSDX04",7,0)
+ ; - Grab multiple resources instead of a single resource. 
+"RTN","BSDX04",8,0)
+ ;   --> Will be passed from C# as | delimited.
+"RTN","BSDX04",9,0)
+ ; - Change in algorithm. Padding part to pad start and end dates to coincide
+"RTN","BSDX04",10,0)
+ ;   --> with schedule now not performed. C# won't need that anymore.
+"RTN","BSDX04",11,0)
+ ;
+"RTN","BSDX04",12,0)
+ ;
+"RTN","BSDX04",13,0)
+CASSCHD(BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXTYPES,BSDXSRCH) ;EP
+"RTN","BSDX04",14,0)
+ ;
+"RTN","BSDX04",15,0)
+ ;D DEBUG^%Serenji("CASSCH^BSDX04(.BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXTYPES,BSDXSRCH)")
+"RTN","BSDX04",16,0)
+ ;
+"RTN","BSDX04",17,0)
+ Q
+"RTN","BSDX04",18,0)
+ ;
+"RTN","BSDX04",19,0)
+CASSET ;EP
+"RTN","BSDX04",20,0)
+ ;Error Trap
+"RTN","BSDX04",21,0)
+ D ^%ZTER
+"RTN","BSDX04",22,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=99999
+"RTN","BSDX04",23,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX04",24,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX04",25,0)
+ Q
+"RTN","BSDX04",26,0)
+ ;
+"RTN","BSDX04",27,0)
+CASSCH(BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXTYPES,BSDXSRCH) ;EP  -- RPC: BSDX CREATE ASGND SLOT SCHED
+"RTN","BSDX04",28,0)
+ ;Create Assigned Slot Schedule recordset (Access Blocks, Availabilities, etc.)
+"RTN","BSDX04",29,0)
+ ;This call is used both to create a schedule of availability for the calendar display
+"RTN","BSDX04",30,0)
+ ;and to search for availability in the Find Appointment function
+"RTN","BSDX04",31,0)
+ ;
+"RTN","BSDX04",32,0)
+ ;BSDXRES is resources name, delimited by |
+"RTN","BSDX04",33,0)
+ ;
+"RTN","BSDX04",34,0)
+ ; BSDXSTART and BSDXEND both passed in FM Format.
+"RTN","BSDX04",35,0)
+ ; BSDXSTART is the Date Portion of FM Date
+"RTN","BSDX04",36,0)
+ ; BSDXEND -- pass date and h,m,s as well
+"RTN","BSDX04",37,0)
+ ;
+"RTN","BSDX04",38,0)
+ ;BSDXTYPES is |-delimited list of Access Type Names
+"RTN","BSDX04",39,0)
+ ;If BSDXTYPES is "" then the screen passes all types.
+"RTN","BSDX04",40,0)
+ ;
+"RTN","BSDX04",41,0)
+ ;BSDXSRCH is |-delimited search info for the Find Appointment function
+"RTN","BSDX04",42,0)
+ ;First piece is 1 if we are in a Find Appointment call
+"RTN","BSDX04",43,0)
+ ;Second piece is weekday info in the format MTWHFSU
+"RTN","BSDX04",44,0)
+ ;Third piece is AM PM info in the form AP
+"RTN","BSDX04",45,0)
+ ;If 2nd or 3rd pieces are null, the screen for that piece is skipped
+"RTN","BSDX04",46,0)
+ ;
+"RTN","BSDX04",47,0)
+ ;Test lines:
+"RTN","BSDX04",48,0)
+ ;D CASSCH^BSDX04(.RES,"REMILLARD,MIKE","<fmdate>","<fmdate>") ZW RES
+"RTN","BSDX04",49,0)
+ ;BSDX CREATE ASGND SLOT SCHED^ROGERS,BUCK^<fmdate>^<fmdate>^2
+"RTN","BSDX04",50,0)
+ ;S ^HW("BSDX04")=BSDXRES_U_BSDXSTART_U_BSDXEND
+"RTN","BSDX04",51,0)
+ ;
+"RTN","BSDX04",52,0)
+ N BSDXERR,BSDXIEN,BSDXDEP,BSDXTYPED,BSDXTYPE,BSDXBS,BSDXI,BSDXNEND,BSDXNSTART,BSDXPEND,BSDXRESD,BSDXRESN,BSDXS,BSDXZ,BSDXTMP,BSDXQ,BSDXNOT,BSDXNOD,BSDXAD
+"RTN","BSDX04",53,0)
+ N BSDXSUBCD
+"RTN","BSDX04",54,0)
+ S X="CASSET^BSDX04",@^%ZOSF("TRAP")
+"RTN","BSDX04",55,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX04",56,0)
+ S BSDXERR=""
+"RTN","BSDX04",57,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX04",58,0)
+ S ^BSDXTMP($J,0)="D00030START_TIME^D00030END_TIME^I00010SLOTS^T00030RESOURCE^T00010ACCESS_TYPE^T00250NOTE^I00030AVAILABILITYID"_$C(30)
+"RTN","BSDX04",59,0)
+ S BSDXI=2
+"RTN","BSDX04",60,0)
+ ;
+"RTN","BSDX04",61,0)
+ ;Get Access Type IDs
+"RTN","BSDX04",62,0)
+ N BSDXK,BSDXTYPED,BSDXL
+"RTN","BSDX04",63,0)
+ I '+BSDXSRCH S BSDXTYPED=""
+"RTN","BSDX04",64,0)
+ I +BSDXSRCH F BSDXK=1:1:$L(BSDXTYPES,"|") D
+"RTN","BSDX04",65,0)
+ . S BSDXL=$P(BSDXTYPES,"|",BSDXK)
+"RTN","BSDX04",66,0)
+ . I BSDXL="" S $P(BSDXTYPED,"|",BSDXK)=0 Q
+"RTN","BSDX04",67,0)
+ . I '$D(^BSDXTYPE("B",BSDXL)) S $P(BSDXTYPED,"|",BSDXK)=0 Q
+"RTN","BSDX04",68,0)
+ . S $P(BSDXTYPED,"|",BSDXK)=$O(^BSDXTYPE("B",BSDXL,0))
+"RTN","BSDX04",69,0)
+ ;
+"RTN","BSDX04",70,0)
+ N BSDXCOUN ; Counter
+"RTN","BSDX04",71,0)
+ FOR BSDXCOUN=1:1:$L(BSDXRES,"|") DO  ;smh - d in algo to do multiple res
+"RTN","BSDX04",72,0)
+ . S BSDXRESN=$P(BSDXRES,"|",BSDXCOUN)
+"RTN","BSDX04",73,0)
+ . Q:BSDXRESN=""
+"RTN","BSDX04",74,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX04",75,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0)) 
+"RTN","BSDX04",76,0)
+ . Q:'+BSDXRESD
+"RTN","BSDX04",77,0)
+ . Q:'$D(^BSDXAB("ARSCT",BSDXRESD))
+"RTN","BSDX04",78,0)
+ . S BSDXBS=0
+"RTN","BSDX04",79,0)
+ . D STRES(BSDXRESN,BSDXRESD)
+"RTN","BSDX04",80,0)
+ . Q
+"RTN","BSDX04",81,0)
+ ;
+"RTN","BSDX04",82,0)
+ ; V 1.5 -- All of this commented out; algo changed on C# side.
+"RTN","BSDX04",83,0)
+ ;start, end, slots, resource, accesstype, note, availabilityid
+"RTN","BSDX04",84,0)
+ ;I '+BSDXSRCH,BSDXALO D
+"RTN","BSDX04",85,0)
+ ; I BSDXALO D
+"RTN","BSDX04",86,0)
+ ; . ;If first block start time > input start time then pad with new block
+"RTN","BSDX04",87,0)
+ ; . I BSDXBS>BSDXSTART K BSDXTMP D
+"RTN","BSDX04",88,0)
+ ; . . S Y=BSDXSTART X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",89,0)
+ ; . . S BSDXTMP=Y
+"RTN","BSDX04",90,0)
+ ; . . S Y=BSDXBS X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",91,0)
+ ; . . S BSDXTMP=BSDXTMP_"^"_Y_"^0^"_BSDXRESN_"^0^^0"_$C(30)
+"RTN","BSDX04",92,0)
+ ; . . S ^BSDXTMP($J,1)=BSDXTMP
+"RTN","BSDX04",93,0)
+ ; . ;
+"RTN","BSDX04",94,0)
+ ; . ;If first block start time < input start time then trim
+"RTN","BSDX04",95,0)
+ ; . I BSDXBS<BSDXSTART D
+"RTN","BSDX04",96,0)
+ ; . . S Y=BSDXSTART
+"RTN","BSDX04",97,0)
+ ; . . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",98,0)
+ ; . . S $P(^BSDXTMP($J,2),U,1)=Y
+"RTN","BSDX04",99,0)
+ ; . ;
+"RTN","BSDX04",100,0)
+ ; . ;If last block end time < input end time then pad end with new block
+"RTN","BSDX04",101,0)
+ ; . I BSDXPEND<BSDXEND D
+"RTN","BSDX04",102,0)
+ ; . . S Y=BSDXPEND X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",103,0)
+ ; . . S BSDXTMP=Y
+"RTN","BSDX04",104,0)
+ ; . . S Y=BSDXEND X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",105,0)
+ ; . . S BSDXTMP=BSDXTMP_"^"_Y_"^0^"_BSDXRESN_"^0^^0"_$C(30)
+"RTN","BSDX04",106,0)
+ ; . . S ^BSDXTMP($J,BSDXI-1)=BSDXTMP
+"RTN","BSDX04",107,0)
+ ; . ;
+"RTN","BSDX04",108,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX04",109,0)
+ Q
+"RTN","BSDX04",110,0)
+ ;
+"RTN","BSDX04",111,0)
+STRES(BSDXRESN,BSDXRESD) ;
+"RTN","BSDX04",112,0)
+ ;BSDXRESD is a Resource ID
+"RTN","BSDX04",113,0)
+ ;$O THRU "ARSCT" XREF OF ^BSDXAB
+"RTN","BSDX04",114,0)
+ S BSDXS=$P(BSDXSTART,"."),BSDXS=BSDXS-.0001
+"RTN","BSDX04",115,0)
+ S BSDXNEND=0,BSDXNSTART=0,BSDXPEND=0
+"RTN","BSDX04",116,0)
+ F  S BSDXS=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX04",117,0)
+ . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D STCOMM(BSDXRESN,BSDXRESD,BSDXS,BSDXAD) ;BSDXAD Is the AvailabilityID
+"RTN","BSDX04",118,0)
+ . Q
+"RTN","BSDX04",119,0)
+ Q
+"RTN","BSDX04",120,0)
+ ;
+"RTN","BSDX04",121,0)
+STCOMM(BSDXRESN,BSDXRESD,BSDXS,BSDXAD) ;
+"RTN","BSDX04",122,0)
+ N BSDXNSTART,BSDXNEND,BSDXNOD,Y,BSDXQ,BSDXZ,BSDXATID,BSDXATOK
+"RTN","BSDX04",123,0)
+ Q:'$D(^BSDXAB(BSDXAD,0))
+"RTN","BSDX04",124,0)
+ S BSDXNOD=^BSDXAB(BSDXAD,0)
+"RTN","BSDX04",125,0)
+ S BSDXATID=$P(BSDXNOD,U,5)
+"RTN","BSDX04",126,0)
+ ;
+"RTN","BSDX04",127,0)
+ ;Screen for Access Type
+"RTN","BSDX04",128,0)
+ ;S BSDXATOK=0
+"RTN","BSDX04",129,0)
+ ;I BSDXTYPED="" S BSDXATOK=1
+"RTN","BSDX04",130,0)
+ ;E  D
+"RTN","BSDX04",131,0)
+ ;. F J=1:1:$L(BSDXTYPED,"|") I BSDXATID=$P(BSDXTYPED,"|",J) S BSDXATOK=1 Q
+"RTN","BSDX04",132,0)
+ ;Q:'BSDXATOK
+"RTN","BSDX04",133,0)
+ ;
+"RTN","BSDX04",134,0)
+ ;I +BSDXSRCH
+"RTN","BSDX04",135,0)
+ ;Screen for Weekday
+"RTN","BSDX04",136,0)
+ ;
+"RTN","BSDX04",137,0)
+ ;Screen for AM PM
+"RTN","BSDX04",138,0)
+ ;
+"RTN","BSDX04",139,0)
+ S BSDXZ=""
+"RTN","BSDX04",140,0)
+ S BSDXNSTART=$P(BSDXNOD,U,2)
+"RTN","BSDX04",141,0)
+ S BSDXNEND=$P(BSDXNOD,U,3)
+"RTN","BSDX04",142,0)
+ I BSDXNEND'>BSDXSTART Q  ;End is less than start
+"RTN","BSDX04",143,0)
+ I +BSDXBS=0 S BSDXBS=$P(BSDXNOD,U,2) ;First block start time
+"RTN","BSDX04",144,0)
+ F BSDXQ=2:1:3 D  ;Start and End times
+"RTN","BSDX04",145,0)
+ . S Y=$P(BSDXNOD,U,BSDXQ)
+"RTN","BSDX04",146,0)
+ . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",147,0)
+ . S BSDXZ=BSDXZ_Y_"^"
+"RTN","BSDX04",148,0)
+ S BSDXZ=BSDXZ_$P(BSDXNOD,U,4)_"^" ;SLOTS
+"RTN","BSDX04",149,0)
+ S BSDXZ=BSDXZ_BSDXRESN_"^" ;Resource name
+"RTN","BSDX04",150,0)
+ S BSDXZ=BSDXZ_BSDXATID_"^" ;Access type ID
+"RTN","BSDX04",151,0)
+ S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAB(BSDXAD,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX04",152,0)
+ . S BSDXNOT=BSDXNOT_$G(^BSDXAB(BSDXAD,1,BSDXQ,0))_" "
+"RTN","BSDX04",153,0)
+ S BSDXZ=BSDXZ_BSDXNOT ;_"^"
+"RTN","BSDX04",154,0)
+ ;I '+BSDXSRCH,BSDXPEND,BSDXNSTART>BSDXPEND D  ;Fill in gap between appointment
+"RTN","BSDX04",155,0)
+ I BSDXPEND,BSDXNSTART>BSDXPEND D  ;Fill in gap between appointment
+"RTN","BSDX04",156,0)
+ . S Y=BSDXPEND X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",157,0)
+ . S BSDXTMP=Y
+"RTN","BSDX04",158,0)
+ . S Y=BSDXNSTART X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX04",159,0)
+ . S BSDXTMP=BSDXTMP_"^"_Y_"^0^"_BSDXRESN_"^0^^0"_$C(30)
+"RTN","BSDX04",160,0)
+ . S ^BSDXTMP($J,BSDXI-1)=BSDXTMP
+"RTN","BSDX04",161,0)
+ S BSDXPEND=BSDXNEND
+"RTN","BSDX04",162,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXZ_"^"_BSDXAD_$C(30)
+"RTN","BSDX04",163,0)
+ S BSDXI=BSDXI+2
+"RTN","BSDX04",164,0)
+ Q
+"RTN","BSDX05")
+0^5^B10878471
+"RTN","BSDX05",1,0)
+BSDX05  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 5:36pm
+"RTN","BSDX05",2,0)
+    ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX05",3,0)
+    ;
+"RTN","BSDX05",4,0)
+    ; Change Log:
+"RTN","BSDX05",5,0)
+    ; UJO/SMH - July 11 2010: pass FM Dates for Start and End rather than US Dates
+"RTN","BSDX05",6,0)
+    ; UJO/SMH - Dec 8 2010: In STCOMM, the logic was that an appointment 
+"RTN","BSDX05",7,0)
+    ;  that was a walk-in didn't count towards slot calculations.
+"RTN","BSDX05",8,0)
+    ;  I checked PIMS, and Walk-ins do indeed count towards slot calculations.
+"RTN","BSDX05",9,0)
+    ;  Therefore, I commented this line out:
+"RTN","BSDX05",10,0)
+    ;    ;Q:$P(BSDXNOD,U,13)="y"  ;WALKIN
+"RTN","BSDX05",11,0)
+    ;
+"RTN","BSDX05",12,0)
+APBLKOV(BSDXY,BSDXSTART,BSDXEND,BSDXRES)     ;EP
+"RTN","BSDX05",13,0)
+    ;Called by BSDX APPT BLOCKS OVERLAP
+"RTN","BSDX05",14,0)
+       ; July 11 2010 - pass FM Dates for Start and End rather than US Dates
+"RTN","BSDX05",15,0)
+    ;(Duplicates old qryAppointmentBlocksOverlapB)
+"RTN","BSDX05",16,0)
+    ;BSDXRES is resource name
+"RTN","BSDX05",17,0)
+    ;
+"RTN","BSDX05",18,0)
+    ;Test lines:
+"RTN","BSDX05",19,0)
+    ;D APBLKOV^BSDX05(.RES,"11-8-2000","11-8-2004","WHITT") ZW RES
+"RTN","BSDX05",20,0)
+    ;BSDX APPT BLOCKS OVERLAP^11-8-2000^11-8-2004^WHITT
+"RTN","BSDX05",21,0)
+    ;S ^HW("BSDXD05")=BSDXSTART_U_BSDXEND_U_BSDXRES
+"RTN","BSDX05",22,0)
+    ;
+"RTN","BSDX05",23,0)
+    N BSDXERR,BSDXIEN,BSDXDEP,BSDXBS,BSDXI,BSDXNEND,BSDXNSTART,BSDXPEND,BSDXRESD,BSDXRESN,BSDXS,BSDXAD,BSDXNOD
+"RTN","BSDX05",24,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX05",25,0)
+    S BSDXERR=""
+"RTN","BSDX05",26,0)
+    S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX05",27,0)
+    S ^BSDXTMP($J,0)="D00030START_TIME^D00030END_TIME"_$C(30)
+"RTN","BSDX05",28,0)
+    D
+"RTN","BSDX05",29,0)
+    . S BSDXBS=0
+"RTN","BSDX05",30,0)
+    . S BSDXEND=BSDXEND+.9999 ;Go to end of day
+"RTN","BSDX05",31,0)
+    . S BSDXRESN=BSDXRES
+"RTN","BSDX05",32,0)
+    . Q:BSDXRESN=""
+"RTN","BSDX05",33,0)
+    . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX05",34,0)
+    . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX05",35,0)
+    . Q:'+BSDXRESD
+"RTN","BSDX05",36,0)
+    . Q:'$D(^BSDXAPPT("ARSRC",BSDXRESD))
+"RTN","BSDX05",37,0)
+    . D STRES(BSDXRESD,BSDXSTART,BSDXEND)
+"RTN","BSDX05",38,0)
+    . Q
+"RTN","BSDX05",39,0)
+    ;
+"RTN","BSDX05",40,0)
+    S BSDXI=$G(BSDXI)+1
+"RTN","BSDX05",41,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX05",42,0)
+    Q
+"RTN","BSDX05",43,0)
+    ;
+"RTN","BSDX05",44,0)
+STRES(BSDXRESD,BSDXSTART,BSDXEND)   ;
+"RTN","BSDX05",45,0)
+    ;$O THRU "ARSRC" XREF OF ^BSDXAPPT
+"RTN","BSDX05",46,0)
+    ;Start at the beginning of the day -- appts can't overlap days
+"RTN","BSDX05",47,0)
+    S BSDXS=$P(BSDXSTART,"."),BSDXS=BSDXS-.0001
+"RTN","BSDX05",48,0)
+    S BSDXI=0
+"RTN","BSDX05",49,0)
+    F  S BSDXS=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX05",50,0)
+    . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D STCOMM(BSDXAD) ;BSDXAD Is the AppointmentID
+"RTN","BSDX05",51,0)
+    . Q
+"RTN","BSDX05",52,0)
+    Q
+"RTN","BSDX05",53,0)
+    ;
+"RTN","BSDX05",54,0)
+STCOMM(BSDXAD)  ;
+"RTN","BSDX05",55,0)
+    S BSDXNEND=0,BSDXNSTART=0,BSDXPEND=0
+"RTN","BSDX05",56,0)
+    Q:'$D(^BSDXAPPT(BSDXAD,0))
+"RTN","BSDX05",57,0)
+    S BSDXNOD=^BSDXAPPT(BSDXAD,0)
+"RTN","BSDX05",58,0)
+    Q:$P(BSDXNOD,U,10)=1  ;NO-SHOW Flag
+"RTN","BSDX05",59,0)
+    Q:$P(BSDXNOD,U,12)]""  ;CANCELLED APPT
+"RTN","BSDX05",60,0)
+    ; Q:$P(BSDXNOD,U,13)="y"  ;WALKIN -- new in V 1.42. See top comments.
+"RTN","BSDX05",61,0)
+    S BSDXNSTART=$P(BSDXNOD,U)
+"RTN","BSDX05",62,0)
+    S BSDXNEND=$P(BSDXNOD,U,2)
+"RTN","BSDX05",63,0)
+    I BSDXNEND'>BSDXSTART Q  ;End is less than start
+"RTN","BSDX05",64,0)
+    S Y=BSDXNSTART X ^DD("DD") S BSDXNSTART=$TR(Y,"@"," ")
+"RTN","BSDX05",65,0)
+    S Y=BSDXNEND X ^DD("DD") S BSDXNEND=$TR(Y,"@"," ")
+"RTN","BSDX05",66,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX05",67,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXNSTART_U_BSDXNEND_$C(30)
+"RTN","BSDX05",68,0)
+    Q
+"RTN","BSDX06")
+0^6^B6812445
+"RTN","BSDX06",1,0)
+BSDX06 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 4:51pm
+"RTN","BSDX06",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX06",3,0)
+    ; Change Log:
+"RTN","BSDX06",4,0)
+    ; UJO/SMH: July 15 2010: Change in BSDXSTART and BSDXEND: get
+"RTN","BSDX06",5,0)
+    ; dates in FM format for i18n
+"RTN","BSDX06",6,0)
+ ;
+"RTN","BSDX06",7,0)
+ ;
+"RTN","BSDX06",8,0)
+TPBLKOV(BSDXY,BSDXSTART,BSDXEND,BSDXRES)  ;EP
+"RTN","BSDX06",9,0)
+ ;Called by BSDXD TYPE BLOCKS OVERLAP
+"RTN","BSDX06",10,0)
+ ;(Duplicates old qryTypeBlocksOverlapB)
+"RTN","BSDX06",11,0)
+ ;BSDXRES is resource name
+"RTN","BSDX06",12,0)
+ ;
+"RTN","BSDX06",13,0)
+ ;Test lines:
+"RTN","BSDX06",14,0)
+ ;D TPBLKOV^BSDX06(.RES,"3030513","3030516","REMILLARD,MIKE") ZW RES
+"RTN","BSDX06",15,0)
+ ;BSDX TYPE BLOCKS OVERLAP^303513^3030516^REMILLARD,MIKE
+"RTN","BSDX06",16,0)
+ ;S ^HW("BSDXD06")=BSDXSTART_U_BSDXEND_U_BSDXRES
+"RTN","BSDX06",17,0)
+ ;
+"RTN","BSDX06",18,0)
+ N BSDXERR,BSDXIEN,BSDXDEP,BSDXBS,BSDXI,BSDXNEND,BSDXNSTART,BSDXPEND,BSDXRESD,BSDXRESN,BSDXS,BSDXTPID,BSDXNOD,BSDXAD
+"RTN","BSDX06",19,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX06",20,0)
+ S BSDXERR=""
+"RTN","BSDX06",21,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX06",22,0)
+ S ^BSDXTMP($J,0)="D00030StartTime^D00030EndTime^I00010AppointmentTypeID^I00010AvailabilityID^T00030ResourceName"_$C(30)
+"RTN","BSDX06",23,0)
+ S BSDXI=0
+"RTN","BSDX06",24,0)
+ D
+"RTN","BSDX06",25,0)
+ . S BSDXBS=0
+"RTN","BSDX06",26,0)
+ . I $L(BSDXEND,".")=1 S BSDXEND=BSDXEND+.9999 ;Go to end of day if only date (not time) is passed
+"RTN","BSDX06",27,0)
+ . S BSDXRESN=BSDXRES
+"RTN","BSDX06",28,0)
+ . Q:BSDXRESN=""
+"RTN","BSDX06",29,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX06",30,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX06",31,0)
+ . Q:'+BSDXRESD
+"RTN","BSDX06",32,0)
+ . D STCOMM(BSDXRESN,BSDXRESD)
+"RTN","BSDX06",33,0)
+ . Q
+"RTN","BSDX06",34,0)
+ ;
+"RTN","BSDX06",35,0)
+ S BSDXI=$G(BSDXI)+1
+"RTN","BSDX06",36,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX06",37,0)
+ Q
+"RTN","BSDX06",38,0)
+ ;
+"RTN","BSDX06",39,0)
+STCOMM(BSDXRESN,BSDXRESD) ;EP
+"RTN","BSDX06",40,0)
+ ;
+"RTN","BSDX06",41,0)
+ Q:'$D(^BSDXAB("ARSCT",BSDXRESD))
+"RTN","BSDX06",42,0)
+ Q:'$D(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX06",43,0)
+ ;$O THRU "ARSCT" XREF OF ^BSDXAB
+"RTN","BSDX06",44,0)
+ S BSDXNEND=0,BSDXNSTART=0,BSDXPEND=0
+"RTN","BSDX06",45,0)
+ ;Start at the beginning of the day -- AV Blocks can't overlap days
+"RTN","BSDX06",46,0)
+ S BSDXS=$P(BSDXSTART,"."),BSDXS=BSDXS-.0001
+"RTN","BSDX06",47,0)
+ F  S BSDXS=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+"RTN","BSDX06",48,0)
+ . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D
+"RTN","BSDX06",49,0)
+ . . Q:'$D(^BSDXAB(BSDXAD,0))
+"RTN","BSDX06",50,0)
+ . . S BSDXNOD=^BSDXAB(BSDXAD,0)
+"RTN","BSDX06",51,0)
+ . . S BSDXNSTART=$P(BSDXNOD,U,2)
+"RTN","BSDX06",52,0)
+ . . S BSDXNEND=$P(BSDXNOD,U,3)
+"RTN","BSDX06",53,0)
+ . . I BSDXNEND'>BSDXSTART Q
+"RTN","BSDX06",54,0)
+ . . S Y=BSDXNSTART X ^DD("DD") S BSDXNSTART=$TR(Y,"@"," ")
+"RTN","BSDX06",55,0)
+ . . S Y=BSDXNEND X ^DD("DD") S BSDXNEND=$TR(Y,"@"," ")
+"RTN","BSDX06",56,0)
+ . . S BSDXTPID=$P(BSDXNOD,U,5)
+"RTN","BSDX06",57,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX06",58,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXNSTART_U_BSDXNEND_U_BSDXTPID_U_BSDXAD_U_BSDXRESN_$C(30)
+"RTN","BSDX06",59,0)
+ . . Q
+"RTN","BSDX06",60,0)
+ . Q
+"RTN","BSDX06",61,0)
+ Q
+"RTN","BSDX07")
+0^7^B192418956
+"RTN","BSDX07",1,0)
+BSDX07 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS  ; 3/15/11 11:50am
+"RTN","BSDX07",2,0)
+    ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX07",3,0)
+    ;
+"RTN","BSDX07",4,0)
+    ; Change Log:
+"RTN","BSDX07",5,0)
+    ; UJO/SMH
+"RTN","BSDX07",6,0)
+    ; v1.3 July 13 2010 - Add support i18n - Dates input as FM dates, not US.
+"RTN","BSDX07",7,0)
+    ; v1.42 Oct 22 2010 - Transaction now restartable by providing arguments
+"RTN","BSDX07",8,0)
+    ;   thanks to Rick Marshall and Zach Gonzalez at Oroville.
+"RTN","BSDX07",9,0)
+    ; v1.42 Oct 30 2010 - Extensive refactoring.
+"RTN","BSDX07",10,0)
+    ; v1.5  Mar 15 2011 - End time does not have to have time anymore.
+"RTN","BSDX07",11,0)
+    ;      It could be midnight of the next day
+"RTN","BSDX07",12,0)
+    ;
+"RTN","BSDX07",13,0)
+    ; Error Reference:
+"RTN","BSDX07",14,0)
+    ; -1: Patient Record is locked. This means something is wrong!!!!
+"RTN","BSDX07",15,0)
+    ; -2: Start Time is not a valid Fileman date
+"RTN","BSDX07",16,0)
+    ; -3: End Time is not a valid Fileman date
+"RTN","BSDX07",17,0)
+    ; v1.5:obsolete::-4: End Time does not have time inside of it.
+"RTN","BSDX07",18,0)
+    ; -5: BSDXPATID is not numeric
+"RTN","BSDX07",19,0)
+    ; -6: Patient Does not exist in ^DPT
+"RTN","BSDX07",20,0)
+    ; -7: Resource Name does not exist in B index of BSDX RESOURCE
+"RTN","BSDX07",21,0)
+    ; -8: Resouce doesn't exist in ^BSDXRES
+"RTN","BSDX07",22,0)
+    ; -9: Couldn't add appointment to BSDX APPOINTMENT
+"RTN","BSDX07",23,0)
+    ; -10: Couldn't add appointment to files 2 and/or 44
+"RTN","BSDX07",24,0)
+    ; -100: Mumps Error
+"RTN","BSDX07",25,0)
+ 
+"RTN","BSDX07",26,0)
+APPADDD(BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID)    ;EP
+"RTN","BSDX07",27,0)
+    ;Entry point for debugging
+"RTN","BSDX07",28,0)
+    D DEBUG^%Serenji("APPADD^BSDX07(.BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID)")
+"RTN","BSDX07",29,0)
+    Q
+"RTN","BSDX07",30,0)
+    ;
+"RTN","BSDX07",31,0)
+UT ; Unit Tests
+"RTN","BSDX07",32,0)
+    N ZZZ
+"RTN","BSDX07",33,0)
+    ; Test for bad start date
+"RTN","BSDX07",34,0)
+    D APPADD(.ZZZ,2100123,3100123.3,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",35,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-2 W "Error in -2",!
+"RTN","BSDX07",36,0)
+    ; Test for bad end date
+"RTN","BSDX07",37,0)
+    D APPADD(.ZZZ,3100123,2100123.3,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",38,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-3 W "Error in -3",!
+"RTN","BSDX07",39,0)
+    ; Test for end date without time
+"RTN","BSDX07",40,0)
+    D APPADD(.ZZZ,3100123.1,3100123,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",41,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-4 W "Error in -4",!
+"RTN","BSDX07",42,0)
+    ; Test for mumps error
+"RTN","BSDX07",43,0)
+    S bsdxdie=1
+"RTN","BSDX07",44,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,2,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",45,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-100 W "Error in -100: M Error",!
+"RTN","BSDX07",46,0)
+    K bsdxdie
+"RTN","BSDX07",47,0)
+    ; Test for TRESTART
+"RTN","BSDX07",48,0)
+    s bsdxrestart=1
+"RTN","BSDX07",49,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",50,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=0&(+$P(^BSDXTMP($J,1),U,2)'=-10) W "Error in TRESTART",!
+"RTN","BSDX07",51,0)
+    k bsdxrestart
+"RTN","BSDX07",52,0)
+    ; Test for non-numeric patient
+"RTN","BSDX07",53,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,"CAT,DOG","Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",54,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-5 W "Error in -5",!
+"RTN","BSDX07",55,0)
+    ; Test for a non-existent patient
+"RTN","BSDX07",56,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,8989898989,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",57,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-6 W "Error in -6",!
+"RTN","BSDX07",58,0)
+    ; Test for a non-existent resource name
+"RTN","BSDX07",59,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"lkajsflkjsadf",30,"Sam's Note",1)
+"RTN","BSDX07",60,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-7 W "Error in -7",!
+"RTN","BSDX07",61,0)
+    ; Test for corrupted resource
+"RTN","BSDX07",62,0)
+    ; Can't test for -8 since it requires DB corruption
+"RTN","BSDX07",63,0)
+    ; Test for inability to add appointment to BSDX Appointment
+"RTN","BSDX07",64,0)
+    ; Also requires something wrong in the DB
+"RTN","BSDX07",65,0)
+    ; Test for inability to add appointment to 2,44
+"RTN","BSDX07",66,0)
+    ; Test by creating a duplicate appointment
+"RTN","BSDX07",67,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",68,0)
+    D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",69,0)
+    I +$P(^BSDXTMP($J,1),U,2)'=-10 W "Error in -10",!
+"RTN","BSDX07",70,0)
+    ; Test for normality:
+"RTN","BSDX07",71,0)
+    D APPADD(.ZZZ,3110123.09,3110123.093,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX07",72,0)
+    ; Does Appt exist?
+"RTN","BSDX07",73,0)
+    N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX07",74,0)
+    I 'APPID W "Error Making Appt-1" QUIT
+"RTN","BSDX07",75,0)
+    I +^BSDXAPPT(APPID,0)'=3110123.09 W "Error Making Appt-2"
+"RTN","BSDX07",76,0)
+    I '$D(^DPT(3,"S",3110123.09)) W "Error Making Appt-3"
+"RTN","BSDX07",77,0)
+    I '$D(^SC(2,"S",3110123.09)) W "Error Making Appt-4"
+"RTN","BSDX07",78,0)
+    QUIT
+"RTN","BSDX07",79,0)
+    ; 
+"RTN","BSDX07",80,0)
+APPADD(BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID) ;EP
+"RTN","BSDX07",81,0)
+    ;Called by RPC: BSDX ADD NEW APPOINTMENT
+"RTN","BSDX07",82,0)
+    ;
+"RTN","BSDX07",83,0)
+    ;Add new appointment to 3 files
+"RTN","BSDX07",84,0)
+    ; - BSDX APPOINTMENT
+"RTN","BSDX07",85,0)
+    ; - Hosp Location Appointment SubSubfile if Resource is linked to clinic
+"RTN","BSDX07",86,0)
+    ; - Patient Appointment Subfile if Resource is linked to clinic
+"RTN","BSDX07",87,0)
+    ;
+"RTN","BSDX07",88,0)
+    ;Paramters:
+"RTN","BSDX07",89,0)
+    ;BSDXY: Global Return (RPC must be set to Global Array)
+"RTN","BSDX07",90,0)
+    ;BSDXSTART: FM Start Date
+"RTN","BSDX07",91,0)
+    ;BSDXEND: FM End Date
+"RTN","BSDX07",92,0)
+    ;BSDXPATID: Patient DFN
+"RTN","BSDX07",93,0)
+    ;BSDXRES is ResourceName in BSDX RESOURCE file (not IEN)
+"RTN","BSDX07",94,0)
+    ;BSDXLEN is the appointment duration in minutes
+"RTN","BSDX07",95,0)
+    ;BSDXNOTE is the Appiontment Note
+"RTN","BSDX07",96,0)
+    ;BSDXATID is used for 2 purposes:
+"RTN","BSDX07",97,0)
+    ; if BSDXATID = "WALKIN" then BSDAPI is called to create a walkin appt.
+"RTN","BSDX07",98,0)
+    ; if BSDXATID = a number, then it is the access type id (used for rebooking)
+"RTN","BSDX07",99,0)
+    ;
+"RTN","BSDX07",100,0)
+    ;Return:
+"RTN","BSDX07",101,0)
+    ; ADO.net Recordset having fields:
+"RTN","BSDX07",102,0)
+    ; AppointmentID and ErrorNumber
+"RTN","BSDX07",103,0)
+    ;
+"RTN","BSDX07",104,0)
+    ;Test lines:
+"RTN","BSDX07",105,0)
+    ;BSDX ADD NEW APPOINTMENT^3091122.0930^3091122.1000^370^Dr Office^30^EXAM^WALKIN
+"RTN","BSDX07",106,0)
+    ;
+"RTN","BSDX07",107,0)
+    ; Return Array; set Return and clear array
+"RTN","BSDX07",108,0)
+    S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX07",109,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX07",110,0)
+    ; $ET
+"RTN","BSDX07",111,0)
+    N $ET S $ET="G ETRAP^BSDX07"
+"RTN","BSDX07",112,0)
+    ; Counter
+"RTN","BSDX07",113,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX07",114,0)
+    ; Lock BSDX node, only to synchronize access to the globals.
+"RTN","BSDX07",115,0)
+    ; It's not expected that the error will ever happen as no filing
+"RTN","BSDX07",116,0)
+    ; is supposed to take 5 seconds.
+"RTN","BSDX07",117,0)
+    L +^BSDXAPPT(BSDXPATID):5 I '$T D ERR(BSDXI,"-1~Patient record is locked. Please contact technical support.") Q
+"RTN","BSDX07",118,0)
+    ; Header Node
+"RTN","BSDX07",119,0)
+    S ^BSDXTMP($J,BSDXI)="I00020APPOINTMENTID^T00100ERRORID"_$C(30)
+"RTN","BSDX07",120,0)
+    ;Restartable Transaction; restore paramters when starting.
+"RTN","BSDX07",121,0)
+    ; (Params restored are what's passed here + BSDXI)
+"RTN","BSDX07",122,0)
+    TSTART (BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID,BSDXI):T="BSDX ADD NEW APPOINTMENT^BSDX07"
+"RTN","BSDX07",123,0)
+    ;
+"RTN","BSDX07",124,0)
+    ; Turn off SDAM APPT PROTOCOL BSDX Entries
+"RTN","BSDX07",125,0)
+    N BSDXNOEV
+"RTN","BSDX07",126,0)
+    S BSDXNOEV=1 ;Don't execute BSDX ADD APPOINTMENT protocol
+"RTN","BSDX07",127,0)
+    ;
+"RTN","BSDX07",128,0)
+    ; Set Error Message to be empty
+"RTN","BSDX07",129,0)
+    N BSDXERR S BSDXERR=0
+"RTN","BSDX07",130,0)
+    ;
+"RTN","BSDX07",131,0)
+    ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX07",132,0)
+    I $G(bsdxdie) S X=1/0
+"RTN","BSDX07",133,0)
+    ;;;test
+"RTN","BSDX07",134,0)
+    ;;;test for TRESTART
+"RTN","BSDX07",135,0)
+    I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX07",136,0)
+    ;;;test
+"RTN","BSDX07",137,0)
+    ;
+"RTN","BSDX07",138,0)
+    ; -- Start and End Date Processing --
+"RTN","BSDX07",139,0)
+    ; If C# sends the dates with extra zeros, remove them
+"RTN","BSDX07",140,0)
+    S BSDXSTART=+BSDXSTART,BSDXEND=+BSDXEND
+"RTN","BSDX07",141,0)
+    ; Are the dates valid? Must be FM Dates > than 2010
+"RTN","BSDX07",142,0)
+    I BSDXSTART'>3100000 D ERR(BSDXI,"-2~BSDX07 Error: Invalid Start Time") Q
+"RTN","BSDX07",143,0)
+    I BSDXEND'>3100000 D ERR(BSDXI,"-3~BSDX07 Error: Invalid End Time") Q
+"RTN","BSDX07",144,0)
+    ;
+"RTN","BSDX07",145,0)
+    ;; If Ending date doesn't have a time, this is an error --rm 1.5
+"RTN","BSDX07",146,0)
+    ; I $L(BSDXEND,".")=1 D ERR(BSDXI,"-4~BSDX07 Error: Invalid End Time") Q
+"RTN","BSDX07",147,0)
+    ;
+"RTN","BSDX07",148,0)
+    ; If the Start Date is greater than the end date, swap dates
+"RTN","BSDX07",149,0)
+    N BSDXTMP
+"RTN","BSDX07",150,0)
+    I BSDXSTART>BSDXEND S BSDXTMP=BSDXEND,BSDXEND=BSDXSTART,BSDXSTART=BSDXTMP
+"RTN","BSDX07",151,0)
+    ;
+"RTN","BSDX07",152,0)
+    ; Check if the patient exists:
+"RTN","BSDX07",153,0)
+    ; - DFN valid number?
+"RTN","BSDX07",154,0)
+    ; - Valid Patient in file 2?
+"RTN","BSDX07",155,0)
+    I '+BSDXPATID D ERR(BSDXI,"-5~BSDX07 Error: Invalid Patient ID") Q 
+"RTN","BSDX07",156,0)
+    I '$D(^DPT(BSDXPATID,0)) D ERR(BSDXI,"-6~BSDX07 Error: Invalid Patient ID") Q
+"RTN","BSDX07",157,0)
+    ;
+"RTN","BSDX07",158,0)
+    ;Validate Resource entry
+"RTN","BSDX07",159,0)
+    I '$D(^BSDXRES("B",BSDXRES)) D ERR(BSDXI,"-7~BSDX07 Error: Invalid Resource ID") Q
+"RTN","BSDX07",160,0)
+    N BSDXRESD ; Resource IEN
+"RTN","BSDX07",161,0)
+    S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0))
+"RTN","BSDX07",162,0)
+    N BSDXRNOD ; Resouce zero node
+"RTN","BSDX07",163,0)
+    S BSDXRNOD=$G(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX07",164,0)
+    I BSDXRNOD="" D ERR(BSDXI,"-8~BSDX07 Error: invalid Resource entry.") Q
+"RTN","BSDX07",165,0)
+    ;
+"RTN","BSDX07",166,0)
+    ; Walk-in (Unscheduled) Appointment?
+"RTN","BSDX07",167,0)
+    N BSDXWKIN S BSDXWKIN=0
+"RTN","BSDX07",168,0)
+    I BSDXATID="WALKIN" S BSDXWKIN=1
+"RTN","BSDX07",169,0)
+    ; Reset Access Type ID if it doesn't say "WALKIN" and isn't a number
+"RTN","BSDX07",170,0)
+    I BSDXATID'?.N&(BSDXATID'="WALKIN") S BSDXATID=""
+"RTN","BSDX07",171,0)
+    ;
+"RTN","BSDX07",172,0)
+    ; Done with all checks, let's make appointment in BSDX APPOINTMENT
+"RTN","BSDX07",173,0)
+    N BSDXAPPTID
+"RTN","BSDX07",174,0)
+    S BSDXAPPTID=$$BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRESD,BSDXATID)
+"RTN","BSDX07",175,0)
+    I 'BSDXAPPTID D ERR(BSDXI,"-9~BSDX07 Error: Unable to add appointment to BSDX APPOINTMENT file.") Q
+"RTN","BSDX07",176,0)
+    I BSDXNOTE]"" D BSDXWP(BSDXAPPTID,BSDXNOTE)
+"RTN","BSDX07",177,0)
+    ;
+"RTN","BSDX07",178,0)
+    ; Then Create Subfiles in 2/44 Appointment
+"RTN","BSDX07",179,0)
+    N BSDXSCD S BSDXSCD=$P(BSDXRNOD,U,4)  ; Hosp Location IEN
+"RTN","BSDX07",180,0)
+    ; Only if we have a valid Hosp Loc can we make an appointment
+"RTN","BSDX07",181,0)
+    I +BSDXSCD,$D(^SC(BSDXSCD,0)) D  I +BSDXERR D ERR(BSDXI,"-10~BSDX07 Error: MAKE^BSDXAPI returned error code: "_BSDXERR) Q
+"RTN","BSDX07",182,0)
+    . N BSDXC
+"RTN","BSDX07",183,0)
+    . S BSDXC("PAT")=BSDXPATID
+"RTN","BSDX07",184,0)
+    . S BSDXC("CLN")=BSDXSCD
+"RTN","BSDX07",185,0)
+    . S BSDXC("TYP")=3 ;3 for scheduled appts, 4 for walkins
+"RTN","BSDX07",186,0)
+    . S:BSDXWKIN BSDXC("TYP")=4
+"RTN","BSDX07",187,0)
+    . S BSDXC("ADT")=BSDXSTART
+"RTN","BSDX07",188,0)
+    . S BSDXC("LEN")=BSDXLEN
+"RTN","BSDX07",189,0)
+    . S BSDXC("OI")=$E($G(BSDXNOTE),1,150) ;File 44 has 150 character limit on OTHER field
+"RTN","BSDX07",190,0)
+    . S BSDXC("OI")=$TR(BSDXC("OI"),";"," ") ;No semicolons allowed by MAKE^BSDXAPI
+"RTN","BSDX07",191,0)
+    . S BSDXC("OI")=$$STRIP(BSDXC("OI")) ;Strip control characters from note
+"RTN","BSDX07",192,0)
+    . S BSDXC("USR")=DUZ
+"RTN","BSDX07",193,0)
+    . S BSDXERR=$$MAKE^BSDXAPI(.BSDXC)
+"RTN","BSDX07",194,0)
+    . Q:BSDXERR
+"RTN","BSDX07",195,0)
+    . ;Update RPMS Clinic availability
+"RTN","BSDX07",196,0)
+    . D AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN)
+"RTN","BSDX07",197,0)
+    . Q
+"RTN","BSDX07",198,0)
+    ;
+"RTN","BSDX07",199,0)
+    ;Return Recordset
+"RTN","BSDX07",200,0)
+    TCOMMIT
+"RTN","BSDX07",201,0)
+    L -^BSDXAPPT(BSDXPATID)
+"RTN","BSDX07",202,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",203,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXAPPTID_"^"_$C(30)
+"RTN","BSDX07",204,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",205,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX07",206,0)
+    Q
+"RTN","BSDX07",207,0)
+BSDXDEL(BSDXAPPTID) ;Deletes appointment BSDXAPPTID from BSDXAPPOINTMETN
+"RTN","BSDX07",208,0)
+    N DA,DIK
+"RTN","BSDX07",209,0)
+    S DIK="^BSDXAPPT(",DA=BSDXAPPTID
+"RTN","BSDX07",210,0)
+    D ^DIK
+"RTN","BSDX07",211,0)
+    Q
+"RTN","BSDX07",212,0)
+    ;
+"RTN","BSDX07",213,0)
+STRIP(BSDXZ)    ;Replace control characters with spaces
+"RTN","BSDX07",214,0)
+    N BSDXI
+"RTN","BSDX07",215,0)
+    F BSDXI=1:1:$L(BSDXZ) I (32>$A($E(BSDXZ,BSDXI))) S BSDXZ=$E(BSDXZ,1,BSDXI-1)_" "_$E(BSDXZ,BSDXI+1,999)
+"RTN","BSDX07",216,0)
+    Q BSDXZ
+"RTN","BSDX07",217,0)
+    ;
+"RTN","BSDX07",218,0)
+BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRESD,BSDXATID)  ;ADD BSDX APPOINTMENT ENTRY
+"RTN","BSDX07",219,0)
+    ;Returns ien in BSDXAPPT or 0 if failed
+"RTN","BSDX07",220,0)
+    ;Create entry in BSDX APPOINTMENT
+"RTN","BSDX07",221,0)
+    N BSDXAPPTID
+"RTN","BSDX07",222,0)
+    S BSDXFDA(9002018.4,"+1,",.01)=BSDXSTART
+"RTN","BSDX07",223,0)
+    S BSDXFDA(9002018.4,"+1,",.02)=BSDXEND
+"RTN","BSDX07",224,0)
+    S BSDXFDA(9002018.4,"+1,",.05)=BSDXPATID
+"RTN","BSDX07",225,0)
+    S BSDXFDA(9002018.4,"+1,",.07)=BSDXRESD
+"RTN","BSDX07",226,0)
+    S BSDXFDA(9002018.4,"+1,",.08)=$G(DUZ)
+"RTN","BSDX07",227,0)
+    S BSDXFDA(9002018.4,"+1,",.09)=$$NOW^XLFDT
+"RTN","BSDX07",228,0)
+    S:BSDXATID="WALKIN" BSDXFDA(9002018.4,"+1,",.13)="y"
+"RTN","BSDX07",229,0)
+    S:BSDXATID?.N BSDXFDA(9002018.4,"+1,",.06)=BSDXATID
+"RTN","BSDX07",230,0)
+    N BSDXIEN,BSDXMSG
+"RTN","BSDX07",231,0)
+    D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX07",232,0)
+    S BSDXAPPTID=+$G(BSDXIEN(1))
+"RTN","BSDX07",233,0)
+    Q BSDXAPPTID
+"RTN","BSDX07",234,0)
+    ;
+"RTN","BSDX07",235,0)
+BSDXWP(BSDXAPPTID,BSDXNOTE) ;
+"RTN","BSDX07",236,0)
+    ;Add WP field
+"RTN","BSDX07",237,0)
+    I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX07",238,0)
+    I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX07",239,0)
+    I $D(BSDXNOTE(.5)) D
+"RTN","BSDX07",240,0)
+    . D WP^DIE(9002018.4,BSDXAPPTID_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX07",241,0)
+    Q
+"RTN","BSDX07",242,0)
+    ;
+"RTN","BSDX07",243,0)
+ADDEVT(BSDXPATID,BSDXSTART,BSDXSC,BSDXSCDA) ;EP
+"RTN","BSDX07",244,0)
+    ;Called by BSDX ADD APPOINTMENT protocol
+"RTN","BSDX07",245,0)
+    ;BSDXSC=IEN of clinic in ^SC
+"RTN","BSDX07",246,0)
+    ;BSDXSCDA=IEN for ^SC(BSDXSC,"S",BSDXSTART,1,BSDXSCDA). Use to get Length & Note
+"RTN","BSDX07",247,0)
+    ;
+"RTN","BSDX07",248,0)
+    N BSDXNOD,BSDXLEN,BSDXAPPTID,BSDXNODP,BSDXWKIN,BSDXRES
+"RTN","BSDX07",249,0)
+    Q:+$G(BSDXNOEV)
+"RTN","BSDX07",250,0)
+    I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0))
+"RTN","BSDX07",251,0)
+    E  I $D(^BSDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0))
+"RTN","BSDX07",252,0)
+    Q:'+$G(BSDXRES)
+"RTN","BSDX07",253,0)
+    S BSDXNOD=$G(^SC(BSDXSC,"S",BSDXSTART,1,BSDXSCDA,0))
+"RTN","BSDX07",254,0)
+    Q:BSDXNOD=""
+"RTN","BSDX07",255,0)
+    S BSDXNODP=$G(^DPT(BSDXPATID,"S",BSDXSTART,0))
+"RTN","BSDX07",256,0)
+    S BSDXWKIN=""
+"RTN","BSDX07",257,0)
+    S:$P(BSDXNODP,U,7)=4 BSDXWKIN="WALKIN" ;Purpose of Visit field of DPT Appointment subfile
+"RTN","BSDX07",258,0)
+    S BSDXLEN=$P(BSDXNOD,U,2)
+"RTN","BSDX07",259,0)
+    Q:'+BSDXLEN
+"RTN","BSDX07",260,0)
+    S BSDXEND=$$FMADD^XLFDT(BSDXSTART,0,0,BSDXLEN,0)
+"RTN","BSDX07",261,0)
+    S BSDXAPPTID=$$BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXWKIN)
+"RTN","BSDX07",262,0)
+    Q:'+BSDXAPPTID
+"RTN","BSDX07",263,0)
+    S BSDXNOTE=$P(BSDXNOD,U,4)
+"RTN","BSDX07",264,0)
+    I BSDXNOTE]"" D BSDXWP(BSDXAPPTID,BSDXNOTE)
+"RTN","BSDX07",265,0)
+    D ADDEVT3(BSDXRES)
+"RTN","BSDX07",266,0)
+    Q
+"RTN","BSDX07",267,0)
+    ;
+"RTN","BSDX07",268,0)
+ADDEVT3(BSDXRES)    ;
+"RTN","BSDX07",269,0)
+    ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX07",270,0)
+    N BSDXRESN
+"RTN","BSDX07",271,0)
+    S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX07",272,0)
+    Q:BSDXRESN=""
+"RTN","BSDX07",273,0)
+    S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX07",274,0)
+    ;D EVENT^BSDX23("SCHEDULE-"_BSDXRESN,"","","")
+"RTN","BSDX07",275,0)
+    D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX07",276,0)
+    Q
+"RTN","BSDX07",277,0)
+    ;
+"RTN","BSDX07",278,0)
+ERR(BSDXI,BSDXERR)  ;Error processing
+"RTN","BSDX07",279,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",280,0)
+    S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX07",281,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX07",282,0)
+    S ^BSDXTMP($J,BSDXI)="0^"_BSDXERR_$C(30)
+"RTN","BSDX07",283,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX07",284,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX07",285,0)
+    L -^BSDXAPPT(BSDXPATID)
+"RTN","BSDX07",286,0)
+    Q
+"RTN","BSDX07",287,0)
+    ;
+"RTN","BSDX07",288,0)
+ETRAP   ;EP Error trap entry
+"RTN","BSDX07",289,0)
+    N $ET S $ET="D ^%ZTER HALT"  ; Emergency Error Trap
+"RTN","BSDX07",290,0)
+    ; Rollback, otherwise ^XTER will be empty from future rollback
+"RTN","BSDX07",291,0)
+    I $TL>0 TROLLBACK 
+"RTN","BSDX07",292,0)
+    D ^%ZTER
+"RTN","BSDX07",293,0)
+    S $EC=""  ; Clear Error
+"RTN","BSDX07",294,0)
+    ; Log error message and send to client
+"RTN","BSDX07",295,0)
+    I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX07",296,0)
+    D ERR(BSDXI,"-100~BSDX07 Error: "_$G(%ZTERZE))
+"RTN","BSDX07",297,0)
+    Q
+"RTN","BSDX07",298,0)
+    ;
+"RTN","BSDX07",299,0)
+DAY ;;^SUN^MON^TUES^WEDNES^THURS^FRI^SATUR
+"RTN","BSDX07",300,0)
+    ;
+"RTN","BSDX07",301,0)
+DOW S %=$E(X,1,3),Y=$E(X,4,5),Y=Y>2&'(%#4)+$E("144025036146",Y)
+"RTN","BSDX07",302,0)
+    F %=%:-1:281 S Y=%#4=1+1+Y
+"RTN","BSDX07",303,0)
+    S Y=$E(X,6,7)+Y#7
+"RTN","BSDX07",304,0)
+    Q
+"RTN","BSDX07",305,0)
+    ;
+"RTN","BSDX07",306,0)
+AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN)   ;Update RPMS Clinic availability
+"RTN","BSDX07",307,0)
+    ;SEE SDM1
+"RTN","BSDX07",308,0)
+    N Y,DFN
+"RTN","BSDX07",309,0)
+    N SL,STARTDAY,X,SC,SB,HSI,SI,STR,SDDIF,SDMAX,SDDATE,SDDMAX,SDSDATE,CCXN,MXOK,COV,SDPROG
+"RTN","BSDX07",310,0)
+    N X1,SDEDT,X2,SD,SM,SS,S,SDLOCK,ST,I
+"RTN","BSDX07",311,0)
+    S Y=BSDXSCD,DFN=BSDXPATID
+"RTN","BSDX07",312,0)
+    S SL=$G(^SC(+Y,"SL")),X=$P(SL,U,3),STARTDAY=$S($L(X):X,1:8),SC=Y,SB=STARTDAY-1/100,X=$P(SL,U,6),HSI=$S(X=1:X,X:X,1:4),SI=$S(X="":4,X<3:4,X:X,1:4),STR="#@!$* XXWVUTSRQPONMLKJIHGFEDCBA0123456789jklmnopqrstuvwxyz",SDDIF=$S(HSI<3:8/HSI,1:2) K Y
+"RTN","BSDX07",313,0)
+    ;Determine maximum days for scheduling
+"RTN","BSDX07",314,0)
+    S SDMAX(1)=$P($G(^SC(+SC,"SDP")),U,2) S:'SDMAX(1) SDMAX(1)=365
+"RTN","BSDX07",315,0)
+    S (SDMAX,SDDMAX)=$$FMADD^XLFDT(DT,SDMAX(1))
+"RTN","BSDX07",316,0)
+    S SDDATE=BSDXSTART
+"RTN","BSDX07",317,0)
+    S SDSDATE=SDDATE,SDDATE=SDDATE\1
+"RTN","BSDX07",318,0)
+1   ;L  Q:$D(SDXXX)  S CCXN=0 K MXOK,COV,SDPROT Q:DFN<0  S SC=+SC
+"RTN","BSDX07",319,0)
+    Q:$D(SDXXX)  S CCXN=0 K MXOK,COV,SDPROT Q:DFN<0  S SC=+SC
+"RTN","BSDX07",320,0)
+    S X1=DT,SDEDT=365 S:$D(^SC(SC,"SDP")) SDEDT=$P(^SC(SC,"SDP"),"^",2)
+"RTN","BSDX07",321,0)
+    S X2=SDEDT D C^%DTC S SDEDT=X
+"RTN","BSDX07",322,0)
+    S Y=BSDXSTART
+"RTN","BSDX07",323,0)
+EN1 S (X,SD)=Y,SM=0 D DOW
+"RTN","BSDX07",324,0)
+S   I '$D(^SC(SC,"ST",$P(SD,"."),1)) S SS=+$O(^SC(+SC,"T"_Y,SD)) Q:SS'>0  Q:^(SS,1)=""  S ^SC(+SC,"ST",$P(SD,"."),1)=$E($P($T(DAY),U,Y+2),1,2)_" "_$E(SD,6,7)_$J("",SI+SI-6)_^(1),^(0)=$P(SD,".")
+"RTN","BSDX07",325,0)
+    S S=BSDXLEN
+"RTN","BSDX07",326,0)
+    ;Check if BSDXLEN evenly divisible by appointment length
+"RTN","BSDX07",327,0)
+    S RPMSL=$P(SL,U)
+"RTN","BSDX07",328,0)
+    I BSDXLEN<RPMSL S BSDXLEN=RPMSL
+"RTN","BSDX07",329,0)
+    I BSDXLEN#RPMSL'=0 D
+"RTN","BSDX07",330,0)
+    . S BSDXINC=BSDXLEN\RPMSL
+"RTN","BSDX07",331,0)
+    . S BSDXINC=BSDXINC+1
+"RTN","BSDX07",332,0)
+    . S BSDXLEN=RPMSL*BSDXINC
+"RTN","BSDX07",333,0)
+    S SL=S_U_$P(SL,U,2,99)
+"RTN","BSDX07",334,0)
+SC  S SDLOCK=$S('$D(SDLOCK):1,1:SDLOCK+1) Q:SDLOCK>9
+"RTN","BSDX07",335,0)
+    L +^SC(SC,"ST",$P(SD,"."),1):5 G:'$T SC
+"RTN","BSDX07",336,0)
+    S SDLOCK=0,S=^SC(SC,"ST",$P(SD,"."),1)
+"RTN","BSDX07",337,0)
+    S I=SD#1-SB*100,ST=I#1*SI\.6+($P(I,".")*SI),SS=SL*HSI/60*SDDIF+ST+ST
+"RTN","BSDX07",338,0)
+    I (I<1!'$F(S,"["))&(S'["CAN") L -^SC(SC,"ST",$P(SD,"."),1) Q
+"RTN","BSDX07",339,0)
+    I SM<7 S %=$F(S,"[",SS-1) S:'%!($P(SL,"^",6)<3) %=999 I $F(S,"]",SS)'<%!(SDDIF=2&$E(S,ST+ST+1,SS-1)["[") S SM=7
+"RTN","BSDX07",340,0)
+    ;
+"RTN","BSDX07",341,0)
+SP  I ST+ST>$L(S),$L(S)<80 S S=S_" " G SP
+"RTN","BSDX07",342,0)
+    S SDNOT=1
+"RTN","BSDX07",343,0)
+    S ABORT=0
+"RTN","BSDX07",344,0)
+    F I=ST+ST:SDDIF:SS-SDDIF D  Q:ABORT
+"RTN","BSDX07",345,0)
+    . S ST=$E(S,I+1) S:ST="" ST=" "
+"RTN","BSDX07",346,0)
+    . S Y=$E(STR,$F(STR,ST)-2)
+"RTN","BSDX07",347,0)
+    . I S["CAN"!(ST="X"&($D(^SC(+SC,"ST",$P(SD,"."),"CAN")))) S ABORT=1 Q
+"RTN","BSDX07",348,0)
+    . I Y="" S ABORT=1 Q
+"RTN","BSDX07",349,0)
+    . S:Y'?1NL&(SM<6) SM=6 S ST=$E(S,I+2,999) S:ST="" ST=" " S S=$E(S,1,I)_Y_ST
+"RTN","BSDX07",350,0)
+    . Q
+"RTN","BSDX07",351,0)
+    S ^SC(SC,"ST",$P(SD,"."),1)=S
+"RTN","BSDX07",352,0)
+    L -^SC(SC,"ST",$P(SD,"."),1)
+"RTN","BSDX07",353,0)
+    Q
+"RTN","BSDX08")
+0^8^B118482818
+"RTN","BSDX08",1,0)
+BSDX08 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 1/25/11 12:39pm
+"RTN","BSDX08",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX08",3,0)
+ ; 
+"RTN","BSDX08",4,0)
+ ; Original by HMW. New Written by Sam Habiel. Licensed under LGPL.
+"RTN","BSDX08",5,0)
+ ; 
+"RTN","BSDX08",6,0)
+ ; Change History
+"RTN","BSDX08",7,0)
+ ; 3101022 UJO/SMH v1.42
+"RTN","BSDX08",8,0)
+ ;  - Transaction now restartable. Thanks to 
+"RTN","BSDX08",9,0)
+ ;   --> Zach Gonzalez and Rick Marshall for fix.
+"RTN","BSDX08",10,0)
+ ;  - Extra TROLLBACK in Lock Statement when lock fails.
+"RTN","BSDX08",11,0)
+ ;   --> Removed--Rollback is already in ERR tag.
+"RTN","BSDX08",12,0)
+ ;  - Added new statements to old SD code in AVUPDT to obviate
+"RTN","BSDX08",13,0)
+ ;   --> need to restore variables in transaction
+"RTN","BSDX08",14,0)
+ ;  - Refactored this chunk of code. Don't really know whether it 
+"RTN","BSDX08",15,0)
+ ;   --> worked in the first place. Waiting for bug report to know.
+"RTN","BSDX08",16,0)
+ ;  - Refactored all of APPDEL.
+"RTN","BSDX08",17,0)
+ ; 
+"RTN","BSDX08",18,0)
+ ; 3111125 UJO/SMH v1.5
+"RTN","BSDX08",19,0)
+ ;  - Added ability to remove checked in appointments. Added a couple
+"RTN","BSDX08",20,0)
+ ;    of units tests for that under UT2.
+"RTN","BSDX08",21,0)
+ ;  - Minor reformatting because of how KIDS adds tabs.
+"RTN","BSDX08",22,0)
+ ; 
+"RTN","BSDX08",23,0)
+ ; Error Reference:
+"RTN","BSDX08",24,0)
+ ;  -1~BSDX08: Appt record is locked. Please contact technical support.
+"RTN","BSDX08",25,0)
+ ;  -2~BSDX08: Invalid Appointment ID
+"RTN","BSDX08",26,0)
+ ;  -3~BSDX08: Invalid Appointment ID
+"RTN","BSDX08",27,0)
+ ;  -4~BSDX08: Cancelled appointment does not have a Resouce ID  
+"RTN","BSDX08",28,0)
+ ;  -5~BSDX08: Resouce ID does not exist in BSDX RESOURCE
+"RTN","BSDX08",29,0)
+ ;  -6~BSDX08: Invalid Hosp Location stored in Database
+"RTN","BSDX08",30,0)
+ ;  -7~BSDX08: Patient does not have an appointment in PIMS Clinic
+"RTN","BSDX08",31,0)
+ ;  -8^BSDX08: Unable to find associated PIMS appointment for this patient
+"RTN","BSDX08",32,0)
+ ;  -9^BSDX08: BSDXAPI returned an error: (error)
+"RTN","BSDX08",33,0)
+ ;  -100~BSDX08 Error: (Mumps Error)
+"RTN","BSDX08",34,0)
+ ;
+"RTN","BSDX08",35,0)
+APPDELD(BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT) ;EP
+"RTN","BSDX08",36,0)
+ ;Entry point for debugging
+"RTN","BSDX08",37,0)
+ D DEBUG^%Serenji("APPDEL^BSDX08(.BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT)")
+"RTN","BSDX08",38,0)
+ Q
+"RTN","BSDX08",39,0)
+ ;
+"RTN","BSDX08",40,0)
+UT ; Unit Tests
+"RTN","BSDX08",41,0)
+ ; Test 1: Make normal appointment and cancel it. See if every thing works
+"RTN","BSDX08",42,0)
+ N ZZZ
+"RTN","BSDX08",43,0)
+ D APPADD^BSDX07(.ZZZ,3110123.2,3110123.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",44,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",45,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Sam's Cancel Note")
+"RTN","BSDX08",46,0)
+ I $P(^BSDXAPPT(APPID,0),U,12)'>0 W "Error in Cancellation-1"
+"RTN","BSDX08",47,0)
+ I $O(^SC(2,"S",3110123.2,1,0))]"" W "Error in Cancellation-2"
+"RTN","BSDX08",48,0)
+ I $P(^DPT(4,"S",3110123.2,0),U,2)'="PC" W "Error in Cancellation-3"
+"RTN","BSDX08",49,0)
+ I ^DPT(4,"S",3110123.2,"R")'="Sam's Cancel Note" W "Error in Cancellation-4"
+"RTN","BSDX08",50,0)
+ ;
+"RTN","BSDX08",51,0)
+ ; Test 2: Check for -1
+"RTN","BSDX08",52,0)
+ ; Make appt
+"RTN","BSDX08",53,0)
+ D APPADD^BSDX07(.ZZZ,3110125.2,3110125.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",54,0)
+ ; Lock the node in another job
+"RTN","BSDX08",55,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",56,0)
+ ; W "Lock ^BSDXAPPT("_APPID_") in another session. You have 10 seconds." H 10
+"RTN","BSDX08",57,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Sam's Cancel Note")
+"RTN","BSDX08",58,0)
+ ;
+"RTN","BSDX08",59,0)
+ ; Test 3: Check for -100
+"RTN","BSDX08",60,0)
+ S bsdxdie=1
+"RTN","BSDX08",61,0)
+ D APPADD^BSDX07(.ZZZ,3110126.2,3110126.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",62,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",63,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Reasons")
+"RTN","BSDX08",64,0)
+ I $P(^BSDXTMP($J,1),"~")'=-100 W "Error in -100",!
+"RTN","BSDX08",65,0)
+ K bsdxdie
+"RTN","BSDX08",66,0)
+ ;
+"RTN","BSDX08",67,0)
+ ; Test 4: Restartable transaction
+"RTN","BSDX08",68,0)
+ S bsdxrestart=1
+"RTN","BSDX08",69,0)
+ D APPADD^BSDX07(.ZZZ,3110128.2,3110128.3,4,"Dr Office",10,"Sam's Note",1)
+"RTN","BSDX08",70,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",71,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Reasons")
+"RTN","BSDX08",72,0)
+ I $P(^DPT(4,"S",3110128.2,0),U,2)'="PC" W "Error in Restartable Transaction",!
+"RTN","BSDX08",73,0)
+ ;
+"RTN","BSDX08",74,0)
+ ; Test 5: for invalid Appointment ID (-2 and -3)
+"RTN","BSDX08",75,0)
+ D APPDEL^BSDX08(.ZZZ,0,"PC",1,"Reasons")
+"RTN","BSDX08",76,0)
+ I $P(^BSDXTMP($J,1),"~")'=-2 W "Error in -2",!
+"RTN","BSDX08",77,0)
+ D APPDEL^BSDX08(.ZZZ,999999,"PC",1,"Reasons")
+"RTN","BSDX08",78,0)
+ I $P(^BSDXTMP($J,1),"~")'=-3 W "Error in -3",!
+"RTN","BSDX08",79,0)
+UT2 ; More unit Tests
+"RTN","BSDX08",80,0)
+ ;
+"RTN","BSDX08",81,0)
+ ; Test 6: for Cancelling walkin and checked-in appointments 
+"RTN","BSDX08",82,0)
+ S BSDXSTART=$E($$NOW^XLFDT,1,12),BSDXEND=BSDXSTART+.0001
+"RTN","BSDX08",83,0)
+ D APPADD^BSDX07(.ZZZ,BSDXSTART,BSDXEND,4,"Dr Office",10,"Sam's Note",1) ; Add appt
+"RTN","BSDX08",84,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",85,0)
+ I APPID=0 W "Error in test 6",!
+"RTN","BSDX08",86,0)
+ D CHECKIN^BSDX25(.ZZZ,APPID,$$NOW^XLFDT) ; check-in
+"RTN","BSDX08",87,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",10,"Cancel Note") ; Delete appt
+"RTN","BSDX08",88,0)
+ I $P(^BSDXTMP($J,1),$C(30))'="" W "Error in test 6",!
+"RTN","BSDX08",89,0)
+ ;
+"RTN","BSDX08",90,0)
+ ; Test 7: for cancelling walkin and checked-in appointments
+"RTN","BSDX08",91,0)
+ S BSDXSTART=$E($$NOW^XLFDT,1,12)+.0001,BSDXEND=BSDXSTART+.0001
+"RTN","BSDX08",92,0)
+ D APPADD^BSDX07(.ZZZ,BSDXSTART,BSDXEND,4,"Dr Office",10,"Sam's Note",1) ; Add appt
+"RTN","BSDX08",93,0)
+ S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX08",94,0)
+ I APPID=0 W "Error in test 6",!
+"RTN","BSDX08",95,0)
+ D CHECKIN^BSDX25(.ZZZ,APPID,$$NOW^XLFDT) ; Checkin
+"RTN","BSDX08",96,0)
+ S BSDXRES=$O(^BSDXRES("B","Dr Office",""))
+"RTN","BSDX08",97,0)
+ S BSDXCLN=$P(^BSDXRES(BSDXRES,0),U,4)
+"RTN","BSDX08",98,0)
+ S BSDXRESULT=$$RMCI^BSDXAPI(4,BSDXCLN,BSDXSTART) ; remove checkin
+"RTN","BSDX08",99,0)
+ D APPDEL^BSDX08(.ZZZ,APPID,"PC",10,"Cancel Note") ; delete appt
+"RTN","BSDX08",100,0)
+ I $P(^BSDXTMP($J,1),$C(30))'="" W "Error in test 6",!
+"RTN","BSDX08",101,0)
+ QUIT
+"RTN","BSDX08",102,0)
+APPDEL(BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT)        ;EP
+"RTN","BSDX08",103,0)
+ ;Called by RPC: BSDX CANCEL APPOINTMENT
+"RTN","BSDX08",104,0)
+ ;Cancels existing appointment in BSDX APPOINTMENT and 44/2 subfiles
+"RTN","BSDX08",105,0)
+ ;Input Parameters:
+"RTN","BSDX08",106,0)
+ ; - BSDXAPTID is entry number in BSDX APPOINTMENT file
+"RTN","BSDX08",107,0)
+ ; - BSDXTYP is C for clinic-cancelled and PC for patient cancelled
+"RTN","BSDX08",108,0)
+ ; - BSDXCR is pointer to CANCELLATION REASON File (409.2)
+"RTN","BSDX08",109,0)
+ ; - BSDXNOT is user note
+"RTN","BSDX08",110,0)
+ ;
+"RTN","BSDX08",111,0)
+ ; Returns error code in recordset field ERRORID. Empty string is success.
+"RTN","BSDX08",112,0)
+ ; Returns Global Array. Must use this type in RPC.
+"RTN","BSDX08",113,0)
+ ;
+"RTN","BSDX08",114,0)
+ ; Return Array: set Return and clear array
+"RTN","BSDX08",115,0)
+ S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX08",116,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX08",117,0)
+ ;
+"RTN","BSDX08",118,0)
+ ; Set min DUZ vars if they don't exist
+"RTN","BSDX08",119,0)
+ D ^XBKVAR
+"RTN","BSDX08",120,0)
+ ;
+"RTN","BSDX08",121,0)
+ ; $ET
+"RTN","BSDX08",122,0)
+ N $ET S $ET="G ETRAP^BSDX08"
+"RTN","BSDX08",123,0)
+ ;
+"RTN","BSDX08",124,0)
+ ; Counter
+"RTN","BSDX08",125,0)
+ N BSDXI S BSDXI=0
+"RTN","BSDX08",126,0)
+ ; Header Node
+"RTN","BSDX08",127,0)
+ S ^BSDXTMP($J,BSDXI)="T00100ERRORID"_$C(30)
+"RTN","BSDX08",128,0)
+ ;
+"RTN","BSDX08",129,0)
+ ; Lock BSDX node, only to synchronize access to the globals.
+"RTN","BSDX08",130,0)
+ ; It's not expected that the error will ever happen as no filing
+"RTN","BSDX08",131,0)
+ ; is supposed to take 5 seconds.
+"RTN","BSDX08",132,0)
+ L +^BSDXAPPT(BSDXAPTID):5 I '$T D ERR(BSDXI,"-1~BSDX08: Appt record is locked. Please contact technical support.") Q
+"RTN","BSDX08",133,0)
+ ;
+"RTN","BSDX08",134,0)
+ ;Restartable Transaction; restore paramters when starting.
+"RTN","BSDX08",135,0)
+ ; (Params restored are what's passed here + BSDXI)
+"RTN","BSDX08",136,0)
+ TSTART (BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT,BSDXI):T="BSDX CANCEL APPOINTEMENT^BSDX08"
+"RTN","BSDX08",137,0)
+ ;
+"RTN","BSDX08",138,0)
+ ; Turn off SDAM APPT PROTOCOL BSDX Entries
+"RTN","BSDX08",139,0)
+ N BSDXNOEV
+"RTN","BSDX08",140,0)
+ S BSDXNOEV=1 ;Don't execute BSDX CANCEL APPOINTMENT protocol
+"RTN","BSDX08",141,0)
+ ;
+"RTN","BSDX08",142,0)
+ ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX08",143,0)
+ I $G(bsdxdie) S X=1/0
+"RTN","BSDX08",144,0)
+ ;;;test
+"RTN","BSDX08",145,0)
+ ;;;test for TRESTART
+"RTN","BSDX08",146,0)
+ I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX08",147,0)
+ ;;;test
+"RTN","BSDX08",148,0)
+ ;
+"RTN","BSDX08",149,0)
+ ; Check appointment ID and whether it exists
+"RTN","BSDX08",150,0)
+ I '+BSDXAPTID D ERR(BSDXI,"-2~BSDX08: Invalid Appointment ID") Q
+"RTN","BSDX08",151,0)
+ I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(BSDXI,"-3~BSDX08: Invalid Appointment ID") Q
+"RTN","BSDX08",152,0)
+ ;
+"RTN","BSDX08",153,0)
+ ; Start Processing:
+"RTN","BSDX08",154,0)
+ ; First, add cancellation date to appt entry in BSDX APPOINTMENT
+"RTN","BSDX08",155,0)
+ N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPTID,0) ; BSDX Appt Node
+"RTN","BSDX08",156,0)
+ N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) ; Patient ID
+"RTN","BSDX08",157,0)
+ N BSDXSTART S BSDXSTART=$P(BSDXNOD,U) ; Start Time
+"RTN","BSDX08",158,0)
+ D BSDXCAN(BSDXAPTID)  ; Add a cancellation date in BSDX APPOINTMENT
+"RTN","BSDX08",159,0)
+ ;
+"RTN","BSDX08",160,0)
+ ; Second, cancel appt in "S" nodes in file 2 and 44, then update Legacy PIMS Availability
+"RTN","BSDX08",161,0)
+ N BSDXSC1 S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID
+"RTN","BSDX08",162,0)
+ ; If the resouce id doesn't exist...
+"RTN","BSDX08",163,0)
+ I BSDXSC1="" D ERR(BSDXI,"-4~BSDX08: Cancelled appointment does not have a Resouce ID") QUIT
+"RTN","BSDX08",164,0)
+ I '$D(^BSDXRES(BSDXSC1,0)) D ERR(BSDXI,"-5~BSDX08: Resouce ID does not exist in BSDX RESOURCE") QUIT
+"RTN","BSDX08",165,0)
+ ; Get zero node of resouce
+"RTN","BSDX08",166,0)
+ S BSDXNOD=^BSDXRES(BSDXSC1,0)
+"RTN","BSDX08",167,0)
+ ; Get Hosp location
+"RTN","BSDX08",168,0)
+ N BSDXLOC S BSDXLOC=$P(BSDXNOD,U,4)
+"RTN","BSDX08",169,0)
+ ; Error indicator for Hosp Location filing for getting out of routine
+"RTN","BSDX08",170,0)
+ N BSDXERR S BSDXERR=0
+"RTN","BSDX08",171,0)
+ ; Only file in 2/44 if there is an associated hospital location
+"RTN","BSDX08",172,0)
+ I BSDXLOC D  QUIT:BSDXERR  
+"RTN","BSDX08",173,0)
+ . I '$D(^SC(BSDXLOC,0)) S BSDXERR=1 D ERR(BSDXI,"-6~BSDX08: Invalid Hosp Location stored in Database") QUIT
+"RTN","BSDX08",174,0)
+ . ; Get the IEN of the appointment in the "S" node of ^SC
+"RTN","BSDX08",175,0)
+ . N BSDXSCIEN
+"RTN","BSDX08",176,0)
+ . S BSDXSCIEN=$$SCIEN^BSDXAPI(BSDXPATID,BSDXLOC,BSDXSTART)
+"RTN","BSDX08",177,0)
+ . I BSDXSCIEN="" S BSDXERR=1 D ERR(BSDXI,"-7~BSDX08: Patient does not have an appointment in PIMS Clinic") QUIT
+"RTN","BSDX08",178,0)
+ . ; Get the appointment node
+"RTN","BSDX08",179,0)
+ . S BSDXNOD=$G(^SC(BSDXLOC,"S",BSDXSTART,1,BSDXSCIEN,0))
+"RTN","BSDX08",180,0)
+ . I BSDXNOD="" S BSDXERR=1 D ERR(BSDXI,"-8^BSDX08: Unable to find associated PIMS appointment for this patient") QUIT
+"RTN","BSDX08",181,0)
+ . N BSDXLEN S BSDXLEN=$P(BSDXNOD,U,2)
+"RTN","BSDX08",182,0)
+ . ; Cancel through BSDXAPI
+"RTN","BSDX08",183,0)
+ . N BSDXZ
+"RTN","BSDX08",184,0)
+ . D APCAN(.BSDXZ,BSDXLOC,BSDXPATID,BSDXSTART)
+"RTN","BSDX08",185,0)
+ . I +BSDXZ>0 S BSDXERR=1 D ERR(BSDXI,"-9^BSDX08: BSDXAPI returned an error: "_$P(BSDXZ,U,2)) QUIT
+"RTN","BSDX08",186,0)
+ . ; Update Legacy PIMS clinic Availability
+"RTN","BSDX08",187,0)
+ . D AVUPDT(BSDXLOC,BSDXSTART,BSDXLEN)
+"RTN","BSDX08",188,0)
+ ;
+"RTN","BSDX08",189,0)
+ TCOMMIT
+"RTN","BSDX08",190,0)
+ L -^BSDXAPPT(BSDXAPTID)
+"RTN","BSDX08",191,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",192,0)
+ S ^BSDXTMP($J,BSDXI)=""_$C(30)
+"RTN","BSDX08",193,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",194,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX08",195,0)
+ Q
+"RTN","BSDX08",196,0)
+ ;
+"RTN","BSDX08",197,0)
+AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN) ;Update Legacy PIMS Clinic availability
+"RTN","BSDX08",198,0)
+ ;See SDCNP0
+"RTN","BSDX08",199,0)
+ N SD,S  ; Start Date
+"RTN","BSDX08",200,0)
+ S (SD,S)=BSDXSTART 
+"RTN","BSDX08",201,0)
+ N I ; Clinic IEN in 44
+"RTN","BSDX08",202,0)
+ S I=BSDXSCD
+"RTN","BSDX08",203,0)
+ ; if day has no schedule in legacy PIMS, forget about this update.
+"RTN","BSDX08",204,0)
+ Q:'$D(^SC(I,"ST",SD\1,1))
+"RTN","BSDX08",205,0)
+ N SL ; Clinic characteristics node (length of appt, when appts start etc)
+"RTN","BSDX08",206,0)
+ S SL=^SC(I,"SL")
+"RTN","BSDX08",207,0)
+ N X ; Hour Clinic Display Begins
+"RTN","BSDX08",208,0)
+ S X=$P(SL,U,3)
+"RTN","BSDX08",209,0)
+ N STARTDAY ; When does the day start?
+"RTN","BSDX08",210,0)
+ S STARTDAY=$S($L(X):X,1:8) ; If defined, use it; otherwise, 8am
+"RTN","BSDX08",211,0)
+ N SB ; ?? Who knows? Day Start - 1 divided by 100.
+"RTN","BSDX08",212,0)
+ S SB=STARTDAY-1/100
+"RTN","BSDX08",213,0)
+ S X=$P(SL,U,6) ; Now X is Display increments per hour
+"RTN","BSDX08",214,0)
+ N HSI ; Slots per hour, try 1
+"RTN","BSDX08",215,0)
+ S HSI=$S(X:X,1:4) ; if defined, use it; otherwise, 4
+"RTN","BSDX08",216,0)
+ N SI ; Slots per hour, try 2
+"RTN","BSDX08",217,0)
+ S SI=$S(X="":4,X<3:4,X:X,1:4) ; If slots "", or less than 3, then 4
+"RTN","BSDX08",218,0)
+ N STR ; ??
+"RTN","BSDX08",219,0)
+ S STR="#@!$* XXWVUTSRQPONMLKJIHGFEDCBA0123456789jklmnopqrstuvwxyz"
+"RTN","BSDX08",220,0)
+ N SDDIF ; Slots per hour diff??
+"RTN","BSDX08",221,0)
+ S SDDIF=$S(HSI<3:8/HSI,1:2)
+"RTN","BSDX08",222,0)
+ S SL=BSDXLEN ; Dammit, reusing variable; SL now Appt Length from GUI
+"RTN","BSDX08",223,0)
+ S S=^SC(I,"ST",SD\1,1) ; reusing var again; S now Day Pattern from PIMS
+"RTN","BSDX08",224,0)
+ N Y ; Hours since start of Date
+"RTN","BSDX08",225,0)
+ S Y=SD#1-SB*100 ;SD#1=FM Time portion; -SB minus start of day; conv to hrs
+"RTN","BSDX08",226,0)
+ N ST  ; ??
+"RTN","BSDX08",227,0)
+ ; Y#1 -> Minutes; *SI -> * Slots per hour; \.6 trunc min to hour
+"RTN","BSDX08",228,0)
+ ; Y\1 -> Hours since start of day; * SI: * slots
+"RTN","BSDX08",229,0)
+ S ST=Y#1*SI\.6+(Y\1*SI) 
+"RTN","BSDX08",230,0)
+ N SS ; how many slots are supposed to be taken by appointment
+"RTN","BSDX08",231,0)
+ S SS=SL*HSI/60 ; (nb: try SL: 30 min; HSI: 4 slots)
+"RTN","BSDX08",232,0)
+ N I
+"RTN","BSDX08",233,0)
+ I Y'<1 D  ; If Hours since start of Date is greater than 1
+"RTN","BSDX08",234,0)
+ . ; loop through pattern. Tired of documenting.
+"RTN","BSDX08",235,0)
+ . F I=ST+ST:SDDIF D  Q:Y=""  Q:SS'>0
+"RTN","BSDX08",236,0)
+ . . S Y=$E(STR,$F(STR,$E(S,I+1))) Q:Y=""  
+"RTN","BSDX08",237,0)
+ . . S S=$E(S,1,I)_Y_$E(S,I+2,999)
+"RTN","BSDX08",238,0)
+ . . S SS=SS-1 
+"RTN","BSDX08",239,0)
+ . . Q:SS'>0
+"RTN","BSDX08",240,0)
+ S ^SC(BSDXSCD,"ST",SD\1,1)=S  ; new pattern; global set
+"RTN","BSDX08",241,0)
+ Q
+"RTN","BSDX08",242,0)
+ ;
+"RTN","BSDX08",243,0)
+APCAN(BSDXZ,BSDXLOC,BSDXDFN,BSDXSD)         ;
+"RTN","BSDX08",244,0)
+ ;Cancel appointment for patient BSDXDFN in clinic BSDXSC1
+"RTN","BSDX08",245,0)
+ ;at time BSDXSD
+"RTN","BSDX08",246,0)
+ N BSDXC,%H
+"RTN","BSDX08",247,0)
+ S BSDXC("PAT")=BSDXPATID
+"RTN","BSDX08",248,0)
+ S BSDXC("CLN")=BSDXLOC
+"RTN","BSDX08",249,0)
+ S BSDXC("TYP")=BSDXTYP
+"RTN","BSDX08",250,0)
+ S BSDXC("ADT")=BSDXSD
+"RTN","BSDX08",251,0)
+ S %H=$H D YMD^%DTC
+"RTN","BSDX08",252,0)
+ S BSDXC("CDT")=X+%
+"RTN","BSDX08",253,0)
+ S BSDXC("NOT")=BSDXNOT
+"RTN","BSDX08",254,0)
+ S:'+$G(BSDXCR) BSDXCR=11 ;Other
+"RTN","BSDX08",255,0)
+ S BSDXC("CR")=BSDXCR
+"RTN","BSDX08",256,0)
+ S BSDXC("USR")=DUZ
+"RTN","BSDX08",257,0)
+ ;
+"RTN","BSDX08",258,0)
+ S BSDXZ=$$CANCEL^BSDXAPI(.BSDXC)
+"RTN","BSDX08",259,0)
+ Q
+"RTN","BSDX08",260,0)
+ ;
+"RTN","BSDX08",261,0)
+BSDXCAN(BSDXAPTID) ;
+"RTN","BSDX08",262,0)
+ ;Cancel BSDX APPOINTMENT entry
+"RTN","BSDX08",263,0)
+ N %DT,X,BSDXDATE,Y,BSDXIENS,BSDXFDA,BSDXMSG
+"RTN","BSDX08",264,0)
+ S %DT="XT",X="NOW" D ^%DT ; X ^DD("DD")
+"RTN","BSDX08",265,0)
+ S BSDXDATE=Y
+"RTN","BSDX08",266,0)
+ S BSDXIENS=BSDXAPTID_","
+"RTN","BSDX08",267,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.12)=BSDXDATE
+"RTN","BSDX08",268,0)
+ K BSDXMSG
+"RTN","BSDX08",269,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX08",270,0)
+ Q
+"RTN","BSDX08",271,0)
+ ;
+"RTN","BSDX08",272,0)
+CANEVT(BSDXPAT,BSDXSTART,BSDXSC) ;EP Called by BSDX CANCEL APPOINTMENT event
+"RTN","BSDX08",273,0)
+ ;when appointments cancelled via PIMS interface.
+"RTN","BSDX08",274,0)
+ ;Propagates cancellation to BSDXAPPT and raises refresh event to running GUI clients
+"RTN","BSDX08",275,0)
+ N BSDXFOUND,BSDXRES
+"RTN","BSDX08",276,0)
+ Q:+$G(BSDXNOEV)
+"RTN","BSDX08",277,0)
+ Q:'+$G(BSDXSC)
+"RTN","BSDX08",278,0)
+ S BSDXFOUND=0
+"RTN","BSDX08",279,0)
+ I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$CANEVT1(BSDXRES,BSDXSTART,BSDXPAT)
+"RTN","BSDX08",280,0)
+ I BSDXFOUND D CANEVT3(BSDXRES) Q
+"RTN","BSDX08",281,0)
+ I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$CANEVT1(BSDXRES,BSDXSTART,BSDXPAT)
+"RTN","BSDX08",282,0)
+ I BSDXFOUND D CANEVT3(BSDXRES)
+"RTN","BSDX08",283,0)
+ Q
+"RTN","BSDX08",284,0)
+ ;
+"RTN","BSDX08",285,0)
+CANEVT1(BSDXRES,BSDXSTART,BSDXPAT) ;
+"RTN","BSDX08",286,0)
+ ;Get appointment id in BSDXAPT
+"RTN","BSDX08",287,0)
+ ;If found, call BSDXCAN(BSDXAPPT) and return 1
+"RTN","BSDX08",288,0)
+ ;else return 0
+"RTN","BSDX08",289,0)
+ N BSDXFOUND,BSDXAPPT
+"RTN","BSDX08",290,0)
+ S BSDXFOUND=0
+"RTN","BSDX08",291,0)
+ Q:'+BSDXRES BSDXFOUND
+"RTN","BSDX08",292,0)
+ Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND
+"RTN","BSDX08",293,0)
+ S BSDXAPPT=0 F  S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT  D  Q:BSDXFOUND
+"RTN","BSDX08",294,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""
+"RTN","BSDX08",295,0)
+ . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q
+"RTN","BSDX08",296,0)
+ I BSDXFOUND,+$G(BSDXAPPT) D BSDXCAN(BSDXAPPT)
+"RTN","BSDX08",297,0)
+ Q BSDXFOUND
+"RTN","BSDX08",298,0)
+ ;
+"RTN","BSDX08",299,0)
+CANEVT3(BSDXRES) ;
+"RTN","BSDX08",300,0)
+ ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX08",301,0)
+ ;
+"RTN","BSDX08",302,0)
+ N BSDXRESN
+"RTN","BSDX08",303,0)
+ S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX08",304,0)
+ Q:BSDXRESN=""
+"RTN","BSDX08",305,0)
+ S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX08",306,0)
+ ;D EVENT^BSDX23("SCHEDULE-"_BSDXRESN,"","","")
+"RTN","BSDX08",307,0)
+ D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX08",308,0)
+ Q
+"RTN","BSDX08",309,0)
+ ;
+"RTN","BSDX08",310,0)
+ERR(BSDXI,BSDXERR) ;Error processing
+"RTN","BSDX08",311,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",312,0)
+ S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX08",313,0)
+ I $TL>0 TROLLBACK
+"RTN","BSDX08",314,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX08",315,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX08",316,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX08",317,0)
+ L -^BSDXAPPT(BSDXAPTID)
+"RTN","BSDX08",318,0)
+ QUIT
+"RTN","BSDX08",319,0)
+ ;
+"RTN","BSDX08",320,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX08",321,0)
+ N $ET S $ET="D ^%ZTER HALT"  ; Emergency Error Trap
+"RTN","BSDX08",322,0)
+ ; Rollback, otherwise ^XTER will be empty from future rollback
+"RTN","BSDX08",323,0)
+ I $TL>0 TROLLBACK 
+"RTN","BSDX08",324,0)
+ D ^%ZTER
+"RTN","BSDX08",325,0)
+ S $EC=""  ; Clear Error
+"RTN","BSDX08",326,0)
+ ; Log error message and send to client
+"RTN","BSDX08",327,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX08",328,0)
+ D ERR(BSDXI,"-100~BSDX08 Error: "_$G(%ZTERZE))
+"RTN","BSDX08",329,0)
+ QUIT
+"RTN","BSDX08",330,0)
+ ;
+"RTN","BSDX08",331,0)
+ ;;;NB: This is code that is unused in both original and port.
+"RTN","BSDX08",332,0)
+ ; ; If not appt in the "S" node is found in ^SC then check associated RPMS Clinic Multiple
+"RTN","BSDX08",333,0)
+ ; I BSDXSCIEN="" D  I 'BSDXZ Q  ;Q:BSDXZ
+"RTN","BSDX08",334,0)
+ ; . S BSDXERR="BSDX08: Unable to find associated RPMS appointment for this patient. "
+"RTN","BSDX08",335,0)
+ ; . S BSDXZ=1
+"RTN","BSDX08",336,0)
+ ; . ; Check if there are associated RPMS clinics. (not currently used) Does the multiple exist? No, then quit
+"RTN","BSDX08",337,0)
+ ; . I '$D(^BSDXRES(BSDXSC1,20)) S BSDXZ=0 QUIT
+"RTN","BSDX08",338,0)
+ ; . ; Loop through the multiple. Get Location and then the ^SC "S" node IEN.
+"RTN","BSDX08",339,0)
+ ; . N BSDX1 S BSDX1=0
+"RTN","BSDX08",340,0)
+ ; . F  S BSDX1=$O(^BSDXRES(BSDXSC1,20,BSDX1)) Q:'+BSDX1  Q:BSDXZ=0  D
+"RTN","BSDX08",341,0)
+ ; . . Q:'$D(^BSDXRES(BSDXSC1,20,BSDX1,0))
+"RTN","BSDX08",342,0)
+ ; . . S BSDXLOC=$P(^BSDXRES(BSDXSC1,20,BSDX1,0),U)
+"RTN","BSDX08",343,0)
+ ; . . S BSDXSCIEN=$$SCIEN^BSDXAPI(BSDXPATID,BSDXLOC,BSDXSTART) I +BSDXSCIEN S BSDXZ=0 Q
+"RTN","BSDX09")
+0^9^B35707298
+"RTN","BSDX09",1,0)
+BSDX09 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;  ; 10/20/10 4:16pm
+"RTN","BSDX09",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX09",3,0)
+ ;
+"RTN","BSDX09",4,0)
+ ; Change Log:
+"RTN","BSDX09",5,0)
+ ; UJO/TH - v 1.3 on 3100714 - Extra Demographics:
+"RTN","BSDX09",6,0)
+ ; - Email
+"RTN","BSDX09",7,0)
+ ; - Cell Phone
+"RTN","BSDX09",8,0)
+ ; - Country
+"RTN","BSDX09",9,0)
+ ; - + refactoring of routine
+"RTN","BSDX09",10,0)
+ ; 
+"RTN","BSDX09",11,0)
+ ; UJO/TH - v 1.3 on 3100715 - Change SSN to PID and get PID field instead
+"RTN","BSDX09",12,0)
+ ;
+"RTN","BSDX09",13,0)
+    ; UJO/TH - v 1.42 on 3101020 - Add Sex field.
+"RTN","BSDX09",14,0)
+    ;
+"RTN","BSDX09",15,0)
+GETREGA(BSDXRET,BSDXPAT)        ;EP
+"RTN","BSDX09",16,0)
+ ;
+"RTN","BSDX09",17,0)
+    ; See below for the returned fields
+"RTN","BSDX09",18,0)
+ ;
+"RTN","BSDX09",19,0)
+ ;For patient with ien BSDXPAT
+"RTN","BSDX09",20,0)
+ ;K ^BSDXTMP($J)
+"RTN","BSDX09",21,0)
+ S BSDXERR=""
+"RTN","BSDX09",22,0)
+ S BSDXRET="^BSDXTMP("_$J_")"
+"RTN","BSDX09",23,0)
+ ;
+"RTN","BSDX09",24,0)
+ N OUT S OUT=$NA(^BSDXTMP($J,0))
+"RTN","BSDX09",25,0)
+ S $P(@OUT,U,1)="T00030IEN"
+"RTN","BSDX09",26,0)
+ S $P(@OUT,U,2)="T00030STREET"
+"RTN","BSDX09",27,0)
+ S $P(@OUT,U,3)="T00030CITY"
+"RTN","BSDX09",28,0)
+ S $P(@OUT,U,4)="T00030STATE"
+"RTN","BSDX09",29,0)
+ S $P(@OUT,U,5)="T00030ZIP"
+"RTN","BSDX09",30,0)
+ S $P(@OUT,U,6)="T00030NAME"
+"RTN","BSDX09",31,0)
+ S $P(@OUT,U,7)="D00030DOB"
+"RTN","BSDX09",32,0)
+ S $P(@OUT,U,8)="T00030PID"
+"RTN","BSDX09",33,0)
+ S $P(@OUT,U,9)="T00030HRN"
+"RTN","BSDX09",34,0)
+ S $P(@OUT,U,10)="T00030HOMEPHONE"
+"RTN","BSDX09",35,0)
+ S $P(@OUT,U,11)="T00030OFCPHONE"
+"RTN","BSDX09",36,0)
+ S $P(@OUT,U,12)="T00030MSGPHONE"
+"RTN","BSDX09",37,0)
+ S $P(@OUT,U,13)="T00030NOK NAME"
+"RTN","BSDX09",38,0)
+ S $P(@OUT,U,14)="T00030RELATIONSHIP"
+"RTN","BSDX09",39,0)
+ S $P(@OUT,U,15)="T00030PHONE"
+"RTN","BSDX09",40,0)
+ S $P(@OUT,U,16)="T00030STREET"
+"RTN","BSDX09",41,0)
+ S $P(@OUT,U,17)="T00030CITY"
+"RTN","BSDX09",42,0)
+ S $P(@OUT,U,18)="T00030STATE"
+"RTN","BSDX09",43,0)
+ S $P(@OUT,U,19)="T00030ZIP"
+"RTN","BSDX09",44,0)
+ S $P(@OUT,U,20)="D00030DATAREVIEWED"
+"RTN","BSDX09",45,0)
+ S $P(@OUT,U,21)="T00030RegistrationComments"
+"RTN","BSDX09",46,0)
+ S $P(@OUT,U,22)="T00050EMAIL ADDRESS"
+"RTN","BSDX09",47,0)
+ S $P(@OUT,U,23)="T00020PHONE NUMBER [CELLULAR]"
+"RTN","BSDX09",48,0)
+ S $P(@OUT,U,24)="T00030COUNTRY"
+"RTN","BSDX09",49,0)
+ S $P(@OUT,U,25)="T00030SEX"
+"RTN","BSDX09",50,0)
+ S $E(@OUT,$L(@OUT)+1)=$C(30)
+"RTN","BSDX09",51,0)
+ ;
+"RTN","BSDX09",52,0)
+ ;
+"RTN","BSDX09",53,0)
+ N BSDXNOD,BSDXNAM,Y,U
+"RTN","BSDX09",54,0)
+ S U="^"
+"RTN","BSDX09",55,0)
+ S BSDXY="ERROR"
+"RTN","BSDX09",56,0)
+ K NAME
+"RTN","BSDX09",57,0)
+ I '+BSDXPAT S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX09",58,0)
+ I '$D(^DPT(+BSDXPAT,0)) S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX09",59,0)
+ S BSDXY=""
+"RTN","BSDX09",60,0)
+ S $P(BSDXY,U)=BSDXPAT
+"RTN","BSDX09",61,0)
+ ;//smh S $P(BSDXY,U,23)=""
+"RTN","BSDX09",62,0)
+ S $P(BSDXY,U,21)=""
+"RTN","BSDX09",63,0)
+ S BSDXNOD=^DPT(+BSDXPAT,0)
+"RTN","BSDX09",64,0)
+ S $P(BSDXY,"^",6)=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX09",65,0)
+ S $P(BSDXY,"^",8)=$$GET1^DIQ(2,BSDXPAT,"PRIMARY LONG ID") ;PID
+"RTN","BSDX09",66,0)
+ S Y=$P(BSDXNOD,U,3) I Y]""  X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX09",67,0)
+ S $P(BSDXY,"^",7)=Y ;DOB
+"RTN","BSDX09",68,0)
+ S $P(BSDXY,"^",9)=""
+"RTN","BSDX09",69,0)
+ I $D(DUZ(2)) I DUZ(2)>0 S $P(BSDXY,"^",9)=$P($G(^AUPNPAT(BSDXPAT,41,DUZ(2),0)),U,2) ;HRN
+"RTN","BSDX09",70,0)
+ D MAIL
+"RTN","BSDX09",71,0)
+ D PHONE
+"RTN","BSDX09",72,0)
+ D NOK
+"RTN","BSDX09",73,0)
+ D DATAREV
+"RTN","BSDX09",74,0)
+ ;/smh D MEDICARE
+"RTN","BSDX09",75,0)
+ D REGCMT
+"RTN","BSDX09",76,0)
+ S $P(BSDXY,"^",22)=$$GET1^DIQ(2,BSDXPAT,"EMAIL ADDRESS")
+"RTN","BSDX09",77,0)
+ S $P(BSDXY,"^",23)=$$GET1^DIQ(2,BSDXPAT,"PHONE NUMBER [CELLULAR]")
+"RTN","BSDX09",78,0)
+ S $P(BSDXY,"^",24)=$$GET1^DIQ(2,BSDXPAT,"COUNTRY:DESCRIPTION")
+"RTN","BSDX09",79,0)
+ S $P(BSDXY,"^",25)=$$GET1^DIQ(2,BSDXPAT,"SEX")
+"RTN","BSDX09",80,0)
+ N BSDXBEG,BSDXEND,BSDXLEN,BSDXI
+"RTN","BSDX09",81,0)
+ S BSDXLEN=$L(BSDXY)
+"RTN","BSDX09",82,0)
+ S BSDXBEG=0,BSDXI=2
+"RTN","BSDX09",83,0)
+ F  D  Q:BSDXEND=BSDXLEN
+"RTN","BSDX09",84,0)
+ . S BSDXEND=BSDXBEG+100
+"RTN","BSDX09",85,0)
+ . S:BSDXEND>BSDXLEN BSDXEND=BSDXLEN
+"RTN","BSDX09",86,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX09",87,0)
+ . S ^BSDXTMP($J,BSDXI)=$E(BSDXY,BSDXBEG,BSDXEND)
+"RTN","BSDX09",88,0)
+ . S BSDXBEG=BSDXBEG+101
+"RTN","BSDX09",89,0)
+ S ^BSDXTMP($J,BSDXI+1)=$C(30)_$C(31)
+"RTN","BSDX09",90,0)
+ Q
+"RTN","BSDX09",91,0)
+ ;
+"RTN","BSDX09",92,0)
+MAIL N BSDXST
+"RTN","BSDX09",93,0)
+ Q:'$D(^DPT(+BSDXPAT,.11))
+"RTN","BSDX09",94,0)
+ S BSDXNOD=^DPT(+BSDXPAT,.11)
+"RTN","BSDX09",95,0)
+ Q:BSDXNOD=""
+"RTN","BSDX09",96,0)
+ S $P(BSDXY,"^",2)=$E($P(BSDXNOD,U),1,50) ;STREET
+"RTN","BSDX09",97,0)
+ S $P(BSDXY,"^",3)=$P(BSDXNOD,U,4) ;CITY
+"RTN","BSDX09",98,0)
+ S BSDXST=$P(BSDXNOD,U,5)
+"RTN","BSDX09",99,0)
+ I +BSDXST,$D(^DIC(5,+BSDXST,0)) S BSDXST=$P(^DIC(5,+BSDXST,0),U,2)
+"RTN","BSDX09",100,0)
+ S $P(BSDXY,"^",4)=BSDXST ;STATE
+"RTN","BSDX09",101,0)
+ S $P(BSDXY,"^",5)=$P(BSDXNOD,U,6) ;ZIP
+"RTN","BSDX09",102,0)
+ Q
+"RTN","BSDX09",103,0)
+ ;
+"RTN","BSDX09",104,0)
+PHONE ;PHONE 10,11,12 HOME,OFC,MSG
+"RTN","BSDX09",105,0)
+ I $D(^DPT(+BSDXPAT,.13)) D
+"RTN","BSDX09",106,0)
+ . S BSDXNOD=^DPT(+BSDXPAT,.13)
+"RTN","BSDX09",107,0)
+ . S $P(BSDXY,U,10)=$P(BSDXNOD,U,1)
+"RTN","BSDX09",108,0)
+ . S $P(BSDXY,U,11)=$P(BSDXNOD,U,2)
+"RTN","BSDX09",109,0)
+ I $D(^DPT(+BSDXPAT,.121)) D
+"RTN","BSDX09",110,0)
+ . S BSDXNOD=^DPT(+BSDXPAT,.121)
+"RTN","BSDX09",111,0)
+ . S $P(BSDXY,U,12)=$P(BSDXNOD,U,10)
+"RTN","BSDX09",112,0)
+ Q
+"RTN","BSDX09",113,0)
+ ;
+"RTN","BSDX09",114,0)
+NOK ;NOK
+"RTN","BSDX09",115,0)
+ ;   13 NOK NAME^RELATIONSHIP^PHONE^STREET^CITY^STATE^ZIP
+"RTN","BSDX09",116,0)
+ N Y,BSDXST
+"RTN","BSDX09",117,0)
+ I $D(^DPT(+BSDXPAT,.21)) D
+"RTN","BSDX09",118,0)
+ . S BSDXNOD=^DPT(+BSDXPAT,.21)
+"RTN","BSDX09",119,0)
+ . S $P(BSDXY,U,13)=$P(BSDXNOD,U,1)
+"RTN","BSDX09",120,0)
+ . S $P(BSDXY,U,14)=$$VAL^XBDIQ1(9000001,BSDXPAT,2802)
+"RTN","BSDX09",121,0)
+ . S $P(BSDXY,U,15)=$P(BSDXNOD,U,9)
+"RTN","BSDX09",122,0)
+ . S $P(BSDXY,U,16)=$P(BSDXNOD,U,3)
+"RTN","BSDX09",123,0)
+ . S $P(BSDXY,U,17)=$P(BSDXNOD,U,6)
+"RTN","BSDX09",124,0)
+ . S BSDXST=$P(BSDXNOD,U,7)
+"RTN","BSDX09",125,0)
+ . I +BSDXST D
+"RTN","BSDX09",126,0)
+ . . I $D(^DIC(5,+BSDXST,0)) S BSDXST=$P(^DIC(5,+BSDXST,0),U,2),$P(BSDXY,U,18)=BSDXST
+"RTN","BSDX09",127,0)
+ . S $P(BSDXY,U,19)=$P(BSDXNOD,U,8)
+"RTN","BSDX09",128,0)
+ Q
+"RTN","BSDX09",129,0)
+ ;
+"RTN","BSDX09",130,0)
+DATAREV S $P(BSDXY,U,20)=$P($$VAL^XBDIQ1(9000001,BSDXPAT,16651),"@")
+"RTN","BSDX09",131,0)
+ Q
+"RTN","BSDX09",132,0)
+ ;
+"RTN","BSDX09",133,0)
+REGCMT N BSDXI,BSDXM,BSDXR
+"RTN","BSDX09",134,0)
+ S BSDXR=""
+"RTN","BSDX09",135,0)
+ D ENP^XBDIQ1(9000001,BSDXPAT,1301,"BSDXM(")
+"RTN","BSDX09",136,0)
+ S BSDXI=0 F  S BSDXI=$O(BSDXM(1301,BSDXI)) Q:'+BSDXI  D
+"RTN","BSDX09",137,0)
+ . S BSDXR=BSDXR_" "_BSDXM(1301,BSDXI)
+"RTN","BSDX09",138,0)
+ ; S $P(BSDXY,U,23)=$TR($E(BSDXR,1,1024),U," ") ; MJL 1/17/2007 //smh
+"RTN","BSDX09",139,0)
+ S $P(BSDXY,U,21)=$TR($E(BSDXR,1,1024),U," ") ;
+"RTN","BSDX09",140,0)
+ Q
+"RTN","BSDX09",141,0)
+ ;
+"RTN","BSDX09",142,0)
+GETMCAID(BSDXY,BSDXPAT) ; not in wv
+"RTN","BSDX09",143,0)
+ ;Returns PATIENTIEN^ENTRY#^MEDICAID#^SUBENTRY#^ELIG.BEGIN^ELIG.END |
+"RTN","BSDX09",144,0)
+ ;File is not dinum
+"RTN","BSDX09",145,0)
+ N C,N,ASDGX,BSDXM,BSDXBLD,BSDXCNT
+"RTN","BSDX09",146,0)
+ N BSDXIEN
+"RTN","BSDX09",147,0)
+ S BSDXBLD=""
+"RTN","BSDX09",148,0)
+ S BSDXIEN=0
+"RTN","BSDX09",149,0)
+ S BSDXCNT=1
+"RTN","BSDX09",150,0)
+ F  S BSDXIEN=$O(^AUPNMCD("B",BSDXPAT,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX09",151,0)
+ . S BSDXNUM=$$VAL^XBDIQ1(9000004,BSDXIEN,.03) ;MCAID#
+"RTN","BSDX09",152,0)
+ . D ENPM^XBDIQ1(9000004.11,BSDXIEN_",0",".01:.02","ASDGX(")
+"RTN","BSDX09",153,0)
+ . S C=1,N=0,BSDXM=""
+"RTN","BSDX09",154,0)
+ . F  S N=$O(ASDGX(N)) Q:'N  D
+"RTN","BSDX09",155,0)
+ . . S $P(BSDXY,"|",C)=BSDXPAT_U_BSDXIEN_U_BSDXNUM_U_N_U_ASDGX(N,.01)_U_ASDGX(N,.02)
+"RTN","BSDX09",156,0)
+ . . S C=C+1
+"RTN","BSDX09",157,0)
+ . . Q
+"RTN","BSDX09",158,0)
+ . Q
+"RTN","BSDX09",159,0)
+ Q
+"RTN","BSDX09",160,0)
+ ;
+"RTN","BSDX09",161,0)
+MEDICARE ; not in WV
+"RTN","BSDX09",162,0)
+ S $P(BSDXY,U,21)=$$VAL^XBDIQ1(9000003,BSDXPAT,.03)
+"RTN","BSDX09",163,0)
+ S $P(BSDXY,U,22)=$$VAL^XBDIQ1(9000003,BSDXPAT,.04)
+"RTN","BSDX09",164,0)
+ Q
+"RTN","BSDX09",165,0)
+ ;
+"RTN","BSDX09",166,0)
+GETMCARE(BSDXY,BSDXPAT)      ;
+"RTN","BSDX09",167,0)
+ ;Returns IEN^MEDICARE#^SUFFIX^SUBENTRY#^TYPE^ELIG.BEGIN^ELIG.END |
+"RTN","BSDX09",168,0)
+ ;File is dinum
+"RTN","BSDX09",169,0)
+ ;
+"RTN","BSDX09",170,0)
+ N ASDGX,C,N,BSDXNUM,BSDXSUF,BSDXBLD
+"RTN","BSDX09",171,0)
+ S BSDXNUM=$$VAL^XBDIQ1(9000003,BSDXPAT,.03)
+"RTN","BSDX09",172,0)
+ S BSDXSUF=$$VAL^XBDIQ1(9000003,BSDXPAT,.04)
+"RTN","BSDX09",173,0)
+ D ENPM^XBDIQ1(9000003.11,BSDXPAT_",0",".01:.03","ASDGX(")
+"RTN","BSDX09",174,0)
+ S C=1,N=0,BSDXBLD=""
+"RTN","BSDX09",175,0)
+ F  S N=$O(ASDGX(N)) Q:'N  D
+"RTN","BSDX09",176,0)
+ . S $P(BSDXY,"|",C)=BSDXPAT_U_BSDXNUM_U_BSDXSUF_U_N_U_ASDGX(N,.03)_U_ASDGX(N,.01)_U_ASDGX(N,.02)
+"RTN","BSDX09",177,0)
+ . S C=C+1
+"RTN","BSDX09",178,0)
+ . Q
+"RTN","BSDX09",179,0)
+ Q
+"RTN","BSDX09",180,0)
+ ;
+"RTN","BSDX09",181,0)
+GETPVTIN(BSDXY,BSDXPAT) ;
+"RTN","BSDX09",182,0)
+ ;Returns IEN^SUBENTRY^INSURER^POLICYNUMBER^ELIG.BEGIN^ELIG.END|...
+"RTN","BSDX09",183,0)
+ ;File is dinum
+"RTN","BSDX09",184,0)
+ ;
+"RTN","BSDX09",185,0)
+ N ASDGX,C,N
+"RTN","BSDX09",186,0)
+ D ENPM^XBDIQ1(9000006.11,BSDXPAT_",0",".01;.02;.06;.07","ASDGX(")
+"RTN","BSDX09",187,0)
+ S C=1,N=0
+"RTN","BSDX09",188,0)
+ F  S N=$O(ASDGX(N)) Q:'N  D
+"RTN","BSDX09",189,0)
+ . S $P(BSDXY,"|",C)=BSDXPAT_U_N_U_ASDGX(N,.01)_U_ASDGX(N,.02)_U_ASDGX(N,.06)_U_ASDGX(N,.07)
+"RTN","BSDX09",190,0)
+ . S C=C+1
+"RTN","BSDX09",191,0)
+ . Q
+"RTN","BSDX09",192,0)
+ Q
+"RTN","BSDX09",193,0)
+ ;
+"RTN","BSDX09",194,0)
+DFN(FILE,BSDXPAT) ; -- returns ien for file
+"RTN","BSDX09",195,0)
+ I FILE'[9000004 Q BSDXPAT
+"RTN","BSDX09",196,0)
+ Q +$O(^AUPNMCD("B",BSDXPAT,0))
+"RTN","BSDX11")
+0^34^B6358791
+"RTN","BSDX11",1,0)
+BSDX11 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX11",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX11",3,0)
+ ;
+"RTN","BSDX11",4,0)
+ENV0100 ;EP Version 1.0 Environment check
+"RTN","BSDX11",5,0)
+ I '$G(IOM) D HOME^%ZIS
+"RTN","BSDX11",6,0)
+ I '$G(DUZ) W !,"DUZ UNDEFINED OR 0." D SORRY(2) Q
+"RTN","BSDX11",7,0)
+ I '$L($G(DUZ(0))) W !,"DUZ(0) UNDEFINED OR NULL." D SORRY(2) Q
+"RTN","BSDX11",8,0)
+ I '(DUZ(0)["@") W:'$D(ZTQUEUED) !,"DUZ(0) DOES NOT CONTAIN AN '@'." D SORRY(2) Q
+"RTN","BSDX11",9,0)
+ S X=$$GET1^DIQ(200,DUZ,.01)
+"RTN","BSDX11",10,0)
+ W !!,$$CJ^XLFSTR("Hello, "_$P(X,",",2)_" "_$P(X,","),IOM)
+"RTN","BSDX11",11,0)
+ W !!,$$CJ^XLFSTR("Checking Environment...",IOM)
+"RTN","BSDX11",12,0)
+ ;
+"RTN","BSDX11",13,0)
+ ;is the PIMS requirement present?
+"RTN","BSDX11",14,0)
+ I '$$INSTALLD("PIMS*5.3*1003") D
+"RTN","BSDX11",15,0)
+ .D BMES^XPDUTL("Version 1.0 of the BSDX Package")
+"RTN","BSDX11",16,0)
+ . D BMES^XPDUTL("Cannot Be Installed Unless")
+"RTN","BSDX11",17,0)
+ . D BMES^XPDUTL("Patch 1003 of version 5.3 of the PIMS Package has been installed.")
+"RTN","BSDX11",18,0)
+ . D SORRY(2)
+"RTN","BSDX11",19,0)
+ . Q
+"RTN","BSDX11",20,0)
+ ;is the BMX requirement present?
+"RTN","BSDX11",21,0)
+ I '$$INSTALLD("BMX 1.0") D
+"RTN","BSDX11",22,0)
+ .D BMES^XPDUTL("Version 1.0 of the BSDX Package")
+"RTN","BSDX11",23,0)
+ . D BMES^XPDUTL("Cannot Be Installed Unless")
+"RTN","BSDX11",24,0)
+ . D BMES^XPDUTL("version 1.0 of the BMX Package has been installed.")
+"RTN","BSDX11",25,0)
+ . D SORRY(2)
+"RTN","BSDX11",26,0)
+ . Q
+"RTN","BSDX11",27,0)
+ Q
+"RTN","BSDX11",28,0)
+ ;End Environment check
+"RTN","BSDX11",29,0)
+ ;
+"RTN","BSDX11",30,0)
+V0100 ;EP Version 1.0 PostInit
+"RTN","BSDX11",31,0)
+ ;Add Protocol items to BSDAM APPOINTMENT EVENTS protocol
+"RTN","BSDX11",32,0)
+ ;
+"RTN","BSDX11",33,0)
+ N BSDXDA,BSDXFDA,BSDXDA1,BSDXSEQ,BSDXDAT,BSDXNOD,BSDXIEN,BSDXMSG
+"RTN","BSDX11",34,0)
+ S BSDXDA=$O(^ORD(101,"B","BSDAM APPOINTMENT EVENTS",0))
+"RTN","BSDX11",35,0)
+ Q:'+BSDXDA
+"RTN","BSDX11",36,0)
+ S BSDXDAT="BSDX ADD APPOINTMENT;10.2^BSDX CANCEL APPOINTMENT;10.4^BSDX CHECKIN APPOINTMENT;10.6^BSDX NOSHOW APPOINTMENT;10.8"
+"RTN","BSDX11",37,0)
+ F J=1:1:$L(BSDXDAT,U) D
+"RTN","BSDX11",38,0)
+ . K BSDXIEN,BSDXMSG,BSDXFDA
+"RTN","BSDX11",39,0)
+ . S BSDXNOD=$P(BSDXDAT,U,J)
+"RTN","BSDX11",40,0)
+ . S BSDXDA1=$P(BSDXNOD,";")
+"RTN","BSDX11",41,0)
+ . S BSDXSEQ=$P(BSDXNOD,";",2)
+"RTN","BSDX11",42,0)
+ . S BSDXDA1=$O(^ORD(101,"B",BSDXDA1,0))
+"RTN","BSDX11",43,0)
+ . Q:'+BSDXDA1
+"RTN","BSDX11",44,0)
+ . Q:$D(^ORD(101,BSDXDA,10,"B",BSDXDA1))
+"RTN","BSDX11",45,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",",".01")=BSDXDA1
+"RTN","BSDX11",46,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",","3")=BSDXSEQ
+"RTN","BSDX11",47,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX11",48,0)
+ . Q
+"RTN","BSDX11",49,0)
+ Q
+"RTN","BSDX11",50,0)
+ ;
+"RTN","BSDX11",51,0)
+SORRY(X) ;
+"RTN","BSDX11",52,0)
+ KILL DIFQ
+"RTN","BSDX11",53,0)
+ S XPDQUIT=X
+"RTN","BSDX11",54,0)
+ W *7,!,$$CJ^XLFSTR("Sorry....Please fix it.",IOM)
+"RTN","BSDX11",55,0)
+ Q
+"RTN","BSDX11",56,0)
+ ;
+"RTN","BSDX11",57,0)
+INSTALLD(BMXPKG) ;
+"RTN","BSDX11",58,0)
+ ;Determine if BMXPKG is present.
+"RTN","BSDX11",59,0)
+ Q 1
+"RTN","BSDX11",60,0)
+ ;S BSDXFIN=$O(^XPD(9.7,"B","PIMS*5.3*1003",""))
+"RTN","BSDX11",61,0)
+ S BSDXFIN=$O(^XPD(9.7,"B",BMXPKG,""))
+"RTN","BSDX11",62,0)
+ I $G(BSDXFIN)="" Q 0
+"RTN","BSDX11",63,0)
+ S BSDXSTAT=$P($G(^XPD(9.7,BSDXFIN,0)),U,9)
+"RTN","BSDX11",64,0)
+ ;'0' Loaded from Distribution
+"RTN","BSDX11",65,0)
+ ;'1' Queued for Install 
+"RTN","BSDX11",66,0)
+ ;'2' Start of Install 
+"RTN","BSDX11",67,0)
+ ;'3' Install Completed 
+"RTN","BSDX11",68,0)
+ ;'4' FOR De-Installed; 
+"RTN","BSDX11",69,0)
+ ;
+"RTN","BSDX11",70,0)
+ I BSDXSTAT'=3 Q 0
+"RTN","BSDX11",71,0)
+ Q 1
+"RTN","BSDX12")
+0^10^B7203579
+"RTN","BSDX12",1,0)
+BSDX12 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/18/10 2:14pm
+"RTN","BSDX12",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX12",3,0)
+    ; 
+"RTN","BSDX12",4,0)
+    ; Change Log:
+"RTN","BSDX12",5,0)
+    ; v 1.3 - i18n support - 3100718
+"RTN","BSDX12",6,0)
+    ; BSDXSTART and BSDXEND passed in FM Dates, not US dates
+"RTN","BSDX12",7,0)
+ ;
+"RTN","BSDX12",8,0)
+ ;
+"RTN","BSDX12",9,0)
+AVADD(BSDXY,BSDXSTART,BSDXEND,BSDXTYPID,BSDXRES,BSDXSLOTS,BSDXNOTE)  ;EP
+"RTN","BSDX12",10,0)
+ ;Called by BSDX ADD NEW AVAILABILITY
+"RTN","BSDX12",11,0)
+ ;Create entry in BSDX ACCESS BLOCK
+"RTN","BSDX12",12,0)
+ ;
+"RTN","BSDX12",13,0)
+ ;BSDXRES is Resource Name
+"RTN","BSDX12",14,0)
+ ;Returns recordset having fields 
+"RTN","BSDX12",15,0)
+ ; AvailabilityID and ErrorNumber
+"RTN","BSDX12",16,0)
+ ;
+"RTN","BSDX12",17,0)
+ ;Test lines:
+"RTN","BSDX12",18,0)
+ ;D AVADD^BSDX12(.RES,"3091227.09","3091227.0930","1","WHITT",2,"SCRATCH AV NOTE") ZW RES
+"RTN","BSDX12",19,0)
+ ;BSDX ADD NEW AVAILABILITY^3091227.09^3091227.0930^1^WHITT^2^SCRATCH AVAILABILITY NOTE
+"RTN","BSDX12",20,0)
+ ;
+"RTN","BSDX12",21,0)
+ N BSDXERR,BSDXIEN,BSDXDEP,BSDXI,BSDXAVID,BSDXI,BSDXERR,BSDXFDA,BSDXMSG,BSDXRESD
+"RTN","BSDX12",22,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX12",23,0)
+ S BSDXERR=0
+"RTN","BSDX12",24,0)
+ S BSDXI=0
+"RTN","BSDX12",25,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX12",26,0)
+ S ^BSDXTMP($J,0)="I00020AVAILABILITYID^I00020ERRORID"_$C(30)
+"RTN","BSDX12",27,0)
+ ;Check input data for errors
+"RTN","BSDX12",28,0)
+    ; i18n - FM Dates passed in
+"RTN","BSDX12",29,0)
+ ; S:BSDXSTART["@0000" BSDXSTART=$P(BSDXSTART,"@")
+"RTN","BSDX12",30,0)
+ ; S:BSDXEND["@0000" BSDXEND=$P(BSDXEND,"@")
+"RTN","BSDX12",31,0)
+ ; S %DT="T",X=BSDXSTART D ^%DT S BSDXSTART=Y
+"RTN","BSDX12",32,0)
+ ; I BSDXSTART=-1 D ERR(70) Q
+"RTN","BSDX12",33,0)
+ ; S %DT="T",X=BSDXEND D ^%DT S BSDXEND=Y
+"RTN","BSDX12",34,0)
+ ; I BSDXEND=-1 D ERR(70) Q
+"RTN","BSDX12",35,0)
+    ; Make sure dates are canonical and don't contain extra zeros
+"RTN","BSDX12",36,0)
+    S BSDXSTART=+BSDXSTART,BSDXEND=+BSDXEND
+"RTN","BSDX12",37,0)
+    ;
+"RTN","BSDX12",38,0)
+ I $L(BSDXEND,".")=1 D ERR(70) Q
+"RTN","BSDX12",39,0)
+ I BSDXSTART>BSDXEND S BSDXTMP=BSDXEND,BSDXEND=BSDXSTART,BSDXSTART=BSDXTMP
+"RTN","BSDX12",40,0)
+ ;Validate Access Type
+"RTN","BSDX12",41,0)
+ I '+BSDXTYPID,'$D(^BSDXTYPE(BSDXTYPID,0)) D ERR(70) Q
+"RTN","BSDX12",42,0)
+ ;Validate Resource
+"RTN","BSDX12",43,0)
+ I '$D(^BSDXRES("B",BSDXRES)) S BSDXERR=70 D ERR(BSDXERR) Q
+"RTN","BSDX12",44,0)
+ S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0)) I '+BSDXRESD S BSDXERR=70 D ERR(BSDXERR) Q
+"RTN","BSDX12",45,0)
+ ;
+"RTN","BSDX12",46,0)
+ ;Create entry in BSDX ACCESS BLOCK
+"RTN","BSDX12",47,0)
+ S BSDXFDA(9002018.3,"+1,",.01)=BSDXRESD
+"RTN","BSDX12",48,0)
+ S BSDXFDA(9002018.3,"+1,",.02)=BSDXSTART
+"RTN","BSDX12",49,0)
+ S BSDXFDA(9002018.3,"+1,",.03)=BSDXEND
+"RTN","BSDX12",50,0)
+ S BSDXFDA(9002018.3,"+1,",.04)=BSDXSLOTS
+"RTN","BSDX12",51,0)
+ S BSDXFDA(9002018.3,"+1,",.05)=BSDXTYPID
+"RTN","BSDX12",52,0)
+ K BSDXIEN,BSDXMSG
+"RTN","BSDX12",53,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX12",54,0)
+ S BSDXAVID=+$G(BSDXIEN(1))
+"RTN","BSDX12",55,0)
+ I 'BSDXAVID D ERR(70) Q
+"RTN","BSDX12",56,0)
+ ;
+"RTN","BSDX12",57,0)
+ ;Add WP field
+"RTN","BSDX12",58,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX12",59,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX12",60,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX12",61,0)
+ . D WP^DIE(9002018.3,BSDXAVID_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX12",62,0)
+ ;
+"RTN","BSDX12",63,0)
+ ;Return Recordset
+"RTN","BSDX12",64,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",65,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXAVID_"^-1"_$C(30)
+"RTN","BSDX12",66,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",67,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX12",68,0)
+ Q
+"RTN","BSDX12",69,0)
+ ;
+"RTN","BSDX12",70,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX12",71,0)
+ S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX12",72,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",73,0)
+ S ^BSDXTMP($J,BSDXI)="0^"_BSDXERR_$C(30)
+"RTN","BSDX12",74,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX12",75,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX12",76,0)
+ Q
+"RTN","BSDX13")
+0^11^B9772451
+"RTN","BSDX13",1,0)
+BSDX13 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 6:05pm
+"RTN","BSDX13",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX13",3,0)
+    ;
+"RTN","BSDX13",4,0)
+    ; Change Log:
+"RTN","BSDX13",5,0)
+    ; V 1.3 - i18n support - Dates passed to Routine as FM Date - WV/SMH
+"RTN","BSDX13",6,0)
+ Q
+"RTN","BSDX13",7,0)
+AVDELDTD(BSDXY,BSDXRESD,BSDXSTART,BSDXEND) ;EP
+"RTN","BSDX13",8,0)
+ ;Entry point for debugging
+"RTN","BSDX13",9,0)
+ ;
+"RTN","BSDX13",10,0)
+ ;D DEBUG^%Serenji("AVDELDT^BSDX13(.BSDXY,BSDXRESD,BSDXSTART,BSDXEND)")
+"RTN","BSDX13",11,0)
+ Q
+"RTN","BSDX13",12,0)
+ ;
+"RTN","BSDX13",13,0)
+AVDELDT(BSDXY,BSDXRESD,BSDXSTART,BSDXEND) ;EP
+"RTN","BSDX13",14,0)
+ ;Cancel availability in a date range
+"RTN","BSDX13",15,0)
+ ;Called by BSDX CANCEL AV BY DATE
+"RTN","BSDX13",16,0)
+ ;
+"RTN","BSDX13",17,0)
+ ;BSDXRESD is BSDX RESOURCE ien
+"RTN","BSDX13",18,0)
+ ;BSDXSTART and BSDXEND are FM dates (change in v 1.3)
+"RTN","BSDX13",19,0)
+ ;
+"RTN","BSDX13",20,0)
+ S X="ERROR^BSDX13",@^%ZOSF("TRAP")
+"RTN","BSDX13",21,0)
+ N BMXIEN,BSDXI
+"RTN","BSDX13",22,0)
+ S BSDXI=0
+"RTN","BSDX13",23,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX13",24,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX13",25,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX13",26,0)
+ ; S X=BSDXSTART ; commented out *v1.3
+"RTN","BSDX13",27,0)
+ ; S %DT="X" D ^%DT
+"RTN","BSDX13",28,0)
+ ; I Y=-1 D ERR(0,"AVDELDT-BSDX13: Invalid Start Date") Q
+"RTN","BSDX13",29,0)
+ ; S BSDXSTART=$P(Y,".")
+"RTN","BSDX13",30,0)
+ ; S X=BSDXEND
+"RTN","BSDX13",31,0)
+ ; S %DT="X" D ^%DT
+"RTN","BSDX13",32,0)
+ ; I Y=-1 D ERR(0,"AVDELDT-BSDX13: Invalid End Date") Q
+"RTN","BSDX13",33,0)
+ S BSDXEND=$P(BSDXEND,".")_".99999"
+"RTN","BSDX13",34,0)
+ I '+BSDXRESD D ERR(0,"AVDELDT-BSDX13: Invalid Resource ID") Q
+"RTN","BSDX13",35,0)
+ ;
+"RTN","BSDX13",36,0)
+ F  S BSDXSTART=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXSTART)) Q:'+BSDXSTART  Q:BSDXSTART>BSDXEND  D
+"RTN","BSDX13",37,0)
+ . S BMXIEN=0
+"RTN","BSDX13",38,0)
+ . F  S BMXIEN=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXSTART,BMXIEN)) Q:'+BMXIEN  D
+"RTN","BSDX13",39,0)
+ . . D CALLDIK(BMXIEN)
+"RTN","BSDX13",40,0)
+ ;
+"RTN","BSDX13",41,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",42,0)
+ S ^BSDXTMP($J,BSDXI)="-1^"_$C(30)_$C(31)
+"RTN","BSDX13",43,0)
+ Q
+"RTN","BSDX13",44,0)
+ERROR ;
+"RTN","BSDX13",45,0)
+ D ^%ZTER
+"RTN","BSDX13",46,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX13",47,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",48,0)
+ D ERR(0,"BSDX13 M Error: <"_$G(%ZTERZE)_">")
+"RTN","BSDX13",49,0)
+ Q
+"RTN","BSDX13",50,0)
+ ;
+"RTN","BSDX13",51,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX13",52,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX13",53,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",54,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX13",55,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",56,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX13",57,0)
+ Q
+"RTN","BSDX13",58,0)
+ ;
+"RTN","BSDX13",59,0)
+AVDEL(BSDXY,BSDXAVID) ;EP
+"RTN","BSDX13",60,0)
+ ;Called by BSDX CANCEL AVAILABILITY
+"RTN","BSDX13",61,0)
+ ;Deletes Access block
+"RTN","BSDX13",62,0)
+ ;BSDXAVID is entry number in BSDX AVAILABILITY file
+"RTN","BSDX13",63,0)
+ ;Returns error code in recordset field ERRORID
+"RTN","BSDX13",64,0)
+ ;
+"RTN","BSDX13",65,0)
+ S X="ERROR^BSDX13",@^%ZOSF("TRAP")
+"RTN","BSDX13",66,0)
+ N BSDXNOD,BSDXSTART,DIK,DA,BSDXID,BSDXI,BSDXEND,BSDXRSID
+"RTN","BSDX13",67,0)
+ ;
+"RTN","BSDX13",68,0)
+ S BSDXI=0
+"RTN","BSDX13",69,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX13",70,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX13",71,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX13",72,0)
+ I '+BSDXAVID D ERR(70) Q
+"RTN","BSDX13",73,0)
+ I '$D(^BSDXAB(BSDXAVID,0)) D ERR(70) Q
+"RTN","BSDX13",74,0)
+ ;
+"RTN","BSDX13",75,0)
+ ;
+"RTN","BSDX13",76,0)
+ ;TODO: Test for existing appointments in availability block
+"RTN","BSDX13",77,0)
+ ; (corresponds to old qryAppointmentBlocksOverlapC
+"RTN","BSDX13",78,0)
+ ;  and AVBlockHasAppointments)
+"RTN","BSDX13",79,0)
+ ;
+"RTN","BSDX13",80,0)
+ ;I $$APTINBLK(BSDXAVID) D ERR(20) Q
+"RTN","BSDX13",81,0)
+ ;
+"RTN","BSDX13",82,0)
+ ;Delete AVAILABILITY entries
+"RTN","BSDX13",83,0)
+ D CALLDIK(BSDXAVID)
+"RTN","BSDX13",84,0)
+ ;
+"RTN","BSDX13",85,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX13",86,0)
+ S ^BSDXTMP($J,BSDXI)="-1^"_$C(30)_$C(31)
+"RTN","BSDX13",87,0)
+ Q
+"RTN","BSDX13",88,0)
+ ;
+"RTN","BSDX13",89,0)
+CALLDIK(BSDXAVID) ;
+"RTN","BSDX13",90,0)
+ ;Delete AVAILABILITY entries
+"RTN","BSDX13",91,0)
+ ;
+"RTN","BSDX13",92,0)
+ S DIK="^BSDXAB("
+"RTN","BSDX13",93,0)
+ S DA=BSDXAVID
+"RTN","BSDX13",94,0)
+ D ^DIK
+"RTN","BSDX13",95,0)
+ ;
+"RTN","BSDX13",96,0)
+ Q
+"RTN","BSDX13",97,0)
+ ;
+"RTN","BSDX13",98,0)
+APTINBLK(BSDXAVID) ;
+"RTN","BSDX13",99,0)
+ ;
+"RTN","BSDX13",100,0)
+ ;NOTE: This Subroutine Not called in current version.  Keep code for later use.
+"RTN","BSDX13",101,0)
+ ;
+"RTN","BSDX13",102,0)
+ ;N BSDXS,BSDXID,BSDXHIT,BSDXNOD,BSDXE,BSDXSTART,BSDXEND,BSDXRSID
+"RTN","BSDX13",103,0)
+ ;S BSDXNOD=^BSDXAB(BSDXAVID,0)
+"RTN","BSDX13",104,0)
+ ;S BSDXSTART=$P(BSDXNOD,U,3)
+"RTN","BSDX13",105,0)
+ ;S BSDXEND=$P(BSDXNOD,U,4)
+"RTN","BSDX13",106,0)
+ ;S BSDXRSID=$P(BSDXNOD,U,1)
+"RTN","BSDX13",107,0)
+ ;I '$D(^BSDXDAPRS("ARSRC",BSDXRSID)) Q 0
+"RTN","BSDX13",108,0)
+ ;;If any appointments start at the AV block start time:
+"RTN","BSDX13",109,0)
+ ;I $D(^BSDXDAPRS("ARSRC",BSDXRSID,BSDXSTART)) Q 1
+"RTN","BSDX13",110,0)
+ ;;Find the first appt time BSDXS on the same day as the av block
+"RTN","BSDX13",111,0)
+ ;S BSDXS=$O(^BSDXDAPRS("ARSRC",BSDXRSID,$P(BSDXSTART,".")))
+"RTN","BSDX13",112,0)
+ ;I BSDXS>BSDXEND Q 0
+"RTN","BSDX13",113,0)
+ ;;For all the appts that day with start times less
+"RTN","BSDX13",114,0)
+ ;;than the av block's end time, find any whose end time is
+"RTN","BSDX13",115,0)
+ ;;greater than the av block's start time
+"RTN","BSDX13",116,0)
+ ;S BSDXHIT=0
+"RTN","BSDX13",117,0)
+ ;S BSDXS=BSDXS-.0001
+"RTN","BSDX13",118,0)
+ ;F  S BSDXS=$O(^BSDXDAPRS("ARSRC",BSDXRSID,BSDXS)) Q:'+BSDXS  Q:BSDXS'<BSDXEND  D  Q:BSDXHIT
+"RTN","BSDX13",119,0)
+ ;. S BSDXID=0 F  S BSDXID=$O(^BSDXDAPRS("ARSRC",BSDXRSID,BSDXS,BSDXID)) Q:'+BSDXID  D  Q:BSDXHIT
+"RTN","BSDX13",120,0)
+ ;. . Q:'$D(^BSDXDAPT(BSDXID,0))
+"RTN","BSDX13",121,0)
+ ;. . S BSDXNOD=^BSDXDAPT(BSDXID,0)
+"RTN","BSDX13",122,0)
+ ;. . S BSDXE=$P(BSDXNOD,U,2)
+"RTN","BSDX13",123,0)
+ ;. . I BSDXE>BSDXSTART S BSDXHIT=1 Q
+"RTN","BSDX13",124,0)
+ ;;
+"RTN","BSDX13",125,0)
+ ;I BSDXHIT Q 1
+"RTN","BSDX13",126,0)
+ Q 0
+"RTN","BSDX13",127,0)
+ ;
+"RTN","BSDX13",128,0)
+ ;ERR(ERRNO) ;Error processing
+"RTN","BSDX13",129,0)
+ ;N BSDXERR
+"RTN","BSDX13",130,0)
+ ;S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX13",131,0)
+ ;S BSDXI=BSDXI+1
+"RTN","BSDX13",132,0)
+ ;S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX13",133,0)
+ ;S BSDXI=BSDXI+1
+"RTN","BSDX13",134,0)
+ ;S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX13",135,0)
+ ;Q
+"RTN","BSDX14")
+0^12^B6450810
+"RTN","BSDX14",1,0)
+BSDX14 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX14",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX14",3,0)
+ ;
+"RTN","BSDX14",4,0)
+ ;
+"RTN","BSDX14",5,0)
+ACCTYPD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX14",6,0)
+ ;Entry point for debugging
+"RTN","BSDX14",7,0)
+ ;
+"RTN","BSDX14",8,0)
+ ;D DEBUG^%Serenji("ACCTYP^BSDX14(.BSDXY,BSDXVAL)")
+"RTN","BSDX14",9,0)
+ Q
+"RTN","BSDX14",10,0)
+ ;
+"RTN","BSDX14",11,0)
+ACCTYP(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX14",12,0)
+ ;Called by BSDX ADD/EDIT ACCESS TYPE
+"RTN","BSDX14",13,0)
+ ;Add/Edit ACCESS TYPE entry
+"RTN","BSDX14",14,0)
+ ;BSDXVAL is IEN|NAME|INACTIVE|COLOR|RED|GREEN|BLUE
+"RTN","BSDX14",15,0)
+ ;If IEN=0 Then this is a new ACCTYPE
+"RTN","BSDX14",16,0)
+ ;Test Line:
+"RTN","BSDX14",17,0)
+ ;D ACCTYP^BSDX14(.RES,"0|ORAL HYGIENE|false|Red")
+"RTN","BSDX14",18,0)
+ ;
+"RTN","BSDX14",19,0)
+ S X="ERROR^BSDX14",@^%ZOSF("TRAP")
+"RTN","BSDX14",20,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXNAM
+"RTN","BSDX14",21,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX14",22,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSTYPEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX14",23,0)
+ I BSDXVAL="" D ERR(0,"BSDX14: Invalid null input Parameter") Q
+"RTN","BSDX14",24,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX14",25,0)
+ I +BSDXIEN D
+"RTN","BSDX14",26,0)
+ . S BSDX="EDIT"
+"RTN","BSDX14",27,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX14",28,0)
+ E  D
+"RTN","BSDX14",29,0)
+ . S BSDX="ADD"
+"RTN","BSDX14",30,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX14",31,0)
+ ;
+"RTN","BSDX14",32,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX14",33,0)
+ I BSDXNAM="" D ERR(0,"BSDX14: Invalid null Access Type name.") Q
+"RTN","BSDX14",34,0)
+ ;
+"RTN","BSDX14",35,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX14",36,0)
+ I $D(^BSDXTYPE("B",BSDXNAM)),$O(^BSDXTYPE("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX14",37,0)
+ . D ERR(0,"BSDX14: Cannot have two Access Types with the same name.")
+"RTN","BSDX14",38,0)
+ . Q
+"RTN","BSDX14",39,0)
+ ;
+"RTN","BSDX14",40,0)
+ S BSDXINA=$P(BSDXVAL,"|",3)
+"RTN","BSDX14",41,0)
+ S BSDXINA=$S(BSDXINA="YES":1,1:0)
+"RTN","BSDX14",42,0)
+ ;
+"RTN","BSDX14",43,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.01)=$P(BSDXVAL,"|",2) ;NAME
+"RTN","BSDX14",44,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.02)=BSDXINA ;INACTIVE
+"RTN","BSDX14",45,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.04)=$P(BSDXVAL,"|",4) ;COLOR
+"RTN","BSDX14",46,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.05)=$P(BSDXVAL,"|",5) ;RED
+"RTN","BSDX14",47,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.06)=$P(BSDXVAL,"|",6) ;GREEN
+"RTN","BSDX14",48,0)
+ S BSDXFDA(9002018.35,BSDXIENS,.07)=$P(BSDXVAL,"|",7) ;BLUE
+"RTN","BSDX14",49,0)
+ K BSDXMSG
+"RTN","BSDX14",50,0)
+ I BSDX="ADD" D
+"RTN","BSDX14",51,0)
+ . K BSDXIEN
+"RTN","BSDX14",52,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX14",53,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX14",54,0)
+ E  D
+"RTN","BSDX14",55,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX14",56,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^-1"_$C(30)_$C(31)
+"RTN","BSDX14",57,0)
+ Q
+"RTN","BSDX14",58,0)
+ ;
+"RTN","BSDX14",59,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX14",60,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX14",61,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX14",62,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX14",63,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX14",64,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX14",65,0)
+ Q
+"RTN","BSDX14",66,0)
+ ;
+"RTN","BSDX14",67,0)
+ERROR ;
+"RTN","BSDX14",68,0)
+ D ^%ZTER
+"RTN","BSDX14",69,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX14",70,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX14",71,0)
+ D ERR(0,"BSDX14 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX14",72,0)
+ Q
+"RTN","BSDX15")
+0^13^B5327807
+"RTN","BSDX15",1,0)
+BSDX15 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX15",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX15",3,0)
+ ;
+"RTN","BSDX15",4,0)
+ ;
+"RTN","BSDX15",5,0)
+GRPTYP(BSDXY) ;EP
+"RTN","BSDX15",6,0)
+ ;Called by BSDX GET ACCESS GROUP TYPES
+"RTN","BSDX15",7,0)
+ ;Returns ADO recordset containing ACTIVE Access types ordered alphabetically
+"RTN","BSDX15",8,0)
+ ;by Access Group
+"RTN","BSDX15",9,0)
+ ;AccessGroupID, AccessGroup, AccessTypeID, AccessType
+"RTN","BSDX15",10,0)
+ ;
+"RTN","BSDX15",11,0)
+ ;Test Code:
+"RTN","BSDX15",12,0)
+ ;D GRPTYP^BSDX15(.RES) ZW RES
+"RTN","BSDX15",13,0)
+ ;
+"RTN","BSDX15",14,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX15",15,0)
+ N BSDX1
+"RTN","BSDX15",16,0)
+ S BSDXI=0
+"RTN","BSDX15",17,0)
+ S X="ETRAP^BSDX15",@^%ZOSF("TRAP")
+"RTN","BSDX15",18,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ACCESS_GROUP_TYPEID^I00020ACCESS_GROUP_ID^T00030ACCESS_GROUP^I00020ACCESS_TYPE_ID^T00030ACCESS_TYPE"_$C(30)
+"RTN","BSDX15",19,0)
+ ;
+"RTN","BSDX15",20,0)
+ ;N BSDX0,BSDX1,BSDXNOD,BSDXGPN,BSDXTN
+"RTN","BSDX15",21,0)
+ ;$O Through "B" x-ref of BSDX ACCESS GROUP file
+"RTN","BSDX15",22,0)
+ ;S BSDXGPN=0 F  S BSDXGPN=$O(^BSDXAGP("B",BSDXGPN)) Q:BSDXGPN=""  D
+"RTN","BSDX15",23,0)
+ ;. S BSDX0=$O(^BSDXAGP("B",BSDXGPN,0))
+"RTN","BSDX15",24,0)
+ ;. Q:'+BSDX0
+"RTN","BSDX15",25,0)
+ ;. Q:'$D(^BSDXAGP(BSDX0,0))  ;INDEX VALIDITY CHECK
+"RTN","BSDX15",26,0)
+ ;. Q:'$D(^BSDXAGTP("B",BSDX0))
+"RTN","BSDX15",27,0)
+ ;. ;$O through "B" x-ref of BSDX ACCESS GROUP TYPE
+"RTN","BSDX15",28,0)
+ ;. S BSDX1=0 F  S BSDX1=$O(^BSDXAGTP("B",BSDX0,BSDX1)) Q:'+BSDX1  D
+"RTN","BSDX15",29,0)
+ ;. . Q:'$D(^BSDXAGTP(BSDX1,0))
+"RTN","BSDX15",30,0)
+ ;. . S BSDX2=$P(^BSDXAGTP(BSDX1,0),U,2)
+"RTN","BSDX15",31,0)
+ ;. . Q:'+BSDX2
+"RTN","BSDX15",32,0)
+ ;. . Q:'$D(^BSDXTYPE(BSDX2,0))
+"RTN","BSDX15",33,0)
+ ;. . S BSDXNOD=^BSDXTYPE(BSDX2,0)
+"RTN","BSDX15",34,0)
+ ;. . Q:$P(BSDXNOD,U,2)=1  ;INACTIVE
+"RTN","BSDX15",35,0)
+ ;. . S BSDXTN=$P(BSDXNOD,U)
+"RTN","BSDX15",36,0)
+ ;. . S BSDXI=BSDXI+1
+"RTN","BSDX15",37,0)
+ ;. . S ^BSDXTMP($J,BSDXI)=BSDX1_U_BSDX0_U_BSDXGPN_U_BSDX2_U_BSDXTN_$C(30)
+"RTN","BSDX15",38,0)
+ ;. . Q
+"RTN","BSDX15",39,0)
+ ;. Q
+"RTN","BSDX15",40,0)
+ ;
+"RTN","BSDX15",41,0)
+ ;$O Through "AC" x-ref of BSDX ACCESS GROUP TYPE file
+"RTN","BSDX15",42,0)
+ N BSDXAGID,BSDXAGN,BSDXATID,BSDXATN,BSDXAGTID
+"RTN","BSDX15",43,0)
+ S BSDXAGID=0
+"RTN","BSDX15",44,0)
+ F  S BSDXAGID=$O(^BSDXAGTP("AC",BSDXAGID)) Q:'+BSDXAGID  D
+"RTN","BSDX15",45,0)
+ . I '$D(^BSDXAGP(BSDXAGID,0)) Q
+"RTN","BSDX15",46,0)
+ . S BSDXAGN=$P(^BSDXAGP(BSDXAGID,0),U)
+"RTN","BSDX15",47,0)
+ . S BSDXATID=0 F  S BSDXATID=$O(^BSDXAGTP("AC",BSDXAGID,BSDXATID)) Q:'+BSDXATID  D
+"RTN","BSDX15",48,0)
+ . . S BSDXNOD=$G(^BSDXTYPE(BSDXATID,0))
+"RTN","BSDX15",49,0)
+ . . I BSDXNOD="" Q
+"RTN","BSDX15",50,0)
+ . . I $P(BSDXNOD,U,2)=1 Q  ;Inactive
+"RTN","BSDX15",51,0)
+ . . S BSDXATN=$P(BSDXNOD,U)
+"RTN","BSDX15",52,0)
+ . . S BSDXAGTID=$O(^BSDXAGTP("AC",BSDXAGID,BSDXATID,0))
+"RTN","BSDX15",53,0)
+ . . I '+BSDXAGTID Q
+"RTN","BSDX15",54,0)
+ . . I '$D(^BSDXAGTP(BSDXAGTID,0)) Q
+"RTN","BSDX15",55,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX15",56,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXAGTID_U_BSDXAGID_U_BSDXAGN_U_BSDXATID_U_BSDXATN_$C(30)
+"RTN","BSDX15",57,0)
+ . . Q
+"RTN","BSDX15",58,0)
+ . Q
+"RTN","BSDX15",59,0)
+ ;
+"RTN","BSDX15",60,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",61,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX15",62,0)
+ Q
+"RTN","BSDX15",63,0)
+ ;
+"RTN","BSDX15",64,0)
+ERR(BSDXI,BSDXID,BSDXERR) ;Error processing
+"RTN","BSDX15",65,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",66,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_"^^^^"_$C(30)
+"RTN","BSDX15",67,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",68,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX15",69,0)
+ Q
+"RTN","BSDX15",70,0)
+ ;
+"RTN","BSDX15",71,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX15",72,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX15",73,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX15",74,0)
+ D ERR(BSDXI,99,70)
+"RTN","BSDX15",75,0)
+ Q
+"RTN","BSDX16")
+0^14^B11948965
+"RTN","BSDX16",1,0)
+BSDX16 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 
+"RTN","BSDX16",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX16",3,0)
+ ;
+"RTN","BSDX16",4,0)
+ ;
+"RTN","BSDX16",5,0)
+RSRCD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX16",6,0)
+ ;Entry point for debugging
+"RTN","BSDX16",7,0)
+ ;
+"RTN","BSDX16",8,0)
+ ;D DEBUG^%Serenji("RSRC^BSDX16(.BSDXY,BSDXVAL)")
+"RTN","BSDX16",9,0)
+ Q
+"RTN","BSDX16",10,0)
+ ;
+"RTN","BSDX16",11,0)
+RSRC(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX16",12,0)
+ ;
+"RTN","BSDX16",13,0)
+ ;Called by BSDX ADD/EDIT RESOURCE
+"RTN","BSDX16",14,0)
+ ;Add/Edit BSDX RESOURCE entry
+"RTN","BSDX16",15,0)
+ ;BSDXVAL is sResourceID|sResourceName|sInactive|sHospLocID|TIME_SCALE|LETTER_TEXT|NO_SHOW_LETTER|CANCELLATION_LETTER
+"RTN","BSDX16",16,0)
+ ;If IEN=0 Then this is a new Resource
+"RTN","BSDX16",17,0)
+ ;Test Line:
+"RTN","BSDX16",18,0)
+ ;D RSRC^BSDX16(.RES,"sResourceID|sResourceName|sInactive|sHospLocID")
+"RTN","BSDX16",19,0)
+ ;
+"RTN","BSDX16",20,0)
+ S X="ERROR^BSDX16",@^%ZOSF("TRAP")
+"RTN","BSDX16",21,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXINA,BSDXNOTE,BSDXNAM
+"RTN","BSDX16",22,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX16",23,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX16",24,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX16",25,0)
+ ; Changed following from a $G = "" to $D check: $G didn't work since BSDXVAL is an array. MJL 10/18/2006
+"RTN","BSDX16",26,0)
+ I BSDXVAL="",$D(BSDXVAL)<2 D ERR(0,"BSDX16: Invalid null input Parameter") Q
+"RTN","BSDX16",27,0)
+ ;Unpack array at @XWBARY
+"RTN","BSDX16",28,0)
+ I BSDXVAL="" D
+"RTN","BSDX16",29,0)
+ . N BSDXC S BSDXC=0 F  S BSDXC=$O(BSDXVAL(BSDXC)) Q:'BSDXC  D
+"RTN","BSDX16",30,0)
+ . . S BSDXVAL=BSDXVAL_BSDXVAL(BSDXC)
+"RTN","BSDX16",31,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX16",32,0)
+ I +BSDXIEN D
+"RTN","BSDX16",33,0)
+ . S BSDX="EDIT"
+"RTN","BSDX16",34,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX16",35,0)
+ E  D
+"RTN","BSDX16",36,0)
+ . S BSDX="ADD"
+"RTN","BSDX16",37,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX16",38,0)
+ ;
+"RTN","BSDX16",39,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX16",40,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX16",41,0)
+ I $D(^BSDXRES("B",BSDXNAM)),$O(^BSDXRES("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX16",42,0)
+ . D ERR(0,"BSDX16: Cannot have two Resources with the same name.")
+"RTN","BSDX16",43,0)
+ . Q
+"RTN","BSDX16",44,0)
+ ;
+"RTN","BSDX16",45,0)
+ S BSDXINA=$P(BSDXVAL,"|",3)
+"RTN","BSDX16",46,0)
+ S BSDXINA=$S(BSDXINA="YES":1,1:0)
+"RTN","BSDX16",47,0)
+ ;
+"RTN","BSDX16",48,0)
+ S BSDXFDA(9002018.1,BSDXIENS,.01)=$P(BSDXVAL,"|",2) ;NAME
+"RTN","BSDX16",49,0)
+ S BSDXFDA(9002018.1,BSDXIENS,.02)=BSDXINA ;INACTIVE
+"RTN","BSDX16",50,0)
+ I +$P(BSDXVAL,"|",5) S BSDXFDA(9002018.1,BSDXIENS,.03)=+$P(BSDXVAL,"|",5) ;TIME SCALE
+"RTN","BSDX16",51,0)
+ I +$P(BSDXVAL,"|",4) S BSDXFDA(9002018.1,BSDXIENS,.04)=$P(BSDXVAL,"|",4) ;HOSPITAL LOCATION
+"RTN","BSDX16",52,0)
+ K BSDXMSG
+"RTN","BSDX16",53,0)
+ I BSDX="ADD" D  ;TODO: Check for error
+"RTN","BSDX16",54,0)
+ . K BSDXIEN
+"RTN","BSDX16",55,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX16",56,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX16",57,0)
+ E  D
+"RTN","BSDX16",58,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX16",59,0)
+ ;
+"RTN","BSDX16",60,0)
+ ;LETTER TEXT wp field
+"RTN","BSDX16",61,0)
+ S BSDXNOTE=$P(BSDXVAL,"|",6)
+"RTN","BSDX16",62,0)
+ ;
+"RTN","BSDX16",63,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX16",64,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX16",65,0)
+ ;
+"RTN","BSDX16",66,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX16",67,0)
+ . D WP^DIE(9002018.1,BSDXIEN_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX16",68,0)
+ ;
+"RTN","BSDX16",69,0)
+ ;NO SHOW LETTER wp fields
+"RTN","BSDX16",70,0)
+ K BSDXNOTE
+"RTN","BSDX16",71,0)
+ S BSDXNOTE=$P(BSDXVAL,"|",7)
+"RTN","BSDX16",72,0)
+ ;
+"RTN","BSDX16",73,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX16",74,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX16",75,0)
+ ;
+"RTN","BSDX16",76,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX16",77,0)
+ . D WP^DIE(9002018.1,BSDXIEN_",",1201,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX16",78,0)
+ ;
+"RTN","BSDX16",79,0)
+ ;CANCELLATION LETTER wp field
+"RTN","BSDX16",80,0)
+ K BSDXNOTE
+"RTN","BSDX16",81,0)
+ S BSDXNOTE=$P(BSDXVAL,"|",8)
+"RTN","BSDX16",82,0)
+ ;
+"RTN","BSDX16",83,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX16",84,0)
+ I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX16",85,0)
+ ;
+"RTN","BSDX16",86,0)
+ I $D(BSDXNOTE(.5)) D
+"RTN","BSDX16",87,0)
+ . D WP^DIE(9002018.1,BSDXIEN_",",1301,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX16",88,0)
+ ;
+"RTN","BSDX16",89,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^"_$C(30)_$C(31)
+"RTN","BSDX16",90,0)
+ Q
+"RTN","BSDX16",91,0)
+ ;
+"RTN","BSDX16",92,0)
+ERROR ;
+"RTN","BSDX16",93,0)
+ D ^%ZTER
+"RTN","BSDX16",94,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX16",95,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX16",96,0)
+ D ERR(0,"BSDX16 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX16",97,0)
+ Q
+"RTN","BSDX16",98,0)
+ ;
+"RTN","BSDX16",99,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX16",100,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX16",101,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX16",102,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX16",103,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX16",104,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX16",105,0)
+ Q
+"RTN","BSDX17")
+0^15^B2072173
+"RTN","BSDX17",1,0)
+BSDX17 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX17",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX17",3,0)
+ ;
+"RTN","BSDX17",4,0)
+ ;
+"RTN","BSDX17",5,0)
+SCHUSRD(BSDXY) ;EP
+"RTN","BSDX17",6,0)
+ ;Entry point for debugging
+"RTN","BSDX17",7,0)
+ ;
+"RTN","BSDX17",8,0)
+ ;D DEBUG^%Serenji("SCHUSR^BSDX17(.BSDXY)")
+"RTN","BSDX17",9,0)
+ Q
+"RTN","BSDX17",10,0)
+ ;
+"RTN","BSDX17",11,0)
+SCHUSR(BSDXY) ;EP
+"RTN","BSDX17",12,0)
+ ;Return recordset of all users in NEW PERSON having BSDXZMENU key
+"RTN","BSDX17",13,0)
+ ;Called by BSDX SCHEDULE USER
+"RTN","BSDX17",14,0)
+ ;Test Line:
+"RTN","BSDX17",15,0)
+ ;D SCHUSR^BSDX17(.RES)
+"RTN","BSDX17",16,0)
+ ;
+"RTN","BSDX17",17,0)
+ N BSDXDUZ,BSDXKEY,BSDXI,BSDXNAM,BSDXKEYN
+"RTN","BSDX17",18,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX17",19,0)
+ K ^TEMP($J,"BSDX17")
+"RTN","BSDX17",20,0)
+ S BSDXI=0
+"RTN","BSDX17",21,0)
+ S ^BSDXTMP($J,0)="I00020USERID^T00030USERNAME"_$C(30)
+"RTN","BSDX17",22,0)
+ ;$O Through ^VA(200,"AB",
+"RTN","BSDX17",23,0)
+ F BSDXKEYN="BSDXZMENU","BSDXZMGR","XUPROGMODE" S BSDXKEY=+$O(^DIC(19.1,"B",BSDXKEYN,0)) D
+"RTN","BSDX17",24,0)
+ . Q:'+BSDXKEY  S BSDXDUZ=0 F  S BSDXDUZ=$O(^VA(200,"AB",BSDXKEY,BSDXDUZ)) Q:'+BSDXDUZ  D
+"RTN","BSDX17",25,0)
+ . . Q:BSDXDUZ<1  ;IHS/HMW **1**
+"RTN","BSDX17",26,0)
+ . . Q:'$D(^VA(200,BSDXDUZ,0))
+"RTN","BSDX17",27,0)
+ . . Q:$D(^TEMP($J,"BSDX17",BSDXDUZ))
+"RTN","BSDX17",28,0)
+ . . S BSDXNAM=$P(^VA(200,BSDXDUZ,0),U)
+"RTN","BSDX17",29,0)
+ . . S BSDXI=BSDXI+1
+"RTN","BSDX17",30,0)
+ . . S ^TEMP($J,"BSDX17",BSDXDUZ)=""
+"RTN","BSDX17",31,0)
+ . . S ^BSDXTMP($J,BSDXI)=BSDXDUZ_"^"_BSDXNAM_$C(30)
+"RTN","BSDX17",32,0)
+ . . Q
+"RTN","BSDX17",33,0)
+ . Q
+"RTN","BSDX17",34,0)
+ ;
+"RTN","BSDX17",35,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX17",36,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX17",37,0)
+ Q
+"RTN","BSDX18")
+0^16^B87953431
+"RTN","BSDX18",1,0)
+BSDX18 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX18",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX18",3,0)
+ ;
+"RTN","BSDX18",4,0)
+ ;
+"RTN","BSDX18",5,0)
+DELRUD(BSDXY,BSDXIEN) ;EP
+"RTN","BSDX18",6,0)
+ ;Entry point for debugging
+"RTN","BSDX18",7,0)
+ ;
+"RTN","BSDX18",8,0)
+ ;D DEBUG^%Serenji("DELRU^BSDX18(.BSDXY,BSDXIEN)")
+"RTN","BSDX18",9,0)
+ Q
+"RTN","BSDX18",10,0)
+ ;
+"RTN","BSDX18",11,0)
+DELRU(BSDXY,BSDXIEN) ;EP
+"RTN","BSDX18",12,0)
+ ;Deletes entry BSDXIEN from RESOURCE USERS file
+"RTN","BSDX18",13,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX18",14,0)
+ ;Called by BSDX DELETE RESOURCEUSER
+"RTN","BSDX18",15,0)
+ ;Test Line:
+"RTN","BSDX18",16,0)
+ ;D DELRU^BSDX18(.RES,99)
+"RTN","BSDX18",17,0)
+ ;
+"RTN","BSDX18",18,0)
+ N BSDXI,DIK,DA
+"RTN","BSDX18",19,0)
+ S BSDXI=0
+"RTN","BSDX18",20,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX18",21,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEUSERID^I00020ERRORID"_$C(30)
+"RTN","BSDX18",22,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",23,0)
+ I '$D(^BSDXRSU(BSDXIEN,0)) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",24,0)
+ ;Delete entry BSDXIEN
+"RTN","BSDX18",25,0)
+ S DIK="^BSDXRSU("
+"RTN","BSDX18",26,0)
+ S DA=BSDXIEN
+"RTN","BSDX18",27,0)
+ D ^DIK
+"RTN","BSDX18",28,0)
+ ;
+"RTN","BSDX18",29,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX18",30,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX18",31,0)
+ Q
+"RTN","BSDX18",32,0)
+ ;
+"RTN","BSDX18",33,0)
+ADDRUD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX18",34,0)
+ ;Entry point for debugging
+"RTN","BSDX18",35,0)
+ ;
+"RTN","BSDX18",36,0)
+ ;D DEBUG^%Serenji("ADDRU^BSDX18(.BSDXY,BSDXVAL)")
+"RTN","BSDX18",37,0)
+ Q
+"RTN","BSDX18",38,0)
+ ;
+"RTN","BSDX18",39,0)
+ADDRU(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX18",40,0)
+ ;
+"RTN","BSDX18",41,0)
+ ;Called by BSDX ADD/EDIT RESOURCEUSER
+"RTN","BSDX18",42,0)
+ ;Add/Edit BSDX RESOURCEUSER entry
+"RTN","BSDX18",43,0)
+ ;BSDXVAL is sResourceUserID|sOverbook|sModifySchedule|ResourceID|UserID|sModifyAppointments
+"RTN","BSDX18",44,0)
+ ;If IEN=0 Then this is a new ResourceUser entry
+"RTN","BSDX18",45,0)
+ ;Test Line:
+"RTN","BSDX18",46,0)
+ ;D ADDRU^BSDX18(.RES,"sResourceUserID|sOverbook|sModifySchedule|sResourceID|sUserID|sModifyAppointments")
+"RTN","BSDX18",47,0)
+ ;
+"RTN","BSDX18",48,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXOVB,BSDXMOD,BSDXI,BSDXUID,BSDXRID
+"RTN","BSDX18",49,0)
+ N BSDXRES,BSDXRSU,BSDXF,BSDXAPPT
+"RTN","BSDX18",50,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX18",51,0)
+ S BSDXI=0
+"RTN","BSDX18",52,0)
+ S ^BSDXTMP($J,BSDXI)="I00020RESOURCEID^I00020ERRORID"_$C(30)
+"RTN","BSDX18",53,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX18",54,0)
+ I +BSDXIEN D
+"RTN","BSDX18",55,0)
+ . S BSDX="EDIT"
+"RTN","BSDX18",56,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",57,0)
+ E  D
+"RTN","BSDX18",58,0)
+ . S BSDX="ADD"
+"RTN","BSDX18",59,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX18",60,0)
+ ;
+"RTN","BSDX18",61,0)
+ I '+$P(BSDXVAL,"|",4) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",62,0)
+ I '+$P(BSDXVAL,"|",5) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX18",63,0)
+ ;
+"RTN","BSDX18",64,0)
+ S BSDXRID=$P(BSDXVAL,"|",4) ;ResourceID
+"RTN","BSDX18",65,0)
+ S BSDXUID=$P(BSDXVAL,"|",5) ;UserID
+"RTN","BSDX18",66,0)
+ S BSDXRSU=0 ;ResourceUserID
+"RTN","BSDX18",67,0)
+ S BSDXF=0 ;flag
+"RTN","BSDX18",68,0)
+ ;If this is an add, check if the user is already assigned to the resource.
+"RTN","BSDX18",69,0)
+ ;If so, then change to an edit
+"RTN","BSDX18",70,0)
+ I BSDX="ADD" F  S BSDXRSU=$O(^BSDXRSU("AC",BSDXUID,BSDXRSU)) Q:'+BSDXRSU  D  Q:BSDXF
+"RTN","BSDX18",71,0)
+ . S BSDXRES=$G(^BSDXRSU(BSDXRSU,0))
+"RTN","BSDX18",72,0)
+ . S BSDXRES=$P(BSDXRES,U) ;ResourceID
+"RTN","BSDX18",73,0)
+ . S:BSDXRES=BSDXRID BSDXF=1
+"RTN","BSDX18",74,0)
+ I BSDXF S BSDX="EDIT",BSDXIEN=BSDXRSU,BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",75,0)
+ ;
+"RTN","BSDX18",76,0)
+ S BSDXOVB=$P(BSDXVAL,"|",2)
+"RTN","BSDX18",77,0)
+ S BSDXOVB=$S(BSDXOVB="YES":1,1:0)
+"RTN","BSDX18",78,0)
+ S BSDXMOD=$P(BSDXVAL,"|",3)
+"RTN","BSDX18",79,0)
+ S BSDXMOD=$S(BSDXMOD="YES":1,1:0)
+"RTN","BSDX18",80,0)
+ S BSDXAPPT=$P(BSDXVAL,"|",6)
+"RTN","BSDX18",81,0)
+ S BSDXAPPT=$S(BSDXAPPT="YES":1,1:0)
+"RTN","BSDX18",82,0)
+ ;
+"RTN","BSDX18",83,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.01)=$P(BSDXVAL,"|",4) ;RESOURCE ID
+"RTN","BSDX18",84,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.02)=$P(BSDXVAL,"|",5) ;USERID
+"RTN","BSDX18",85,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.03)=BSDXOVB ;OVERBOOK
+"RTN","BSDX18",86,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.04)=BSDXMOD ;MODIFY SCHEDULE
+"RTN","BSDX18",87,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.05)=BSDXAPPT ;ADD, EDIT, DELETE APPOINMENTS
+"RTN","BSDX18",88,0)
+ K BSDXMSG
+"RTN","BSDX18",89,0)
+ I BSDX="ADD" D
+"RTN","BSDX18",90,0)
+ . K BSDXIEN
+"RTN","BSDX18",91,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX18",92,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX18",93,0)
+ E  D
+"RTN","BSDX18",94,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX18",95,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^-1"_$C(31)
+"RTN","BSDX18",96,0)
+ Q
+"RTN","BSDX18",97,0)
+ ;
+"RTN","BSDX18",98,0)
+ERR(BSDXI,BSDXID,BSDXERR) ;Error processing
+"RTN","BSDX18",99,0)
+ S BSDXERR=BSDXERR+134234112 ;vbObjectError
+"RTN","BSDX18",100,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX18",101,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXID_"^"_BSDXERR_$C(30)
+"RTN","BSDX18",102,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX18",103,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX18",104,0)
+ Q
+"RTN","BSDX18",105,0)
+ ;
+"RTN","BSDX18",106,0)
+MADERR(BSDXMSG) ;
+"RTN","BSDX18",107,0)
+ W !,BSDXMSG
+"RTN","BSDX18",108,0)
+ Q
+"RTN","BSDX18",109,0)
+ ;
+"RTN","BSDX18",110,0)
+MADSCR(BSDXDUZ,BSDXZMGR,BSDXZMENU,BSDXZPROG) ;EP - File 200 screening code for MADDRU
+"RTN","BSDX18",111,0)
+ ;Called from DIR to screen for scheduling users
+"RTN","BSDX18",112,0)
+ I $D(^VA(200,BSDXDUZ,51,"B",BSDXZMENU)) Q 1
+"RTN","BSDX18",113,0)
+ I $D(^VA(200,BSDXDUZ,51,"B",BSDXZMGR)) Q 1
+"RTN","BSDX18",114,0)
+ I $D(^VA(200,BSDXDUZ,51,"B",BSDXZPROG)) Q 1
+"RTN","BSDX18",115,0)
+ Q 0
+"RTN","BSDX18",116,0)
+ ;
+"RTN","BSDX18",117,0)
+MADDRU ;EP -Command line utility to bulk-add users and set access rights IHS/HMW 20060420 **1**
+"RTN","BSDX18",118,0)
+ ;Main entry point
+"RTN","BSDX18",119,0)
+ ;
+"RTN","BSDX18",120,0)
+ N BSDX,BSDXZMENU,BSDXZMGR,BSDXZPROG,DIR
+"RTN","BSDX18",121,0)
+ ;
+"RTN","BSDX18",122,0)
+ ;INIT
+"RTN","BSDX18",123,0)
+ K ^TMP($J)
+"RTN","BSDX18",124,0)
+ S BSDXZMENU=$O(^DIC(19.1,"B","BSDXZMENU",0)) I '+BSDXZMENU D MADERR("Error: BSDXZMENU KEY NOT FOUND.") Q
+"RTN","BSDX18",125,0)
+ S BSDXZMGR=$O(^DIC(19.1,"B","BSDXZMGR",0)) I '+BSDXZMGR D MADERR("Error: BSDXZMGR KEY NOT FOUND.") Q
+"RTN","BSDX18",126,0)
+ S BSDXZPROG=$O(^DIC(19.1,"B","XUPROGMODE",0)) I '+BSDXZPROG D MADERR("Error: XUPROGMODE KEY NOT FOUND.") Q
+"RTN","BSDX18",127,0)
+ ;
+"RTN","BSDX18",128,0)
+ D MADUSR
+"RTN","BSDX18",129,0)
+ I '$D(^TMP($J,"BSDX MADDRU","USER")) D MADERR("Cancelled:  No Users selected.") Q
+"RTN","BSDX18",130,0)
+ D MADRES
+"RTN","BSDX18",131,0)
+ I '$D(^TMP($J,"BSDX MADDRU","RESOURCE")) D MADERR("Cancelled:  No Resources selected.") Q
+"RTN","BSDX18",132,0)
+ I '$$MADACC(.BSDX) ;D MADERR("Selected users will have no access to the selected clinics.")
+"RTN","BSDX18",133,0)
+ I '$$MADCONF(.BSDX) W ! D MADERR("--Cancelled") Q
+"RTN","BSDX18",134,0)
+ D MADASS(.BSDX)
+"RTN","BSDX18",135,0)
+ W ! D MADERR("--Done")
+"RTN","BSDX18",136,0)
+ ;
+"RTN","BSDX18",137,0)
+ Q
+"RTN","BSDX18",138,0)
+ ;
+"RTN","BSDX18",139,0)
+MADUSR ;Prompt for users from file 200 who have BSDXUSER key
+"RTN","BSDX18",140,0)
+ ;Store results in ^TMP($J,"BSDX MADDRU","USER",DUZ) array
+"RTN","BSDX18",141,0)
+ N DIRUT,Y,DIR
+"RTN","BSDX18",142,0)
+ S DIR(0)="PO^200:EMZ",DIR("S")="I $$MADSCR^BSDX18(Y,BSDXZMGR,BSDXZMENU,BSDXZPROG)"
+"RTN","BSDX18",143,0)
+ S Y=0
+"RTN","BSDX18",144,0)
+ K ^TMP($J,"BSDX MADDRU","USER")
+"RTN","BSDX18",145,0)
+ W !!,"-------Select Users-------"
+"RTN","BSDX18",146,0)
+ F  D ^DIR Q:$G(DIRUT)  Q:'Y  D
+"RTN","BSDX18",147,0)
+ . S ^TMP($J,"BSDX MADDRU","USER",+Y)=""
+"RTN","BSDX18",148,0)
+ Q
+"RTN","BSDX18",149,0)
+ ;
+"RTN","BSDX18",150,0)
+MADRES ;Prompt for Resources
+"RTN","BSDX18",151,0)
+ ;Store results in ^TMP($J,"BSDX MADDRU","RESOURCE",ResourceID) array
+"RTN","BSDX18",152,0)
+ N DIRUT,Y,DIR
+"RTN","BSDX18",153,0)
+ S DIR(0)="PO^9002018.1:EMZ"
+"RTN","BSDX18",154,0)
+ S Y=0
+"RTN","BSDX18",155,0)
+ K ^TMP($J,"BSDX MADDRU","RESOURCE")
+"RTN","BSDX18",156,0)
+ W !!,"-------Select Resources-------"
+"RTN","BSDX18",157,0)
+ F  D ^DIR Q:$G(DIRUT)  Q:'Y  D
+"RTN","BSDX18",158,0)
+ . S ^TMP($J,"BSDX MADDRU","RESOURCE",+Y)=""
+"RTN","BSDX18",159,0)
+ Q
+"RTN","BSDX18",160,0)
+ ;
+"RTN","BSDX18",161,0)
+MADACC(BSDX) ;Prompt for access level.
+"RTN","BSDX18",162,0)
+ ;Start with Overbook and go to read-only access.
+"RTN","BSDX18",163,0)
+ ;Store results in variables for:
+"RTN","BSDX18",164,0)
+ ;sOverbook, sModifySchedule, sModifyAppointments
+"RTN","BSDX18",165,0)
+ ;
+"RTN","BSDX18",166,0)
+ N DIRUT,Y,DIR,J
+"RTN","BSDX18",167,0)
+ W !!,"-------Select Access Level-------"
+"RTN","BSDX18",168,0)
+ S Y=0
+"RTN","BSDX18",169,0)
+ F J="MODIFY","OVERBOOK","WRITE","READ" S BSDX(J)=1
+"RTN","BSDX18",170,0)
+ S DIR(0)="Y"
+"RTN","BSDX18",171,0)
+ ;
+"RTN","BSDX18",172,0)
+ S DIR("A")="Allow users to Modify Clinic Availability"
+"RTN","BSDX18",173,0)
+ D ^DIR
+"RTN","BSDX18",174,0)
+ Q:$G(DIRUT) 0
+"RTN","BSDX18",175,0)
+ Q:Y 1
+"RTN","BSDX18",176,0)
+ S BSDX("MODIFY")=0
+"RTN","BSDX18",177,0)
+ ;
+"RTN","BSDX18",178,0)
+ S DIR("A")="Allow users to Overbook the selected clinics"
+"RTN","BSDX18",179,0)
+ D ^DIR
+"RTN","BSDX18",180,0)
+ Q:$G(DIRUT) 0
+"RTN","BSDX18",181,0)
+ Q:Y 1
+"RTN","BSDX18",182,0)
+ S BSDX("OVERBOOK")=0
+"RTN","BSDX18",183,0)
+ ;
+"RTN","BSDX18",184,0)
+ S DIR("A")="Allow users to Add, Edit and Delete appointments in the selected resources"
+"RTN","BSDX18",185,0)
+ D ^DIR
+"RTN","BSDX18",186,0)
+ Q:$G(DIRUT)
+"RTN","BSDX18",187,0)
+ Q:Y 1
+"RTN","BSDX18",188,0)
+ S BSDX("WRITE")=0
+"RTN","BSDX18",189,0)
+ ;
+"RTN","BSDX18",190,0)
+ S DIR("A")="Allow users to View appointments in the selected resources"
+"RTN","BSDX18",191,0)
+ D ^DIR
+"RTN","BSDX18",192,0)
+ Q:$G(DIRUT)
+"RTN","BSDX18",193,0)
+ Q:Y 1
+"RTN","BSDX18",194,0)
+ S BSDX("READ")=0
+"RTN","BSDX18",195,0)
+ ;
+"RTN","BSDX18",196,0)
+ Q 0
+"RTN","BSDX18",197,0)
+ ;
+"RTN","BSDX18",198,0)
+MADCONF(BSDX) ;Confirm selections
+"RTN","BSDX18",199,0)
+ N DIR,DIRUT,Y
+"RTN","BSDX18",200,0)
+ S DIR(0)="Y"
+"RTN","BSDX18",201,0)
+ W !!,"-------Confirm Selections-------"
+"RTN","BSDX18",202,0)
+ I BSDX("READ")=0 D
+"RTN","BSDX18",203,0)
+ . S DIR("A")="Are you sure you want to remove all access to these clinics for these users"
+"RTN","BSDX18",204,0)
+ E  D
+"RTN","BSDX18",205,0)
+ . W !,"Selected users will be assigned the following access:"
+"RTN","BSDX18",206,0)
+ . W !,"Modify clinic availability:  ",?50,BSDX("MODIFY")
+"RTN","BSDX18",207,0)
+ . W !,"Overbook Appointments:  ",?50,BSDX("OVERBOOK")
+"RTN","BSDX18",208,0)
+ . W !,"Add, Edit and Delete Appointments:  ",?50,BSDX("WRITE")
+"RTN","BSDX18",209,0)
+ . W !,"View Clinic Appointments:  ",?50,BSDX("READ")
+"RTN","BSDX18",210,0)
+ . S DIR("A")="Are you sure you want to assign these access rights to the selected users"
+"RTN","BSDX18",211,0)
+ D ^DIR
+"RTN","BSDX18",212,0)
+ Q:$G(DIRUT) 0
+"RTN","BSDX18",213,0)
+ Q:$G(Y) 1
+"RTN","BSDX18",214,0)
+ Q 0
+"RTN","BSDX18",215,0)
+ ;
+"RTN","BSDX18",216,0)
+MADASS(BSDX) ;
+"RTN","BSDX18",217,0)
+ ;Assign access level to selected users and resources
+"RTN","BSDX18",218,0)
+ ;Loop through selected users
+"RTN","BSDX18",219,0)
+ ;. Loop through selected resources
+"RTN","BSDX18",220,0)
+ ; . . If an entry in ^BSDXRSU for this user/resource combination exists, then
+"RTN","BSDX18",221,0)
+ ; . . . S sResourceUserID = to it
+"RTN","BSDX18",222,0)
+ ; . . Else
+"RTN","BSDX18",223,0)
+ ; . . . S sResourceUserID = 0
+"RTN","BSDX18",224,0)
+ ; . . Call MADFILE
+"RTN","BSDX18",225,0)
+ N BSDXU,BSDXR,BSDXRUID,BSDXVAL
+"RTN","BSDX18",226,0)
+ S BSDXU=0
+"RTN","BSDX18",227,0)
+ F  S BSDXU=$O(^TMP($J,"BSDX MADDRU","USER",BSDXU)) Q:'+BSDXU  D
+"RTN","BSDX18",228,0)
+ . S BSDXR=0 F  S BSDXR=$O(^TMP($J,"BSDX MADDRU","RESOURCE",BSDXR)) Q:'+BSDXR  D
+"RTN","BSDX18",229,0)
+ . . S BSDXRUID=$$MADEXST(BSDXU,BSDXR)
+"RTN","BSDX18",230,0)
+ . . S BSDXVAL=BSDXRUID_"|"_BSDX("OVERBOOK")_"|"_BSDX("MODIFY")_"|"_BSDXR_"|"_BSDXU_"|"_BSDX("WRITE")
+"RTN","BSDX18",231,0)
+ . . I +BSDXRUID,BSDX("READ")=0 D MADDEL(BSDXRUID)
+"RTN","BSDX18",232,0)
+ . . Q:BSDX("READ")=0
+"RTN","BSDX18",233,0)
+ . . D MADFILE(BSDXVAL)
+"RTN","BSDX18",234,0)
+ . . Q
+"RTN","BSDX18",235,0)
+ . Q
+"RTN","BSDX18",236,0)
+ Q
+"RTN","BSDX18",237,0)
+ ;
+"RTN","BSDX18",238,0)
+MADDEL(BSDXRUID) ;
+"RTN","BSDX18",239,0)
+ ;Delete entry BSDXRUID from BSDX RESOURCE USER file
+"RTN","BSDX18",240,0)
+ N DIK,DA
+"RTN","BSDX18",241,0)
+ Q:'+BSDXRUID
+"RTN","BSDX18",242,0)
+ Q:'$D(^BSDXRSU(BSDXRUID))
+"RTN","BSDX18",243,0)
+ S DIK="^BSDXRSU("
+"RTN","BSDX18",244,0)
+ S DA=BSDXRUID
+"RTN","BSDX18",245,0)
+ D ^DIK
+"RTN","BSDX18",246,0)
+ Q
+"RTN","BSDX18",247,0)
+ ;
+"RTN","BSDX18",248,0)
+MADFILE(BSDXVAL) ;
+"RTN","BSDX18",249,0)
+ ;
+"RTN","BSDX18",250,0)
+ ;Add/Edit BSDX RESOURCEUSER entry
+"RTN","BSDX18",251,0)
+ ;BSDXVAL is sResourceUserID|sOverbook|sModifySchedule|ResourceID|UserID|sModifyAppointments
+"RTN","BSDX18",252,0)
+ ;If sResourceUserID=0 Then this is a new ResourceUser entry
+"RTN","BSDX18",253,0)
+ ;
+"RTN","BSDX18",254,0)
+ N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXOVB,BSDXMOD,BSDXI,BSDXUID,BSDXRID
+"RTN","BSDX18",255,0)
+ N BSDXRES,BSDXRSU,BSDXF,BSDXAPPT
+"RTN","BSDX18",256,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX18",257,0)
+ I +BSDXIEN D
+"RTN","BSDX18",258,0)
+ . S BSDX="EDIT"
+"RTN","BSDX18",259,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",260,0)
+ E  D
+"RTN","BSDX18",261,0)
+ . S BSDX="ADD"
+"RTN","BSDX18",262,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX18",263,0)
+ ;
+"RTN","BSDX18",264,0)
+ I '+$P(BSDXVAL,"|",4) D MADERR("Error in MADFILE^BSDX18: No Resource ID") Q
+"RTN","BSDX18",265,0)
+ I '+$P(BSDXVAL,"|",5) D MADERR("Error in MADFILE^BSDX18: No User ID") Q
+"RTN","BSDX18",266,0)
+ ;
+"RTN","BSDX18",267,0)
+ S BSDXRID=$P(BSDXVAL,"|",4) ;ResourceID
+"RTN","BSDX18",268,0)
+ S BSDXUID=$P(BSDXVAL,"|",5) ;UserID
+"RTN","BSDX18",269,0)
+ S BSDXRSU=0 ;ResourceUserID
+"RTN","BSDX18",270,0)
+ S BSDXF=0 ;flag
+"RTN","BSDX18",271,0)
+ ;If this is an add, check if the user is already assigned to the resource.
+"RTN","BSDX18",272,0)
+ ;If so, then change to an edit
+"RTN","BSDX18",273,0)
+ I BSDX="ADD" F  S BSDXRSU=$O(^BSDXRSU("AC",BSDXUID,BSDXRSU)) Q:'+BSDXRSU  D  Q:BSDXF
+"RTN","BSDX18",274,0)
+ . S BSDXRES=$G(^BSDXRSU(BSDXRSU,0))
+"RTN","BSDX18",275,0)
+ . S BSDXRES=$P(BSDXRES,U) ;ResourceID
+"RTN","BSDX18",276,0)
+ . S:BSDXRES=BSDXRID BSDXF=1
+"RTN","BSDX18",277,0)
+ I BSDXF S BSDX="EDIT",BSDXIEN=BSDXRSU,BSDXIENS=BSDXIEN_","
+"RTN","BSDX18",278,0)
+ ;
+"RTN","BSDX18",279,0)
+ S BSDXOVB=$P(BSDXVAL,"|",2)
+"RTN","BSDX18",280,0)
+ S BSDXMOD=$P(BSDXVAL,"|",3)
+"RTN","BSDX18",281,0)
+ S BSDXAPPT=$P(BSDXVAL,"|",6)
+"RTN","BSDX18",282,0)
+ ;
+"RTN","BSDX18",283,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.01)=$P(BSDXVAL,"|",4) ;RESOURCE ID
+"RTN","BSDX18",284,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.02)=$P(BSDXVAL,"|",5) ;USERID
+"RTN","BSDX18",285,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.03)=BSDXOVB ;OVERBOOK
+"RTN","BSDX18",286,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.04)=BSDXMOD ;MODIFY SCHEDULE
+"RTN","BSDX18",287,0)
+ S BSDXFDA(9002018.15,BSDXIENS,.05)=BSDXAPPT ;ADD, EDIT, DELETE APPOINMENTS
+"RTN","BSDX18",288,0)
+ K BSDXMSG
+"RTN","BSDX18",289,0)
+ I BSDX="ADD" D
+"RTN","BSDX18",290,0)
+ . K BSDXIEN
+"RTN","BSDX18",291,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX18",292,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX18",293,0)
+ E  D
+"RTN","BSDX18",294,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX18",295,0)
+ Q
+"RTN","BSDX18",296,0)
+ ;
+"RTN","BSDX18",297,0)
+MADEXST(BSDXU,BSDXR) ;
+"RTN","BSDX18",298,0)
+ ;Returns BSDX RESOURCE USER ID
+"RTN","BSDX18",299,0)
+ ;if there is a BSDX RESOURCE USER entry for
+"RTN","BSDX18",300,0)
+ ;user BSDXU and resource BSDXR
+"RTN","BSDX18",301,0)
+ ;Otherwise, returns 0
+"RTN","BSDX18",302,0)
+ ;
+"RTN","BSDX18",303,0)
+ N BSDXID,BSDXFOUND,BSDXNOD
+"RTN","BSDX18",304,0)
+ I '$D(^BSDXRSU("AC",BSDXU)) Q 0
+"RTN","BSDX18",305,0)
+ S BSDXID=0,BSDXFOUND=0
+"RTN","BSDX18",306,0)
+ F  S BSDXID=$O(^BSDXRSU("AC",BSDXU,BSDXID)) Q:'+BSDXID  D  Q:BSDXFOUND
+"RTN","BSDX18",307,0)
+ . S BSDXNOD=$G(^BSDXRSU(BSDXID,0))
+"RTN","BSDX18",308,0)
+ . I +BSDXNOD=BSDXR S BSDXFOUND=BSDXID
+"RTN","BSDX18",309,0)
+ . Q
+"RTN","BSDX18",310,0)
+ Q BSDXFOUND
+"RTN","BSDX19")
+0^17^B7890401
+"RTN","BSDX19",1,0)
+BSDX19 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX19",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX19",3,0)
+ ;
+"RTN","BSDX19",4,0)
+ ;
+"RTN","BSDX19",5,0)
+ADDRGD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX19",6,0)
+ ;Entry point for debugging
+"RTN","BSDX19",7,0)
+ ;
+"RTN","BSDX19",8,0)
+ ;D DEBUG^%Serenji("ADDRG^BSDX19(.BSDXY,BSDXVAL)")
+"RTN","BSDX19",9,0)
+ Q
+"RTN","BSDX19",10,0)
+ ;
+"RTN","BSDX19",11,0)
+ADDRG(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX19",12,0)
+ ;Called by BSDX ADD/EDIT RESOURCE GROUP
+"RTN","BSDX19",13,0)
+ ;Add a new BSDX RESOURCE GROUP entry
+"RTN","BSDX19",14,0)
+ ;BSDXVAL is IEN|NAME of the entry
+"RTN","BSDX19",15,0)
+ ;Returns IEN of added/edited entry or 0 if error
+"RTN","BSDX19",16,0)
+ ;
+"RTN","BSDX19",17,0)
+ S X="ERROR^BSDX19",@^%ZOSF("TRAP")
+"RTN","BSDX19",18,0)
+ N BSDXIENS,BSDXFDA,BSDXMSG,BSDXIEN,BSDX,BSDXNAM
+"RTN","BSDX19",19,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX19",20,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX19",21,0)
+ I BSDXVAL="" D ERR(0,"BSDX16: Invalid null input Parameter") Q
+"RTN","BSDX19",22,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX19",23,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX19",24,0)
+ I +BSDXIEN D
+"RTN","BSDX19",25,0)
+ . S BSDX="EDIT"
+"RTN","BSDX19",26,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX19",27,0)
+ E  D
+"RTN","BSDX19",28,0)
+ . S BSDX="ADD"
+"RTN","BSDX19",29,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX19",30,0)
+ ;
+"RTN","BSDX19",31,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX19",32,0)
+ I $D(^BSDXDEPT("B",BSDXNAM)),$O(^BSDXDEPT("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX19",33,0)
+ . D ERR(0,"BSDX19: Cannot have two Resource Groups with the same name.")
+"RTN","BSDX19",34,0)
+ . Q
+"RTN","BSDX19",35,0)
+ ;
+"RTN","BSDX19",36,0)
+ S BSDXFDA(9002018.2,BSDXIENS,.01)=BSDXNAM ;NAME
+"RTN","BSDX19",37,0)
+ I BSDX="ADD" D
+"RTN","BSDX19",38,0)
+ . K BSDXIEN
+"RTN","BSDX19",39,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX19",40,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX19",41,0)
+ E  D
+"RTN","BSDX19",42,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX19",43,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^"_$C(30)_$C(31)
+"RTN","BSDX19",44,0)
+ Q
+"RTN","BSDX19",45,0)
+ ;
+"RTN","BSDX19",46,0)
+DELRGD(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX19",47,0)
+ ;Entry point for debugging
+"RTN","BSDX19",48,0)
+ ;
+"RTN","BSDX19",49,0)
+ ;D DEBUG^%Serenji("DELRG^BSDX19(.BSDXY,BSDXGRP)")
+"RTN","BSDX19",50,0)
+ Q
+"RTN","BSDX19",51,0)
+ ;
+"RTN","BSDX19",52,0)
+DELRG(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX19",53,0)
+ ;Deletes entry name BSDXGRP from BSDX RESOURCE GROUP file
+"RTN","BSDX19",54,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX19",55,0)
+ ;Called by BSDX DELETE RESOURCE GROUP
+"RTN","BSDX19",56,0)
+ ;Test Line:
+"RTN","BSDX19",57,0)
+ ;D DELRU^BSDX18(.RES,99)
+"RTN","BSDX19",58,0)
+ ;
+"RTN","BSDX19",59,0)
+ N BSDXI,DIK,DA,BSDXIEN
+"RTN","BSDX19",60,0)
+ S BSDXI=0
+"RTN","BSDX19",61,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX19",62,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX19",63,0)
+ I BSDXGRP="" D ERR(0,"DELRG~BSDX19: Invalid null Resource Group Name") Q
+"RTN","BSDX19",64,0)
+ S BSDXIEN=$O(^BSDXDEPT("B",BSDXGRP,0))
+"RTN","BSDX19",65,0)
+ I '+BSDXIEN D ERR(0,"DELRG~BSDX19: Invalid Resource Group Name") Q
+"RTN","BSDX19",66,0)
+ I '$D(^BSDXDEPT(BSDXIEN,0)) D ERR(0,"DELRG~BSDX19: Invalid Resource Group IEN") Q
+"RTN","BSDX19",67,0)
+ ;Delete entry BSDXIEN
+"RTN","BSDX19",68,0)
+ S DIK="^BSDXDEPT("
+"RTN","BSDX19",69,0)
+ S DA=BSDXIEN
+"RTN","BSDX19",70,0)
+ D ^DIK
+"RTN","BSDX19",71,0)
+ ;
+"RTN","BSDX19",72,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",73,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_$C(30)_$C(31)
+"RTN","BSDX19",74,0)
+ Q
+"RTN","BSDX19",75,0)
+ ;
+"RTN","BSDX19",76,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX19",77,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX19",78,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",79,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX19",80,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",81,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX19",82,0)
+ Q
+"RTN","BSDX19",83,0)
+ ;
+"RTN","BSDX19",84,0)
+ERROR ;
+"RTN","BSDX19",85,0)
+ D ^%ZTER
+"RTN","BSDX19",86,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX19",87,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX19",88,0)
+ D ERR(0,"BSDX19 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX19",89,0)
+ Q
+"RTN","BSDX20")
+0^18^B5911607
+"RTN","BSDX20",1,0)
+BSDX20 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX20",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX20",3,0)
+ ;
+"RTN","BSDX20",4,0)
+ ;
+"RTN","BSDX20",5,0)
+DELRGID(BSDXY,BSDXIEN) ;EP
+"RTN","BSDX20",6,0)
+ ;Entry point for debugging
+"RTN","BSDX20",7,0)
+ ;
+"RTN","BSDX20",8,0)
+ ;D DEBUG^%Serenji("DELRGI^BSDX20(.BSDXY,BSDXIEN)")
+"RTN","BSDX20",9,0)
+ Q
+"RTN","BSDX20",10,0)
+ ;
+"RTN","BSDX20",11,0)
+DELRGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX20",12,0)
+ ;Deletes entry BSDXIEN1 from entry BSDXIEN in the RESOURCE GROUP file
+"RTN","BSDX20",13,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX20",14,0)
+ ;Called by BSDX DELETE RES GROUP ITEM
+"RTN","BSDX20",15,0)
+ ;Test Line:
+"RTN","BSDX20",16,0)
+ ;D DELRU^BSDX18(.RES,99)
+"RTN","BSDX20",17,0)
+ ;
+"RTN","BSDX20",18,0)
+ N BSDXI,DIK,DA
+"RTN","BSDX20",19,0)
+ S BSDXI=0
+"RTN","BSDX20",20,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX20",21,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPID^I00020ERRORID"_$C(30)
+"RTN","BSDX20",22,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",23,0)
+ I '+BSDXIEN1 D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",24,0)
+ I '$D(^BSDXDEPT(BSDXIEN,1,BSDXIEN1,0)) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",25,0)
+ ;
+"RTN","BSDX20",26,0)
+ ;Delete entry BSDXIEN1
+"RTN","BSDX20",27,0)
+ S DIK="^BSDXDEPT("_BSDXIEN_",1,"
+"RTN","BSDX20",28,0)
+ S DA=BSDXIEN1,DA(1)=BSDXIEN
+"RTN","BSDX20",29,0)
+ D ^DIK
+"RTN","BSDX20",30,0)
+ ;
+"RTN","BSDX20",31,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",32,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX20",33,0)
+ Q
+"RTN","BSDX20",34,0)
+ ;
+"RTN","BSDX20",35,0)
+ADDRGID(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX20",36,0)
+ ;Entry point for debugging
+"RTN","BSDX20",37,0)
+ ;
+"RTN","BSDX20",38,0)
+ ;D DEBUG^%Serenji("ADDRGI^BSDX20(.BSDXY,BSDXIEN,BSDXIEN1)")
+"RTN","BSDX20",39,0)
+ Q
+"RTN","BSDX20",40,0)
+ ;
+"RTN","BSDX20",41,0)
+ADDRGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX20",42,0)
+ ;Adds RESOURCEID BSEDXIEN1 to RESOURCE GROUP entry BSDXIEN
+"RTN","BSDX20",43,0)
+ ;Return recordset containing added subentry number error message or "" if no error
+"RTN","BSDX20",44,0)
+ ;Called by BSDX ADD RES GROUP ITEM
+"RTN","BSDX20",45,0)
+ ;Test Line:
+"RTN","BSDX20",46,0)
+ ;D ADDRGI^BSDX20(.RES,1,1)
+"RTN","BSDX20",47,0)
+ ;
+"RTN","BSDX20",48,0)
+ N BSDXI,BSDXIENS,BSDXMSG,BSDXFDA
+"RTN","BSDX20",49,0)
+ S X="ETRAP^BSDX20",@^%ZOSF("TRAP")
+"RTN","BSDX20",50,0)
+ S BSDXI=0
+"RTN","BSDX20",51,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX20",52,0)
+ S ^BSDXTMP($J,0)="I00020RESOURCEGROUPITEMID^I00020ERRORID"_$C(30)
+"RTN","BSDX20",53,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",54,0)
+ I '+BSDXIEN1 D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",55,0)
+ I '$D(^BSDXDEPT(BSDXIEN,0)) D ERR(BSDXI,BSDXIEN,70) Q
+"RTN","BSDX20",56,0)
+ I '$D(^BSDXRES(BSDXIEN1,0)) D ERR(BSDXI,BSDXIEN1,70) Q
+"RTN","BSDX20",57,0)
+ I $D(^BSDXDEPT(BSDXIEN,1,"B",BSDXIEN1)) D ERR(BSDXI,0,0) Q
+"RTN","BSDX20",58,0)
+ ;^BSDXDEPT(3,1,"B",3,1)=
+"RTN","BSDX20",59,0)
+ ;
+"RTN","BSDX20",60,0)
+ S BSDXIENS="+1,"_BSDXIEN_","
+"RTN","BSDX20",61,0)
+ S BSDXFDA(9002018.21,BSDXIENS,.01)=BSDXIEN1 ;RESOURCEID
+"RTN","BSDX20",62,0)
+ K BSDXIEN
+"RTN","BSDX20",63,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX20",64,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",65,0)
+ S ^BSDXTMP($J,BSDXI)=+$G(BSDXIEN(1))_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX20",66,0)
+ Q
+"RTN","BSDX20",67,0)
+ ;
+"RTN","BSDX20",68,0)
+ERR(BSDXI,BSDXID,BSDXERR) ;Error processing
+"RTN","BSDX20",69,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",70,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXID_"^"_BSDXERR_$C(30)
+"RTN","BSDX20",71,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",72,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX20",73,0)
+ Q
+"RTN","BSDX20",74,0)
+ ;
+"RTN","BSDX20",75,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX20",76,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX20",77,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX20",78,0)
+ D ERR(BSDXI,99,70)
+"RTN","BSDX20",79,0)
+ Q
+"RTN","BSDX21")
+0^19^B8672065
+"RTN","BSDX21",1,0)
+BSDX21 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 5/21/10 9:42pm
+"RTN","BSDX21",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX21",3,0)
+ ;
+"RTN","BSDX21",4,0)
+ ;
+"RTN","BSDX21",5,0)
+ADDAGD(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX21",6,0)
+ ;Entry point for debugging
+"RTN","BSDX21",7,0)
+ ;
+"RTN","BSDX21",8,0)
+ ;D DEBUG^%Serenji("ADDAG^BSDX21(.BSDXY,BSDXVAL)")
+"RTN","BSDX21",9,0)
+ Q
+"RTN","BSDX21",10,0)
+ ;
+"RTN","BSDX21",11,0)
+ADDAG(BSDXY,BSDXVAL) ;EP
+"RTN","BSDX21",12,0)
+ ;Called by BSDX ADD/EDIT ACCESS GROUP
+"RTN","BSDX21",13,0)
+ ;Add a new BSDX ACCESS GROUP entry
+"RTN","BSDX21",14,0)
+ ;BSDXVAL is NAME of the entry
+"RTN","BSDX21",15,0)
+ ;
+"RTN","BSDX21",16,0)
+ S X="ERROR^BSDX21",@^%ZOSF("TRAP")
+"RTN","BSDX21",17,0)
+ N BSDXIENS,BSDXFDA,BSDXMSG,BSDXIEN,BSDX,BSDXNAM
+"RTN","BSDX21",18,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX21",19,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX21",20,0)
+ I BSDXVAL="" D ERR(0,"BSDX21: Invalid null input Parameter") Q
+"RTN","BSDX21",21,0)
+ S BSDXIEN=$P(BSDXVAL,"|")
+"RTN","BSDX21",22,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX21",23,0)
+ I +BSDXIEN D
+"RTN","BSDX21",24,0)
+ . S BSDX="EDIT"
+"RTN","BSDX21",25,0)
+ . S BSDXIENS=BSDXIEN_","
+"RTN","BSDX21",26,0)
+ E  D
+"RTN","BSDX21",27,0)
+ . S BSDX="ADD"
+"RTN","BSDX21",28,0)
+ . S BSDXIENS="+1,"
+"RTN","BSDX21",29,0)
+ ;
+"RTN","BSDX21",30,0)
+ S BSDXNAM=$P(BSDXVAL,"|",2)
+"RTN","BSDX21",31,0)
+ I BSDXNAM="" D ERR(0,"BSDX14: Invalid null Access Type name.") Q
+"RTN","BSDX21",32,0)
+ ;
+"RTN","BSDX21",33,0)
+ ;Prevent adding entry with duplicate name
+"RTN","BSDX21",34,0)
+ I $D(^BSDXAGP("B",BSDXNAM)),$O(^BSDXAGP("B",BSDXNAM,0))'=BSDXIEN D  Q
+"RTN","BSDX21",35,0)
+ . D ERR(0,"BSDX21: Cannot have two Access Groups with the same name.")
+"RTN","BSDX21",36,0)
+ . Q
+"RTN","BSDX21",37,0)
+ ;
+"RTN","BSDX21",38,0)
+ S BSDXFDA(9002018.38,BSDXIENS,.01)=BSDXNAM ;NAME
+"RTN","BSDX21",39,0)
+ I BSDX="ADD" D
+"RTN","BSDX21",40,0)
+ . K BSDXIEN
+"RTN","BSDX21",41,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX21",42,0)
+ . S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX21",43,0)
+ E  D
+"RTN","BSDX21",44,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX21",45,0)
+ S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^"_$C(30)_$C(31)
+"RTN","BSDX21",46,0)
+ Q
+"RTN","BSDX21",47,0)
+ ;
+"RTN","BSDX21",48,0)
+DELAGD(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX21",49,0)
+ ;Entry point for debugging
+"RTN","BSDX21",50,0)
+ ;
+"RTN","BSDX21",51,0)
+ ;D DEBUG^%Serenji("DELAG^BSDX21(.BSDXY,BSDXGRP)")
+"RTN","BSDX21",52,0)
+ Q
+"RTN","BSDX21",53,0)
+ ;
+"RTN","BSDX21",54,0)
+DELAG(BSDXY,BSDXGRP) ;EP
+"RTN","BSDX21",55,0)
+ ;Deletes entry having IEN BSDXGRP from BSDX ACCESS GROUP file
+"RTN","BSDX21",56,0)
+ ;Also deletes all entries in BSDX ACCESS GROUP TYPE that point to this group
+"RTN","BSDX21",57,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX21",58,0)
+ ;Called by BSDX DELETE ACCESS GROUP
+"RTN","BSDX21",59,0)
+ ;Test Line:
+"RTN","BSDX21",60,0)
+ ;D DELAG^BSDX21(.RES,99)
+"RTN","BSDX21",61,0)
+ ;
+"RTN","BSDX21",62,0)
+ S X="ERROR^BSDX21",@^%ZOSF("TRAP")
+"RTN","BSDX21",63,0)
+ N BSDXI,DIK,DA,BSDXIEN,BSDXIEN1
+"RTN","BSDX21",64,0)
+ S BSDXI=0
+"RTN","BSDX21",65,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX21",66,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX21",67,0)
+ S BSDXIEN=BSDXGRP
+"RTN","BSDX21",68,0)
+ ;I '$D(^BSDXAGP("B",BSDXGRP)) D ERR(BSDXI,0,0) Q
+"RTN","BSDX21",69,0)
+ ;S BSDXIEN=$O(^BSDXAGP("B",BSDXGRP,0))
+"RTN","BSDX21",70,0)
+ I '+BSDXIEN D ERR(BSDXI,BSDXIEN) Q
+"RTN","BSDX21",71,0)
+ I '$D(^BSDXAGP(BSDXIEN,0)) D ERR(0,"BSDX14: Invalid Access Group ID name.") Q
+"RTN","BSDX21",72,0)
+ ;
+"RTN","BSDX21",73,0)
+ ;Delete BSDXACCESS GROUP TYPE entries
+"RTN","BSDX21",74,0)
+ ;
+"RTN","BSDX21",75,0)
+ S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXAGTP("B",BSDXIEN,BSDXIEN1)) Q:'BSDXIEN1  D
+"RTN","BSDX21",76,0)
+ . S DIK="^BSDXAGTP("
+"RTN","BSDX21",77,0)
+ . S DA=BSDXIEN1
+"RTN","BSDX21",78,0)
+ . D ^DIK
+"RTN","BSDX21",79,0)
+ . Q
+"RTN","BSDX21",80,0)
+ ;
+"RTN","BSDX21",81,0)
+ ;Delete entry BSDXIEN in BSDX ACCESS GROUP
+"RTN","BSDX21",82,0)
+ S DIK="^BSDXAGP("
+"RTN","BSDX21",83,0)
+ S DA=BSDXIEN
+"RTN","BSDX21",84,0)
+ D ^DIK
+"RTN","BSDX21",85,0)
+ ;
+"RTN","BSDX21",86,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",87,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_""_$C(30)_$C(31)
+"RTN","BSDX21",88,0)
+ Q
+"RTN","BSDX21",89,0)
+ ;
+"RTN","BSDX21",90,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX21",91,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX21",92,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",93,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX21",94,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",95,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX21",96,0)
+ Q
+"RTN","BSDX21",97,0)
+ ;
+"RTN","BSDX21",98,0)
+ERROR ;
+"RTN","BSDX21",99,0)
+ D ^%ZTER
+"RTN","BSDX21",100,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX21",101,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX21",102,0)
+ D ERR(0,"BSDX21 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX21",103,0)
+ Q
+"RTN","BSDX22")
+0^20^B9479861
+"RTN","BSDX22",1,0)
+BSDX22 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX22",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX22",3,0)
+ ;
+"RTN","BSDX22",4,0)
+ ;
+"RTN","BSDX22",5,0)
+DELAGID(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",6,0)
+ ;Entry point for debugging
+"RTN","BSDX22",7,0)
+ ;
+"RTN","BSDX22",8,0)
+ ;D DEBUG^%Serenji("DELAGI^BSDX22(.BSDXY,BSDXIEN,BSDXIEN1)")
+"RTN","BSDX22",9,0)
+ Q
+"RTN","BSDX22",10,0)
+ ;
+"RTN","BSDX22",11,0)
+DELAGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",12,0)
+ ;Deletes entry having Access Group BSDXIEN and Access Type BSDXIEN1 the ACCESS GROUP TYPE file
+"RTN","BSDX22",13,0)
+ ;Return recordset containing error message or "" if no error
+"RTN","BSDX22",14,0)
+ ;Called by BSDX DELETE ACCESS GROUP ITEM
+"RTN","BSDX22",15,0)
+ ;Test Line:
+"RTN","BSDX22",16,0)
+ ;D DELAGI^BSDX22(.RES,99)
+"RTN","BSDX22",17,0)
+ ;
+"RTN","BSDX22",18,0)
+ S X="ERROR^BSDX22",@^%ZOSF("TRAP")
+"RTN","BSDX22",19,0)
+ N BSDXI,DIK,DA,BSDXIEN2
+"RTN","BSDX22",20,0)
+ S BSDXI=0
+"RTN","BSDX22",21,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX22",22,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPTYPEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX22",23,0)
+ I '+BSDXIEN D ERR(0,"BSDX22: Invalid null Access Group ID") Q
+"RTN","BSDX22",24,0)
+ I '+BSDXIEN1 D ERR(0,"BSDX22: Invalid null Access Type ID") Q
+"RTN","BSDX22",25,0)
+ I '$D(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1)) D  Q
+"RTN","BSDX22",26,0)
+ . D ERR(0,"BSDX22: Invalid null Access Group Type ID")
+"RTN","BSDX22",27,0)
+ . Q
+"RTN","BSDX22",28,0)
+ S BSDXIEN2=$O(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1,0))
+"RTN","BSDX22",29,0)
+ I '+BSDXIEN2 D ERR(0,"BSDX22: Invalid null Access Group Type ID") Q
+"RTN","BSDX22",30,0)
+ ;
+"RTN","BSDX22",31,0)
+ ;Delete entry
+"RTN","BSDX22",32,0)
+ S DIK="^BSDXAGTP("
+"RTN","BSDX22",33,0)
+ S DA=BSDXIEN2
+"RTN","BSDX22",34,0)
+ D ^DIK
+"RTN","BSDX22",35,0)
+ ;
+"RTN","BSDX22",36,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",37,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXIEN2_"^"_"-1"_$C(30)_$C(31)
+"RTN","BSDX22",38,0)
+ Q
+"RTN","BSDX22",39,0)
+ ;
+"RTN","BSDX22",40,0)
+ADDAGID(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",41,0)
+ ;Entry point for debugging
+"RTN","BSDX22",42,0)
+ ;
+"RTN","BSDX22",43,0)
+ ;D DEBUG^%Serenji("ADDAGI^BSDX22(.BSDXY,BSDXIEN,BSDXIEN1)")
+"RTN","BSDX22",44,0)
+ Q
+"RTN","BSDX22",45,0)
+ ;
+"RTN","BSDX22",46,0)
+ADDAGI(BSDXY,BSDXIEN,BSDXIEN1) ;EP
+"RTN","BSDX22",47,0)
+ ;Adds ACCESS GROUP TYPE file entry having access group BSDXIEN and access type BSDXIEN1
+"RTN","BSDX22",48,0)
+ ;Return recordset containing added entry number error message or "" if no error
+"RTN","BSDX22",49,0)
+ ;Called by BSDX ADD ACCESS GROUP ITEM
+"RTN","BSDX22",50,0)
+ ;Test Line:
+"RTN","BSDX22",51,0)
+ ;D ADDAGI^BSDX22(.RES,1,1)
+"RTN","BSDX22",52,0)
+ ;
+"RTN","BSDX22",53,0)
+ S X="ERROR^BSDX22",@^%ZOSF("TRAP")
+"RTN","BSDX22",54,0)
+ N BSDXI,BSDXIENS,BSDXMSG,BSDXFDA
+"RTN","BSDX22",55,0)
+ S BSDXI=0
+"RTN","BSDX22",56,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX22",57,0)
+ ;S ^BSDXTMP($J,0)="I00020ACCESSGROUPTYPEID^I00020ERRORID"_$C(30)
+"RTN","BSDX22",58,0)
+ S ^BSDXTMP($J,0)="I00020ACCESSGROUPTYPEID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX22",59,0)
+ I '+BSDXIEN D ERR(0,"BSDX22: Invalid null Access Group ID") Q
+"RTN","BSDX22",60,0)
+ I '+BSDXIEN1 D ERR(0,"BSDX22: Invalid null Access Type ID") Q
+"RTN","BSDX22",61,0)
+ I '$D(^BSDXAGP(BSDXIEN,0)) D ERR(0,"BSDX22: Invalid Access Group ID") Q
+"RTN","BSDX22",62,0)
+ I '$D(^BSDXTYPE(BSDXIEN1,0)) D ERR(0,"BSDX22: Invalid Access Type ID") Q
+"RTN","BSDX22",63,0)
+ I $D(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1)) D  Q
+"RTN","BSDX22",64,0)
+ . S BSDXIENS=$O(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1,0))
+"RTN","BSDX22",65,0)
+ . S ^BSDXTMP($J,BSDXI+1)=+BSDXIENS_"^"_$C(30)_$C(31)
+"RTN","BSDX22",66,0)
+ . Q
+"RTN","BSDX22",67,0)
+ ;
+"RTN","BSDX22",68,0)
+ S BSDXIENS="+1,"
+"RTN","BSDX22",69,0)
+ S BSDXFDA(9002018.39,BSDXIENS,.01)=BSDXIEN ;ACCESS GROUP ID
+"RTN","BSDX22",70,0)
+ S BSDXFDA(9002018.39,BSDXIENS,.02)=BSDXIEN1 ;ACCESS TYPE ID
+"RTN","BSDX22",71,0)
+ K BSDXIEN
+"RTN","BSDX22",72,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX22",73,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",74,0)
+ S ^BSDXTMP($J,BSDXI)=+$G(BSDXIEN(1))_"^"_$C(30)_$C(31)
+"RTN","BSDX22",75,0)
+ Q
+"RTN","BSDX22",76,0)
+ ;
+"RTN","BSDX22",77,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX22",78,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX22",79,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",80,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX22",81,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",82,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX22",83,0)
+ Q
+"RTN","BSDX22",84,0)
+ ;
+"RTN","BSDX22",85,0)
+ERROR ;
+"RTN","BSDX22",86,0)
+ D ^%ZTER
+"RTN","BSDX22",87,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX22",88,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX22",89,0)
+ D ERR(0,"BSDX22 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX22",90,0)
+ Q
+"RTN","BSDX23")
+0^21^B8488013
+"RTN","BSDX23",1,0)
+BSDX23 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX23",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX23",3,0)
+ ;
+"RTN","BSDX23",4,0)
+ ;
+"RTN","BSDX23",5,0)
+EVENT(BSDXEVENT,BSDXPARAM,BSDXSIP,BSDXSPT) ;EP
+"RTN","BSDX23",6,0)
+ ;Raise event to interested clients
+"RTN","BSDX23",7,0)
+ ;Clients are listed in ^BSDXTMP("EVENT",EVENT_NAME,IP,PORT)
+"RTN","BSDX23",8,0)
+ ;BSDXSIP and BSDXSPT represent the sender's IP and PORT.  
+"RTN","BSDX23",9,0)
+ ;The event will not be raised back to the sender if these are non-null
+"RTN","BSDX23",10,0)
+ ;
+"RTN","BSDX23",11,0)
+ Q:'$D(^BSDXTMP("EVENT",BSDXEVENT))
+"RTN","BSDX23",12,0)
+ S BSDXIP=0 F  S BSDXIP=$O(^BSDXTMP("EVENT",BSDXEVENT,BSDXIP)) Q:BSDXIP=""  D
+"RTN","BSDX23",13,0)
+ . S BSDXPORT=0 F  S BSDXPORT=$O(^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)) Q:'+BSDXPORT  D
+"RTN","BSDX23",14,0)
+ . . I BSDXIP=BSDXSIP Q  ;,BSDXPORT=BSDXSPT Q
+"RTN","BSDX23",15,0)
+ . . D CALL^%ZISTCP(BSDXIP,BSDXPORT,5)
+"RTN","BSDX23",16,0)
+ . . I POP K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT) Q
+"RTN","BSDX23",17,0)
+ . . ;U IO R X#3:5
+"RTN","BSDX23",18,0)
+ . . I X'="ACK" K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT) Q
+"RTN","BSDX23",19,0)
+ . . S BSDXPARAM=$S(BSDXPARAM="":"",1:U_BSDXPARAM)
+"RTN","BSDX23",20,0)
+ . . U IO W BSDXEVENT,BSDXPARAM,!
+"RTN","BSDX23",21,0)
+ . . D ^%ZISC
+"RTN","BSDX23",22,0)
+ . . Q
+"RTN","BSDX23",23,0)
+ . Q
+"RTN","BSDX23",24,0)
+ Q
+"RTN","BSDX23",25,0)
+ ;
+"RTN","BSDX23",26,0)
+EVERR(BSDXEVENT,BSDXIP,BSDXPORT) ;
+"RTN","BSDX23",27,0)
+ ;
+"RTN","BSDX23",28,0)
+ Q:$G(BSDXEVENT)=""
+"RTN","BSDX23",29,0)
+ Q:$G(BSDXIP)=""
+"RTN","BSDX23",30,0)
+ Q:$G(BSDXIP)=""
+"RTN","BSDX23",31,0)
+ K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)
+"RTN","BSDX23",32,0)
+ Q
+"RTN","BSDX23",33,0)
+ ;
+"RTN","BSDX23",34,0)
+REGET ;EP
+"RTN","BSDX23",35,0)
+ ;Error trap from REGEVNT
+"RTN","BSDX23",36,0)
+ ;
+"RTN","BSDX23",37,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX23",38,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",39,0)
+ D REGERR(BSDXI,99)
+"RTN","BSDX23",40,0)
+ Q
+"RTN","BSDX23",41,0)
+ ;
+"RTN","BSDX23",42,0)
+REGERR(BSDXI,BSDXERID) ;Error processing
+"RTN","BSDX23",43,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",44,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_$C(30)
+"RTN","BSDX23",45,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",46,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX23",47,0)
+ Q
+"RTN","BSDX23",48,0)
+ ;
+"RTN","BSDX23",49,0)
+ ;
+"RTN","BSDX23",50,0)
+REGEVNT(BSDXY,BSDXEVENT,BSDXIP,BSDXPORT) ;EP
+"RTN","BSDX23",51,0)
+ ;RPC Called by client to inform RPMS server of client's interest in BSDXEVENT
+"RTN","BSDX23",52,0)
+ ;Returns RECORDSET with field ERRORID.
+"RTN","BSDX23",53,0)
+ ;If everything ok then ERRORID = 0;
+"RTN","BSDX23",54,0)
+ ;
+"RTN","BSDX23",55,0)
+ N BSDXI
+"RTN","BSDX23",56,0)
+ S BSDXI=0
+"RTN","BSDX23",57,0)
+ S X="REGET^BSDX23",@^%ZOSF("TRAP")
+"RTN","BSDX23",58,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX23",59,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID"_$C(30)
+"RTN","BSDX23",60,0)
+ I '+BSDXPORT D REGERR(BSDXI,1) Q
+"RTN","BSDX23",61,0)
+ I BSDXIP="" D REGERR(BSDXI,2) Q
+"RTN","BSDX23",62,0)
+ S ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)=""
+"RTN","BSDX23",63,0)
+ ;
+"RTN","BSDX23",64,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",65,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)_$C(31)
+"RTN","BSDX23",66,0)
+ Q
+"RTN","BSDX23",67,0)
+ ;
+"RTN","BSDX23",68,0)
+UNREG(BSDXY,BSDXEVENT,BSDXIP,BSDXPORT) ;EP
+"RTN","BSDX23",69,0)
+ ;RPC Called by client to Unregister client's interest in BSDXEVENT
+"RTN","BSDX23",70,0)
+ ;Returns RECORDSET with field ERRORID.
+"RTN","BSDX23",71,0)
+ ;If everything ok then ERRORID = 0;
+"RTN","BSDX23",72,0)
+ ;
+"RTN","BSDX23",73,0)
+ N BSDXI
+"RTN","BSDX23",74,0)
+ S BSDXI=0
+"RTN","BSDX23",75,0)
+ S X="REGET^BSDX23",@^%ZOSF("TRAP")
+"RTN","BSDX23",76,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX23",77,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID"_$C(30)
+"RTN","BSDX23",78,0)
+ I '+BSDXPORT D REGERR(BSDXI,1) Q
+"RTN","BSDX23",79,0)
+ I BSDXIP="" D REGERR(BSDXI,2) Q
+"RTN","BSDX23",80,0)
+ K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)
+"RTN","BSDX23",81,0)
+ ;
+"RTN","BSDX23",82,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",83,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)_$C(31)
+"RTN","BSDX23",84,0)
+ Q
+"RTN","BSDX23",85,0)
+ ;
+"RTN","BSDX23",86,0)
+RAISEVNT(BSDXY,BSDXEVENT,BSDXPARAM,BSDXSIP,BSDXSPT) ;EP
+"RTN","BSDX23",87,0)
+ ;RPC Called to raise event BSDXEVENT with parameter BSDXPARAM
+"RTN","BSDX23",88,0)
+ ;BSDXSIP and BSDXSPT represent the sender's IP and PORT.
+"RTN","BSDX23",89,0)
+ ;If not null, these will prevent the event from being raised back
+"RTN","BSDX23",90,0)
+ ;to the sender.
+"RTN","BSDX23",91,0)
+ ;Returns a RECORDSET wit the field ERRORID.
+"RTN","BSDX23",92,0)
+ ;If everything ok then ERRORID = 0;
+"RTN","BSDX23",93,0)
+ ;
+"RTN","BSDX23",94,0)
+ N BSDXI
+"RTN","BSDX23",95,0)
+ S BSDXI=0
+"RTN","BSDX23",96,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX23",97,0)
+ S ^BSDXTMP($J,0)="I00020ERRORID"_$C(30)
+"RTN","BSDX23",98,0)
+ S X="REGET^BSDX23",@^%ZOSF("TRAP")
+"RTN","BSDX23",99,0)
+ ;
+"RTN","BSDX23",100,0)
+ D EVENT(BSDXEVENT,BSDXPARAM,BSDXSIP,BSDXSPT)
+"RTN","BSDX23",101,0)
+ ;
+"RTN","BSDX23",102,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX23",103,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)_$C(31)
+"RTN","BSDX23",104,0)
+ Q
+"RTN","BSDX24")
+0^22^B13455014
+"RTN","BSDX24",1,0)
+BSDX24 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX24",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX24",3,0)
+ ;
+"RTN","BSDX24",4,0)
+ ;
+"RTN","BSDX24",5,0)
+ Q
+"RTN","BSDX24",6,0)
+CRCONTXT(RESULT,OPTION) ;EP
+"RTN","BSDX24",7,0)
+ ;Entry point for debugging XWBSEC
+"RTN","BSDX24",8,0)
+ ;
+"RTN","BSDX24",9,0)
+ ;D DEBUG^%Serenji("CRCONTXT^XWBSEC(.RESULT,OPTION)")
+"RTN","BSDX24",10,0)
+ ;;H .5
+"RTN","BSDX24",11,0)
+ ;;D CRCONTXT^XWBSEC(.RESULT,OPTION)
+"RTN","BSDX24",12,0)
+ ;;S BSDX="^BSDXTMP($J,"
+"RTN","BSDX24",13,0)
+ ;;S ^BSDXTMP($J,0)=RESULT
+"RTN","BSDX24",14,0)
+ ;;S RESULT=1
+"RTN","BSDX24",15,0)
+ Q
+"RTN","BSDX24",16,0)
+TEST0(BSDX) ;EP Delete user from 200
+"RTN","BSDX24",17,0)
+ S DIK="^VA(200,"
+"RTN","BSDX24",18,0)
+ S DA=BSDX
+"RTN","BSDX24",19,0)
+ D ^DIK
+"RTN","BSDX24",20,0)
+ ;
+"RTN","BSDX24",21,0)
+ Q
+"RTN","BSDX24",22,0)
+KILLM ;EP Delete BMXMENU entry
+"RTN","BSDX24",23,0)
+ S DIK="^DIC(19,"
+"RTN","BSDX24",24,0)
+ S DA=$O(^DIC(19,"B","BMXMENU",0))
+"RTN","BSDX24",25,0)
+ Q:'+DA
+"RTN","BSDX24",26,0)
+ D ^DIK
+"RTN","BSDX24",27,0)
+ Q
+"RTN","BSDX24",28,0)
+ ;
+"RTN","BSDX24",29,0)
+TEST1 ;EP Adding an entry to 200
+"RTN","BSDX24",30,0)
+ ;
+"RTN","BSDX24",31,0)
+ S BSDXFDA(200,"+1,",.01)="BMXNET,APPLICATION"
+"RTN","BSDX24",32,0)
+ K BSDXIEN,BSDXMSG
+"RTN","BSDX24",33,0)
+ S DIC(0)=""
+"RTN","BSDX24",34,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX24",35,0)
+ ;
+"RTN","BSDX24",36,0)
+ Q
+"RTN","BSDX24",37,0)
+TEST2 ;EP
+"RTN","BSDX24",38,0)
+ ;How to change the ACCESS CODE, VERIFY CODE, DATE VERIFY CODE LAST CHANGED field
+"RTN","BSDX24",39,0)
+ ;ACCESS CODE BSDXXX1^1_(a>yr}:3x3ja9\8vbH
+"RTN","BSDX24",40,0)
+ ;VERIFY CODE BSDXXX2^$;HOSs|:3w25lLD}Be=
+"RTN","BSDX24",41,0)
+ N BSDXFDA
+"RTN","BSDX24",42,0)
+ S BSDXFDA(200,"36,",2)="1_(a>yr}:3x3ja9\8vbH"
+"RTN","BSDX24",43,0)
+ S BSDXFDA(200,"36,",11)="$;HOSs|:3w25lLD}Be="
+"RTN","BSDX24",44,0)
+ S BSDXFDA(200,"36,",11.2)="88888,88888"
+"RTN","BSDX24",45,0)
+ S BSDXFDA(200,"36,",201)="BMXRPC"
+"RTN","BSDX24",46,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX24",47,0)
+ Q
+"RTN","BSDX24",48,0)
+ ;
+"RTN","BSDX24",49,0)
+ ;
+"RTN","BSDX24",50,0)
+SEARCHD(BSDXY,BSDXRES,BSDXSTRT,BSDXEND,BSDXTYPES,BSDXAMPM,BSDXWKDY) ;EP
+"RTN","BSDX24",51,0)
+ ;Entry point for debugging
+"RTN","BSDX24",52,0)
+ ;
+"RTN","BSDX24",53,0)
+ ;D DEBUG^%Serenji("SEARCH^BSDX24(.RES,""ROGERS,BUCK|FUNAKOSHI,GICHIN"","""","""","""","""","""")")
+"RTN","BSDX24",54,0)
+ ;D DEBUG^%Serenji("SEARCH^BSDX24(.BSDXY,BSDXRES,BSDXSTRT,BSDXEND,BSDXTYPES,BSDXAMPM,BSDXWKDY)")
+"RTN","BSDX24",55,0)
+ Q
+"RTN","BSDX24",56,0)
+ ;
+"RTN","BSDX24",57,0)
+SEARCH(BSDXY,BSDXRES,BSDXSTRT,BSDXEND,BSDXTYPES,BSDXAMPM,BSDXWKDY) ;EP
+"RTN","BSDX24",58,0)
+ ;Searches availability database for availability blocks between
+"RTN","BSDX24",59,0)
+ ;BSDXSTRT and BSDXEND for each of the resources in BSDXRES.
+"RTN","BSDX24",60,0)
+ ;The av blocks must be one of the types in BSDXTYPES, must be
+"RTN","BSDX24",61,0)
+ ;AM or PM depending on value in BSDXAMPM and
+"RTN","BSDX24",62,0)
+ ;must be on one of the weekdays listed in BSDXWKDY.
+"RTN","BSDX24",63,0)
+ ;
+"RTN","BSDX24",64,0)
+ ;Return recordset containing the start times of availability blocks
+"RTN","BSDX24",65,0)
+ ;meeting the search criteria.
+"RTN","BSDX24",66,0)
+ ;
+"RTN","BSDX24",67,0)
+ ;Variables:
+"RTN","BSDX24",68,0)
+ ;BSDXRES |-Delimited list of resource names
+"RTN","BSDX24",69,0)
+ ;BSDXSTRT FM-formatted beginning date of search
+"RTN","BSDX24",70,0)
+ ;BSDXEND FM-Formatted ending date of search
+"RTN","BSDX24",71,0)
+ ;BSDXTYPES |-Delimited list of access type IENs
+"RTN","BSDX24",72,0)
+ ;BSDXAMPM "AM" for am-only, "PM" for pm-only, "BOTH" for both
+"RTN","BSDX24",73,0)
+ ;BSDXWKDY "" if any weekday, else |-delimited list of weekdays
+"RTN","BSDX24",74,0)
+ ;
+"RTN","BSDX24",75,0)
+ ;NOTE: If BSDXEND="" Then:
+"RTN","BSDX24",76,0)
+ ; either ONE record is returned matching the first available block
+"RTN","BSDX24",77,0)
+ ; -or- NO record is returned indicating no available block exists
+"RTN","BSDX24",78,0)
+ ;
+"RTN","BSDX24",79,0)
+ ;Called by BSDX SEARCH AVAILABILITY
+"RTN","BSDX24",80,0)
+ ;Test Line:
+"RTN","BSDX24",81,0)
+ ;D SEARCH^BSDX24(.RES,"ROGERS,BUCK|FUNAKOSHI,GICHIN","","","","","") ZW RES
+"RTN","BSDX24",82,0)
+ ;
+"RTN","BSDX24",83,0)
+ ;
+"RTN","BSDX24",84,0)
+ S X=BSDXSTRT,%DT="X" D ^%DT S BSDXSTRT=$P(Y,".")
+"RTN","BSDX24",85,0)
+ S:+BSDXSTRT<0 BSDXSTRT=DT
+"RTN","BSDX24",86,0)
+ S X=BSDXEND,%DT="X" D ^%DT S BSDXEND=$P(Y,".")
+"RTN","BSDX24",87,0)
+ S:+BSDXEND<0 BSDXEND=9990101
+"RTN","BSDX24",88,0)
+ S BSDXEND=BSDXEND_".99"
+"RTN","BSDX24",89,0)
+ N BSDXRESN,BSDXRESD,BSDXDATE,BSDXI,BSDXABD,BSDXNOD,BSDXATD,BSDXATN
+"RTN","BSDX24",90,0)
+ N BSDXTYPE
+"RTN","BSDX24",91,0)
+ ;
+"RTN","BSDX24",92,0)
+ ;Set up access types array
+"RTN","BSDX24",93,0)
+ F BSDX=1:1:$L(BSDXTYPES,"|") D
+"RTN","BSDX24",94,0)
+ . S BSDXATD=$P(BSDXTYPES,"|",BSDX)
+"RTN","BSDX24",95,0)
+ . S:+BSDXATD BSDXTYPE(BSDXTYPD)=""
+"RTN","BSDX24",96,0)
+ ;
+"RTN","BSDX24",97,0)
+ S BSDXI=0
+"RTN","BSDX24",98,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX24",99,0)
+ S ^BSDXTMP($J,0)="T00030RESOURCENAME^D00030DATE^T00030ACCESSTYPE^T00030COMMENT"_$C(30)
+"RTN","BSDX24",100,0)
+ F BSDX=1:1:$L(BSDXRES,"|") S BSDXRESN=$P(BSDXRES,"|",BSDX) D
+"RTN","BSDX24",101,0)
+ . Q:'$D(^BSDXRES("B",BSDXRESN))
+"RTN","BSDX24",102,0)
+ . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+"RTN","BSDX24",103,0)
+ . Q:'+BSDXRESD
+"RTN","BSDX24",104,0)
+ . Q:'$D(^BSDXRES(BSDXRESD,0))
+"RTN","BSDX24",105,0)
+ . Q:'$D(^BSDXAB("ARSCT",BSDXRESD))
+"RTN","BSDX24",106,0)
+ . S BSDXDATE=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXSTRT))
+"RTN","BSDX24",107,0)
+ . Q:BSDXDATE=""
+"RTN","BSDX24",108,0)
+ . Q:BSDXDATE>BSDXEND
+"RTN","BSDX24",109,0)
+ . ;TODO: Screen for AMPM
+"RTN","BSDX24",110,0)
+ . ;TODO: Screen for Weekday
+"RTN","BSDX24",111,0)
+ . ;
+"RTN","BSDX24",112,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX24",113,0)
+ . S BSDXABD=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXDATE,0))
+"RTN","BSDX24",114,0)
+ . S BSDXNOD=$G(^BSDXAB(BSDXABD,0))
+"RTN","BSDX24",115,0)
+ . Q:BSDXNOD=""
+"RTN","BSDX24",116,0)
+ . S Y=$P(BSDXDATE,".")
+"RTN","BSDX24",117,0)
+ . D DD^%DT
+"RTN","BSDX24",118,0)
+ . S BSDXATD=$P(BSDXNOD,U,5) ;ACCESS TYPE POINTER
+"RTN","BSDX24",119,0)
+ . S BSDXATD=$G(^BSDXTYPE(+BSDXATD,0))
+"RTN","BSDX24",120,0)
+ . S BSDXATN=$P(BSDXATD,U)
+"RTN","BSDX24",121,0)
+ . I +BSDXATD,BSDXTYPES]"" Q:'$D(BSDXTYPES(BSDXATD))
+"RTN","BSDX24",122,0)
+ . ;TODO: Screen for TYPE ----DONE!
+"RTN","BSDX24",123,0)
+ . ;TODO: Comment
+"RTN","BSDX24",124,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXRESN_U_Y_U_BSDXATN_U_$C(30)
+"RTN","BSDX24",125,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX24",126,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX24",127,0)
+ Q
+"RTN","BSDX25")
+0^23^B57972087
+"RTN","BSDX25",1,0)
+BSDX25 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 3/16/11 2:21am
+"RTN","BSDX25",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX25",3,0)
+ ;
+"RTN","BSDX25",4,0)
+ ; Change Log:
+"RTN","BSDX25",5,0)
+ ; 3110106: SMH -> Changed Check-in EP - Removed unused paramters. Will change C#
+"RTN","BSDX25",6,0)
+ ;
+"RTN","BSDX25",7,0)
+ ;
+"RTN","BSDX25",8,0)
+UT ; Unit Tests
+"RTN","BSDX25",9,0)
+ ; Make appointment, checkin, then uncheckin
+"RTN","BSDX25",10,0)
+ N ZZZ
+"RTN","BSDX25",11,0)
+ N APPTTIME S APPTTIME=$E($$NOW^XLFDT(),1,12)
+"RTN","BSDX25",12,0)
+ D APPADD^BSDX07(.ZZZ,APPTTIME,APPTTIME+.0001,3,"Dr Office",30,"Sam's Note",1)
+"RTN","BSDX25",13,0)
+ N APPTID S APPTID=+^BSDXTMP($J,1)
+"RTN","BSDX25",14,0)
+ N HL S HL=$$GET1^DIQ(9002018.4,APPTID,".07:.04","I")
+"RTN","BSDX25",15,0)
+ D CHECKIN^BSDX25(.ZZZ,APPTID,$$NOW^XLFDT())
+"RTN","BSDX25",16,0)
+ IF '$P(^BSDXAPPT(APPTID,0),U,3) WRITE "ERROR IN CHECKIN 1",!
+"RTN","BSDX25",17,0)
+ IF '+$G(^SC(HL,"S",APPTTIME,1,1,"C")) WRITE "ERROR IN CHECKIN 2",!
+"RTN","BSDX25",18,0)
+ D RMCI^BSDX25(.ZZZ,APPTID)
+"RTN","BSDX25",19,0)
+ IF $P(^BSDXAPPT(APPTID,0),U,3) WRITE "ERROR IN UNCHECKIN 1",!
+"RTN","BSDX25",20,0)
+ IF $G(^SC(HL,"S",APPTTIME,1,1,"C")) WRITE "ERROR IN UNCHECKIN 2",!
+"RTN","BSDX25",21,0)
+ D RMCI^BSDX25(.ZZZ,APPTID)  ; again, test sanity in repeat
+"RTN","BSDX25",22,0)
+ IF $P(^BSDXAPPT(APPTID,0),U,3) WRITE "ERROR IN UNCHECKIN 1",!
+"RTN","BSDX25",23,0)
+ IF $G(^SC(HL,"S",APPTTIME,1,1,"C")) WRITE "ERROR IN UNCHECKIN 2",!
+"RTN","BSDX25",24,0)
+ ; now test various error conditions
+"RTN","BSDX25",25,0)
+ ; Test Error 1
+"RTN","BSDX25",26,0)
+ D RMCI^BSDX25(.ZZZ,)
+"RTN","BSDX25",27,0)
+ IF +^BSDXTMP($J,1)'=-1 WRITE "ERROR IN ETest 1",!
+"RTN","BSDX25",28,0)
+ ; Test Error 2
+"RTN","BSDX25",29,0)
+ D RMCI^BSDX25(.ZZZ,234987234398)
+"RTN","BSDX25",30,0)
+ IF +^BSDXTMP($J,1)'=-2 WRITE "ERROR IN Etest 2",!
+"RTN","BSDX25",31,0)
+ ; Tests for 3 to 5 difficult to produce
+"RTN","BSDX25",32,0)
+ ; Error tests follow: Mumps error test; Transaction restartability
+"RTN","BSDX25",33,0)
+ N bsdxdie S bsdxdie=1
+"RTN","BSDX25",34,0)
+ D RMCI^BSDX25(.ZZZ,APPTID)
+"RTN","BSDX25",35,0)
+ IF +^BSDXTMP($J,1)'=-20 WRITE "ERROR IN Etest 3",!
+"RTN","BSDX25",36,0)
+ K bsdxdie
+"RTN","BSDX25",37,0)
+ N bsdxrestart S bsdxrestart=1
+"RTN","BSDX25",38,0)
+ D RMCI^BSDX25(.ZZZ,APPTID)
+"RTN","BSDX25",39,0)
+ IF +^BSDXTMP($J,1)'=0 WRITE "Error in Etest 4",!
+"RTN","BSDX25",40,0)
+ QUIT
+"RTN","BSDX25",41,0)
+CHECKIND(BSDXY,BSDXAPTID,BSDXCDT,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG) ;EP
+"RTN","BSDX25",42,0)
+ ;Entry point for debugging
+"RTN","BSDX25",43,0)
+ ;
+"RTN","BSDX25",44,0)
+ ;I +$G(^BSDXDBUG("BREAK","CHECKIN")),+$G(^BSDXDBUG("BREAK"))=DUZ D DEBUG^%Serenji("CHECKIN^BSDX25(.BSDXY,BSDXAPTID,BSDXCDT,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG)",$P(^BSDXDBUG("BREAK"),U,2))
+"RTN","BSDX25",45,0)
+ Q
+"RTN","BSDX25",46,0)
+ ;
+"RTN","BSDX25",47,0)
+CHECKIN(BSDXY,BSDXAPTID,BSDXCDT) ; ,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG)	;EP Check in appointment
+"RTN","BSDX25",48,0)
+ ; Private to GUI; use BSDXAPI for general API to checkin patients
+"RTN","BSDX25",49,0)
+ ; Parameters:
+"RTN","BSDX25",50,0)
+ ; BSDXY: Global Out
+"RTN","BSDX25",51,0)
+ ; BSDXAPTID: Appointment ID in ^BSDXAPPT
+"RTN","BSDX25",52,0)
+ ; BSDXCDT: Checkin Date --> Changed
+"RTN","BSDX25",53,0)
+ ; BSDXCC: Clinic Stop IEN (not used)
+"RTN","BSDX25",54,0)
+ ; BSDXPRV: Provider IEN (not used)
+"RTN","BSDX25",55,0)
+ ; BSDXROU: Print Routing Slip? (not used)
+"RTN","BSDX25",56,0)
+ ; BSDXVCL: PCC+ Clinic IEN (not used)
+"RTN","BSDX25",57,0)
+ ; BSDXVFM: PCC+ Form IEN (not used)
+"RTN","BSDX25",58,0)
+ ; BSDXOG: PCC+ Outguide (true or false)
+"RTN","BSDX25",59,0)
+ ;
+"RTN","BSDX25",60,0)
+ ; Output:
+"RTN","BSDX25",61,0)
+ ; ADO.net table with 1 column ErrorID, 1 row result
+"RTN","BSDX25",62,0)
+ ; - 0 if all okay
+"RTN","BSDX25",63,0)
+ ; - Another number or text if not
+"RTN","BSDX25",64,0)
+ 
+"RTN","BSDX25",65,0)
+ N BSDXNOD,BSDXPATID,BSDXSTART,DIK,DA,BSDXID,BSDXI,BSDXZ,BSDXIENS,BSDXVEN
+"RTN","BSDX25",66,0)
+ N BSDXNOEV
+"RTN","BSDX25",67,0)
+ S BSDXNOEV=1 ;Don't execute protocol
+"RTN","BSDX25",68,0)
+ ;
+"RTN","BSDX25",69,0)
+ D ^XBKVAR S X="ERROR^BSDX25",@^%ZOSF("TRAP")
+"RTN","BSDX25",70,0)
+ S BSDXI=0
+"RTN","BSDX25",71,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX25",72,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX25",73,0)
+ S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30)
+"RTN","BSDX25",74,0)
+ I '+BSDXAPTID D ERR("BSDX25: Invalid Appointment ID") Q
+"RTN","BSDX25",75,0)
+ I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR("BSDX08: Invalid Appointment ID") Q
+"RTN","BSDX25",76,0)
+ ; Remove Date formatting v.1.5. Client will send date as FM Date.
+"RTN","BSDX25",77,0)
+ ;S:BSDXCDT["@0000" BSDXCDT=$P(BSDXCDT,"@")
+"RTN","BSDX25",78,0)
+ ;S %DT="T",X=BSDXCDT D ^%DT S BSDXCDT=Y
+"RTN","BSDX25",79,0)
+    S BSDXCDT=+BSDXCDT  ; Strip off zeros if C# sends them
+"RTN","BSDX25",80,0)
+ I BSDXCDT=-1 D ERR(70) Q
+"RTN","BSDX25",81,0)
+ I BSDXCDT>$$NOW^XLFDT S BSDXCDT=$$NOW^XLFDT
+"RTN","BSDX25",82,0)
+ ;Checkin BSDX APPOINTMENT entry
+"RTN","BSDX25",83,0)
+ D BSDXCHK(BSDXAPTID,BSDXCDT)
+"RTN","BSDX25",84,0)
+ S BSDXNOD=^BSDXAPPT(BSDXAPTID,0)
+"RTN","BSDX25",85,0)
+ S BSDXPATID=$P(BSDXNOD,U,5)
+"RTN","BSDX25",86,0)
+ S BSDXSTART=$P(BSDXNOD,U)
+"RTN","BSDX25",87,0)
+ ;
+"RTN","BSDX25",88,0)
+ S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID
+"RTN","BSDX25",89,0)
+ I BSDXSC1]"",$D(^BSDXRES(BSDXSC1,0)) D  I +$G(BSDXZ) D ERR($P(BSDXZ,U,2)) Q
+"RTN","BSDX25",90,0)
+ . S BSDXNOD=^BSDXRES(BSDXSC1,0)
+"RTN","BSDX25",91,0)
+ . S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION
+"RTN","BSDX25",92,0)
+ . I BSDXSC1]"",$D(^SC(BSDXSC1,0)) D APCHK(.BSDXZ,BSDXSC1,BSDXPATID,BSDXCDT,BSDXSTART)
+"RTN","BSDX25",93,0)
+ ;
+"RTN","BSDX25",94,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",95,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)
+"RTN","BSDX25",96,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",97,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX25",98,0)
+ Q
+"RTN","BSDX25",99,0)
+ ;
+"RTN","BSDX25",100,0)
+BSDXCHK(BSDXAPTID,BSDXCDT) ;
+"RTN","BSDX25",101,0)
+ ;
+"RTN","BSDX25",102,0)
+ S BSDXIENS=BSDXAPTID_","
+"RTN","BSDX25",103,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.03)=BSDXCDT
+"RTN","BSDX25",104,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX25",105,0)
+ Q
+"RTN","BSDX25",106,0)
+ ;
+"RTN","BSDX25",107,0)
+APCHK(BSDXZ,BSDXSC1,BSDXDFN,BSDXCDT,BSDXSTART)         ;
+"RTN","BSDX25",108,0)
+ ;Checkin appointment for patient BSDXDFN in clinic BSDXSC1
+"RTN","BSDX25",109,0)
+ ;at time BSDXSTART
+"RTN","BSDX25",110,0)
+ S BSDXZ=$$CHECKIN1^BSDXAPI(BSDXDFN,BSDXSC1,BSDXSTART)
+"RTN","BSDX25",111,0)
+ Q
+"RTN","BSDX25",112,0)
+ ;
+"RTN","BSDX25",113,0)
+RMCI(BSDXY,BSDXAPPTID) ; EP - Remove Check-in from BSDX APPT and 2/44
+"RTN","BSDX25",114,0)
+ ; Called by RPC [Fill in later]
+"RTN","BSDX25",115,0)
+ ; 
+"RTN","BSDX25",116,0)
+ ; Parameters to pass:
+"RTN","BSDX25",117,0)
+ ; APPTID: IEN in file BSDX APPOINTMENT
+"RTN","BSDX25",118,0)
+ ;
+"RTN","BSDX25",119,0)
+ ; Return in global array:
+"RTN","BSDX25",120,0)
+ ; Record set with Column ERRORID; value of 0 AOK; other value 
+"RTN","BSDX25",121,0)
+ ;  --> means that something went wrong
+"RTN","BSDX25",122,0)
+ ; 
+"RTN","BSDX25",123,0)
+ ; Error Reference:
+"RTN","BSDX25",124,0)
+ ; -1~Invalid Appointment ID (not passed)
+"RTN","BSDX25",125,0)
+ ; -2~Invalid Appointment ID (Doesn't exist in ^BSDXAPPT)
+"RTN","BSDX25",126,0)
+ ; -3~DB has corruption. Call Tech Support. (Resource ID doesn't exist in BSDXAPPT)
+"RTN","BSDX25",127,0)
+ ; -4~DB has corruption. Call Tech Support. (Resource ID in BSDXAPPT doesnt exist in BSDXRES)
+"RTN","BSDX25",128,0)
+ ; -5~BSDXAPI Error. Message depends on error.
+"RTN","BSDX25",129,0)
+ ; -20~Mumps Error
+"RTN","BSDX25",130,0)
+ ; 
+"RTN","BSDX25",131,0)
+ N BSDXNOEV S BSDXNOEV=1 ;Don't execute protocol
+"RTN","BSDX25",132,0)
+ ;
+"RTN","BSDX25",133,0)
+ N $ET S $ET="G ERROR^BSDX25" ; Error Trap
+"RTN","BSDX25",134,0)
+ ;
+"RTN","BSDX25",135,0)
+ ; Set return variable and kill contents
+"RTN","BSDX25",136,0)
+ S BSDXY=$NAME(^BSDXTMP($J))
+"RTN","BSDX25",137,0)
+ K @BSDXY
+"RTN","BSDX25",138,0)
+ ; 
+"RTN","BSDX25",139,0)
+ N BSDXI S BSDXI=0 ; Initialize Counter
+"RTN","BSDX25",140,0)
+ ;
+"RTN","BSDX25",141,0)
+ S ^BSDXTMP($J,BSDXI)="T00020ERRORID"_$C(30) ; Header of ADO recordset
+"RTN","BSDX25",142,0)
+ ;
+"RTN","BSDX25",143,0)
+ TSTART (BSDXI):SERIAL ; Perform Autolocking
+"RTN","BSDX25",144,0)
+ ;
+"RTN","BSDX25",145,0)
+ ;;;test
+"RTN","BSDX25",146,0)
+ I $g(bsdxdie) S X=8/0
+"RTN","BSDX25",147,0)
+ ;;;
+"RTN","BSDX25",148,0)
+ I $g(bsdxrestart) k bsdxrestart TRESTART
+"RTN","BSDX25",149,0)
+ ;;;test
+"RTN","BSDX25",150,0)
+ ;
+"RTN","BSDX25",151,0)
+ ; Check for Appointment ID (passed and exists in file)
+"RTN","BSDX25",152,0)
+ I '+$G(BSDXAPPTID) D ERR("-1~Invalid Appointment ID") QUIT
+"RTN","BSDX25",153,0)
+ I '$D(^BSDXAPPT(BSDXAPPTID,0)) D ERR("-2~Invalid Appointment ID") QUIT
+"RTN","BSDX25",154,0)
+ ;
+"RTN","BSDX25",155,0)
+ ; Remove checkin from BSDX APPOINTMENT entry
+"RTN","BSDX25",156,0)
+ D BSDXCHK(BSDXAPPTID,"@")
+"RTN","BSDX25",157,0)
+ ;
+"RTN","BSDX25",158,0)
+ ; Now, remove checkin from PIMS files 2/44
+"RTN","BSDX25",159,0)
+ N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPPTID,0)
+"RTN","BSDX25",160,0)
+ N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5)	; DFN
+"RTN","BSDX25",161,0)
+ N BSDXSTART S BSDXSTART=$P(BSDXNOD,U)	; Start Date
+"RTN","BSDX25",162,0)
+ N BSDXSC1 S BSDXSC1=$P(BSDXNOD,U,7) ; Resource ID
+"RTN","BSDX25",163,0)
+ ; 
+"RTN","BSDX25",164,0)
+ ; If the resource doesn't exist, error out. DB is corrupt.
+"RTN","BSDX25",165,0)
+ I 'BSDXSC1 D ERR("-3~DB has corruption. Call Tech Support.") QUIT
+"RTN","BSDX25",166,0)
+ I '$D(^BSDXRES(BSDXSC1,0)) D ERR("-4~DB has corruption. Call Tech Support.") QUIT 
+"RTN","BSDX25",167,0)
+ ;
+"RTN","BSDX25",168,0)
+ N BSDXNOD S BSDXNOD=^BSDXRES(BSDXSC1,0) ; Resource 0 node
+"RTN","BSDX25",169,0)
+ S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION
+"RTN","BSDX25",170,0)
+ ;
+"RTN","BSDX25",171,0)
+ N BSDXZ ; Scratch variable to hold error message
+"RTN","BSDX25",172,0)
+ I BSDXSC1]"",$D(^SC(BSDXSC1,0)) S BSDXZ=$$RMCI^BSDXAPI(BSDXPATID,BSDXSC1,BSDXSTART)
+"RTN","BSDX25",173,0)
+ I +$G(BSDXZ) D ERR("-5~"_$P(BSDXZ,U,2)) QUIT
+"RTN","BSDX25",174,0)
+ ; 
+"RTN","BSDX25",175,0)
+ TCOMMIT  ; Save Data into Globals
+"RTN","BSDX25",176,0)
+ ;
+"RTN","BSDX25",177,0)
+ ; Return ADO recordset
+"RTN","BSDX25",178,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",179,0)
+ S ^BSDXTMP($J,BSDXI)="0"_$C(30)
+"RTN","BSDX25",180,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",181,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX25",182,0)
+ Q
+"RTN","BSDX25",183,0)
+ ;
+"RTN","BSDX25",184,0)
+CHKEVT(BSDXPAT,BSDXSTART,BSDXSC) ;EP Called by BSDX CHECKIN APPOINTMENT event
+"RTN","BSDX25",185,0)
+ ;when appointments CHECKIN via PIMS interface.
+"RTN","BSDX25",186,0)
+ ;Propagates CHECKIN to BSDXAPPT and raises refresh event to running GUI clients
+"RTN","BSDX25",187,0)
+ ;
+"RTN","BSDX25",188,0)
+ Q:+$G(BSDXNOEV)
+"RTN","BSDX25",189,0)
+ Q:'+$G(BSDXSC)
+"RTN","BSDX25",190,0)
+ N BSDXSTAT,BSDXFOUND,BSDXRES
+"RTN","BSDX25",191,0)
+ S BSDXSTAT=""
+"RTN","BSDX25",192,0)
+ S:$G(SDATA("AFTER","STATUS"))["CHECKED IN" BSDXSTAT=$P(SDATA("AFTER","STATUS"),"^",4)
+"RTN","BSDX25",193,0)
+ S BSDXFOUND=0
+"RTN","BSDX25",194,0)
+ I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$CHKEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX25",195,0)
+ I BSDXFOUND D CHKEVT3(BSDXRES) Q
+"RTN","BSDX25",196,0)
+ I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$CHKEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX25",197,0)
+ I BSDXFOUND D CHKEVT3(BSDXRES)
+"RTN","BSDX25",198,0)
+ Q
+"RTN","BSDX25",199,0)
+ ;
+"RTN","BSDX25",200,0)
+CHKEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT) ;
+"RTN","BSDX25",201,0)
+ ;Get appointment id in BSDXAPT
+"RTN","BSDX25",202,0)
+ ;If found, call BSDXNOS(BSDXAPPT) and return 1
+"RTN","BSDX25",203,0)
+ ;else return 0
+"RTN","BSDX25",204,0)
+ N BSDXFOUND,BSDXAPPT
+"RTN","BSDX25",205,0)
+ S BSDXFOUND=0
+"RTN","BSDX25",206,0)
+ Q:'+$G(BSDXRES) BSDXFOUND
+"RTN","BSDX25",207,0)
+ Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND
+"RTN","BSDX25",208,0)
+ S BSDXAPPT=0 F  S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT  D  Q:BSDXFOUND
+"RTN","BSDX25",209,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""
+"RTN","BSDX25",210,0)
+ . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q
+"RTN","BSDX25",211,0)
+ I BSDXFOUND,+$G(BSDXAPPT) D BSDXCHK(BSDXAPPT,BSDXSTAT)
+"RTN","BSDX25",212,0)
+ Q BSDXFOUND
+"RTN","BSDX25",213,0)
+ ;
+"RTN","BSDX25",214,0)
+CHKEVT3(BSDXRES) ;
+"RTN","BSDX25",215,0)
+ ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX25",216,0)
+ ;
+"RTN","BSDX25",217,0)
+ N BSDXRESN
+"RTN","BSDX25",218,0)
+ S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX25",219,0)
+ Q:BSDXRESN=""
+"RTN","BSDX25",220,0)
+ S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX25",221,0)
+ D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX25",222,0)
+ Q
+"RTN","BSDX25",223,0)
+ ;
+"RTN","BSDX25",224,0)
+ERROR ;
+"RTN","BSDX25",225,0)
+ S $ETRAP="D ^%ZTER HALT"  ; Emergency Error Trap for the wise
+"RTN","BSDX25",226,0)
+    ; Rollback, otherwise ^XTER will be empty from future rollback
+"RTN","BSDX25",227,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX25",228,0)
+    D ^%ZTER
+"RTN","BSDX25",229,0)
+    S $EC=""  ; Clear Error
+"RTN","BSDX25",230,0)
+    ; Log error message and send to client
+"RTN","BSDX25",231,0)
+ D ERR("-20~Mumps Error")
+"RTN","BSDX25",232,0)
+ Q
+"RTN","BSDX25",233,0)
+ ;
+"RTN","BSDX25",234,0)
+ERR(BSDXERR) ;Error processing
+"RTN","BSDX25",235,0)
+ I $TLEVEL>0 TROLLBACK
+"RTN","BSDX25",236,0)
+ S BSDXERR=$G(BSDXERR)
+"RTN","BSDX25",237,0)
+ S BSDXERR=$P(BSDXERR,"~")_"~"_$TEXT(+0)_":"_$P(BSDXERR,"~",2) ; Append Routine Name
+"RTN","BSDX25",238,0)
+ S BSDXI=$G(BSDXI)+1
+"RTN","BSDX25",239,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX25",240,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX25",241,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX25",242,0)
+ QUIT
+"RTN","BSDX26")
+0^24^B30714245
+"RTN","BSDX26",1,0)
+BSDX26  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:38pm
+"RTN","BSDX26",2,0)
+    ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX26",3,0)
+    ; Change History:
+"RTN","BSDX26",4,0)
+    ; 3101023 - UJO/SMH - Addition of restartable transaction; relocation of tx.
+"RTN","BSDX26",5,0)
+    ; --> Thanks to Zach Gonzalez and Rick Marshall
+"RTN","BSDX26",6,0)
+    ; 3101205 - UJO/SMH - Extensive refactoring.
+"RTN","BSDX26",7,0)
+    ;
+"RTN","BSDX26",8,0)
+    ; Error Reference:
+"RTN","BSDX26",9,0)
+    ; -1: Appt ID is not a number
+"RTN","BSDX26",10,0)
+    ; -2: Appt IEN is not in ^BSDXAPPT
+"RTN","BSDX26",11,0)
+    ; -3: FM Failure to file WP field in ^BSDXAPPT
+"RTN","BSDX26",12,0)
+    ;
+"RTN","BSDX26",13,0)
+EDITAPTD(BSDXY,BSDXAPTID,BSDXNOTE)  ;EP
+"RTN","BSDX26",14,0)
+    ;Entry point for debugging
+"RTN","BSDX26",15,0)
+    ;
+"RTN","BSDX26",16,0)
+    D DEBUG^%Serenji("EDITAPT^BSDX26(.BSDXY,BSDXAPTID,BSDXNOTE)")
+"RTN","BSDX26",17,0)
+    Q
+"RTN","BSDX26",18,0)
+UT ; Unit Tests
+"RTN","BSDX26",19,0)
+    ; Test 1: Make sure this damn thing works
+"RTN","BSDX26",20,0)
+    N ZZZ
+"RTN","BSDX26",21,0)
+    N %H S %H=$H
+"RTN","BSDX26",22,0)
+    N NOTE S NOTE="New Note "_%H
+"RTN","BSDX26",23,0)
+    D EDITAPT(.ZZZ,188,NOTE)
+"RTN","BSDX26",24,0)
+    I ^BSDXAPPT(188,1,1,0)'=NOTE W "ERROR",! B
+"RTN","BSDX26",25,0)
+    ; Test 2: Test Errors -1 and -2
+"RTN","BSDX26",26,0)
+    N ZZZ
+"RTN","BSDX26",27,0)
+    N NOTE S NOTE="Nothing important"
+"RTN","BSDX26",28,0)
+    D EDITAPT(.ZZZ,"BLAHBLAH",NOTE)
+"RTN","BSDX26",29,0)
+    I +^BSDXTMP($J,1)'=-1 W "ERROR IN -1",! B
+"RTN","BSDX26",30,0)
+    D EDITAPT(.ZZZ,298734322,NOTE)
+"RTN","BSDX26",31,0)
+    I +^BSDXTMP($J,1)'=-2 W "ERROR IN -2",! B
+"RTN","BSDX26",32,0)
+    ; Test 4: M Error
+"RTN","BSDX26",33,0)
+    N bsdxdie S bsdxdie=1
+"RTN","BSDX26",34,0)
+    D EDITAPT(.ZZZ,188,NOTE)
+"RTN","BSDX26",35,0)
+    I +^BSDXTMP($J,1)'=-100 W "ERROR IN -100",! B
+"RTN","BSDX26",36,0)
+    k bsdxdie
+"RTN","BSDX26",37,0)
+    ; Test 5: Trestart
+"RTN","BSDX26",38,0)
+    N bsdxrestart S bsdxrestart=1
+"RTN","BSDX26",39,0)
+    N %H S %H=$H
+"RTN","BSDX26",40,0)
+    N NOTE S NOTE="New Note "_%H
+"RTN","BSDX26",41,0)
+    D EDITAPT(.ZZZ,188,NOTE)
+"RTN","BSDX26",42,0)
+    I ^BSDXAPPT(188,1,1,0)'=NOTE W "ERROR in TRESTART",! B
+"RTN","BSDX26",43,0)
+    ; Test 6: for Hosp Location Update
+"RTN","BSDX26",44,0)
+    N DATE S DATE=$$NOW^XLFDT()
+"RTN","BSDX26",45,0)
+    S DATE=$E(DATE,1,12) ; Just get minutes b/c of HL file input transform
+"RTN","BSDX26",46,0)
+    D APPADD^BSDX07(.ZZZ,DATE,DATE+.001,3,"Dr Office",30,"Old Note",1)
+"RTN","BSDX26",47,0)
+    N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX26",48,0)
+    D EDITAPT(.ZZZ,APPID,"New Note")
+"RTN","BSDX26",49,0)
+    I ^BSDXAPPT(APTID,1,1,0)'="New Note" W "Error in HL Section",! B
+"RTN","BSDX26",50,0)
+    I $P(^SC(2,"S",DATE,1,1,0),U,4)'="New Note" W "Error in HL Section",! B
+"RTN","BSDX26",51,0)
+    QUIT
+"RTN","BSDX26",52,0)
+    ;
+"RTN","BSDX26",53,0)
+EDITAPT(BSDXY,BSDXAPTID,BSDXNOTE)   ;EP Edit appointment (only note text can be edited)
+"RTN","BSDX26",54,0)
+    ; Called by RPC: BSDX EDIT APPOINTMENT
+"RTN","BSDX26",55,0)
+    ;
+"RTN","BSDX26",56,0)
+    ; Edits Appointment Text in BSDX APPOINTMENT file & Hosp Location (44) file
+"RTN","BSDX26",57,0)
+    ;
+"RTN","BSDX26",58,0)
+    ; Parameters:
+"RTN","BSDX26",59,0)
+    ; - BSDXY: Global Return (RPC must be set to Global Array)
+"RTN","BSDX26",60,0)
+    ; - BSDXAPTID: Appointment IEN in BSDX APPOINTMENT
+"RTN","BSDX26",61,0)
+    ; - BSDXNOTE: New note
+"RTN","BSDX26",62,0)
+    ;
+"RTN","BSDX26",63,0)
+    ; Return:
+"RTN","BSDX26",64,0)
+    ; ADO.net Recordset having 1 field: ERRORID
+"RTN","BSDX26",65,0)
+    ; If Okay: -1; otherwise, positive integer with message
+"RTN","BSDX26",66,0)
+    ;
+"RTN","BSDX26",67,0)
+    ; Return Array; set Return and clear array
+"RTN","BSDX26",68,0)
+    S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX26",69,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX26",70,0)
+    ; ET
+"RTN","BSDX26",71,0)
+    N $ET S $ET="G ETRAP^BSDX26"
+"RTN","BSDX26",72,0)
+    ; Set up basic DUZ variables
+"RTN","BSDX26",73,0)
+    D ^XBKVAR
+"RTN","BSDX26",74,0)
+    ; Counter
+"RTN","BSDX26",75,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX26",76,0)
+    ; Header Node
+"RTN","BSDX26",77,0)
+    S ^BSDXTMP($J,BSDXI)="T00100ERRORID"_$C(30)
+"RTN","BSDX26",78,0)
+    ; Restartable txn for GT.M. Restored vars are Params + BSDXI.
+"RTN","BSDX26",79,0)
+    TSTART (BSDXY,BSDXAPTID,BSDXNOTE,BSDXI):T="BSDX EDIT APPOINTMENT^BSDX26"
+"RTN","BSDX26",80,0)
+    ;
+"RTN","BSDX26",81,0)
+    ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX26",82,0)
+    I $G(bsdxdie) S X=1/0
+"RTN","BSDX26",83,0)
+    ;;;test
+"RTN","BSDX26",84,0)
+    ;;;test for TRESTART
+"RTN","BSDX26",85,0)
+    I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX26",86,0)
+    ;;;test
+"RTN","BSDX26",87,0)
+    ;
+"RTN","BSDX26",88,0)
+    ; Validate Appointment ID
+"RTN","BSDX26",89,0)
+    I '+BSDXAPTID D ERR(BSDXI,"-1~BSDX26: Invalid Appointment ID") QUIT
+"RTN","BSDX26",90,0)
+    I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(BSDXI,"-2~BSDX26: Invalid Appointment ID") QUIT
+"RTN","BSDX26",91,0)
+    ; Put the WP in decendant fields from the root to file as a WP field
+"RTN","BSDX26",92,0)
+    S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+"RTN","BSDX26",93,0)
+    I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+"RTN","BSDX26",94,0)
+    N BSDXMSG ; Message in case of error in filing.
+"RTN","BSDX26",95,0)
+    I $D(BSDXNOTE(.5)) D
+"RTN","BSDX26",96,0)
+    . D WP^DIE(9002018.4,BSDXAPTID_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX26",97,0)
+    I $D(BSDXMSG) D ERR(BSDXI,"-3~BSDX26: Fileman failure to file data into 9002018.4") QUIT
+"RTN","BSDX26",98,0)
+    ;
+"RTN","BSDX26",99,0)
+    ; Now file in file 44:
+"RTN","BSDX26",100,0)
+    N PTIEN S PTIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".05","I") ; Patient IEN
+"RTN","BSDX26",101,0)
+    N HLIEN S HLIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".07:.04","I") ; HL Location IEN pointed to by Resource ID
+"RTN","BSDX26",102,0)
+    N DATE S DATE=+^BSDXAPPT(BSDXAPTID,0) ; Date of APPT
+"RTN","BSDX26",103,0)
+    N BSDXRES S BSDXRES=0 ; Result
+"RTN","BSDX26",104,0)
+    ; Update Note only if we have a linked hospital location.
+"RTN","BSDX26",105,0)
+    I HLIEN S BSDXRES=$$UPDATENOTE^BSDXAPI(PTIEN,HLIEN,DATE,BSDXNOTE(.5))
+"RTN","BSDX26",106,0)
+    ; If we get an error (denoted by -1 in BSDXRES), return error to client
+"RTN","BSDX26",107,0)
+    I BSDXRES<0 D ERR(BSDXI,"-4~BSDX26: BSDXAPI reports an error: "_BSDXRES) QUIT
+"RTN","BSDX26",108,0)
+    ;Return Recordset
+"RTN","BSDX26",109,0)
+    TCOMMIT
+"RTN","BSDX26",110,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",111,0)
+    S ^BSDXTMP($J,BSDXI)="-1"_$C(30)
+"RTN","BSDX26",112,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",113,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX26",114,0)
+    QUIT
+"RTN","BSDX26",115,0)
+    ;
+"RTN","BSDX26",116,0)
+ERR(BSDXI,BSDXERR)  ;Error processing
+"RTN","BSDX26",117,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",118,0)
+    S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX26",119,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX26",120,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX26",121,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX26",122,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX26",123,0)
+    QUIT
+"RTN","BSDX26",124,0)
+    ;
+"RTN","BSDX26",125,0)
+ETRAP   ;EP Error trap entry
+"RTN","BSDX26",126,0)
+    N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+"RTN","BSDX26",127,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX26",128,0)
+    D ^%ZTER
+"RTN","BSDX26",129,0)
+    S $EC=""
+"RTN","BSDX26",130,0)
+    I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX26",131,0)
+    D ERR(BSDXI,"-100~BSDX26 Error: "_$G(%ZTERZE))
+"RTN","BSDX26",132,0)
+    Q
+"RTN","BSDX27")
+0^25^B133007616
+"RTN","BSDX27",1,0)
+BSDX27  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 4:52pm
+"RTN","BSDX27",2,0)
+    ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX27",3,0)
+    ; 
+"RTN","BSDX27",4,0)
+    ; Change Log: July 15, 2010
+"RTN","BSDX27",5,0)
+    ; UJO/SMH - i18n: FM Dates passed into routine for Clinic Letters - CLDISP ta
+"RTN","BSDX27",6,0)
+    ; v 1.42 - 3101208 - SMH
+"RTN","BSDX27",7,0)
+    ; - Added check to skip cancelled appointments. Check was forgotten
+"RTN","BSDX27",8,0)
+    ;   in original code.
+"RTN","BSDX27",9,0)
+    ;   . N BSDXFLAGS S BSDXFLAGS=$P(BSDXNOD,U,2)  ; No show and Cancel Flags
+"RTN","BSDX27",10,0)
+    ;   . Q:BSDXFLAGS["C"  ; if appt is cancelled, quit
+"RTN","BSDX27",11,0)
+    ;
+"RTN","BSDX27",12,0)
+    Q
+"RTN","BSDX27",13,0)
+    ;
+"RTN","BSDX27",14,0)
+PADISPD(BSDXY,BSDXPAT)  ;EP
+"RTN","BSDX27",15,0)
+    ;Entry point for debugging
+"RTN","BSDX27",16,0)
+    ;
+"RTN","BSDX27",17,0)
+    ;D DEBUG^%Serenji("PADISP^BSDX27(.BSDXY,BSDXPAT)")
+"RTN","BSDX27",18,0)
+    Q
+"RTN","BSDX27",19,0)
+    ;
+"RTN","BSDX27",20,0)
+PADISP(BSDXY,BSDXPAT)   ;EP
+"RTN","BSDX27",21,0)
+    ;Return recordset of patient appointments used in listing
+"RTN","BSDX27",22,0)
+    ;a patient's appointments and generating patient letters.
+"RTN","BSDX27",23,0)
+    ;Called by rpc BSDX PATIENT APPT DISPLAY
+"RTN","BSDX27",24,0)
+    ;
+"RTN","BSDX27",25,0)
+    ; Sam's Notes:
+"RTN","BSDX27",26,0)
+    ; Relatively complex algorithm.
+"RTN","BSDX27",27,0)
+    ; 1. First, loop through ^DPT(DA,"S", and get all appointments. 
+"RTN","BSDX27",28,0)
+    ;   Exclude cancelled appts. Store in BSDXDPT array.
+"RTN","BSDX27",29,0)
+    ; 2. Go through ^BSDXAPPT("CPAT", (patient index) . 
+"RTN","BSDX27",30,0)
+    ;   Get the info from there and compar with BSDXDPT array. If 
+"RTN","BSDX27",31,0)
+    ;   they are the same, get all info, and rm entry from BSDXDPT array.
+"RTN","BSDX27",32,0)
+    ; 3. If there are any remaining entries in BSDXDPT (PIMS leftovers),
+"RTN","BSDX27",33,0)
+    ;   Get the data from file 2 and 44.
+"RTN","BSDX27",34,0)
+    ;
+"RTN","BSDX27",35,0)
+    N BSDXI,BSDXIEN,BSDXNOD,BSDXNAM,BSDXDOB,BSDXHRN,BSDXSEX,BSDXCNID,BSDXCNOD,BSDXMADE,BSDXCLRK,BSDXNOT,BSDXQ
+"RTN","BSDX27",36,0)
+    N BSDXSTRT
+"RTN","BSDX27",37,0)
+    N BSDXSTRE,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX27",38,0)
+    S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX27",39,0)
+    S BSDXI=0
+"RTN","BSDX27",40,0)
+    S ^BSDXTMP($J,BSDXI)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030ApptDate^T00030Clinic^T00030TypeStatus"
+"RTN","BSDX27",41,0)
+    S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE"_$C(30)
+"RTN","BSDX27",42,0)
+    S X="ERROR^BSDX27",@^%ZOSF("TRAP")
+"RTN","BSDX27",43,0)
+    ;Get patient info
+"RTN","BSDX27",44,0)
+    ;
+"RTN","BSDX27",45,0)
+    I '+BSDXPAT S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX27",46,0)
+    I '$D(^DPT(+BSDXPAT,0)) S ^BSDXTMP($J,1)=$C(31) Q
+"RTN","BSDX27",47,0)
+    S BSDXNOD=$$PATINFO(BSDXPAT)
+"RTN","BSDX27",48,0)
+    S BSDXNAM=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX27",49,0)
+    S BSDXSEX=$P(BSDXNOD,U,2) ;SEX
+"RTN","BSDX27",50,0)
+    S BSDXDOB=$P(BSDXNOD,U,3) ;DOB
+"RTN","BSDX27",51,0)
+    S BSDXHRN=$P(BSDXNOD,U,4) ;Health Record Number for location DUZ(2)
+"RTN","BSDX27",52,0)
+    S BSDXSTRE=$P(BSDXNOD,U,5) ;Street
+"RTN","BSDX27",53,0)
+    S BSDXCITY=$P(BSDXNOD,U,6) ;City
+"RTN","BSDX27",54,0)
+    S BSDXST=$P(BSDXNOD,U,7) ;State
+"RTN","BSDX27",55,0)
+    S BSDXZIP=$P(BSDXNOD,U,8) ;zip
+"RTN","BSDX27",56,0)
+    S BSDXPHON=$P(BSDXNOD,U,9) ;homephone
+"RTN","BSDX27",57,0)
+    ;
+"RTN","BSDX27",58,0)
+    ;Organize ^DPT(BSDXPAT,"S," nodes
+"RTN","BSDX27",59,0)
+    ; into BSDXDPT(CLINIC,DATE)
+"RTN","BSDX27",60,0)
+    ;
+"RTN","BSDX27",61,0)
+    I $D(^DPT(BSDXPAT,"S")) S BSDXDT=0 F  S BSDXDT=$O(^DPT(BSDXPAT,"S",BSDXDT)) Q:'+BSDXDT  D
+"RTN","BSDX27",62,0)
+    . S BSDXNOD=$G(^DPT(BSDXPAT,"S",BSDXDT,0))
+"RTN","BSDX27",63,0)
+    . S BSDXCID=$P(BSDXNOD,U)
+"RTN","BSDX27",64,0)
+    . Q:'+BSDXCID
+"RTN","BSDX27",65,0)
+    . Q:'$D(^SC(BSDXCID,0))
+"RTN","BSDX27",66,0)
+    . N BSDXFLAGS S BSDXFLAGS=$P(BSDXNOD,U,2)  ; No show and Cancel Flags
+"RTN","BSDX27",67,0)
+    . Q:BSDXFLAGS["C"  ; if appt is cancelled, quit
+"RTN","BSDX27",68,0)
+    . S BSDXDPT(BSDXCID,BSDXDT)=BSDXNOD
+"RTN","BSDX27",69,0)
+    ;
+"RTN","BSDX27",70,0)
+    ;$O Through ^BSDX("CPAT",
+"RTN","BSDX27",71,0)
+    S BSDXIEN=0
+"RTN","BSDX27",72,0)
+    I $D(^BSDXAPPT("CPAT",BSDXPAT)) F  S BSDXIEN=$O(^BSDXAPPT("CPAT",BSDXPAT,BSDXIEN)) Q:'BSDXIEN  D
+"RTN","BSDX27",73,0)
+    . N BSDXNOD,BSDXAPT,BSDXCID,BSDXCNOD,BSDXCLN,BSDX44,BSDXDNOD,BSDXSTAT,BSDX,BSDXTYPE,BSDXLIN
+"RTN","BSDX27",74,0)
+    . S BSDXNOD=$G(^BSDXAPPT(BSDXIEN,0))
+"RTN","BSDX27",75,0)
+    . Q:BSDXNOD=""
+"RTN","BSDX27",76,0)
+    . Q:$P(BSDXNOD,U,12)]""  ;CANCELLED
+"RTN","BSDX27",77,0)
+    . S Y=$P(BSDXNOD,U)
+"RTN","BSDX27",78,0)
+    . Q:'+Y
+"RTN","BSDX27",79,0)
+    . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",80,0)
+    . S BSDXAPT=Y ;Appointment date time
+"RTN","BSDX27",81,0)
+    . S BSDXCLRK=$P(BSDXNOD,U,8) ;Appointment made by
+"RTN","BSDX27",82,0)
+    . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX27",83,0)
+    . S Y=$P(BSDXNOD,U,9) ;Date Appointment Made
+"RTN","BSDX27",84,0)
+    . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",85,0)
+    . S BSDXMADE=Y
+"RTN","BSDX27",86,0)
+    . ;NOTE
+"RTN","BSDX27",87,0)
+    . S BSDXNOT=""
+"RTN","BSDX27",88,0)
+    . I $D(^BSDXAPPT(BSDXIEN,1,0)) S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXIEN,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX27",89,0)
+    . . S BSDXLIN=$G(^BSDXAPPT(BSDXIEN,1,BSDXQ,0))
+"RTN","BSDX27",90,0)
+    . . S:(BSDXLIN'="")&($E(BSDXLIN,$L(BSDXLIN)-1,$L(BSDXLIN))'=" ") BSDXLIN=BSDXLIN_" "
+"RTN","BSDX27",91,0)
+    . . S BSDXNOT=BSDXNOT_BSDXLIN
+"RTN","BSDX27",92,0)
+    . ;Resource
+"RTN","BSDX27",93,0)
+    . S BSDXCID=$P(BSDXNOD,U,7) ;IEN of BSDX RESOURCE
+"RTN","BSDX27",94,0)
+    . Q:'+BSDXCID
+"RTN","BSDX27",95,0)
+    . Q:'$D(^BSDXRES(BSDXCID,0))
+"RTN","BSDX27",96,0)
+    . S BSDXCNOD=$G(^BSDXRES(BSDXCID,0)) ;BSDX RESOURCE node
+"RTN","BSDX27",97,0)
+    . Q:BSDXCNOD=""
+"RTN","BSDX27",98,0)
+    . S BSDXCLN=$P(BSDXCNOD,U) ;Text name of BSDX Resource
+"RTN","BSDX27",99,0)
+    . S BSDX44=$P(BSDXCNOD,U,4) ;File 44 pointer
+"RTN","BSDX27",100,0)
+    . ;If appt entry in ^DPT(PAT,"S" exists for this clinic, get the TYPE/STATUS info from
+"RTN","BSDX27",101,0)
+    . ;the BSDXDPT array and delete the BSDXDPT node
+"RTN","BSDX27",102,0)
+    . S BSDXTYPE=""
+"RTN","BSDX27",103,0)
+    . I +BSDX44,$D(BSDXDPT(BSDX44,$P(BSDXNOD,U))) D  ;BSDXNOD is the BSDX APPOINTMENT node
+"RTN","BSDX27",104,0)
+    . . S BSDXDNOD=BSDXDPT(BSDX44,$P(BSDXNOD,U)) ;BSDXDNOD is a copy of the ^DPT(PAT,"S" node
+"RTN","BSDX27",105,0)
+    . . S BSDXTYPE=$$STATUS(BSDXPAT,$P(BSDXNOD,U),BSDXDNOD) ;IHS/OIT/HMW 20050208 Added
+"RTN","BSDX27",106,0)
+    . . K BSDXDPT(BSDX44,$P(BSDXNOD,U))
+"RTN","BSDX27",107,0)
+    . S BSDXI=BSDXI+1
+"RTN","BSDX27",108,0)
+    . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXAPT_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_BSDXCID_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_$C(30)
+"RTN","BSDX27",109,0)
+    . Q
+"RTN","BSDX27",110,0)
+    ;
+"RTN","BSDX27",111,0)
+    ;Go through remaining BSDXDPT( entries
+"RTN","BSDX27",112,0)
+    I $D(BSDXDPT) S BSDX44=0 D
+"RTN","BSDX27",113,0)
+    . F  S BSDX44=$O(BSDXDPT(BSDX44)) Q:'+BSDX44  S BSDXDT=0 D
+"RTN","BSDX27",114,0)
+    . . F  S BSDXDT=$O(BSDXDPT(BSDX44,BSDXDT)) Q:'+BSDXDT  D
+"RTN","BSDX27",115,0)
+    . . . S BSDXDNOD=BSDXDPT(BSDX44,BSDXDT)
+"RTN","BSDX27",116,0)
+    . . . S Y=BSDXDT
+"RTN","BSDX27",117,0)
+    . . . Q:'+Y
+"RTN","BSDX27",118,0)
+    . . . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",119,0)
+    . . . S BSDXAPT=Y
+"RTN","BSDX27",120,0)
+    . . . S BSDXTYPE=$$STATUS(BSDXPAT,BSDXDT,BSDXDNOD) ;IHS/OIT/HMW 20050208 Added
+"RTN","BSDX27",121,0)
+    . . . S BSDXCLN=$P($G(^SC(BSDX44,0)),U)
+"RTN","BSDX27",122,0)
+    . . . S BSDXCLRK=$P(BSDXDNOD,U,18)
+"RTN","BSDX27",123,0)
+    . . . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX27",124,0)
+    . . . S Y=$P(BSDXDNOD,U,19)
+"RTN","BSDX27",125,0)
+    . . . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",126,0)
+    . . . S BSDXMADE=Y
+"RTN","BSDX27",127,0)
+    . . . S BSDXNOT=""
+"RTN","BSDX27",128,0)
+    . . . S BSDXI=BSDXI+1
+"RTN","BSDX27",129,0)
+    . . . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXAPT_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_$C(30)
+"RTN","BSDX27",130,0)
+    . . . K BSDXDPT(BSDX44,BSDXDT)
+"RTN","BSDX27",131,0)
+    ;
+"RTN","BSDX27",132,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",133,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX27",134,0)
+    Q
+"RTN","BSDX27",135,0)
+    ;
+"RTN","BSDX27",136,0)
+STATUS(PAT,DATE,NODE)   ; returns appt status
+"RTN","BSDX27",137,0)
+    ;IHS/OIT/HMW 20050208 Added from BSDDPA
+"RTN","BSDX27",138,0)
+    NEW TYP
+"RTN","BSDX27",139,0)
+    S TYP=$$APPTYP^BSDXAPI(PAT,DATE)    ;sched vs. walkin
+"RTN","BSDX27",140,0)
+    I $P(NODE,U,2)["C" Q TYP_" - CANCELLED"
+"RTN","BSDX27",141,0)
+    I $P(NODE,U,2)'="NT",$P(NODE,U,2)["N" Q TYP_" - NO SHOW"
+"RTN","BSDX27",142,0)
+    I $$CO^BSDXAPI(PAT,+NODE,DATE) Q TYP_" - CHECKED OUT"
+"RTN","BSDX27",143,0)
+    I $$CI^BSDXAPI(PAT,+NODE,DATE) Q TYP_" - CHECKED IN"
+"RTN","BSDX27",144,0)
+    Q TYP
+"RTN","BSDX27",145,0)
+    ;
+"RTN","BSDX27",146,0)
+ERROR   ;
+"RTN","BSDX27",147,0)
+    D ERR(BSDXI,"RPMS Error")
+"RTN","BSDX27",148,0)
+    Q
+"RTN","BSDX27",149,0)
+    ;
+"RTN","BSDX27",150,0)
+ERR(BSDXI,ERRNO,MSG)    ;Error processing
+"RTN","BSDX27",151,0)
+    S:'$D(BSDXI) BSDXI=999
+"RTN","BSDX27",152,0)
+    I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX27",153,0)
+    E  S BSDXERR=ERRNO
+"RTN","BSDX27",154,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",155,0)
+    S ^BSDXTMP($J,BSDXI)=MSG_"^^^^^^^^^^^^^^^"_$C(30)
+"RTN","BSDX27",156,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",157,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX27",158,0)
+    Q
+"RTN","BSDX27",159,0)
+PATINFO(BSDXPAT)    ;EP
+"RTN","BSDX27",160,0)
+    ;Intrisic Function returns NAME^SEX^DOB^HRN^STREET^CITY^STATE^ZIP^PHONE for patient ien BSDXPAT
+"RTN","BSDX27",161,0)
+    ;DOB is in external format
+"RTN","BSDX27",162,0)
+    ;HRN depends on existence of DUZ(2)
+"RTN","BSDX27",163,0)
+    ;
+"RTN","BSDX27",164,0)
+    N BSDXNOD,BSDXNAM,BSDXSEX,BSDXDOB,BSDXHRN,BSDXSTRT,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX27",165,0)
+    S BSDXNOD=^DPT(+BSDXPAT,0)
+"RTN","BSDX27",166,0)
+    S BSDXNAM=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX27",167,0)
+    S BSDXSEX=$P(BSDXNOD,U,2)
+"RTN","BSDX27",168,0)
+    S BSDXSEX=$S(BSDXSEX="F":"FEMALE",BSDXSEX="M":"MALE",1:"")
+"RTN","BSDX27",169,0)
+    S Y=$P(BSDXNOD,U,3) I Y]""  X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",170,0)
+    S BSDXDOB=Y ;DOB
+"RTN","BSDX27",171,0)
+    S BSDXHRN=""
+"RTN","BSDX27",172,0)
+    I $D(DUZ(2)) I DUZ(2)>0 S BSDXHRN=$P($G(^AUPNPAT(BSDXPAT,41,DUZ(2),0)),U,2) ;HRN
+"RTN","BSDX27",173,0)
+    ;
+"RTN","BSDX27",174,0)
+    S BSDXNOD=$G(^DPT(+BSDXPAT,.11))
+"RTN","BSDX27",175,0)
+    S (BSDXSTRT,BSDXCITY,BSDXST,BSDXZIP)=""
+"RTN","BSDX27",176,0)
+    I BSDXNOD]"" D
+"RTN","BSDX27",177,0)
+    . S BSDXSTRT=$E($P(BSDXNOD,U),1,50) ;STREET
+"RTN","BSDX27",178,0)
+    . S BSDXCITY=$P(BSDXNOD,U,4) ;CITY
+"RTN","BSDX27",179,0)
+    . S BSDXST=$P(BSDXNOD,U,5) ;STATE
+"RTN","BSDX27",180,0)
+    . I +BSDXST,$D(^DIC(5,+BSDXST,0)) S BSDXST=$P(^DIC(5,+BSDXST,0),U,2)
+"RTN","BSDX27",181,0)
+    . S BSDXZIP=$P(BSDXNOD,U,6) ;ZIP
+"RTN","BSDX27",182,0)
+    ;
+"RTN","BSDX27",183,0)
+    S BSDXNOD=$G(^DPT(+BSDXPAT,.13)) ;PHONE
+"RTN","BSDX27",184,0)
+    S BSDXPHON=$P(BSDXNOD,U)
+"RTN","BSDX27",185,0)
+    ;
+"RTN","BSDX27",186,0)
+    Q BSDXNAM_U_BSDXSEX_U_BSDXDOB_U_BSDXHRN_U_BSDXSTRT_U_BSDXCITY_U_BSDXST_U_BSDXZIP_U_BSDXPHON
+"RTN","BSDX27",187,0)
+    ;
+"RTN","BSDX27",188,0)
+CLDISPD(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX27",189,0)
+    ;Entry point for debugging
+"RTN","BSDX27",190,0)
+    ;
+"RTN","BSDX27",191,0)
+    ;D DEBUG^%Serenji("CLDISP^BSDX27(.BSDXY,BSDXCLST,BSDXBEG,BSDXEND)")
+"RTN","BSDX27",192,0)
+    Q
+"RTN","BSDX27",193,0)
+    ;
+"RTN","BSDX27",194,0)
+CLDISP(BSDXY,BSDXCLST,BSDXBEG,BSDXEND)  ;EP
+"RTN","BSDX27",195,0)
+    ;
+"RTN","BSDX27",196,0)
+    ;Return recordset of patient appointments
+"RTN","BSDX27",197,0)
+    ;between dates BSDXBEG and BSDXEND for each clinic in BSDXCLST.
+"RTN","BSDX27",198,0)
+    ;Used in listing a patient's appointments and generating patient letters.
+"RTN","BSDX27",199,0)
+    ;BSDXCLST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX27",200,0)
+    ;BSDXBEG and BSDXEND are in external date form.
+"RTN","BSDX27",201,0)
+    ;Called by BSDX CLINIC LETTERS
+"RTN","BSDX27",202,0)
+    ;
+"RTN","BSDX27",203,0)
+       ; July 10, 2010 -- to support i18n, we pass dates from client in
+"RTN","BSDX27",204,0)
+       ; locale-neutral Fileman format. No need to convert it.
+"RTN","BSDX27",205,0)
+    N BSDXI,BSDXNOD,BSDXNAM,BSDXDOB,BSDXHRN,BSDXSEX,BSDXCID,BSDXCNOD,BSDXDT
+"RTN","BSDX27",206,0)
+    N BSDXJ,BSDXAID,BSDXPAT,BSDXPNOD,BSDXCLN,BSDXCLRK,BSDXMADE,BSDXNOT,BSDXLIN
+"RTN","BSDX27",207,0)
+    N BSDXSTRT
+"RTN","BSDX27",208,0)
+    N BSDXSTRE,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX27",209,0)
+    S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX27",210,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX27",211,0)
+    S BSDXI=0
+"RTN","BSDX27",212,0)
+    S ^BSDXTMP($J,BSDXI)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030ApptDate^T00030Clinic^T00030TypeStatus"
+"RTN","BSDX27",213,0)
+    S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE"_$C(30)
+"RTN","BSDX27",214,0)
+    S X="ERROR^BSDX27",@^%ZOSF("TRAP")
+"RTN","BSDX27",215,0)
+    ;
+"RTN","BSDX27",216,0)
+    ;Convert beginning and ending dates
+"RTN","BSDX27",217,0)
+    ;
+"RTN","BSDX27",218,0)
+    S BSDXBEG=BSDXBEG-1,BSDXBEG=BSDXBEG_".9999"
+"RTN","BSDX27",219,0)
+    S BSDXEND=BSDXEND_".9999"
+"RTN","BSDX27",220,0)
+    I BSDXCLST="" D ERR(BSDXI,0,"Routine: BSDX27, Error: Null clinic list") Q
+"RTN","BSDX27",221,0)
+    ;
+"RTN","BSDX27",222,0)
+    ;For each clinic in BSDXCLST $O through ^BSDXAPPT("ARSRC",ResourceIEN,FMDate,ApptIEN)
+"RTN","BSDX27",223,0)
+    ;
+"RTN","BSDX27",224,0)
+    F BSDXJ=1:1:$L(BSDXCLST,"|")-1 S BSDXCID=$P(BSDXCLST,"|",BSDXJ) D
+"RTN","BSDX27",225,0)
+    . S BSDXCLN=$G(^BSDXRES(BSDXCID,0)) S BSDXCLN=$P(BSDXCLN,U) Q:BSDXCLN=""
+"RTN","BSDX27",226,0)
+    . S BSDXSTRT=BSDXBEG F  S BSDXSTRT=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT)) Q:'+BSDXSTRT  Q:BSDXSTRT>BSDXEND  D
+"RTN","BSDX27",227,0)
+    . . S BSDXAID=0 F  S BSDXAID=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT,BSDXAID)) Q:'+BSDXAID  D
+"RTN","BSDX27",228,0)
+    . . . S BSDXNOD=$G(^BSDXAPPT(BSDXAID,0))
+"RTN","BSDX27",229,0)
+    . . . Q:BSDXNOD=""
+"RTN","BSDX27",230,0)
+    . . . Q:$P(BSDXNOD,U,12)]""  ;CANCELLED
+"RTN","BSDX27",231,0)
+    . . . Q:$P(BSDXNOD,U,13)="y"  ;WALKIN
+"RTN","BSDX27",232,0)
+    . . . S Y=$P(BSDXNOD,U)
+"RTN","BSDX27",233,0)
+    . . . Q:'+Y
+"RTN","BSDX27",234,0)
+    . . . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",235,0)
+    . . . S BSDXAPT=Y ;Appointment date time
+"RTN","BSDX27",236,0)
+    . . . ;
+"RTN","BSDX27",237,0)
+    . . . ;NOTE
+"RTN","BSDX27",238,0)
+    . . . S BSDXNOT=""
+"RTN","BSDX27",239,0)
+    . . . I $D(^BSDXAPPT(BSDXAID,1,0)) S BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXAID,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX27",240,0)
+    . . . . S BSDXLIN=$G(^BSDXAPPT(BSDXAID,1,BSDXQ,0))
+"RTN","BSDX27",241,0)
+    . . . . S:(BSDXLIN'="")&($E(BSDXLIN,$L(BSDXLIN)-1,$L(BSDXLIN))'=" ") BSDXLIN=BSDXLIN_" "
+"RTN","BSDX27",242,0)
+    . . . . S BSDXNOT=BSDXNOT_BSDXLIN
+"RTN","BSDX27",243,0)
+    . . . ;
+"RTN","BSDX27",244,0)
+    . . . S BSDXPAT=$P(BSDXNOD,U,5)
+"RTN","BSDX27",245,0)
+    . . . S BSDXPNOD=$$PATINFO(BSDXPAT)
+"RTN","BSDX27",246,0)
+    . . . S BSDXNAM=$P(BSDXPNOD,U) ;NAME
+"RTN","BSDX27",247,0)
+    . . . S BSDXSEX=$P(BSDXPNOD,U,2) ;SEX
+"RTN","BSDX27",248,0)
+    . . . S BSDXDOB=$P(BSDXPNOD,U,3) ;DOB
+"RTN","BSDX27",249,0)
+    . . . S BSDXHRN=$P(BSDXPNOD,U,4) ;Health Record Number for location DUZ(2)
+"RTN","BSDX27",250,0)
+    . . . S BSDXSTRE=$P(BSDXPNOD,U,5) ;Street
+"RTN","BSDX27",251,0)
+    . . . S BSDXCITY=$P(BSDXPNOD,U,6) ;City
+"RTN","BSDX27",252,0)
+    . . . S BSDXST=$P(BSDXPNOD,U,7) ;State
+"RTN","BSDX27",253,0)
+    . . . S BSDXZIP=$P(BSDXPNOD,U,8) ;zip
+"RTN","BSDX27",254,0)
+    . . . S BSDXPHON=$P(BSDXPNOD,U,9) ;homephone
+"RTN","BSDX27",255,0)
+    . . . S BSDXTYPE="" ;Type/status doesn't exist for BSDX APPT clinics and it's not needed for clinic letters
+"RTN","BSDX27",256,0)
+    . . . S BSDXCLRK=$P(BSDXNOD,U,8)
+"RTN","BSDX27",257,0)
+    . . . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX27",258,0)
+    . . . S Y=$P(BSDXNOD,U,9)
+"RTN","BSDX27",259,0)
+    . . . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX27",260,0)
+    . . . S BSDXMADE=Y
+"RTN","BSDX27",261,0)
+    . . . S BSDXI=BSDXI+1
+"RTN","BSDX27",262,0)
+    . . . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXAPT_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_BSDXCID_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_$C(30)
+"RTN","BSDX27",263,0)
+    ;
+"RTN","BSDX27",264,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX27",265,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX27",266,0)
+    Q
+"RTN","BSDX28")
+0^26^B32389827
+"RTN","BSDX28",1,0)
+BSDX28 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/18/10 2:30pm
+"RTN","BSDX28",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX28",3,0)
+ ; 
+"RTN","BSDX28",4,0)
+    ; Change Log:
+"RTN","BSDX28",5,0)
+ ; HMW 3050721 Added test for inactivated record
+"RTN","BSDX28",6,0)
+    ; V1.3 WV/SMH 3100714 
+"RTN","BSDX28",7,0)
+    ; - add PID search
+"RTN","BSDX28",8,0)
+    ; - return PID instead of SSN (change header and logic)
+"RTN","BSDX28",9,0)
+    ; - Change Error trap to new style.
+"RTN","BSDX28",10,0)
+ ;
+"RTN","BSDX28",11,0)
+PTLOOKRS(BSDXY,BSDXP,BSDXC)  ;EP Patient Lookup
+"RTN","BSDX28",12,0)
+ ;
+"RTN","BSDX28",13,0)
+ ;Find up to BSDXC patients matching BSDXP*
+"RTN","BSDX28",14,0)
+ ;Supports DOB Lookup, Primary Long ID lookup
+"RTN","BSDX28",15,0)
+ ;
+"RTN","BSDX28",16,0)
+ N $ET S $ET="G ERROR^BSDX28"
+"RTN","BSDX28",17,0)
+    ; rm ctrl chars
+"RTN","BSDX28",18,0)
+ S BSDXP=$TR(BSDXP,$C(13),"")
+"RTN","BSDX28",19,0)
+ S BSDXP=$TR(BSDXP,$C(10),"")
+"RTN","BSDX28",20,0)
+ S BSDXP=$TR(BSDXP,$C(9),"")
+"RTN","BSDX28",21,0)
+    ; num of pts to find
+"RTN","BSDX28",22,0)
+ S:BSDXC="" BSDXC=10
+"RTN","BSDX28",23,0)
+ N BSDXHRN,BSDXZ,BSDXDLIM,BSDXRET,BSDXDPT,BSDXRET,BSDXIEN,BSDXFILE
+"RTN","BSDX28",24,0)
+ N BSDXIENS,BSDXFIELDS,BSDXFLAGS,BSDXVALUE,BSDXNUMBER,BSDXINDEXES,BSDXSCREEN
+"RTN","BSDX28",25,0)
+ N BSDXTARG,BSDXMSG,BSDXRSLT
+"RTN","BSDX28",26,0)
+ S BSDXDLIM="^"
+"RTN","BSDX28",27,0)
+ S BSDXRET="T00030NAME^T00030HRN^T00030PID^D00030DOB^T00030IEN"_$C(30)
+"RTN","BSDX28",28,0)
+ I '+$G(DUZ) S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",29,0)
+ I '$D(DUZ(2)) S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",30,0)
+ 
+"RTN","BSDX28",31,0)
+PID ;PID Lookup
+"RTN","BSDX28",32,0)
+    ; If this ID exists, go get it. If "UJOPID" index doesn't exist,
+"RTN","BSDX28",33,0)
+    ; won't work anyways.
+"RTN","BSDX28",34,0)
+    I $D(^DPT("UJOPID",BSDXP)) DO  SET BSDXY=BSDXRET_$C(31) QUIT
+"RTN","BSDX28",35,0)
+    . S BSDXIEN=$O(^DPT("UJOPID",BSDXP,""))
+"RTN","BSDX28",36,0)
+    . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",37,0)
+    . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",38,0)
+    . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",39,0)
+    . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",40,0)
+    . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",41,0)
+    . ; Inactivated Chart get an *
+"RTN","BSDX28",42,0)
+    . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q
+"RTN","BSDX28",43,0)
+    . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",44,0)
+    . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",45,0)
+    . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",46,0)
+    . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",47,0)
+    . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",48,0)
+    . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",49,0)
+ ;
+"RTN","BSDX28",50,0)
+DOB ;DOB Lookup
+"RTN","BSDX28",51,0)
+ I +DUZ(2),((BSDXP?1.2N1"/"1.2N1"/"1.4N)!(BSDXP?1.2N1" "1.2N1" "1.4N)!(BSDXP?1.2N1"-"1.2N1"-"1.4N)) D  S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",52,0)
+ . S X=BSDXP S %DT="P" D ^%DT S BSDXP=Y Q:'+Y
+"RTN","BSDX28",53,0)
+ . Q:'$D(^DPT("ADOB",BSDXP))
+"RTN","BSDX28",54,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^DPT("ADOB",BSDXP,BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX28",55,0)
+ . . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",56,0)
+ . . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",57,0)
+ . . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",58,0)
+ . . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",59,0)
+ . . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",60,0)
+ . . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",61,0)
+ . . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",62,0)
+    . . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",63,0)
+ . . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",64,0)
+ . . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",65,0)
+ . . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",66,0)
+ . . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",67,0)
+ . . Q
+"RTN","BSDX28",68,0)
+ . Q
+"RTN","BSDX28",69,0)
+ ;
+"RTN","BSDX28",70,0)
+CHART 
+"RTN","BSDX28",71,0)
+    ;Chart# Lookup
+"RTN","BSDX28",72,0)
+ I +DUZ(2),BSDXP]"",$D(^AUPNPAT("D",BSDXP)) D  S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",73,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^AUPNPAT("D",BSDXP,BSDXIEN)) Q:'+BSDXIEN  I $D(^AUPNPAT("D",BSDXP,BSDXIEN,DUZ(2))) D  Q
+"RTN","BSDX28",74,0)
+ . . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",75,0)
+ . . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",76,0)
+ . . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",77,0)
+ . . S BSDXHRN=BSDXP ;CHART
+"RTN","BSDX28",78,0)
+ . . I $D(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),$P(^(0),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",79,0)
+ . . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",80,0)
+    . . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",81,0)
+ . . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",82,0)
+ . . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",83,0)
+ . . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",84,0)
+ . . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",85,0)
+ . . Q
+"RTN","BSDX28",86,0)
+ . Q
+"RTN","BSDX28",87,0)
+    ;
+"RTN","BSDX28",88,0)
+SSN ;SSN Lookup
+"RTN","BSDX28",89,0)
+ I (BSDXP?9N)!(BSDXP?3N1"-"2N1"-"4N),$D(^DPT("SSN",BSDXP)) D  S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",90,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^DPT("SSN",BSDXP,BSDXIEN)) Q:'+BSDXIEN  D  Q
+"RTN","BSDX28",91,0)
+ . . Q:'$D(^DPT(BSDXIEN,0))
+"RTN","BSDX28",92,0)
+ . . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",93,0)
+ . . S BSDXZ=$P(BSDXDPT,U) ;NAME
+"RTN","BSDX28",94,0)
+ . . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",95,0)
+ . . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",96,0)
+ . . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",97,0)
+ . . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",98,0)
+    . . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",99,0)
+ . . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",100,0)
+ . . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",101,0)
+ . . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",102,0)
+ . . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+"RTN","BSDX28",103,0)
+ . . Q
+"RTN","BSDX28",104,0)
+ . Q
+"RTN","BSDX28",105,0)
+ ;
+"RTN","BSDX28",106,0)
+ S BSDXFILE=9000001
+"RTN","BSDX28",107,0)
+ S BSDXIENS=""
+"RTN","BSDX28",108,0)
+ S BSDXFIELDS=".01"
+"RTN","BSDX28",109,0)
+ S BSDXFLAGS="M"
+"RTN","BSDX28",110,0)
+ S BSDXVALUE=BSDXP
+"RTN","BSDX28",111,0)
+ S BSDXNUMBER=BSDXC
+"RTN","BSDX28",112,0)
+ S BSDXINDEXES=""
+"RTN","BSDX28",113,0)
+ S BSDXSCREEN=$S(+DUZ(2):"I $D(^AUPNPAT(Y,41,DUZ(2),0))",1:"")
+"RTN","BSDX28",114,0)
+ S BSDXIDEN=""
+"RTN","BSDX28",115,0)
+ S BSDXTARG="BSDXRSLT"
+"RTN","BSDX28",116,0)
+ S BSDXMSG=""
+"RTN","BSDX28",117,0)
+ D FIND^DIC(BSDXFILE,BSDXIENS,BSDXFIELDS,BSDXFLAGS,BSDXVALUE,BSDXNUMBER,BSDXINDEXES,BSDXSCREEN,BSDXIDEN,BSDXTARG,BSDXMSG)
+"RTN","BSDX28",118,0)
+ I '+$G(BSDXRSLT("DILIST",0)) S BSDXY=BSDXRET_$C(31) Q
+"RTN","BSDX28",119,0)
+ N BSDXCNT S BSDXCNT=2
+"RTN","BSDX28",120,0)
+ F BSDXX=1:1:$P(BSDXRSLT("DILIST",0),U) D
+"RTN","BSDX28",121,0)
+ . S BSDXIEN=BSDXRSLT("DILIST",2,BSDXX)
+"RTN","BSDX28",122,0)
+ . S BSDXZ=BSDXRSLT("DILIST","ID",BSDXX,.01) ;NAME
+"RTN","BSDX28",123,0)
+ . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+"RTN","BSDX28",124,0)
+ . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+"RTN","BSDX28",125,0)
+ . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+"RTN","BSDX28",126,0)
+ . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+"RTN","BSDX28",127,0)
+ . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+"RTN","BSDX28",128,0)
+    . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+"RTN","BSDX28",129,0)
+ . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+"RTN","BSDX28",130,0)
+ . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+"RTN","BSDX28",131,0)
+ . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+"RTN","BSDX28",132,0)
+ . S $P(BSDXRET,$C(30),BSDXCNT)=BSDXZ
+"RTN","BSDX28",133,0)
+ . S BSDXCNT=BSDXCNT+1
+"RTN","BSDX28",134,0)
+ . Q
+"RTN","BSDX28",135,0)
+ S BSDXY=BSDXRET_$C(30)_$C(31)
+"RTN","BSDX28",136,0)
+ Q
+"RTN","BSDX28",137,0)
+ ;
+"RTN","BSDX28",138,0)
+ERROR ;
+"RTN","BSDX28",139,0)
+ D ERR("RPMS Error")
+"RTN","BSDX28",140,0)
+ Q
+"RTN","BSDX28",141,0)
+ ;
+"RTN","BSDX28",142,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX28",143,0)
+ S BSDXRET="T00030NAME^T00030HRN^T00030SSN^D00030DOB^T00030IEN"_$C(30)_"^^^^"_$C(30)_$C(31)
+"RTN","BSDX28",144,0)
+ Q
+"RTN","BSDX29")
+0^27^B51424449
+"RTN","BSDX29",1,0)
+BSDX29 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:39pm
+"RTN","BSDX29",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX29",3,0)
+ ; 
+"RTN","BSDX29",4,0)
+ ; Change Log:
+"RTN","BSDX29",5,0)
+ ; v1.3 by WV/SMH on 3100713
+"RTN","BSDX29",6,0)
+ ; - Beginning and Ending dates passed as FM Dates
+"RTN","BSDX29",7,0)
+    ; v1.42 by WV/SMH on 3101023
+"RTN","BSDX29",8,0)
+    ; - Transaction moved; now restartable too.
+"RTN","BSDX29",9,0)
+    ; --> Thanks to Zach Gonzalez and Rick Marshall.
+"RTN","BSDX29",10,0)
+    ; - Refactoring of major portions of routine
+"RTN","BSDX29",11,0)
+ ;
+"RTN","BSDX29",12,0)
+BSDXCPD(BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX29",13,0)
+ ;Entry point for debugging
+"RTN","BSDX29",14,0)
+ ;
+"RTN","BSDX29",15,0)
+ D DEBUG^%Serenji("BSDXCP^BSDX29(.BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND)")
+"RTN","BSDX29",16,0)
+ Q
+"RTN","BSDX29",17,0)
+ ;
+"RTN","BSDX29",18,0)
+BSDXCP(BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX29",19,0)
+ ;Copy appointments from HOSPITAL LOCATION entry BSDX44 to BSDX RESOURCE entry BSDXRES
+"RTN","BSDX29",20,0)
+ ;Beginning with appointments on day BSDXBEG and ending on BSDXEND, inclusive
+"RTN","BSDX29",21,0)
+    ;Called by RPC: BSDX COPY APPOINTMENTS
+"RTN","BSDX29",22,0)
+ ;
+"RTN","BSDX29",23,0)
+    ; Parameters:
+"RTN","BSDX29",24,0)
+    ; - BSDXY: Global Return
+"RTN","BSDX29",25,0)
+    ; - BSDXRES: BSDX RESOURCE to copy appointments to
+"RTN","BSDX29",26,0)
+    ; - BSDX44: Hospital Location IEN to copy appointments from
+"RTN","BSDX29",27,0)
+    ; - BSDXBEG: Beginning Date in FM Format
+"RTN","BSDX29",28,0)
+    ; - BSDXEND: End Date in FM Format
+"RTN","BSDX29",29,0)
+    ;
+"RTN","BSDX29",30,0)
+ ;Returns ADO Recordset containing TASK_NUMBER and ERRORID
+"RTN","BSDX29",31,0)
+ ;
+"RTN","BSDX29",32,0)
+    ; Return Array
+"RTN","BSDX29",33,0)
+ S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX29",34,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX29",35,0)
+    ; $ET
+"RTN","BSDX29",36,0)
+    N $ET S $ET="G ETRAP^BSDX29"
+"RTN","BSDX29",37,0)
+ ; Counter
+"RTN","BSDX29",38,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX29",39,0)
+    ; Header Node
+"RTN","BSDX29",40,0)
+ S ^BSDXTMP($J,0)="T00010TASK_NUMBER^T00100ERRORID"_$C(30)
+"RTN","BSDX29",41,0)
+ ;
+"RTN","BSDX29",42,0)
+    ; Make dates inclusive; add 1 to FM dates
+"RTN","BSDX29",43,0)
+    S BSDXBEG=BSDXBEG-1
+"RTN","BSDX29",44,0)
+ S BSDXEND=BSDXEND+1
+"RTN","BSDX29",45,0)
+ ;
+"RTN","BSDX29",46,0)
+    ; Taskman variables
+"RTN","BSDX29",47,0)
+    N ZTSK,ZTRTN,ZTDTH,ZTDESC,ZTSAVE 
+"RTN","BSDX29",48,0)
+ ; Task Load
+"RTN","BSDX29",49,0)
+ S ZTRTN="ZTM^BSDX29",ZTDTH=$H,ZTDESC="COPY PATIENT APPTS"
+"RTN","BSDX29",50,0)
+ S ZTSAVE("BSDXBEG")="",ZTSAVE("BSDXEND")="",ZTSAVE("BSDX44")="",ZTSAVE("BSDXRES")=""
+"RTN","BSDX29",51,0)
+ D ^%ZTLOAD
+"RTN","BSDX29",52,0)
+ ; Set up return ADO.net dataset
+"RTN","BSDX29",53,0)
+ N BSDXST S BSDXST=$S($G(ZTSK)>0:"OK",1:"Unable to create task.")
+"RTN","BSDX29",54,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",55,0)
+ S ^BSDXTMP($J,BSDXI)=$G(ZTSK)_"^"_BSDXST_$C(30)_$C(31)
+"RTN","BSDX29",56,0)
+ QUIT
+"RTN","BSDX29",57,0)
+ ;
+"RTN","BSDX29",58,0)
+ZTMD ;EP - Debug entry point
+"RTN","BSDX29",59,0)
+ ;D DEBUG^%Serenji("ZTM^BSDX29")
+"RTN","BSDX29",60,0)
+ Q
+"RTN","BSDX29",61,0)
+ ;
+"RTN","BSDX29",62,0)
+ZTM ;EP - Taskman entry point
+"RTN","BSDX29",63,0)
+    ; Variables set up in ZTSAVE above
+"RTN","BSDX29",64,0)
+    ;
+"RTN","BSDX29",65,0)
+ Q:'$D(ZTSK)
+"RTN","BSDX29",66,0)
+    ; $ET
+"RTN","BSDX29",67,0)
+    N $ET S $ET="G ZTMERR^BSDX29"
+"RTN","BSDX29",68,0)
+ ; Txn
+"RTN","BSDX29",69,0)
+    TSTART (BSDXBEG,BSDXEND,BSDX44,BSDXRES):T="BSDX COPY APPOINTMENT^BSDX29"
+"RTN","BSDX29",70,0)
+ ;$O through ^SC(BSDX44,"S",
+"RTN","BSDX29",71,0)
+ N BSDXCNT S BSDXCNT=0  ; Count of Copied Appointments
+"RTN","BSDX29",72,0)
+    N BSDXQUIT S BSDXQUIT=0  ; Quit Flag to be retrieved from an external proc
+"RTN","BSDX29",73,0)
+ ; Set Count
+"RTN","BSDX29",74,0)
+    S ^BSDXTMP("BSDXCOPY",ZTSK)=BSDXCNT
+"RTN","BSDX29",75,0)
+ ; Loop through dates here.
+"RTN","BSDX29",76,0)
+    F  S BSDXBEG=$O(^SC(BSDX44,"S",BSDXBEG)) Q:'+BSDXBEG  Q:BSDXBEG>BSDXEND  Q:BSDXQUIT  D
+"RTN","BSDX29",77,0)
+    . ; Loop through Entries in each date in the subsubfile.
+"RTN","BSDX29",78,0)
+    . ; Quit if we are at the end or if a remote process requests a quit.
+"RTN","BSDX29",79,0)
+    . N BSDXIEN S BSDXIEN=0
+"RTN","BSDX29",80,0)
+ . F  S BSDXIEN=$O(^SC(BSDX44,"S",BSDXBEG,1,BSDXIEN)) Q:'+BSDXIEN  Q:BSDXQUIT  D
+"RTN","BSDX29",81,0)
+ . . N BSDXNOD S BSDXNOD=$G(^SC(BSDX44,"S",BSDXBEG,1,BSDXIEN,0)) ; Node
+"RTN","BSDX29",82,0)
+ . . Q:'+BSDXNOD  ; Quit if no node
+"RTN","BSDX29",83,0)
+ . . N BSDXCAN S BSDXCAN=$P(BSDXNOD,U,9) ; Cancel flag
+"RTN","BSDX29",84,0)
+ . . Q:BSDXCAN="C"  ; Quit if appt cancelled
+"RTN","BSDX29",85,0)
+    . . N BSDXPAT S BSDXPAT=$P(BSDXNOD,U) ; Patient
+"RTN","BSDX29",86,0)
+    . . N BSDXLEN S BSDXLEN=$P(BSDXNOD,U,2) ;duration in minutes
+"RTN","BSDX29",87,0)
+ . . N BSDXCLRK S BSDXCLRK=$P(BSDXNOD,U,6) ;appt made by (clerk)
+"RTN","BSDX29",88,0)
+ . . N BSDXMADE S BSDXMADE=$P(BSDXNOD,U,7) ;date appt made
+"RTN","BSDX29",89,0)
+ . . N BSDXNOTE S BSDXNOTE=$P(BSDXNOD,U,4) ;'OTHER' field contains note
+"RTN","BSDX29",90,0)
+ . . S BSDXCNT=BSDXCNT+$$XFER(BSDXRES,BSDXBEG,BSDXPAT,BSDXLEN,BSDXCLRK,BSDXMADE,BSDXNOTE)
+"RTN","BSDX29",91,0)
+ . . I +BSDXCNT,BSDXCNT#10=0 S ^BSDXTMP("BSDXCOPY",ZTSK)=BSDXCNT_" records copied." ;every 10th record
+"RTN","BSDX29",92,0)
+ . . I $D(^BSDXTMP("BSDXCOPY",ZTSK,"CANCEL")) S BSDXQUIT=1 ;Check for cancel flag
+"RTN","BSDX29",93,0)
+ . . Q
+"RTN","BSDX29",94,0)
+ . Q
+"RTN","BSDX29",95,0)
+ I 'BSDXQUIT TCOMMIT
+"RTN","BSDX29",96,0)
+ E  TROLLBACK
+"RTN","BSDX29",97,0)
+ S ^BSDXTMP("BSDXCOPY",ZTSK)=$S(BSDXQUIT:"Cancelled.  No records copied.",1:"Finished.  "_BSDXCNT_" records copied.")
+"RTN","BSDX29",98,0)
+ Q
+"RTN","BSDX29",99,0)
+ ;
+"RTN","BSDX29",100,0)
+ZTMERR ; For now, error from TM is only in trap; not returned to client.
+"RTN","BSDX29",101,0)
+ N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+"RTN","BSDX29",102,0)
+    ; Rollback before logging the error
+"RTN","BSDX29",103,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX29",104,0)
+ D ^%ZTER
+"RTN","BSDX29",105,0)
+    S $EC="" ; Clear Error
+"RTN","BSDX29",106,0)
+ QUIT
+"RTN","BSDX29",107,0)
+ ;
+"RTN","BSDX29",108,0)
+XFER(BSDXRES,BSDXBEG,BSDXPAT,BSDXLEN,BSDXCLRK,BSDXMADE,BSDXNOTE) ;EP
+"RTN","BSDX29",109,0)
+ ;
+"RTN","BSDX29",110,0)
+ ;Copy record to BSDX APPOINTMENT file
+"RTN","BSDX29",111,0)
+ ;Return 1 if record copied, otherwise 0
+"RTN","BSDX29",112,0)
+ ;
+"RTN","BSDX29",113,0)
+ ;$O Thru ^BSDXAPPT to determine if this appt already added
+"RTN","BSDX29",114,0)
+ N BSDXEND,BSDXIEN,BSDXFND,BSDXPAT2
+"RTN","BSDX29",115,0)
+ S BSDXIEN=0,BSDXFND=0
+"RTN","BSDX29",116,0)
+ F  S BSDXIEN=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXBEG,BSDXIEN)) Q:'+BSDXIEN  D  Q:BSDXFND
+"RTN","BSDX29",117,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXIEN,0))
+"RTN","BSDX29",118,0)
+ . Q:'+BSDXNOD
+"RTN","BSDX29",119,0)
+ . S BSDXPAT2=$P(BSDXNOD,U,5)
+"RTN","BSDX29",120,0)
+ . S BSDXFND=0
+"RTN","BSDX29",121,0)
+ . I BSDXPAT2=BSDXPAT S BSDXFND=1
+"RTN","BSDX29",122,0)
+ . Q
+"RTN","BSDX29",123,0)
+ Q:BSDXFND 0
+"RTN","BSDX29",124,0)
+ ;
+"RTN","BSDX29",125,0)
+ ;Add to BSDX APPOINTMENT
+"RTN","BSDX29",126,0)
+ S BSDXEND=BSDXBEG
+"RTN","BSDX29",127,0)
+ ;Calculate ending time from beginning time and duration.
+"RTN","BSDX29",128,0)
+ S BSDXEND=$$ADDMIN(BSDXBEG,BSDXLEN)
+"RTN","BSDX29",129,0)
+ S BSDXIENS="+1,"
+"RTN","BSDX29",130,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.01)=BSDXBEG
+"RTN","BSDX29",131,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.02)=BSDXEND
+"RTN","BSDX29",132,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.05)=BSDXPAT
+"RTN","BSDX29",133,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.07)=BSDXRES
+"RTN","BSDX29",134,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.08)=BSDXCLRK
+"RTN","BSDX29",135,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.09)=BSDXMADE
+"RTN","BSDX29",136,0)
+ ;
+"RTN","BSDX29",137,0)
+ K BSDXIEN
+"RTN","BSDX29",138,0)
+ D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX29",139,0)
+ S BSDXIEN=+$G(BSDXIEN(1))
+"RTN","BSDX29",140,0)
+ I '+BSDXIEN Q 0
+"RTN","BSDX29",141,0)
+ ;
+"RTN","BSDX29",142,0)
+ ;Add WP field
+"RTN","BSDX29",143,0)
+ I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE="" D
+"RTN","BSDX29",144,0)
+ . D WP^DIE(9002018.4,BSDXIEN_",",1,"","BSDXNOTE","BSDXMSG")
+"RTN","BSDX29",145,0)
+ ;
+"RTN","BSDX29",146,0)
+ Q 1
+"RTN","BSDX29",147,0)
+ ;
+"RTN","BSDX29",148,0)
+ERR(BSDXI,BSDXCNT,BSDXERR) ;Error processing
+"RTN","BSDX29",149,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",150,0)
+    S BSDXERR=$TR(BSDXERR,"^","~")
+"RTN","BSDX29",151,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_BSDXERR_$C(30)
+"RTN","BSDX29",152,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",153,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX29",154,0)
+ Q
+"RTN","BSDX29",155,0)
+ ;
+"RTN","BSDX29",156,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX29",157,0)
+ ; No Txn here. So don't rollback anything
+"RTN","BSDX29",158,0)
+    N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+"RTN","BSDX29",159,0)
+    D ^%ZTER
+"RTN","BSDX29",160,0)
+    S $EC="" ; Clear error
+"RTN","BSDX29",161,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX29",162,0)
+ D ERR(BSDXI,$G(BSDXCNT),"~100~BSDX29, Error: "_$G(%ZTERZE))
+"RTN","BSDX29",163,0)
+ Q
+"RTN","BSDX29",164,0)
+ ;
+"RTN","BSDX29",165,0)
+CPSTAT(BSDXY,BSDXTSK) ;EP - Note: As of Dec 6 2010: Inactive Code
+"RTN","BSDX29",166,0)
+ ;Return status (copied record count) of tasked job having ZTSK=BSDXTSK
+"RTN","BSDX29",167,0)
+ ;
+"RTN","BSDX29",168,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX29",169,0)
+ N BSDXI,BSDXCNT
+"RTN","BSDX29",170,0)
+ S BSDXI=0
+"RTN","BSDX29",171,0)
+ S X="ETRAP^BSDX29",@^%ZOSF("TRAP")
+"RTN","BSDX29",172,0)
+ S ^BSDXTMP($J,0)="T00020RECORD_COUNT^T00020ERRORID"_$C(30)
+"RTN","BSDX29",173,0)
+ S BSDXCNT=$G(^BSDXTMP("BSDXCOPY",BSDXTSK))
+"RTN","BSDX29",174,0)
+ I BSDXCNT["Finished" K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",175,0)
+ I BSDXCNT["Cancelled" K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",176,0)
+ ;I $D(^BSDXTMP("BSDXCOPY",BSDXTSK,"CANCEL")) K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",177,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",178,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_"OK"_$C(30)_$C(31)
+"RTN","BSDX29",179,0)
+ Q
+"RTN","BSDX29",180,0)
+ ;
+"RTN","BSDX29",181,0)
+CPCANC(BSDXY,BSDXTSK) ;EP Note: As of Dec 6 2010: Inactive code.
+"RTN","BSDX29",182,0)
+ ;Signal tasked job having ZTSK=BSDXTSK to cancel
+"RTN","BSDX29",183,0)
+ ;Returns current record count of copy process
+"RTN","BSDX29",184,0)
+ ;
+"RTN","BSDX29",185,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX29",186,0)
+ N BSDXI,BSDXCNT
+"RTN","BSDX29",187,0)
+ S BSDXI=0
+"RTN","BSDX29",188,0)
+ S X="ETRAP^BSDX29",@^%ZOSF("TRAP")
+"RTN","BSDX29",189,0)
+ S ^BSDXTMP($J,0)="T00020RECORD_COUNT^T00020ERRORID"_$C(30)
+"RTN","BSDX29",190,0)
+ S BSDXCNT=$G(^BSDXTMP("BSDXCOPY",BSDXTSK))
+"RTN","BSDX29",191,0)
+ I BSDXCNT["FINISHED" K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+"RTN","BSDX29",192,0)
+ E  S ^BSDXTMP("BSDXCOPY",BSDXTSK,"CANCEL")=""
+"RTN","BSDX29",193,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX29",194,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_"OK"_$C(30)_$C(31)
+"RTN","BSDX29",195,0)
+ Q
+"RTN","BSDX29",196,0)
+ ;
+"RTN","BSDX29",197,0)
+ADDMIN(BSDXSTRT,BSDXLEN) ;
+"RTN","BSDX29",198,0)
+ ;
+"RTN","BSDX29",199,0)
+ ;Add BSDXLEN minutes to time BSDXSTRT and return end time
+"RTN","BSDX29",200,0)
+ N BSDXEND,BSDXH,BSDXM,BSDXSTIM,BSDXETIM
+"RTN","BSDX29",201,0)
+ S BSDXEND=$P(BSDXSTRT,".")
+"RTN","BSDX29",202,0)
+ ;
+"RTN","BSDX29",203,0)
+ ;Convert start time to minutes past midnight
+"RTN","BSDX29",204,0)
+ S BSDXSTIM=$P(BSDXSTRT,".",2)
+"RTN","BSDX29",205,0)
+ S BSDXSTIM=BSDXSTIM_"0000"
+"RTN","BSDX29",206,0)
+ S BSDXSTIM=$E(BSDXSTIM,1,4)
+"RTN","BSDX29",207,0)
+ S BSDXH=$E(BSDXSTIM,1,2)
+"RTN","BSDX29",208,0)
+ S BSDXH=BSDXH*60
+"RTN","BSDX29",209,0)
+ S BSDXH=BSDXH+$E(BSDXSTIM,3,4)
+"RTN","BSDX29",210,0)
+ ;
+"RTN","BSDX29",211,0)
+ ;Add duration to find minutes past midnight of end time
+"RTN","BSDX29",212,0)
+ S BSDXETIM=BSDXH+BSDXLEN
+"RTN","BSDX29",213,0)
+ ;
+"RTN","BSDX29",214,0)
+ ;Convert back to a time
+"RTN","BSDX29",215,0)
+ S BSDXH=BSDXETIM\60
+"RTN","BSDX29",216,0)
+ S BSDXH="00"_BSDXH
+"RTN","BSDX29",217,0)
+ S BSDXH=$E(BSDXH,$L(BSDXH)-1,$L(BSDXH))
+"RTN","BSDX29",218,0)
+ S BSDXM=BSDXETIM#60
+"RTN","BSDX29",219,0)
+ S BSDXM="00"_BSDXM
+"RTN","BSDX29",220,0)
+ S BSDXM=$E(BSDXM,$L(BSDXM)-1,$L(BSDXM))
+"RTN","BSDX29",221,0)
+ S BSDXETIM=BSDXH_BSDXM
+"RTN","BSDX29",222,0)
+ I BSDXETIM>2400 S BSDXETIM=2400
+"RTN","BSDX29",223,0)
+ S $P(BSDXEND,".",2)=BSDXETIM
+"RTN","BSDX29",224,0)
+ Q BSDXEND
+"RTN","BSDX2E")
+0^^B25513799
+"RTN","BSDX2E",1,0)
+BSDX2E ;IHS/OIT/MJL - ENVIRONMENT CHECK FOR WINDOWS SCHEDULING [3/16/11 9:54am]
+"RTN","BSDX2E",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX2E",3,0)
+ ;
+"RTN","BSDX2E",4,0)
+ S LINE="",$P(LINE,"*",81)=""
+"RTN","BSDX2E",5,0)
+ S XPDNOQUE="NO QUE"  ;NO QUEUING ALLOWED
+"RTN","BSDX2E",6,0)
+ S XPDABORT=0
+"RTN","BSDX2E",7,0)
+ I '$G(DUZ) D SORRY("DUZ UNDEFINED OR 0") Q
+"RTN","BSDX2E",8,0)
+ ;
+"RTN","BSDX2E",9,0)
+ I '$L($G(DUZ(0))) D SORRY("DUZ(0) UNDEFINED OR NULL") Q
+"RTN","BSDX2E",10,0)
+ ;
+"RTN","BSDX2E",11,0)
+ D HOME^%ZIS,DT^DICRW
+"RTN","BSDX2E",12,0)
+ S X=$P($G(^VA(200,DUZ,0)),U)
+"RTN","BSDX2E",13,0)
+ I $G(X)="" W !,$$C^XBFUNC("Who are you????") D SORRY("Unknown User") Q
+"RTN","BSDX2E",14,0)
+ ;
+"RTN","BSDX2E",15,0)
+VERSION ;
+"RTN","BSDX2E",16,0)
+ W !,$$C^XBFUNC("Hello, "_$P(X,",",2)_" "_$P(X,","))
+"RTN","BSDX2E",17,0)
+ W !!,$$C^XBFUNC("Checking Environment for Install of Version "_$P($T(+2),";",3)_" of "_$P($T(+2),";",4)_".")
+"RTN","BSDX2E",18,0)
+ ;
+"RTN","BSDX2E",19,0)
+ Q:'$$VERCHK("VA FILEMAN",22)
+"RTN","BSDX2E",20,0)
+ Q:'$$VERCHK("KERNEL",8)
+"RTN","BSDX2E",21,0)
+ Q:'$$VERCHK("XB",3)
+"RTN","BSDX2E",22,0)
+ ;Is the PIMS requirement present?
+"RTN","BSDX2E",23,0)
+ Q:'$$VERCHK("SD",5.3)
+"RTN","BSDX2E",24,0)
+ ; Q:'$$PATCHCK("PIMS*5.3*1003") D
+"RTN","BSDX2E",25,0)
+ Q:'$$VERCHK("BMX",2)
+"RTN","BSDX2E",26,0)
+ ;
+"RTN","BSDX2E",27,0)
+OTHER ;
+"RTN","BSDX2E",28,0)
+ ;Other checks
+"RTN","BSDX2E",29,0)
+ ;
+"RTN","BSDX2E",30,0)
+ENVOK ; If this is just an environ check, end here.
+"RTN","BSDX2E",31,0)
+ W !!,$$C^XBFUNC("ENVIRONMENT OK.")
+"RTN","BSDX2E",32,0)
+ ;
+"RTN","BSDX2E",33,0)
+ ; The following line prevents the "Disable Options..." and "Move
+"RTN","BSDX2E",34,0)
+ ; Routines..." questions from being asked during the install.
+"RTN","BSDX2E",35,0)
+ I $G(XPDENV)=1 S (XPDDIQ("XPZ1"),XPDDIQ("XPZ2"))=0
+"RTN","BSDX2E",36,0)
+ ;
+"RTN","BSDX2E",37,0)
+ ;
+"RTN","BSDX2E",38,0)
+ ;VERIFY BACKUPS HAVE BEEN DONE
+"RTN","BSDX2E",39,0)
+ ;W !!
+"RTN","BSDX2E",40,0)
+ ;S DIR(0)="Y"
+"RTN","BSDX2E",41,0)
+ ;S DIR("B")="NO"
+"RTN","BSDX2E",42,0)
+ ;S DIR("A")="Has a SUCCESSFUL system backup been performed??"
+"RTN","BSDX2E",43,0)
+ ;D ^DIR
+"RTN","BSDX2E",44,0)
+ ;I $D(DIRUT)!($G(Y)=0) S XPDABORT=1 S XPX="BACKUP" D SORRY Q
+"RTN","BSDX2E",45,0)
+ ;S ^TMP("BPCPRE",$J,"BACKUPS CONFIRMED BY "_DUZ)=$H
+"RTN","BSDX2E",46,0)
+ ;
+"RTN","BSDX2E",47,0)
+ Q
+"RTN","BSDX2E",48,0)
+ ;
+"RTN","BSDX2E",49,0)
+VERCHK(XPXPKG,XVRMIN) ;
+"RTN","BSDX2E",50,0)
+ S X=$$VERSION^XPDUTL(XPXPKG)
+"RTN","BSDX2E",51,0)
+ W !!,$$C^XBFUNC("Need at least "_XPXPKG_" "_XVRMIN_"....."_XPXPKG_" "_$S(X'="":X,1:"Is Not")_" Present")
+"RTN","BSDX2E",52,0)
+ I X<XVRMIN  D SORRY(XPXPKG_" "_XVRMIN_" Is Not Installed") Q 0
+"RTN","BSDX2E",53,0)
+ Q 1
+"RTN","BSDX2E",54,0)
+ ;
+"RTN","BSDX2E",55,0)
+PATCHCK(XPXPCH) ;
+"RTN","BSDX2E",56,0)
+ S X=$$PATCH^XPDUTL(XPXPCH)
+"RTN","BSDX2E",57,0)
+ W !!,$$C^XBFUNC("Need "_XPXPCH_"....."_XPXPCH_" "_$S(X:"Is",1:"Is Not")_" Present")
+"RTN","BSDX2E",58,0)
+ Q X
+"RTN","BSDX2E",59,0)
+ ;
+"RTN","BSDX2E",60,0)
+V0200 ;EP Version 1.5 PostInit
+"RTN","BSDX2E",61,0)
+ ;Add Protocol items to SDAM APPOINTMENT EVENTS protocol
+"RTN","BSDX2E",62,0)
+ ;Remove protocols known to cause problems from SDAM APPOINTMENT EVENTS
+"RTN","BSDX2E",63,0)
+ ;Set Default Values for Parameters
+"RTN","BSDX2E",64,0)
+ N BSDXDA,BSDXFDA,BSDXDA1,BSDXSEQ,BSDXDAT,BSDXNOD,BSDXIEN,BSDXMSG
+"RTN","BSDX2E",65,0)
+ ;
+"RTN","BSDX2E",66,0)
+ ; 1st, add the BSDX event protocols
+"RTN","BSDX2E",67,0)
+ ; Get SDAM APPOINTMENT EVENTS IEN in 101
+"RTN","BSDX2E",68,0)
+ S BSDXDA=$O(^ORD(101,"B","SDAM APPOINTMENT EVENTS",0))
+"RTN","BSDX2E",69,0)
+ Q:'+BSDXDA
+"RTN","BSDX2E",70,0)
+ ; Add each of those protocols unless they already exist.
+"RTN","BSDX2E",71,0)
+ S BSDXDAT="BSDX ADD APPOINTMENT;10.2^BSDX CANCEL APPOINTMENT;10.4^BSDX CHECKIN APPOINTMENT;10.6^BSDX NOSHOW APPOINTMENT;10.8"
+"RTN","BSDX2E",72,0)
+ ; For each
+"RTN","BSDX2E",73,0)
+ F J=1:1:$L(BSDXDAT,U) D
+"RTN","BSDX2E",74,0)
+ . K BSDXIEN,BSDXMSG,BSDXFDA
+"RTN","BSDX2E",75,0)
+ . ; Get Item
+"RTN","BSDX2E",76,0)
+ . S BSDXNOD=$P(BSDXDAT,U,J)
+"RTN","BSDX2E",77,0)
+ . ; Get Item Name (BSDX ADD APPOINTMENT)
+"RTN","BSDX2E",78,0)
+ . S BSDXDA1=$P(BSDXNOD,";")
+"RTN","BSDX2E",79,0)
+ . ; Get Item Sequence (10.2)
+"RTN","BSDX2E",80,0)
+ . S BSDXSEQ=$P(BSDXNOD,";",2)
+"RTN","BSDX2E",81,0)
+ . ; Get Item Reference (Item is already in the protocol file)
+"RTN","BSDX2E",82,0)
+ . S BSDXDA1=$O(^ORD(101,"B",BSDXDA1,0))
+"RTN","BSDX2E",83,0)
+ . ; Quit if not found
+"RTN","BSDX2E",84,0)
+ . Q:'+BSDXDA1
+"RTN","BSDX2E",85,0)
+ . ; Quit if already exists in the SDAM protocol
+"RTN","BSDX2E",86,0)
+ . Q:$D(^ORD(101,BSDXDA,10,"B",BSDXDA1))
+"RTN","BSDX2E",87,0)
+ . ; Go ahead and save it.
+"RTN","BSDX2E",88,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",",".01")=BSDXDA1
+"RTN","BSDX2E",89,0)
+ . S BSDXFDA(101.01,"+1,"_BSDXDA_",","3")=BSDXSEQ
+"RTN","BSDX2E",90,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX2E",91,0)
+ . ; Error message
+"RTN","BSDX2E",92,0)
+ . I $D(BSDXMSG) W $C(7),"Error: ",BSDXMSG("DIERR",1,"TEXT",1)
+"RTN","BSDX2E",93,0)
+ ;
+"RTN","BSDX2E",94,0)
+ ; Remove nassssty protocols ORU PATIENT MOVMT and DVBA C&P SCHD EVENT
+"RTN","BSDX2E",95,0)
+ ; SDAM APPOINTMENT EVENTS IENS for use in FIND1^DIC
+"RTN","BSDX2E",96,0)
+ N SDEVTIENS S SDEVTIENS=","_BSDXDA_","
+"RTN","BSDX2E",97,0)
+ ; Subfile entry for ORU...
+"RTN","BSDX2E",98,0)
+ N ORUIEN S ORUIEN=$$FIND1^DIC(101.01,SDEVTIENS,"","ORU PATIENT MOVMT")
+"RTN","BSDX2E",99,0)
+ ; Subfile entry for DVBA...
+"RTN","BSDX2E",100,0)
+ N DVBAIEN S DVBAIEN=$$FIND1^DIC(101.01,SDEVTIENS,"","DVBA C&P SCHD EVENT")
+"RTN","BSDX2E",101,0)
+ ; Deletion code
+"RTN","BSDX2E",102,0)
+ N BSDXFDA,BSDXMSG
+"RTN","BSDX2E",103,0)
+ S:ORUIEN>0 BSDXFDA(101.01,ORUIEN_SDEVTIENS,.01)="@"
+"RTN","BSDX2E",104,0)
+ S:DVBAIEN>0 BSDXFDA(101.01,DVBAIEN_SDEVTIENS,.01)="@"
+"RTN","BSDX2E",105,0)
+ D:$D(BSDXFDA) FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX2E",106,0)
+ ; If error
+"RTN","BSDX2E",107,0)
+ I $D(BSDXMSG) W $C(7),"Error: ",BSDXMSG("DIERR",1,"TEXT",1)
+"RTN","BSDX2E",108,0)
+ ;
+"RTN","BSDX2E",109,0)
+ ;
+"RTN","BSDX2E",110,0)
+ ; Now put in the default values for parameters
+"RTN","BSDX2E",111,0)
+ ; BSDX AUTO PRINT RS as false
+"RTN","BSDX2E",112,0)
+ ; BSDX AUTO PRINT AS as false
+"RTN","BSDX2E",113,0)
+ ;
+"RTN","BSDX2E",114,0)
+ N BSDXERR
+"RTN","BSDX2E",115,0)
+ D PUT^XPAR("PKG","BSDX AUTO PRINT RS",1,0,.BSDXERR)
+"RTN","BSDX2E",116,0)
+ I $G(BSDXERR) W $C(7),"Error: ",BSDXERR
+"RTN","BSDX2E",117,0)
+ D PUT^XPAR("PKG","BSDX AUTO PRINT AS",1,0,.BSDXERR)
+"RTN","BSDX2E",118,0)
+ I $G(BSDXERR) W $C(7),"Error: ",BSDXERR
+"RTN","BSDX2E",119,0)
+ QUIT
+"RTN","BSDX2E",120,0)
+ ;
+"RTN","BSDX2E",121,0)
+SORRY(XPX) ;
+"RTN","BSDX2E",122,0)
+ K DIFQ
+"RTN","BSDX2E",123,0)
+ S XPDABORT=1
+"RTN","BSDX2E",124,0)
+ W !,$$C^XBFUNC($P($T(+2),";",3)_" of "_$P($T(+2),";",4)_" Cannot Be Installed!")
+"RTN","BSDX2E",125,0)
+ W !,$$C^XBFUNC("Reason: "_XPX_".")
+"RTN","BSDX2E",126,0)
+ W *7,!!!,$$C^XBFUNC("Sorry....something is wrong with your environment")
+"RTN","BSDX2E",127,0)
+ W !,$$C^XBFUNC("Aborting "_XPDNM_" install!")
+"RTN","BSDX2E",128,0)
+ W !,$$C^XBFUNC("Correct error and reinstall otherwise")
+"RTN","BSDX2E",129,0)
+ W !,$$C^XBFUNC("please print/capture this screen and notify")
+"RTN","BSDX2E",130,0)
+ W !,$$C^XBFUNC("technical support")
+"RTN","BSDX2E",131,0)
+ W !!,LINE
+"RTN","BSDX2E",132,0)
+ D BMES^XPDUTL("Sorry....something is wrong with your environment")
+"RTN","BSDX2E",133,0)
+ D BMES^XPDUTL("Enviroment ERROR "_$G(XPX))
+"RTN","BSDX2E",134,0)
+ D BMES^XPDUTL("Aborting "_XPDNM_" install!")
+"RTN","BSDX2E",135,0)
+ D BMES^XPDUTL("Correct error and reinstall otherwise")
+"RTN","BSDX2E",136,0)
+ D BMES^XPDUTL("please print/capture this screen and notify")
+"RTN","BSDX2E",137,0)
+ D BMES^XPDUTL("technical support")
+"RTN","BSDX2E",138,0)
+ Q
+"RTN","BSDX2E",139,0)
+ ;
+"RTN","BSDX30")
+0^28^B6616255
+"RTN","BSDX30",1,0)
+BSDX30 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; [ 09/12/2007  1:54 PM ]
+"RTN","BSDX30",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX30",3,0)
+ ;
+"RTN","BSDX30",4,0)
+ ;
+"RTN","BSDX30",5,0)
+SPACED(BSDXY,BSDXDIC,BSDXVAL) ;EP
+"RTN","BSDX30",6,0)
+ ;Entry point for debugging
+"RTN","BSDX30",7,0)
+ ;
+"RTN","BSDX30",8,0)
+ D DEBUG^%Serenji("SPACE^BSDX30(.BSDXY,BSDXDIC,BSDXVAL)")
+"RTN","BSDX30",9,0)
+ Q
+"RTN","BSDX30",10,0)
+ ;
+"RTN","BSDX30",11,0)
+SPACE(BSDXY,BSDXDIC,BSDXVAL) ;EP
+"RTN","BSDX30",12,0)
+ ;Update ^DISV with most recent lookup value BSDXVAL from file BSDXDIC
+"RTN","BSDX30",13,0)
+ ;BSDXDIC is the data global in the form GLOBAL(
+"RTN","BSDX30",14,0)
+ ;BSDXVAL is the entry number (IEN) in the file
+"RTN","BSDX30",15,0)
+ ;
+"RTN","BSDX30",16,0)
+ ;Return Status = 1 if success, 0 if fail
+"RTN","BSDX30",17,0)
+ ;
+"RTN","BSDX30",18,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX30",19,0)
+ N BSDX1,BSDXRES
+"RTN","BSDX30",20,0)
+ S BSDXI=0
+"RTN","BSDX30",21,0)
+ S X="ETRAP^BSDX30",@^%ZOSF("TRAP")
+"RTN","BSDX30",22,0)
+ I (BSDXDIC="")!('+$G(BSDXVAL)) D ERR(BSDXI+1,99) Q
+"RTN","BSDX30",23,0)
+ S BSDXDIC="^"_BSDXDIC
+"RTN","BSDX30",24,0)
+ S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30)
+"RTN","BSDX30",25,0)
+ ;Note:  Naked reference below is immediately preceded
+"RTN","BSDX30",26,0)
+ ;by the full global reference per SAC 2.2.2.8
+"RTN","BSDX30",27,0)
+ I $D(@(BSDXDIC_"BSDXVAL,0)")),'$D(^(-9)) D
+"RTN","BSDX30",28,0)
+ . S ^DISV(DUZ,BSDXDIC)=BSDXVAL
+"RTN","BSDX30",29,0)
+ . S BSDXRES=1
+"RTN","BSDX30",30,0)
+ E  S BSDXRES=0
+"RTN","BSDX30",31,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",32,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXRES_$C(30)_$C(31)
+"RTN","BSDX30",33,0)
+ Q
+"RTN","BSDX30",34,0)
+ ;
+"RTN","BSDX30",35,0)
+ERR(BSDXI,BSDXERR) ;Error processing
+"RTN","BSDX30",36,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",37,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+"RTN","BSDX30",38,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",39,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX30",40,0)
+ Q
+"RTN","BSDX30",41,0)
+ ;
+"RTN","BSDX30",42,0)
+ETRAP ;EP Error trap entry
+"RTN","BSDX30",43,0)
+ I '$D(BSDXI) N BSDXI S BSDXI=999
+"RTN","BSDX30",44,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",45,0)
+ D ERR(99,0)
+"RTN","BSDX30",46,0)
+ Q
+"RTN","BSDX30",47,0)
+ ;
+"RTN","BSDX30",48,0)
+EHRPTD(BSDXY,BSDXWID,BSDXDFN) ;
+"RTN","BSDX30",49,0)
+ ;
+"RTN","BSDX30",50,0)
+ D DEBUG^%Serenji("EHRPT^BSDX30(.BSDXY,BSDXWID,BSDXDFN)")
+"RTN","BSDX30",51,0)
+ Q
+"RTN","BSDX30",52,0)
+ ;
+"RTN","BSDX30",53,0)
+EHRPT(BSDXY,BSDXWID,BSDXDFN) ;
+"RTN","BSDX30",54,0)
+ ;
+"RTN","BSDX30",55,0)
+ ;Return Status = 1 if success, 0 if error
+"RTN","BSDX30",56,0)
+ ;
+"RTN","BSDX30",57,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX30",58,0)
+ N BSDX1,BSDXRES
+"RTN","BSDX30",59,0)
+ S BSDXI=0,BSDXRES=1
+"RTN","BSDX30",60,0)
+ S X="ETRAP^BSDX30",@^%ZOSF("TRAP")
+"RTN","BSDX30",61,0)
+ S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30)
+"RTN","BSDX30",62,0)
+ I '+BSDXDFN D ERR(BSDXI+1,0) Q
+"RTN","BSDX30",63,0)
+ ;
+"RTN","BSDX30",64,0)
+ D PEVENT(BSDXWID,BSDXDFN) ;Raise patient selected event
+"RTN","BSDX30",65,0)
+ ;
+"RTN","BSDX30",66,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX30",67,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXRES_$C(30)_$C(31)
+"RTN","BSDX30",68,0)
+ Q
+"RTN","BSDX30",69,0)
+ ;
+"RTN","BSDX30",70,0)
+PEVENT(BSDXWID,DFN) ;EP - Raise patient selection event to EHR
+"RTN","BSDX30",71,0)
+ ;
+"RTN","BSDX30",72,0)
+ ;Change patient context to patient DFN
+"RTN","BSDX30",73,0)
+ ;on all EHR client sessions associated with user DUZ
+"RTN","BSDX30",74,0)
+ ;and workstation BSDXWID.
+"RTN","BSDX30",75,0)
+ ;
+"RTN","BSDX30",76,0)
+ ;If BSDXWID is "", the context change is sent to
+"RTN","BSDX30",77,0)
+ ;all EHR client sessions belonging to user DUZ.
+"RTN","BSDX30",78,0)
+ ;
+"RTN","BSDX30",79,0)
+ Q:'$G(DUZ)
+"RTN","BSDX30",80,0)
+ ;N X
+"RTN","BSDX30",81,0)
+ ;S X="CIANBUTL" X ^%ZOSF("TEST") Q:'$T
+"RTN","BSDX30",82,0)
+ ;S X="CIANBEVT" X ^%ZOSF("TEST") Q:'$T
+"RTN","BSDX30",83,0)
+ N UID,BRET
+"RTN","BSDX30",84,0)
+ S BRET=0,UID=0
+"RTN","BSDX30",85,0)
+ F  S BRET=$$NXTUID^CIANBUTL(.UID,1) Q:'UID  D
+"RTN","BSDX30",86,0)
+ . Q:DUZ'=$$GETVAR^CIANBUTL("DUZ",,,UID)
+"RTN","BSDX30",87,0)
+ . I BSDXWID'="" Q:BSDXWID'=$TR($$GETVAR^CIANBUTL("WID",,,UID),"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
+"RTN","BSDX30",88,0)
+ . D QUEUE^CIANBEVT("CONTEXT.PATIENT",+DFN,UID)
+"RTN","BSDX30",89,0)
+ Q
+"RTN","BSDX31")
+0^29^B67823338
+"RTN","BSDX31",1,0)
+BSDX31  ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:39pm
+"RTN","BSDX31",2,0)
+    ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX31",3,0)
+    ; Change Log:
+"RTN","BSDX31",4,0)
+    ; v1.42 Oct 23 2010 WV/SMH
+"RTN","BSDX31",5,0)
+    ; - Change transaction to restartable. Thanks to Zach Gonzalez
+"RTN","BSDX31",6,0)
+    ; --> and Rick Marshall for their help.
+"RTN","BSDX31",7,0)
+    ; v1.42 Dec 6 2010: Extensive refactoring
+"RTN","BSDX31",8,0)
+    ; 
+"RTN","BSDX31",9,0)
+    ; Error Reference:
+"RTN","BSDX31",10,0)
+    ; -1: zero or null Appt ID
+"RTN","BSDX31",11,0)
+    ; -2: Invalid APPT ID (doesn't exist in ^BSDXAPPT)
+"RTN","BSDX31",12,0)
+    ; -3: No-show flag is invalid
+"RTN","BSDX31",13,0)
+    ; -4: Filing of No-show in ^BSDXAPPT failed
+"RTN","BSDX31",14,0)
+    ; -5: Filing of No-show in ^DPT failed (BSDXAPI error)
+"RTN","BSDX31",15,0)
+    ; -100: M Error
+"RTN","BSDX31",16,0)
+    ;
+"RTN","BSDX31",17,0)
+    ;
+"RTN","BSDX31",18,0)
+NOSHOWD(BSDXY,BSDXAPTID,BSDXNS) ;EP
+"RTN","BSDX31",19,0)
+    ;Entry point for debugging
+"RTN","BSDX31",20,0)
+    ;
+"RTN","BSDX31",21,0)
+    D DEBUG^%Serenji("NOSHOW^BSDX31(.BSDXY,BSDXAPTID,BSDXNS)")
+"RTN","BSDX31",22,0)
+    Q
+"RTN","BSDX31",23,0)
+    ;
+"RTN","BSDX31",24,0)
+UT ; Unit Tests
+"RTN","BSDX31",25,0)
+    ; Test 1: Sanity Check
+"RTN","BSDX31",26,0)
+    N ZZZ ; Garbage return variable
+"RTN","BSDX31",27,0)
+    N DATE S DATE=$$NOW^XLFDT()
+"RTN","BSDX31",28,0)
+    S DATE=$E(DATE,1,12) ; Just get minutes b/c of HL file input transform
+"RTN","BSDX31",29,0)
+    D APPADD^BSDX07(.ZZZ,DATE,DATE+.0001,3,"Dr Office",30,"Old Note",1)
+"RTN","BSDX31",30,0)
+    N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+"RTN","BSDX31",31,0)
+    D NOSHOW(.ZZZ,APPID,1)
+"RTN","BSDX31",32,0)
+    I $P(^BSDXAPPT(APPID,0),U,10)'=1 W "ERROR T1",! B
+"RTN","BSDX31",33,0)
+    I $P(^DPT(3,"S",DATE,0),U,2)'="N" W "ERROR T1",! B
+"RTN","BSDX31",34,0)
+    ; Test 2: Undo noshow
+"RTN","BSDX31",35,0)
+    D NOSHOW(.ZZZ,APPID,0)
+"RTN","BSDX31",36,0)
+    I $P(^BSDXAPPT(APPID,0),U,10)'="0" W "ERROR T2",! B
+"RTN","BSDX31",37,0)
+    I $P(^DPT(3,"S",DATE,0),U,2)'="" W "ERROR T2",! B
+"RTN","BSDX31",38,0)
+    ; Test 3: -1
+"RTN","BSDX31",39,0)
+    D NOSHOW(.ZZZ,"",0)
+"RTN","BSDX31",40,0)
+    I $P(^BSDXTMP($J,1),U)'=-1 W "ERROR T3",! B
+"RTN","BSDX31",41,0)
+    ; Test 4: -2
+"RTN","BSDX31",42,0)
+    D NOSHOW(.ZZZ,2938748233,0)
+"RTN","BSDX31",43,0)
+    I $P(^BSDXTMP($J,1),U)'=-2 W "ERROR T4",! B
+"RTN","BSDX31",44,0)
+    ; Test 5: -3
+"RTN","BSDX31",45,0)
+    D NOSHOW(.ZZZ,APPID,3)
+"RTN","BSDX31",46,0)
+    I $P(^BSDXTMP($J,1),U)'=-3 W "ERROR T5",! B
+"RTN","BSDX31",47,0)
+    ; Test 6: Mumps error (-100)
+"RTN","BSDX31",48,0)
+    s bsdxdie=1
+"RTN","BSDX31",49,0)
+    D NOSHOW(.ZZZ,APPID,1)
+"RTN","BSDX31",50,0)
+    I $P(^BSDXTMP($J,1),U)'=-100 W "ERROR T6",! B
+"RTN","BSDX31",51,0)
+    k bsdxdie
+"RTN","BSDX31",52,0)
+    ; Test 7: Restartable transaction
+"RTN","BSDX31",53,0)
+    s bsdxrestart=1
+"RTN","BSDX31",54,0)
+    D NOSHOW(.ZZZ,APPID,1)
+"RTN","BSDX31",55,0)
+    I $P(^BSDXAPPT(APPID,0),U,10)'=1 W "ERROR T7",! B
+"RTN","BSDX31",56,0)
+    QUIT
+"RTN","BSDX31",57,0)
+NOSHOW(BSDXY,BSDXAPTID,BSDXNS)         ;EP - No show a patient
+"RTN","BSDX31",58,0)
+    ; Called by RPC: BSDX NOSHOW
+"RTN","BSDX31",59,0)
+    ; Sets appointment noshow flag in BSDX APPOINTMENT file and "S" node in File 2
+"RTN","BSDX31",60,0)
+    ;
+"RTN","BSDX31",61,0)
+    ; Parameters:
+"RTN","BSDX31",62,0)
+    ; BSDXY: Global Return
+"RTN","BSDX31",63,0)
+    ; BSDXAPTID is entry number in BSDX APPOINTMENT file
+"RTN","BSDX31",64,0)
+    ; BSDXNS = 1: NOSHOW, 0: CANCEL NOSHO
+"RTN","BSDX31",65,0)
+    ; 
+"RTN","BSDX31",66,0)
+    ; Returns ADO.net record set with fields
+"RTN","BSDX31",67,0)
+    ; - ERRORID; ERRORTEXT
+"RTN","BSDX31",68,0)
+    ; ERRORID of 1 is okay
+"RTN","BSDX31",69,0)
+    ; Anything else is an error.
+"RTN","BSDX31",70,0)
+    ;
+"RTN","BSDX31",71,0)
+    ; Return Array; set and clear
+"RTN","BSDX31",72,0)
+    S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDX31",73,0)
+    K ^BSDXTMP($J)
+"RTN","BSDX31",74,0)
+    ; $ET
+"RTN","BSDX31",75,0)
+    N $ET S $ET="G ETRAP^BSDX31"
+"RTN","BSDX31",76,0)
+    ; Basline vars
+"RTN","BSDX31",77,0)
+    D ^XBKVAR  ; Set up baseline variables (DUZ, DUZ(2)) if they don't exist
+"RTN","BSDX31",78,0)
+    ; Counter
+"RTN","BSDX31",79,0)
+    N BSDXI S BSDXI=0
+"RTN","BSDX31",80,0)
+    ; Header Node
+"RTN","BSDX31",81,0)
+    S ^BSDXTMP($J,BSDXI)="I00100ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX31",82,0)
+    ; Begin transaction
+"RTN","BSDX31",83,0)
+    TSTART (BSDXI,BSDXY,BSDXAPTID,BSDXNS):T="BSDX NOSHOW CANCEL^BSDX29"
+"RTN","BSDX31",84,0)
+    ;;;test for error inside transaction. See if %ZTER works
+"RTN","BSDX31",85,0)
+    I $G(bsdxdie) S X=1/0
+"RTN","BSDX31",86,0)
+    ;;;TEST
+"RTN","BSDX31",87,0)
+    ;;;test for TRESTART
+"RTN","BSDX31",88,0)
+    I $G(bsdxrestart) K bsdxrestart TRESTART
+"RTN","BSDX31",89,0)
+    ;;;test
+"RTN","BSDX31",90,0)
+    ; Turn off SDAM APPT PROTOCOL BSDX Entries
+"RTN","BSDX31",91,0)
+    N BSDXNOEV S BSDXNOEV=1 ;Don't execute protocol
+"RTN","BSDX31",92,0)
+    ; Appointment ID check
+"RTN","BSDX31",93,0)
+    I '+BSDXAPTID D ERR(-1,"BSDX31: Invalid Appointment ID") Q
+"RTN","BSDX31",94,0)
+    I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(-2,"BSDX31: Invalid Appointment ID") Q
+"RTN","BSDX31",95,0)
+    ; Noshow value check - Must be 1 or 0
+"RTN","BSDX31",96,0)
+    S BSDXNS=+BSDXNS
+"RTN","BSDX31",97,0)
+    I BSDXNS'=1&(BSDXNS'=0) D ERR(-3,"BSDX31: Invalid No Show value") Q
+"RTN","BSDX31",98,0)
+    ; Get Some data
+"RTN","BSDX31",99,0)
+    N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPTID,0) ; Node
+"RTN","BSDX31",100,0)
+    N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) ; DFN
+"RTN","BSDX31",101,0)
+    N BSDXSTART S BSDXSTART=$P(BSDXNOD,U)  ; Start Date/Time
+"RTN","BSDX31",102,0)
+    ; Edit BSDX APPOINTMENT entry
+"RTN","BSDX31",103,0)
+    N BSDXMSG  ; 
+"RTN","BSDX31",104,0)
+    D BSDXNOS(BSDXAPTID,BSDXNS,.BSDXMSG)  ;Edit BSDX APPOINTMENT entry NOSHOW field 
+"RTN","BSDX31",105,0)
+    I $D(BSDXMSG("DIERR")) S BSDXMSG=$G(BSDXMSG("DIERR",1,"TEXT",1)) D ERR(-4,"BSDX31: "_BSDXMSG) Q
+"RTN","BSDX31",106,0)
+    ; Edit File 2 "S" node entry
+"RTN","BSDX31",107,0)
+    N BSDXZ,BSDXERR ; Error variables to control looping
+"RTN","BSDX31",108,0)
+    S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID
+"RTN","BSDX31",109,0)
+    ; If Resource ID exists, and HL exists (means that Resource is linked), No show in File 2
+"RTN","BSDX31",110,0)
+    I BSDXSC1]"",$D(^BSDXRES(BSDXSC1,0)) D  I $G(BSDXZ)]"" S BSDXERR="BSDX31: APNOSHO Returned: "_BSDXZ D ERR(-5,BSDXERR) Q
+"RTN","BSDX31",111,0)
+    . S BSDXNOD=^BSDXRES(BSDXSC1,0)
+"RTN","BSDX31",112,0)
+    . S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION
+"RTN","BSDX31",113,0)
+    . I BSDXSC1]"",$D(^SC(BSDXSC1,0)) D APNOSHO(.BSDXZ,BSDXSC1,BSDXPATID,BSDXSTART,BSDXNS)
+"RTN","BSDX31",114,0)
+    ;
+"RTN","BSDX31",115,0)
+    TCOMMIT
+"RTN","BSDX31",116,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",117,0)
+    S ^BSDXTMP($J,BSDXI)="1^"_$C(30) ; 1 means everything okay
+"RTN","BSDX31",118,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",119,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX31",120,0)
+    QUIT
+"RTN","BSDX31",121,0)
+    ;
+"RTN","BSDX31",122,0)
+APNOSHO(BSDXZ,BSDXSC1,BSDXDFN,BSDXSD,BSDXNS)            ;
+"RTN","BSDX31",123,0)
+    ; update file 2 info
+"RTN","BSDX31",124,0)
+    ;Set noshow for patient BSDXDFN in clinic BSDXSC1
+"RTN","BSDX31",125,0)
+    ;at time BSDXSD
+"RTN","BSDX31",126,0)
+    N BSDXC,%H,BSDXCDT,BSDXIEN
+"RTN","BSDX31",127,0)
+    N BSDXIENS,BSDXFDA,BSDXMSG
+"RTN","BSDX31",128,0)
+    S %H=$H D YMD^%DTC
+"RTN","BSDX31",129,0)
+    S BSDXCDT=X+%
+"RTN","BSDX31",130,0)
+    ;
+"RTN","BSDX31",131,0)
+    S BSDXIENS=BSDXSD_","_BSDXDFN_","
+"RTN","BSDX31",132,0)
+    I +BSDXNS D
+"RTN","BSDX31",133,0)
+    . S BSDXFDA(2.98,BSDXIENS,3)="N"
+"RTN","BSDX31",134,0)
+    . S BSDXFDA(2.98,BSDXIENS,14)=DUZ
+"RTN","BSDX31",135,0)
+    . S BSDXFDA(2.98,BSDXIENS,15)=BSDXCDT
+"RTN","BSDX31",136,0)
+    E  D
+"RTN","BSDX31",137,0)
+    . S BSDXFDA(2.98,BSDXIENS,3)=""
+"RTN","BSDX31",138,0)
+    . S BSDXFDA(2.98,BSDXIENS,14)=""
+"RTN","BSDX31",139,0)
+    . S BSDXFDA(2.98,BSDXIENS,15)=""
+"RTN","BSDX31",140,0)
+    K BSDXIEN
+"RTN","BSDX31",141,0)
+    D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+"RTN","BSDX31",142,0)
+    S BSDXZ=$G(BSDXMSG("DIERR",1,"TEXT",1))
+"RTN","BSDX31",143,0)
+    Q
+"RTN","BSDX31",144,0)
+    ;
+"RTN","BSDX31",145,0)
+BSDXNOS(BSDXAPTID,BSDXNS,BSDXMSG)   ;
+"RTN","BSDX31",146,0)
+    ;
+"RTN","BSDX31",147,0)
+    N BSDXFDA,BSDXIENS
+"RTN","BSDX31",148,0)
+    S BSDXIENS=BSDXAPTID_","
+"RTN","BSDX31",149,0)
+    S BSDXFDA(9002018.4,BSDXIENS,.1)=BSDXNS ;NOSHOW
+"RTN","BSDX31",150,0)
+    D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX31",151,0)
+    QUIT
+"RTN","BSDX31",152,0)
+    ;
+"RTN","BSDX31",153,0)
+NOSEVT(BSDXPAT,BSDXSTART,BSDXSC)    ;EP Called by BSDX NOSHOW APPOINTMENT event
+"RTN","BSDX31",154,0)
+    ;when appointments NOSHOW via PIMS interface.
+"RTN","BSDX31",155,0)
+    ;Propagates NOSHOW to BSDXAPPT and raises refresh event to running GUI clients
+"RTN","BSDX31",156,0)
+    ;
+"RTN","BSDX31",157,0)
+    Q:+$G(BSDXNOEV)
+"RTN","BSDX31",158,0)
+    Q:'+$G(BSDXSC)
+"RTN","BSDX31",159,0)
+    Q:$G(SDATA("AFTER","STATUS"))["AUTO RE-BOOK"
+"RTN","BSDX31",160,0)
+    N BSDXSTAT,BSDXFOUND,BSDXRES
+"RTN","BSDX31",161,0)
+    S BSDXSTAT=1
+"RTN","BSDX31",162,0)
+    S:$G(SDATA("BEFORE","STATUS"))["NO-SHOW" BSDXSTAT=0
+"RTN","BSDX31",163,0)
+    S BSDXFOUND=0
+"RTN","BSDX31",164,0)
+    I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX31",165,0)
+    I BSDXFOUND D NOSEVT3(BSDXRES) Q
+"RTN","BSDX31",166,0)
+    I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+"RTN","BSDX31",167,0)
+    I BSDXFOUND D NOSEVT3(BSDXRES)
+"RTN","BSDX31",168,0)
+    Q
+"RTN","BSDX31",169,0)
+    ;
+"RTN","BSDX31",170,0)
+NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT) ;
+"RTN","BSDX31",171,0)
+    ;Get appointment id in BSDXAPT
+"RTN","BSDX31",172,0)
+    ;If found, call BSDXNOS(BSDXAPPT) and return 1
+"RTN","BSDX31",173,0)
+    ;else return 0
+"RTN","BSDX31",174,0)
+    N BSDXFOUND,BSDXAPPT
+"RTN","BSDX31",175,0)
+    S BSDXFOUND=0
+"RTN","BSDX31",176,0)
+    Q:'+$G(BSDXRES) BSDXFOUND
+"RTN","BSDX31",177,0)
+    Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND
+"RTN","BSDX31",178,0)
+    S BSDXAPPT=0 F  S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT  D  Q:BSDXFOUND
+"RTN","BSDX31",179,0)
+    . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""
+"RTN","BSDX31",180,0)
+    . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q
+"RTN","BSDX31",181,0)
+    I BSDXFOUND,+$G(BSDXAPPT) D BSDXNOS(BSDXAPPT,BSDXSTAT)
+"RTN","BSDX31",182,0)
+    Q BSDXFOUND
+"RTN","BSDX31",183,0)
+    ;
+"RTN","BSDX31",184,0)
+NOSEVT3(BSDXRES)    ;
+"RTN","BSDX31",185,0)
+    ;Call RaiseEvent to notify GUI clients
+"RTN","BSDX31",186,0)
+    ;
+"RTN","BSDX31",187,0)
+    N BSDXRESN
+"RTN","BSDX31",188,0)
+    S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+"RTN","BSDX31",189,0)
+    Q:BSDXRESN=""
+"RTN","BSDX31",190,0)
+    S BSDXRESN=$P(BSDXRESN,"^")
+"RTN","BSDX31",191,0)
+    D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+"RTN","BSDX31",192,0)
+    Q
+"RTN","BSDX31",193,0)
+    ;
+"RTN","BSDX31",194,0)
+    ;
+"RTN","BSDX31",195,0)
+ERR(BSDXERID,ERRTXT)    ;Error processing
+"RTN","BSDX31",196,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",197,0)
+    S ERRTXT=$TR(ERRTXT,"^","~")
+"RTN","BSDX31",198,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX31",199,0)
+    S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX31",200,0)
+    S BSDXI=BSDXI+1
+"RTN","BSDX31",201,0)
+    S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX31",202,0)
+    QUIT
+"RTN","BSDX31",203,0)
+    ;
+"RTN","BSDX31",204,0)
+ETRAP   ;EP Error trap entry
+"RTN","BSDX31",205,0)
+    N $ET S $ET="D ^%ZTER HALT"  ; Emergency Error Trap
+"RTN","BSDX31",206,0)
+    ; Rollback, otherwise ^XTER will be empty from future rollback
+"RTN","BSDX31",207,0)
+    I $TL>0 TROLLBACK
+"RTN","BSDX31",208,0)
+    D ^%ZTER
+"RTN","BSDX31",209,0)
+    S $EC="" ; Clear Error
+"RTN","BSDX31",210,0)
+    ; Send to client
+"RTN","BSDX31",211,0)
+    I '$D(BSDXI) N BSDXI S BSDXI=0
+"RTN","BSDX31",212,0)
+    D ERR(-100,"BSDX31 Error: "_$G(%ZTERZE))
+"RTN","BSDX31",213,0)
+    QUIT
+"RTN","BSDX31",214,0)
+    ;
+"RTN","BSDX31",215,0)
+IMHERE(BSDXRES) ;EP
+"RTN","BSDX31",216,0)
+    ;Entry point for BSDX IM HERE remote procedure
+"RTN","BSDX31",217,0)
+    S BSDXRES=1
+"RTN","BSDX31",218,0)
+    Q
+"RTN","BSDX31",219,0)
+    ;
+"RTN","BSDX32")
+0^30^B17196738
+"RTN","BSDX32",1,0)
+BSDX32 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 9/29/10 10:21am
+"RTN","BSDX32",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX32",3,0)
+ ;
+"RTN","BSDX32",4,0)
+ ;
+"RTN","BSDX32",5,0)
+ERROR ;
+"RTN","BSDX32",6,0)
+ D ERR("RPMS Error")
+"RTN","BSDX32",7,0)
+ Q
+"RTN","BSDX32",8,0)
+ ;
+"RTN","BSDX32",9,0)
+ERR(BSDXERR) ;Error processing
+"RTN","BSDX32",10,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX32",11,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX32",12,0)
+ Q
+"RTN","BSDX32",13,0)
+ ;
+"RTN","BSDX32",14,0)
+HOSPLOCD(BSDXY) ;EP Debugging entry point
+"RTN","BSDX32",15,0)
+ ;
+"RTN","BSDX32",16,0)
+ ;D DEBUG^%Serenji("HOSPLOC^BSDX32(.BSDXY)")
+"RTN","BSDX32",17,0)
+ ;
+"RTN","BSDX32",18,0)
+ Q
+"RTN","BSDX32",19,0)
+ ;
+"RTN","BSDX32",20,0)
+HOSPLOC(BSDXY) ;EP
+"RTN","BSDX32",21,0)
+ ;Called by BSDX HOSPITAL LOCATION
+"RTN","BSDX32",22,0)
+    ;Returns all hospital locations that are active 
+"RTN","BSDX32",23,0)
+ ;
+"RTN","BSDX32",24,0)
+ N BSDXI,BSDXIEN,BSDXNOD,BSDXNAM,BSDXINA,BSDXREA,BSDXSCOD
+"RTN","BSDX32",25,0)
+ D ^XBKVAR S X="ERROR^BSDX32",@^%ZOSF("TRAP")
+"RTN","BSDX32",26,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX32",27,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX32",28,0)
+ S BSDXI=0
+"RTN","BSDX32",29,0)
+ ;"SELECT BSDXIEN 'HOSPITAL_LOCATION_ID', NAME 'HOSPITAL_LOCATION', DEFAULT_PROVIDER, STOP_CODE_NUMBER, INACTIVATE_DATE, REACTIVATE_DATE FROM HOSPITAL_LOCATION";
+"RTN","BSDX32",30,0)
+ S ^BSDXTMP($J,BSDXI)="I00020HOSPITAL_LOCATION_ID^T00040HOSPITAL_LOCATION^T00030DEFAULT_PROVIDER^T00030STOP_CODE_NUMBER^D00020INACTIVATE_DATE^D00020REACTIVATE_DATE"_$C(30)
+"RTN","BSDX32",31,0)
+ ;
+"RTN","BSDX32",32,0)
+ S BSDXNAM="" F  S BSDXNAM=$O(^SC("B",BSDXNAM)) Q:BSDXNAM=""  D
+"RTN","BSDX32",33,0)
+ . S BSDXIEN=$O(^SC("B",BSDXNAM,0))
+"RTN","BSDX32",34,0)
+ . Q:'+BSDXIEN>0
+"RTN","BSDX32",35,0)
+ . Q:'$D(^SC(+BSDXIEN,0))
+"RTN","BSDX32",36,0)
+    . ;Q:'$$INDIV^BSDX01(+BSDXIEN)  ; if not in the same division, quit
+"RTN","BSDX32",37,0)
+ . S BSDXINA=$$GET1^DIQ(44,BSDXIEN_",",2505) ;INACTIVATE
+"RTN","BSDX32",38,0)
+ . S BSDXREA=$$GET1^DIQ(44,BSDXIEN_",",2506) ;REACTIVATE
+"RTN","BSDX32",39,0)
+ . I BSDXINA]""&(BSDXREA="") Q  ;Clinic is inactivated and has no reactivate date
+"RTN","BSDX32",40,0)
+ . S BSDXNOD=^SC(BSDXIEN,0)
+"RTN","BSDX32",41,0)
+ . S BSDXNAM=$P(BSDXNOD,U)
+"RTN","BSDX32",42,0)
+ . S BSDXSCOD=$$GET1^DIQ(44,BSDXIEN_",",8) ;STOP CODE
+"RTN","BSDX32",43,0)
+ . ;Calculate default provider
+"RTN","BSDX32",44,0)
+ . S BSDXPRV=""
+"RTN","BSDX32",45,0)
+ . I $D(^SC(BSDXIEN,"PR")) D
+"RTN","BSDX32",46,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^SC(BSDXIEN,"PR",BSDXIEN1)) Q:'+BSDXIEN1  Q:BSDXPRV]""  D
+"RTN","BSDX32",47,0)
+ . . . S BSDXNOD1=$G(^SC(BSDXIEN,"PR",BSDXIEN1,0))
+"RTN","BSDX32",48,0)
+ . . . S:$P(BSDXNOD1,U,2)="1" BSDXPRV=$$GET1^DIQ(200,$P(BSDXNOD1,U),.01)
+"RTN","BSDX32",49,0)
+ . . . Q
+"RTN","BSDX32",50,0)
+ . . Q
+"RTN","BSDX32",51,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX32",52,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXNAM_U_BSDXPRV_U_BSDXSCOD_U_BSDXINA_U_BSDXREA_$C(30)
+"RTN","BSDX32",53,0)
+ . Q
+"RTN","BSDX32",54,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX32",55,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX32",56,0)
+ Q
+"RTN","BSDX32",57,0)
+ ;
+"RTN","BSDX32",58,0)
+CLNSETD(BSDXY) ;EP Debugging entry point
+"RTN","BSDX32",59,0)
+ ;
+"RTN","BSDX32",60,0)
+ ;D DEBUG^%Serenji("CLNSET^BSDX32(.BSDXY)")
+"RTN","BSDX32",61,0)
+ ;
+"RTN","BSDX32",62,0)
+ Q
+"RTN","BSDX32",63,0)
+ ;
+"RTN","BSDX32",64,0)
+CLNSET(BSDXY) ;EP
+"RTN","BSDX32",65,0)
+ ;Called by BSDX CLINIC SETUP
+"RTN","BSDX32",66,0)
+ ;Returns CLINIC SETUP file entries for clinics which
+"RTN","BSDX32",67,0)
+ ;are active in ^SC
+"RTN","BSDX32",68,0)
+ N BSDXI,BSDXIEN,BSDXNOD,BSDXNAM,BSDXINA,BSDXREA
+"RTN","BSDX32",69,0)
+ N BSDXCRV,BSDXVSC,BSDXMULT,BSDXREQ,BSDXPCC
+"RTN","BSDX32",70,0)
+ D ^XBKVAR S X="ERROR^BSDX32",@^%ZOSF("TRAP")
+"RTN","BSDX32",71,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX32",72,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX32",73,0)
+ S BSDXI=0
+"RTN","BSDX32",74,0)
+ ;SELECT BMXIEN 'HOSPITAL_LOCATION_ID', CLINIC_NAME 'HOSPITAL_LOCATION', CREATE_VISIT_AT_CHECK-IN? 'CREATE_VISIT', VISIT_SERVICE_CATEGORY,  MULTIPLE_CLINIC_CODES_USED?, VISIT_PROVIDER_REQUIRED,
+"RTN","BSDX32",75,0)
+ ;GENERATE_PCCPLUS_FORMS? FROM CLINIC_SETUP_PARAMETERS
+"RTN","BSDX32",76,0)
+ S ^BSDXTMP($J,BSDXI)="I00020HOSPITAL_LOCATION_ID^T00040HOSPITAL_LOCATION^T00030CREATE_VISIT^T00030VISIT_SERVICE_CATEGORY^T00030MULTIPLE_CLINIC_CODES_USED?^T00030VISIT_PROVIDER_REQUIRED^T00030GENERATE_PCCPLUS_FORMS?"_$C(30)
+"RTN","BSDX32",77,0)
+ ;
+"RTN","BSDX32",78,0)
+ S BSDXIEN=0 F  S BSDXIEN=$O(^BSDSC(BSDXIEN)) Q:'+BSDXIEN  D
+"RTN","BSDX32",79,0)
+ . Q:'$D(^SC(+BSDXIEN,0))
+"RTN","BSDX32",80,0)
+ . Q:'$D(^BSDSC(+BSDXIEN,0))
+"RTN","BSDX32",81,0)
+ . S BSDXINA=$$GET1^DIQ(44,BSDXIEN_",",2505) ;INACTIVATE
+"RTN","BSDX32",82,0)
+ . S BSDXREA=$$GET1^DIQ(44,BSDXIEN_",",2506) ;REACTIVATE
+"RTN","BSDX32",83,0)
+ . I BSDXINA]""&(BSDXREA="") Q  ;Clinic is inactivated and has no reactivate date
+"RTN","BSDX32",84,0)
+ . S BSDXNOD=^BSDSC(BSDXIEN,0)
+"RTN","BSDX32",85,0)
+ . S BSDXNAM=$$GET1^DIQ(44,BSDXIEN_",",.01)
+"RTN","BSDX32",86,0)
+ . S BSDXCRV=$$GET1^DIQ(9009017.2,BSDXIEN_",",.09)
+"RTN","BSDX32",87,0)
+ . S BSDXVSC=$$GET1^DIQ(9009017.2,BSDXIEN_",",.12)
+"RTN","BSDX32",88,0)
+ . S BSDXMULT=$$GET1^DIQ(9009017.2,BSDXIEN_",",.13)
+"RTN","BSDX32",89,0)
+ . S BSDXREQ=$$GET1^DIQ(9009017.2,BSDXIEN_",",.14)
+"RTN","BSDX32",90,0)
+ . S BSDXPCC=$$GET1^DIQ(9009017.2,BSDXIEN_",",.15)
+"RTN","BSDX32",91,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX32",92,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXNAM_U_BSDXCRV_U_BSDXVSC_U_BSDXMULT_U_BSDXREQ_U_BSDXPCC_$C(30)
+"RTN","BSDX32",93,0)
+ . Q
+"RTN","BSDX32",94,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX32",95,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX32",96,0)
+ Q
+"RTN","BSDX33")
+0^31^B14923306
+"RTN","BSDX33",1,0)
+BSDX33 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 12:33pm
+"RTN","BSDX33",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX33",3,0)
+    ; Mods by WV/STAR
+"RTN","BSDX33",4,0)
+    ;
+"RTN","BSDX33",5,0)
+    ; Change Log:
+"RTN","BSDX33",6,0)
+    ; July 13, 2010
+"RTN","BSDX33",7,0)
+    ; v 1.3 adds fixes Rebooking behavior in application (see RBNEXT)
+"RTN","BSDX33",8,0)
+    ; also adds i18 support - Dates passed in FM format from application
+"RTN","BSDX33",9,0)
+    ; in tag SETRBK and RBNEXT
+"RTN","BSDX33",10,0)
+ ;
+"RTN","BSDX33",11,0)
+ ;
+"RTN","BSDX33",12,0)
+ Q
+"RTN","BSDX33",13,0)
+RBNEXTD(BSDXY,BSDXDATE,BSDXRES,BSDXTPID) ;EP
+"RTN","BSDX33",14,0)
+ ;Entry point for debugging
+"RTN","BSDX33",15,0)
+ ;
+"RTN","BSDX33",16,0)
+ ;D DEBUG^%Serenji("RBNEXT^BSDX33(.BSDXY,BSDXDATE,BSDXRES,BSDXTPID)")
+"RTN","BSDX33",17,0)
+ Q
+"RTN","BSDX33",18,0)
+ ;
+"RTN","BSDX33",19,0)
+RBNEXT(BSDXY,BSDXDATE,BSDXRES,BSDXTPID) ;EP
+"RTN","BSDX33",20,0)
+ ;Called by BSDX REBOOK NEXT BLOCK to find
+"RTN","BSDX33",21,0)
+ ;the next ACCESS BLOCK in resource BSDXRES after BSDXDATE
+"RTN","BSDX33",22,0)
+ ;Returns 1 in ERRORID and date in NEXTBLOCK if a block was found or NULL in NEXTBLOCK of no date found
+"RTN","BSDX33",23,0)
+ ;Otherwise, returns 0 and error message in ERRORTEXT
+"RTN","BSDX33",24,0)
+ ;If BSDXTPID = 0 then any access type match
+"RTN","BSDX33",25,0)
+ ;
+"RTN","BSDX33",26,0)
+ S X="ERROR2^BSDX33",@^%ZOSF("TRAP")
+"RTN","BSDX33",27,0)
+ N BSDXI,BSDXIENS,%DT,BSDXMSG,Y,BSDXRESD,BSDXFND,BSDXIEN,BSDXNOD,BSDXATID
+"RTN","BSDX33",28,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX33",29,0)
+ S BSDXI=0
+"RTN","BSDX33",30,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ERRORID^D00010NEXTBLOCK^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX33",31,0)
+ ;
+"RTN","BSDX33",32,0)
+ I BSDXRES="" D ERR2("BSDX REBOOK NEXT BLOCK: Invalid resource name") Q
+"RTN","BSDX33",33,0)
+ I '$D(^BSDXRES("B",BSDXRES)) D ERR2("BSDX REBOOK NEXT BLOCK: Invalid resource name") Q
+"RTN","BSDX33",34,0)
+ S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0))
+"RTN","BSDX33",35,0)
+ I '+BSDXRESD D ERR2("BSDX REBOOK NEXT BLOCK: Invalid resource name") Q
+"RTN","BSDX33",36,0)
+ ;
+"RTN","BSDX33",37,0)
+    ; i18n fix
+"RTN","BSDX33",38,0)
+    ; S X=BSDXDATE,%DT="XT" D ^%DT
+"RTN","BSDX33",39,0)
+ ; I Y=-1 D ERR2(1,"BSDX REBOOK NEXT BLOCK: Invalid datetime") Q
+"RTN","BSDX33",40,0)
+ ;
+"RTN","BSDX33",41,0)
+    ; S BSDXDATE=$P(Y,".")
+"RTN","BSDX33",42,0)
+ ;
+"RTN","BSDX33",43,0)
+ S BSDXFND=0
+"RTN","BSDX33",44,0)
+ F  S BSDXDATE=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXDATE)) Q:'+BSDXDATE  D  Q:BSDXFND
+"RTN","BSDX33",45,0)
+ . S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXDATE,BSDXIEN)) Q:'+BSDXIEN  D  Q:BSDXFND
+"RTN","BSDX33",46,0)
+ . . Q:'$D(^BSDXAB(BSDXIEN,0))
+"RTN","BSDX33",47,0)
+ . . S BSDXNOD=^BSDXAB(BSDXIEN,0)
+"RTN","BSDX33",48,0)
+ . . Q:+$P(BSDXNOD,U,4)=0  ;Slots
+"RTN","BSDX33",49,0)
+ . . S BSDXATID=$P(BSDXNOD,U,5)
+"RTN","BSDX33",50,0)
+ . . I BSDXTPID=0!(BSDXATID=BSDXTPID) S BSDXFND=$P(BSDXNOD,U,2) Q
+"RTN","BSDX33",51,0)
+ ;
+"RTN","BSDX33",52,0)
+ I BSDXFND=0 S BSDXFND=""
+"RTN","BSDX33",53,0)
+ E  S Y=BSDXFND X ^DD("DD") S BSDXFND=Y
+"RTN","BSDX33",54,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",55,0)
+    ;//smh - bug (V 1.3): Need to replace @ in FM date for C# to recognize it
+"RTN","BSDX33",56,0)
+    S BSDXFND=$TR(BSDXFND,"@"," ")
+"RTN","BSDX33",57,0)
+    ;//smh end fix
+"RTN","BSDX33",58,0)
+ S ^BSDXTMP($J,BSDXI)="1^"_BSDXFND_"^"_$C(30)_$C(31)
+"RTN","BSDX33",59,0)
+ Q
+"RTN","BSDX33",60,0)
+SETRBKD(BSDXY,BSDXAPPT,BSDXDATE) ;EP
+"RTN","BSDX33",61,0)
+ ;Entry point for debugging
+"RTN","BSDX33",62,0)
+ ;
+"RTN","BSDX33",63,0)
+ ;D DEBUG^%Serenji("SETRBK^BSDX33(.BSDXY,BSDXAPPT,BSDXDATE)")
+"RTN","BSDX33",64,0)
+ Q
+"RTN","BSDX33",65,0)
+ ;
+"RTN","BSDX33",66,0)
+SETRBK(BSDXY,BSDXAPPT,BSDXDATE) ;EP
+"RTN","BSDX33",67,0)
+ ;
+"RTN","BSDX33",68,0)
+ ;Sets rebook date into appointment
+"RTN","BSDX33",69,0)
+ ;BSDXAPPT - Appointment ID
+"RTN","BSDX33",70,0)
+ ;BSDXDATE - Rebook Datetime in internal format
+"RTN","BSDX33",71,0)
+ ;Called by BSDX REBOOK SET
+"RTN","BSDX33",72,0)
+ ;
+"RTN","BSDX33",73,0)
+ ;ErrorID:
+"RTN","BSDX33",74,0)
+ ; 0 if a problem.  Message in ERRORTEXT
+"RTN","BSDX33",75,0)
+ ; 1 if OK
+"RTN","BSDX33",76,0)
+ ;
+"RTN","BSDX33",77,0)
+ S X="ERROR^BSDX33",@^%ZOSF("TRAP")
+"RTN","BSDX33",78,0)
+ N BSDXI,BSDXIENS,%DT,BSDXMSG,Y
+"RTN","BSDX33",79,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX33",80,0)
+ S BSDXI=0
+"RTN","BSDX33",81,0)
+ S ^BSDXTMP($J,BSDXI)="I00020ERRORID^T00030ERRORTEXT"_$C(30)
+"RTN","BSDX33",82,0)
+ ;
+"RTN","BSDX33",83,0)
+ I '+BSDXAPPT
+"RTN","BSDX33",84,0)
+ I '$D(^BSDXAPPT(BSDXAPPT,0)) D ERR(1,"BSDX REBOOK SET: Invalid appointment ID") Q
+"RTN","BSDX33",85,0)
+ ; i18n (v 1.3)
+"RTN","BSDX33",86,0)
+    ;S X=BSDXDATE,%DT="XT" D ^%DT
+"RTN","BSDX33",87,0)
+ ;I Y=-1 D ERR(1,"BSDX REBOOK SET: Invalid rebook datetime") Q
+"RTN","BSDX33",88,0)
+ ;S BSDXDATE=Y
+"RTN","BSDX33",89,0)
+ S BSDXIENS=BSDXAPPT_","
+"RTN","BSDX33",90,0)
+ S BSDXFDA(9002018.4,BSDXIENS,.11)=+BSDXDATE
+"RTN","BSDX33",91,0)
+ ;
+"RTN","BSDX33",92,0)
+ K BSDXMSG
+"RTN","BSDX33",93,0)
+ D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDX33",94,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",95,0)
+ S ^BSDXTMP($J,BSDXI)="1^"_$C(31)
+"RTN","BSDX33",96,0)
+ ;
+"RTN","BSDX33",97,0)
+ Q
+"RTN","BSDX33",98,0)
+ ;
+"RTN","BSDX33",99,0)
+ERR(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX33",100,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX33",101,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",102,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+"RTN","BSDX33",103,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",104,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX33",105,0)
+ Q
+"RTN","BSDX33",106,0)
+ ;
+"RTN","BSDX33",107,0)
+ERROR ;
+"RTN","BSDX33",108,0)
+ D ^%ZTER
+"RTN","BSDX33",109,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX33",110,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",111,0)
+ D ERR(0,"BSDX33 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX33",112,0)
+ Q
+"RTN","BSDX33",113,0)
+ ;
+"RTN","BSDX33",114,0)
+ERR2(BSDXERID,ERRTXT) ;Error processing
+"RTN","BSDX33",115,0)
+ S:'+$G(BSDXI) BSDXI=999999
+"RTN","BSDX33",116,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",117,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERID_"^^"_ERRTXT_$C(30)
+"RTN","BSDX33",118,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",119,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX33",120,0)
+ Q
+"RTN","BSDX33",121,0)
+ ;
+"RTN","BSDX33",122,0)
+ERROR2 ;
+"RTN","BSDX33",123,0)
+ D ^%ZTER
+"RTN","BSDX33",124,0)
+ I '+$G(BSDXI) N BSDXI S BSDXI=999999
+"RTN","BSDX33",125,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX33",126,0)
+ D ERR2(0,"BSDX33 M Error: <"_$G(%ZTERROR)_">")
+"RTN","BSDX33",127,0)
+ Q
+"RTN","BSDX34")
+0^32^B43182525
+"RTN","BSDX34",1,0)
+BSDX34 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 12:37pm
+"RTN","BSDX34",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX34",3,0)
+    ;
+"RTN","BSDX34",4,0)
+    ; Change Log:
+"RTN","BSDX34",5,0)
+    ; July 10 2010: 
+"RTN","BSDX34",6,0)
+ ; CANCLIN AND RBCLIN: Dates passed in FM format for i18n
+"RTN","BSDX34",7,0)
+ ;
+"RTN","BSDX34",8,0)
+ Q
+"RTN","BSDX34",9,0)
+ ;
+"RTN","BSDX34",10,0)
+RBCLIND(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX34",11,0)
+ ;Entry point for debugging
+"RTN","BSDX34",12,0)
+ ;
+"RTN","BSDX34",13,0)
+ ;D DEBUG^%Serenji("RBCLIN^BSDX34(.BSDXY,BSDXCLST,BSDXBEG,BSDXEND)")
+"RTN","BSDX34",14,0)
+ Q
+"RTN","BSDX34",15,0)
+ ;
+"RTN","BSDX34",16,0)
+RBERR ;
+"RTN","BSDX34",17,0)
+ ;Called from RBCLIN on error to set up header
+"RTN","BSDX34",18,0)
+ K ^BSDXTMP($J)
+"RTN","BSDX34",19,0)
+ S ^BSDXTMP($J,0)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030NewApptDate^T00030Clinic^T00030TypeStatus^I00010RESOURCEID"
+"RTN","BSDX34",20,0)
+ S ^BSDXTMP($J,0)=^(0)_"^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE^D00030OldApptDate"_$C(30)
+"RTN","BSDX34",21,0)
+ D ERR(999)
+"RTN","BSDX34",22,0)
+ Q
+"RTN","BSDX34",23,0)
+ ;
+"RTN","BSDX34",24,0)
+CANCLIN(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX34",25,0)
+ ;
+"RTN","BSDX34",26,0)
+ ;Return recordset of CANCELLED patient appointments
+"RTN","BSDX34",27,0)
+ ;between dates BSDXBEG and BSDXEND for each clinic in BSDXCLST.
+"RTN","BSDX34",28,0)
+ ;Used in generating cancellation letters for a clinic
+"RTN","BSDX34",29,0)
+ ;BSDXCLST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX34",30,0)
+    ;v 1.3 BSDXBEG and BSDXEND are in fm format
+"RTN","BSDX34",31,0)
+ ;Called by BSDX CANCEL CLINIC LIST
+"RTN","BSDX34",32,0)
+ N BSDXCAN
+"RTN","BSDX34",33,0)
+ S BSDXCAN=1
+"RTN","BSDX34",34,0)
+ D RBCLIN(.BSDXY,BSDXCLST,BSDXBEG,BSDXEND)
+"RTN","BSDX34",35,0)
+ ;
+"RTN","BSDX34",36,0)
+ Q
+"RTN","BSDX34",37,0)
+ ;
+"RTN","BSDX34",38,0)
+RBCLIN(BSDXY,BSDXCLST,BSDXBEG,BSDXEND) ;EP
+"RTN","BSDX34",39,0)
+ ;
+"RTN","BSDX34",40,0)
+ ;Return recordset of rebooked patient appointments
+"RTN","BSDX34",41,0)
+ ;between dates BSDXBEG and BSDXEND for each clinic in BSDXCLST.
+"RTN","BSDX34",42,0)
+ ;Used in generating rebook letters for a clinic
+"RTN","BSDX34",43,0)
+ ;BSDXCLST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX34",44,0)
+ ;Called by BSDX REBOOK CLINIC LIST and BSDX CANCEL CLINIC LIST via entry point CANCLIN above
+"RTN","BSDX34",45,0)
+ ;Jul 11 2010 (smh):
+"RTN","BSDX34",46,0)
+    ;for i18n, pass BSDXBEG and BSDXEND in FM format.
+"RTN","BSDX34",47,0)
+ ;
+"RTN","BSDX34",48,0)
+ S X="RBERR^BSDX34",@^%ZOSF("TRAP")
+"RTN","BSDX34",49,0)
+ ;
+"RTN","BSDX34",50,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX34",51,0)
+ N %DT,Y,BSDXJ,BSDXCID,BSDXCLN,BSDXSTRT,BSDXAID,BSDXNOD,BSDXLIST,BSDX,BSDY
+"RTN","BSDX34",52,0)
+ ;Convert beginning and ending dates
+"RTN","BSDX34",53,0)
+ ;TODO: Validation of date to make sure it's a right FM Date
+"RTN","BSDX34",54,0)
+    S BSDXBEG=$P(BSDXBEG,".")
+"RTN","BSDX34",55,0)
+    S BSDXEND=$P(BSDXEND,".")
+"RTN","BSDX34",56,0)
+ S BSDXBEG=BSDXBEG-1,BSDXBEG=BSDXBEG_".9999"
+"RTN","BSDX34",57,0)
+ S BSDXEND=BSDXEND_".9999"
+"RTN","BSDX34",58,0)
+    ;
+"RTN","BSDX34",59,0)
+ I BSDXCLST="" D RBERR Q
+"RTN","BSDX34",60,0)
+ ;
+"RTN","BSDX34",61,0)
+ ;
+"RTN","BSDX34",62,0)
+ ;If BSDXCLST is a list of resource NAMES, look up each name and convert to IEN
+"RTN","BSDX34",63,0)
+ F BSDXJ=1:1:$L(BSDXCLST,"|")-1 S BSDX=$P(BSDXCLST,"|",BSDXJ) D  S $P(BSDXCLST,"|",BSDXJ)=BSDY
+"RTN","BSDX34",64,0)
+ . S BSDY=""
+"RTN","BSDX34",65,0)
+ . I BSDX]"",$D(^BSDXRES(BSDX,0)) S BSDY=BSDX Q
+"RTN","BSDX34",66,0)
+ . I BSDX]"",$D(^BSDXRES("B",BSDX)) S BSDY=$O(^BSDXRES("B",BSDX,0)) Q
+"RTN","BSDX34",67,0)
+ . Q
+"RTN","BSDX34",68,0)
+ ;
+"RTN","BSDX34",69,0)
+ ;For each clinic in BSDXCLST $O through ^BSDXAPPT("ARSRC",ResourceIEN,FMDate,ApptIEN)
+"RTN","BSDX34",70,0)
+ ;
+"RTN","BSDX34",71,0)
+ S BSDXLIST=""
+"RTN","BSDX34",72,0)
+ F BSDXJ=1:1:$L(BSDXCLST,"|")-1 S BSDXCID=$P(BSDXCLST,"|",BSDXJ) D:+BSDXCID
+"RTN","BSDX34",73,0)
+ . S BSDXCLN=$G(^BSDXRES(BSDXCID,0)) S BSDXCLN=$P(BSDXCLN,U) Q:BSDXCLN=""
+"RTN","BSDX34",74,0)
+ . S BSDXSTRT=BSDXBEG F  S BSDXSTRT=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT)) Q:'+BSDXSTRT  Q:BSDXSTRT>BSDXEND  D
+"RTN","BSDX34",75,0)
+ . . S BSDXAID=0 F  S BSDXAID=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT,BSDXAID)) Q:'+BSDXAID  D
+"RTN","BSDX34",76,0)
+ . . . S BSDXNOD=$G(^BSDXAPPT(BSDXAID,0))
+"RTN","BSDX34",77,0)
+ . . . I $D(BSDXCAN) D  Q
+"RTN","BSDX34",78,0)
+ . . . . I $P(BSDXNOD,U,12) S BSDXLIST=BSDXLIST_BSDXAID_"|" ;Cancelled appt
+"RTN","BSDX34",79,0)
+ . . . I $P(BSDXNOD,U,11) S BSDXLIST=BSDXLIST_BSDXAID_"|" ;Rebooked appt
+"RTN","BSDX34",80,0)
+ D RBLETT(.BSDXY,BSDXLIST)
+"RTN","BSDX34",81,0)
+ Q
+"RTN","BSDX34",82,0)
+ ;
+"RTN","BSDX34",83,0)
+RBLETTD(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX34",84,0)
+ ;Entry point for debugging
+"RTN","BSDX34",85,0)
+ ;
+"RTN","BSDX34",86,0)
+ ;D DEBUG^%Serenji("RBLETT^BSDX34(.BSDXY,BSDXLIST)")
+"RTN","BSDX34",87,0)
+ Q
+"RTN","BSDX34",88,0)
+ ;
+"RTN","BSDX34",89,0)
+RBLETT(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX34",90,0)
+ ;Return recordset of patient appointments used in listing
+"RTN","BSDX34",91,0)
+ ;REBOOKED appointments for a list of appointmentIDs.
+"RTN","BSDX34",92,0)
+ ;Called by rpc BSDX REBOOK LIST
+"RTN","BSDX34",93,0)
+ ;BSDXLIST is a |-delimited list of BSDX APPOINTMENT iens (the last |-piece is null)
+"RTN","BSDX34",94,0)
+ ;
+"RTN","BSDX34",95,0)
+ N BSDXI,BSDXIEN,BSDXNOD,BSDXCNID,BSDXCNOD,BSDXMADE,BSDXCLRK,BSDXNOT,BSDXQ,BSDX
+"RTN","BSDX34",96,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX34",97,0)
+ S BSDXI=0
+"RTN","BSDX34",98,0)
+ S ^BSDXTMP($J,BSDXI)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030NewApptDate^T00030Clinic^T00030TypeStatus"
+"RTN","BSDX34",99,0)
+ S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE^D00030OldApptDate"_$C(30)
+"RTN","BSDX34",100,0)
+ S X="ERROR^BSDX34",@^%ZOSF("TRAP")
+"RTN","BSDX34",101,0)
+ ;
+"RTN","BSDX34",102,0)
+ ;Iterate through BSDXLIST
+"RTN","BSDX34",103,0)
+ S BSDXIEN=0
+"RTN","BSDX34",104,0)
+ F BSDX=1:1:$L(BSDXLIST,"|")-1 S BSDXIEN=$P(BSDXLIST,"|",BSDX) D
+"RTN","BSDX34",105,0)
+ . N BSDXNOD,BSDXAPT,BSDXCID,BSDXCNOD,BSDXCLN,BSDX44,BSDXDNOD,BSDXSTAT,BSDX,BSDXTYPE,BSDXLIN,BSDXPAT
+"RTN","BSDX34",106,0)
+ . N BSDXSTRE,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+"RTN","BSDX34",107,0)
+ . N BSDXNAM,BSDXDOB,BSDXHRN,BSDXSEX
+"RTN","BSDX34",108,0)
+ . N BSDXREBK
+"RTN","BSDX34",109,0)
+ . S BSDXNOD=$G(^BSDXAPPT(BSDXIEN,0))
+"RTN","BSDX34",110,0)
+ . Q:BSDXNOD=""
+"RTN","BSDX34",111,0)
+ . S BSDXPAT=$P(BSDXNOD,U,5) ;PATIENT ien
+"RTN","BSDX34",112,0)
+ . Q:'+BSDXPAT
+"RTN","BSDX34",113,0)
+ . Q:'$D(^DPT(BSDXPAT))
+"RTN","BSDX34",114,0)
+ . D PINFO(BSDXPAT)
+"RTN","BSDX34",115,0)
+ . S Y=$P(BSDXNOD,U)
+"RTN","BSDX34",116,0)
+ . Q:'+Y
+"RTN","BSDX34",117,0)
+ . X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX34",118,0)
+ . S BSDXAPT=Y ;Appointment date time
+"RTN","BSDX34",119,0)
+ . S BSDXREBK=""
+"RTN","BSDX34",120,0)
+ . S Y=$P(BSDXNOD,U,11)
+"RTN","BSDX34",121,0)
+ . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ") S BSDXREBK=Y ;Rebook date time
+"RTN","BSDX34",122,0)
+ . S BSDXCLRK=$P(BSDXNOD,U,8) ;Appointment made by
+"RTN","BSDX34",123,0)
+ . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+"RTN","BSDX34",124,0)
+ . S Y=$P(BSDXNOD,U,9) ;Date Appointment Made
+"RTN","BSDX34",125,0)
+ . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+"RTN","BSDX34",126,0)
+ . S BSDXMADE=Y
+"RTN","BSDX34",127,0)
+ . ;NOTE
+"RTN","BSDX34",128,0)
+ . S BSDXNOT=""
+"RTN","BSDX34",129,0)
+ . I $D(^BSDXAPPT(BSDXIEN,1,0)) S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXIEN,1,BSDXQ)) Q:'+BSDXQ  D
+"RTN","BSDX34",130,0)
+ . . S BSDXLIN=$G(^BSDXAPPT(BSDXIEN,1,BSDXQ,0))
+"RTN","BSDX34",131,0)
+ . . S:(BSDXLIN'="")&($E(BSDXLIN,$L(BSDXLIN)-1,$L(BSDXLIN))'=" ") BSDXLIN=BSDXLIN_" "
+"RTN","BSDX34",132,0)
+ . . S BSDXNOT=BSDXNOT_BSDXLIN
+"RTN","BSDX34",133,0)
+ . ;Resource
+"RTN","BSDX34",134,0)
+ . S BSDXCID=$P(BSDXNOD,U,7) ;IEN of BSDX RESOURCE
+"RTN","BSDX34",135,0)
+ . Q:'+BSDXCID
+"RTN","BSDX34",136,0)
+ . Q:'$D(^BSDXRES(BSDXCID,0))
+"RTN","BSDX34",137,0)
+ . S BSDXCNOD=$G(^BSDXRES(BSDXCID,0)) ;BSDX RESOURCE node
+"RTN","BSDX34",138,0)
+ . Q:BSDXCNOD=""
+"RTN","BSDX34",139,0)
+ . S BSDXCLN=$P(BSDXCNOD,U) ;Text name of BSDX Resource
+"RTN","BSDX34",140,0)
+ . S BSDXTYPE="" ;Unused in this recordset
+"RTN","BSDX34",141,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX34",142,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXREBK_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_BSDXCID_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_"^"_BSDXAPT_$C(30)
+"RTN","BSDX34",143,0)
+ . Q
+"RTN","BSDX34",144,0)
+ ;
+"RTN","BSDX34",145,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX34",146,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX34",147,0)
+ Q
+"RTN","BSDX34",148,0)
+ ;
+"RTN","BSDX34",149,0)
+PINFO(BSDXPAT) ;
+"RTN","BSDX34",150,0)
+ ;Get patient info
+"RTN","BSDX34",151,0)
+ N BSDXNOD
+"RTN","BSDX34",152,0)
+ S BSDXNOD=$$PATINFO^BSDX27(BSDXPAT)
+"RTN","BSDX34",153,0)
+ S BSDXNAM=$P(BSDXNOD,U) ;NAME
+"RTN","BSDX34",154,0)
+ S BSDXSEX=$P(BSDXNOD,U,2) ;SEX
+"RTN","BSDX34",155,0)
+ S BSDXDOB=$P(BSDXNOD,U,3) ;DOB
+"RTN","BSDX34",156,0)
+ S BSDXHRN=$P(BSDXNOD,U,4) ;Health Record Number for location DUZ(2)
+"RTN","BSDX34",157,0)
+ S BSDXSTRE=$P(BSDXNOD,U,5) ;Street
+"RTN","BSDX34",158,0)
+ S BSDXCITY=$P(BSDXNOD,U,6) ;City
+"RTN","BSDX34",159,0)
+ S BSDXST=$P(BSDXNOD,U,7) ;State
+"RTN","BSDX34",160,0)
+ S BSDXZIP=$P(BSDXNOD,U,8) ;zip
+"RTN","BSDX34",161,0)
+ S BSDXPHON=$P(BSDXNOD,U,9) ;homephone
+"RTN","BSDX34",162,0)
+ Q
+"RTN","BSDX34",163,0)
+ ;
+"RTN","BSDX34",164,0)
+ERROR ;
+"RTN","BSDX34",165,0)
+ D ERR("RPMS Error")
+"RTN","BSDX34",166,0)
+ Q
+"RTN","BSDX34",167,0)
+ ;
+"RTN","BSDX34",168,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX34",169,0)
+ S:'$D(BSDXI) BSDXI=999
+"RTN","BSDX34",170,0)
+ I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX34",171,0)
+ E  S BSDXERR=ERRNO
+"RTN","BSDX34",172,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX34",173,0)
+ S ^BSDXTMP($J,BSDXI)="^^^^^^^^^^^^^^^^"_$C(30)
+"RTN","BSDX34",174,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX34",175,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX34",176,0)
+ Q
+"RTN","BSDX35")
+0^33^B8147998
+"RTN","BSDX35",1,0)
+BSDX35 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+"RTN","BSDX35",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDX35",3,0)
+ ;
+"RTN","BSDX35",4,0)
+ ;
+"RTN","BSDX35",5,0)
+ Q
+"RTN","BSDX35",6,0)
+ ;
+"RTN","BSDX35",7,0)
+RSRCLTRD(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX35",8,0)
+ ;Entry point for debugging
+"RTN","BSDX35",9,0)
+ ;
+"RTN","BSDX35",10,0)
+ ;D DEBUG^%Serenji("RSRCLTR^BSDX35(.BSDXY,BSDXLIST)")
+"RTN","BSDX35",11,0)
+ Q
+"RTN","BSDX35",12,0)
+ ;
+"RTN","BSDX35",13,0)
+RSRCLTR(BSDXY,BSDXLIST) ;EP
+"RTN","BSDX35",14,0)
+ ;
+"RTN","BSDX35",15,0)
+ ;Return recordset of RESOURCES and associated LETTERS
+"RTN","BSDX35",16,0)
+ ;Used in generating rebook letters for a clinic
+"RTN","BSDX35",17,0)
+ ;BSDXLIST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+"RTN","BSDX35",18,0)
+ ;Called by BSDX RESOURCE LETTERS
+"RTN","BSDX35",19,0)
+ ;
+"RTN","BSDX35",20,0)
+ ;
+"RTN","BSDX35",21,0)
+ S X="ERROR^BSDX35",@^%ZOSF("TRAP")
+"RTN","BSDX35",22,0)
+ S BSDXY="^BSDXTMP("_$J_")"
+"RTN","BSDX35",23,0)
+ N BSDXIEN,BSDX,BSDXLTR,BSDXNOS,BSDXCAN,BSDXIEN1
+"RTN","BSDX35",24,0)
+ S BSDXI=0
+"RTN","BSDX35",25,0)
+ S ^BSDXTMP($J,BSDXI)="I00010RESOURCEID^T00030RESOURCE_NAME^T00030LETTER_TEXT^T00030NO_SHOW_LETTER^T00030CLINIC_CANCELLATION_LETTER"_$C(30)
+"RTN","BSDX35",26,0)
+ ;
+"RTN","BSDX35",27,0)
+ ;
+"RTN","BSDX35",28,0)
+ ;If BSDXLIST is a list of resource NAMES, look up each name and convert to IEN
+"RTN","BSDX35",29,0)
+ F BSDXJ=1:1:$L(BSDXLIST,"|")-1 S BSDX=$P(BSDXLIST,"|",BSDXJ) D  S $P(BSDXLIST,"|",BSDXJ)=BSDY
+"RTN","BSDX35",30,0)
+ . S BSDY=""
+"RTN","BSDX35",31,0)
+ . I BSDX]"",$D(^BSDXRES(BSDX,0)) S BSDY=BSDX Q
+"RTN","BSDX35",32,0)
+ . I BSDX]"",$D(^BSDXRES("B",BSDX)) S BSDY=$O(^BSDXRES("B",BSDX,0)) Q
+"RTN","BSDX35",33,0)
+ . Q
+"RTN","BSDX35",34,0)
+ ;
+"RTN","BSDX35",35,0)
+ ;Get letter text from wp fields
+"RTN","BSDX35",36,0)
+ S BSDXIEN=0
+"RTN","BSDX35",37,0)
+ F BSDX=1:1:$L(BSDXLIST,"|")-1 S BSDXIEN=$P(BSDXLIST,"|",BSDX) D
+"RTN","BSDX35",38,0)
+ . Q:'$D(^BSDXRES(BSDXIEN))
+"RTN","BSDX35",39,0)
+ . S BSDXNAM=$P(^BSDXRES(BSDXIEN,0),U)
+"RTN","BSDX35",40,0)
+ . S BSDXLTR=""
+"RTN","BSDX35",41,0)
+ . I $D(^BSDXRES(BSDXIEN,1)) D
+"RTN","BSDX35",42,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXRES(BSDXIEN,1,BSDXIEN1)) Q:'+BSDXIEN1  D
+"RTN","BSDX35",43,0)
+ . . . S BSDXLTR=BSDXLTR_$G(^BSDXRES(BSDXIEN,1,BSDXIEN1,0))
+"RTN","BSDX35",44,0)
+ . . . S BSDXLTR=BSDXLTR_$C(13)_$C(10)
+"RTN","BSDX35",45,0)
+ . S BSDXNOS=""
+"RTN","BSDX35",46,0)
+ . I $D(^BSDXRES(BSDXIEN,12)) D
+"RTN","BSDX35",47,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXRES(BSDXIEN,12,BSDXIEN1)) Q:'+BSDXIEN1  D
+"RTN","BSDX35",48,0)
+ . . . S BSDXNOS=BSDXNOS_$G(^BSDXRES(BSDXIEN,12,BSDXIEN1,0))
+"RTN","BSDX35",49,0)
+ . . . S BSDXNOS=BSDXNOS_$C(13)_$C(10)
+"RTN","BSDX35",50,0)
+ . S BSDXCAN=""
+"RTN","BSDX35",51,0)
+ . I $D(^BSDXRES(BSDXIEN,13)) D
+"RTN","BSDX35",52,0)
+ . . S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXRES(BSDXIEN,13,BSDXIEN1)) Q:'+BSDXIEN1  D
+"RTN","BSDX35",53,0)
+ . . . S BSDXCAN=BSDXCAN_$G(^BSDXRES(BSDXIEN,13,BSDXIEN1,0))
+"RTN","BSDX35",54,0)
+ . . . S BSDXCAN=BSDXCAN_$C(13)_$C(10)
+"RTN","BSDX35",55,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDX35",56,0)
+ . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXNAM_U_BSDXLTR_U_BSDXNOS_U_BSDXCAN_$C(30)
+"RTN","BSDX35",57,0)
+ ;
+"RTN","BSDX35",58,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX35",59,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX35",60,0)
+ Q
+"RTN","BSDX35",61,0)
+ ;
+"RTN","BSDX35",62,0)
+ERROR ;
+"RTN","BSDX35",63,0)
+ D ERR("RPMS Error")
+"RTN","BSDX35",64,0)
+ Q
+"RTN","BSDX35",65,0)
+ ;
+"RTN","BSDX35",66,0)
+ERR(ERRNO) ;Error processing
+"RTN","BSDX35",67,0)
+ S:'$D(BSDXI) BSDXI=999
+"RTN","BSDX35",68,0)
+ I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+"RTN","BSDX35",69,0)
+ E  S BSDXERR=ERRNO
+"RTN","BSDX35",70,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX35",71,0)
+ S ^BSDXTMP($J,BSDXI)="^^^^"_$C(30)
+"RTN","BSDX35",72,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDX35",73,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDX35",74,0)
+ Q
+"RTN","BSDXAPI")
+0^35^B148584022
+"RTN","BSDXAPI",1,0)
+BSDXAPI ; IHS/ANMC/LJF - SCHEDULING APIs ; 1/26/11 11:47am
+"RTN","BSDXAPI",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDXAPI",3,0)
+ ;Orignal routine is BSDAPI by IHS/LJF, HMW, and MAW
+"RTN","BSDXAPI",4,0)
+ ;local mods (many) by WV/SMH
+"RTN","BSDXAPI",5,0)
+ ;Move to BSDX namespace as BSDXAPI from BSDAPI by WV/SMH
+"RTN","BSDXAPI",6,0)
+ ; Change History:
+"RTN","BSDXAPI",7,0)
+ ; 2010-11-5: (1.42)
+"RTN","BSDXAPI",8,0)
+ ; - Fixed errors having to do uncanceling patient appointments if it was a patient cancelled appointment.
+"RTN","BSDXAPI",9,0)
+ ; - Use new style Fileman API for storing appointments in file 44 in $$MAKE due to problems with legacy API.
+"RTN","BSDXAPI",10,0)
+ ; 2010-11-12: (1.42)
+"RTN","BSDXAPI",11,0)
+ ; - Changed ="C" to ["C" in SCIEN. Cancelled appointments can be "PC" as well. 
+"RTN","BSDXAPI",12,0)
+ ; 2010-12-5 (1.42)
+"RTN","BSDXAPI",13,0)
+ ; Added an entry point to update the patient note in file 44.
+"RTN","BSDXAPI",14,0)
+ ; 2010-12-6 (1.42)
+"RTN","BSDXAPI",15,0)
+ ; MAKE1 incorrectly put info field in BSDR("INFO") rather than BSDR("OI")
+"RTN","BSDXAPI",16,0)
+ ; 2010-12-8 (1.42)
+"RTN","BSDXAPI",17,0)
+ ; Removed restriction on max appt length. Even though this restriction
+"RTN","BSDXAPI",18,0)
+ ; exists in fileman (120 minutes), PIMS ignores it. Therefore, I 
+"RTN","BSDXAPI",19,0)
+ ; will ignore it here too.
+"RTN","BSDXAPI",20,0)
+ ; 2011-01-25 (v.1.5)
+"RTN","BSDXAPI",21,0)
+ ; Added entry point $$RMCI to remove checked in appointments.
+"RTN","BSDXAPI",22,0)
+ ; In $$CANCEL, if the appointment is checked in, delete check-in rather than
+"RTN","BSDXAPI",23,0)
+ ;  spitting an error message to the user saying 'Delete the check-in'
+"RTN","BSDXAPI",24,0)
+ ; Changed all lines that look like this:
+"RTN","BSDXAPI",25,0)
+ ;  I $G(BSDR("ADT"))'?7N1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",26,0)
+ ; to:
+"RTN","BSDXAPI",27,0)
+ ;  I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",28,0)
+ ; to allow for date at midnight which does not have a dot at the end.
+"RTN","BSDXAPI",29,0)
+ ; 2011-01-26 (v.1.5)
+"RTN","BSDXAPI",30,0)
+ ; More user friendly message if patient already has appointment in $$MAKE:
+"RTN","BSDXAPI",31,0)
+ ;  Spits out pt name and user friendly date.
+"RTN","BSDXAPI",32,0)
+ ;  
+"RTN","BSDXAPI",33,0)
+ ;
+"RTN","BSDXAPI",34,0)
+MAKE1(DFN,CLIN,TYP,DATE,LEN,INFO) ; Simplified PEP w/ parameters for $$MAKE - making appointment
+"RTN","BSDXAPI",35,0)
+ ; Call like this for DFN 23435 having an appointment at Hospital Location 33
+"RTN","BSDXAPI",36,0)
+ ; have 3 (scheduled) or 4 (walkin) appt at Dec 20, 2009 @ 10:11:59 for 30 minutes appt
+"RTN","BSDXAPI",37,0)
+ ; for Baby foxes hallucinations.
+"RTN","BSDXAPI",38,0)
+ ; S RESULT=$$MAKE1^BSDXAPI(23435,33,(3 or 4),3091220.221159,30,"I see Baby foxes")
+"RTN","BSDXAPI",39,0)
+ S BSDR("PAT")=DFN       ;DFN
+"RTN","BSDXAPI",40,0)
+ S BSDR("CLN")=CLIN      ;Hosp Loc IEN
+"RTN","BSDXAPI",41,0)
+ S BSDR("TYP")=TYP       ;3 sched or 4 walkin
+"RTN","BSDXAPI",42,0)
+ S BSDR("ADT")=DATE      ;Appointment date in FM format
+"RTN","BSDXAPI",43,0)
+ S BSDR("LEN")=LEN       ;Appt len upto 240 (min)
+"RTN","BSDXAPI",44,0)
+ S BSDR("OI")=INFO     ;Reason for appt - up to 150 char
+"RTN","BSDXAPI",45,0)
+ S BSDR("USR")=DUZ       ;Person who made appt - current user
+"RTN","BSDXAPI",46,0)
+ Q $$MAKE(.BSDR)
+"RTN","BSDXAPI",47,0)
+ ;
+"RTN","BSDXAPI",48,0)
+MAKE(BSDR) ;PEP; call to store appt made
+"RTN","BSDXAPI",49,0)
+ ;
+"RTN","BSDXAPI",50,0)
+ ; Make call using: S ERR=$$MAKE^BSDXAPI(.ARRAY)
+"RTN","BSDXAPI",51,0)
+ ;
+"RTN","BSDXAPI",52,0)
+ ; Input Array -
+"RTN","BSDXAPI",53,0)
+ ; BSDR("PAT") = ien of patient in file 2
+"RTN","BSDXAPI",54,0)
+ ; BSDR("CLN") = ien of clinic in file 44
+"RTN","BSDXAPI",55,0)
+ ; BSDR("TYP") = 3 for scheduled appts, 4 for walkins
+"RTN","BSDXAPI",56,0)
+ ; BSDR("ADT") = appointment date and time
+"RTN","BSDXAPI",57,0)
+ ; BSDR("LEN") = appointment length in minutes (*1.42 limit removed)
+"RTN","BSDXAPI",58,0)
+ ; BSDR("OI")  = reason for appt - up to 150 characters
+"RTN","BSDXAPI",59,0)
+ ; BSDR("USR") = user who made appt
+"RTN","BSDXAPI",60,0)
+ ;
+"RTN","BSDXAPI",61,0)
+ ;Output: error status and message
+"RTN","BSDXAPI",62,0)
+ ;   = 0 or null:  everything okay
+"RTN","BSDXAPI",63,0)
+ ;   = 1^message:  error and reason
+"RTN","BSDXAPI",64,0)
+ ;
+"RTN","BSDXAPI",65,0)
+ I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT"))
+"RTN","BSDXAPI",66,0)
+ I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN"))
+"RTN","BSDXAPI",67,0)
+ I ($G(BSDR("TYP"))<3)!($G(BSDR("TYP"))>4) Q 1_U_"Appt Type error: "_$G(BSDR("TYP"))
+"RTN","BSDXAPI",68,0)
+ I $G(BSDR("ADT")) S BSDR("ADT")=+$E(BSDR("ADT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",69,0)
+ I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",70,0)
+ ;
+"RTN","BSDXAPI",71,0)
+ ;I ($G(BSDR("LEN"))<5)!($G(BSDR("LEN"))>240) Q 1_U_"Appt Length error: "_$G(BSDR("LEN")) ; v 1.42 - no check on length is done anymore. see top comments for details.
+"RTN","BSDXAPI",72,0)
+ I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Made Appt Error: "_$G(BSDR("USR"))
+"RTN","BSDXAPI",73,0)
+ ;I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)'["C" Q 1_U_"Patient "_BSDR("PAT")_" already has appt at "_BSDR("ADT") ; v.1.5 more user friendly err msg
+"RTN","BSDXAPI",74,0)
+ ;
+"RTN","BSDXAPI",75,0)
+ ; Following block to give an error message to user if there is already an appointment for patient. More verbose than others.
+"RTN","BSDXAPI",76,0)
+ N BSDXERR ; place to store error message
+"RTN","BSDXAPI",77,0)
+ I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)'["C" DO  QUIT BSDXERR  ; If there's an appt in the "S" node of file 2 and it's not cancelled
+"RTN","BSDXAPI",78,0)
+ . S BSDXERR=1_U_"Patient "_$P(^DPT(BSDR("PAT"),0),U)_" ("_BSDR("PAT")_") "
+"RTN","BSDXAPI",79,0)
+ . S BSDXERR=BSDXERR_"already has appt at "_$$FMTE^XLFDT(BSDR("ADT"))
+"RTN","BSDXAPI",80,0)
+ . N BSDXSCIEN S BSDXSCIEN=$P(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0),U)  ; Clinic IEN in ^SC (0 piece of 0 node of "S" multiple in file 2)
+"RTN","BSDXAPI",81,0)
+ . N BSDXSCNAM S BSDXSCNAM=$P(^SC(BSDXSCIEN,0),U) ; PIMS Name of Clinic
+"RTN","BSDXAPI",82,0)
+ . S BSDXERR=BSDXERR_$C(13,10)_"PIMS clinic: "_BSDXSCNAM ; tell the user of the PIMS clinic
+"RTN","BSDXAPI",83,0)
+ . I $D(^BSDXRES("ALOC",BSDXSCIEN)) DO  ; if the Clinic is linked to a BSDX Resource (we find out using the index ALOC in the BSDX RESOURCE file)
+"RTN","BSDXAPI",84,0)
+ . . N BSDXRESIEN S BSDXRESIEN=$O(^BSDXRES("ALOC",BSDXSCIEN,""))
+"RTN","BSDXAPI",85,0)
+ . . QUIT:'BSDXRESIEN  ; Safeguard if index is corrupt
+"RTN","BSDXAPI",86,0)
+ . . N BSDXRESNAM S BSDXRESNAM=$P(^BSDXRES(BSDXRESIEN,0),U)
+"RTN","BSDXAPI",87,0)
+ . . S BSDXERR=BSDXERR_$C(13,10)_"Scheduling GUI clinic: "_BSDXRESNAM ; tell the user of the BSDX clinic
+"RTN","BSDXAPI",88,0)
+ ;
+"RTN","BSDXAPI",89,0)
+ NEW DIC,DA,Y,X,DD,DO,DLAYGO
+"RTN","BSDXAPI",90,0)
+ ;
+"RTN","BSDXAPI",91,0)
+ I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)["C" D
+"RTN","BSDXAPI",92,0)
+ . ; "un-cancel" existing appt in file 2
+"RTN","BSDXAPI",93,0)
+ . N BSDXFDA,BSDXIENS,BSDXMSG
+"RTN","BSDXAPI",94,0)
+ . S BSDXIENS=BSDR("ADT")_","_BSDR("PAT")_","
+"RTN","BSDXAPI",95,0)
+ . S BSDXFDA(2.98,BSDXIENS,".01")=BSDR("CLN")
+"RTN","BSDXAPI",96,0)
+ . S BSDXFDA(2.98,BSDXIENS,"3")=""
+"RTN","BSDXAPI",97,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9")=BSDR("TYP")
+"RTN","BSDXAPI",98,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9.5")=9
+"RTN","BSDXAPI",99,0)
+ . S BSDXFDA(2.98,BSDXIENS,"14")=""
+"RTN","BSDXAPI",100,0)
+ . S BSDXFDA(2.98,BSDXIENS,"15")=""
+"RTN","BSDXAPI",101,0)
+ . S BSDXFDA(2.98,BSDXIENS,"16")=""
+"RTN","BSDXAPI",102,0)
+ . S BSDXFDA(2.98,BSDXIENS,"19")=""
+"RTN","BSDXAPI",103,0)
+ . S BSDXFDA(2.98,BSDXIENS,"20")=$$NOW^XLFDT
+"RTN","BSDXAPI",104,0)
+ . D FILE^DIE("","BSDXFDA","BSDXMSG")
+"RTN","BSDXAPI",105,0)
+ . N BSDXTEMP S BSDXTEMP=$G(BSDXMSG)
+"RTN","BSDXAPI",106,0)
+ E  D  I $G(BSDXERR(1)) Q 1_U_"FileMan add to DPT error: Patient="_BSDR("PAT")_" Appt="_BSDR("ADT")  
+"RTN","BSDXAPI",107,0)
+ . N BSDXFDA,BSDXIENS,BSDXMSG
+"RTN","BSDXAPI",108,0)
+ . S BSDXIENS="?+2,"_BSDR("PAT")_","
+"RTN","BSDXAPI",109,0)
+ . S BSDXIENS(2)=BSDR("ADT")
+"RTN","BSDXAPI",110,0)
+ . S BSDXFDA(2.98,BSDXIENS,.01)=BSDR("CLN")
+"RTN","BSDXAPI",111,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9")=BSDR("TYP")
+"RTN","BSDXAPI",112,0)
+ . S BSDXFDA(2.98,BSDXIENS,"9.5")=9
+"RTN","BSDXAPI",113,0)
+ . S BSDXFDA(2.98,BSDXIENS,"20")=$$NOW^XLFDT
+"RTN","BSDXAPI",114,0)
+ . D UPDATE^DIE("","BSDXFDA","BSDXIENS","BSDXERR(1)")
+"RTN","BSDXAPI",115,0)
+ ; add appt to file 44
+"RTN","BSDXAPI",116,0)
+ K DIC,DA,X,Y,DLAYGO,DD,DO
+"RTN","BSDXAPI",117,0)
+ I '$D(^SC(BSDR("CLN"),"S",0)) S ^SC(BSDR("CLN"),"S",0)="^44.001DA^^"
+"RTN","BSDXAPI",118,0)
+ I '$D(^SC(BSDR("CLN"),"S",BSDR("ADT"),0)) D  I Y<1 Q 1_U_"Error adding date to file 44: Clinic="_BSDR("CLN")_" Date="_BSDR("ADT")
+"RTN","BSDXAPI",119,0)
+ . S DIC="^SC("_BSDR("CLN")_",""S"",",DA(1)=BSDR("CLN"),(X,DINUM)=BSDR("ADT")
+"RTN","BSDXAPI",120,0)
+ . S DIC("P")="44.001DA",DIC(0)="L",DLAYGO=44.001
+"RTN","BSDXAPI",121,0)
+ . S Y=1 I '$D(@(DIC_X_")")) D FILE^DICN
+"RTN","BSDXAPI",122,0)
+ ;
+"RTN","BSDXAPI",123,0)
+ ; Sep 28 2010: Changed old style API to new style API. Keep for reference //smh
+"RTN","BSDXAPI",124,0)
+ ;K DIC,DA,X,Y,DLAYGO,DD,DO,DINUM
+"RTN","BSDXAPI",125,0)
+ ;S DIC="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"
+"RTN","BSDXAPI",126,0)
+ ;S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),X=BSDR("PAT")
+"RTN","BSDXAPI",127,0)
+ ;S DIC("DR")="1///"_BSDR("LEN")_";3///"_$E($G(BSDR("OI")),1,150)_";7///`"_BSDR("USR")_";8///"_$P($$NOW^XLFDT,".")
+"RTN","BSDXAPI",128,0)
+ ;S DIC("P")="44.003PA",DIC(0)="L",DLAYGO=44.003
+"RTN","BSDXAPI",129,0)
+ ;D FILE^DICN
+"RTN","BSDXAPI",130,0)
+ ;
+"RTN","BSDXAPI",131,0)
+ N BSDXIENS S BSDXIENS="?+1,"_BSDR("ADT")_","_BSDR("CLN")_","
+"RTN","BSDXAPI",132,0)
+ N BSDXFDA
+"RTN","BSDXAPI",133,0)
+ S BSDXFDA(44.003,BSDXIENS,.01)=BSDR("PAT")
+"RTN","BSDXAPI",134,0)
+ S BSDXFDA(44.003,BSDXIENS,1)=BSDR("LEN")
+"RTN","BSDXAPI",135,0)
+ S BSDXFDA(44.003,BSDXIENS,3)=$E($G(BSDR("OI")),1,150)
+"RTN","BSDXAPI",136,0)
+ S BSDXFDA(44.003,BSDXIENS,7)=BSDR("USR")
+"RTN","BSDXAPI",137,0)
+ S BSDXFDA(44.003,BSDXIENS,8)=$P($$NOW^XLFDT,".")
+"RTN","BSDXAPI",138,0)
+ N BSDXERR
+"RTN","BSDXAPI",139,0)
+ D UPDATE^DIE("","BSDXFDA","","BSDXERR")
+"RTN","BSDXAPI",140,0)
+ ;
+"RTN","BSDXAPI",141,0)
+ I $D(BSDXERR) Q 1_U_"Error adding appt to file 44: Clinic="_BSDR("CLN")_" Date="_BSDR("ADT")_" Patient="_BSDR("PAT")_" Error: "_BSDXERR("DIERR",1,"TEXT",1)
+"RTN","BSDXAPI",142,0)
+ ;
+"RTN","BSDXAPI",143,0)
+ ; call event driver
+"RTN","BSDXAPI",144,0)
+ NEW DFN,SDT,SDCL,SDDA,SDMODE
+"RTN","BSDXAPI",145,0)
+ S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2
+"RTN","BSDXAPI",146,0)
+ S SDDA=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",147,0)
+ D MAKE^SDAMEVT(DFN,SDT,SDCL,SDDA,SDMODE)
+"RTN","BSDXAPI",148,0)
+ Q 0
+"RTN","BSDXAPI",149,0)
+ ;
+"RTN","BSDXAPI",150,0)
+CHECKIN1(DFN,CLIN,APDATE) ; Simplified PEP w/ parameters for $$CHECKIN - Checking in
+"RTN","BSDXAPI",151,0)
+ ; Call like this for DFN 23435 checking in now at Hospital Location 33
+"RTN","BSDXAPI",152,0)
+ ; for appt at Dec 20, 2009 @ 10:11:59 
+"RTN","BSDXAPI",153,0)
+ ; S RESULT=$$CHECKIN1^BSDXAPI(23435,33,3091220.221159)
+"RTN","BSDXAPI",154,0)
+ S BSDR("PAT")=DFN          ;DFN
+"RTN","BSDXAPI",155,0)
+ S BSDR("CLN")=CLIN         ;Hosp Loc IEN
+"RTN","BSDXAPI",156,0)
+ S BSDR("ADT")=APDATE       ;Appt Date
+"RTN","BSDXAPI",157,0)
+ S BSDR("CDT")=$$NOW^XLFDT  ;Check-in date defaults to now
+"RTN","BSDXAPI",158,0)
+ S BSDR("USR")=DUZ          ;Check-in user defaults to current
+"RTN","BSDXAPI",159,0)
+ Q $$CHECKIN(.BSDR)
+"RTN","BSDXAPI",160,0)
+ ;
+"RTN","BSDXAPI",161,0)
+CHECKIN(BSDR) ;EP; call to add checkin info to appt; IHS/ITSC/LJF 12/23/2004 PATCH 1002
+"RTN","BSDXAPI",162,0)
+ ;
+"RTN","BSDXAPI",163,0)
+ ; Make call by using:  S ERR=$$CHECKIN^BSDXAPI(.ARRAY)
+"RTN","BSDXAPI",164,0)
+ ;
+"RTN","BSDXAPI",165,0)
+ ; Input array -
+"RTN","BSDXAPI",166,0)
+ ;  BSDR("PAT") = ien of patient in file 2
+"RTN","BSDXAPI",167,0)
+ ;  BSDR("CLN") = ien of clinic in file 44
+"RTN","BSDXAPI",168,0)
+ ;  BSDR("ADT") = appt date/time
+"RTN","BSDXAPI",169,0)
+ ;  BSDR("CDT") = checkin date/time
+"RTN","BSDXAPI",170,0)
+ ;  BSDR("USR") = checkin user
+"RTN","BSDXAPI",171,0)
+ ;
+"RTN","BSDXAPI",172,0)
+ ; Output value -
+"RTN","BSDXAPI",173,0)
+ ;              = 0 means everything worked
+"RTN","BSDXAPI",174,0)
+ ;              = 1^message means error with reason message
+"RTN","BSDXAPI",175,0)
+ ;
+"RTN","BSDXAPI",176,0)
+ I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT"))
+"RTN","BSDXAPI",177,0)
+ I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN"))
+"RTN","BSDXAPI",178,0)
+ I $G(BSDR("ADT")) S BSDR("ADT")=+$E(BSDR("ADT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",179,0)
+ I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",180,0)
+ I $G(BSDR("CDT")) S BSDR("CDT")=+$E(BSDR("CDT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",181,0)
+ I $G(BSDR("CDT"))'?7N.1".".4N Q 1_U_"Checkin Date/Time error: "_$G(BSDR("CDT"))
+"RTN","BSDXAPI",182,0)
+ I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Made Appt Error: "_$G(BSDR("USR"))
+"RTN","BSDXAPI",183,0)
+ ;
+"RTN","BSDXAPI",184,0)
+ ; find ien for appt in file 44
+"RTN","BSDXAPI",185,0)
+ NEW IEN,DIE,DA,DR
+"RTN","BSDXAPI",186,0)
+ S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",187,0)
+ I 'IEN Q 1_U_"Error trying to find appointment for checkin: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT")
+"RTN","BSDXAPI",188,0)
+ ;
+"RTN","BSDXAPI",189,0)
+ ; remember before status
+"RTN","BSDXAPI",190,0)
+ NEW SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL
+"RTN","BSDXAPI",191,0)
+ S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2,SDDA=IEN
+"RTN","BSDXAPI",192,0)
+ S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",193,0)
+ D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+"RTN","BSDXAPI",194,0)
+ ;
+"RTN","BSDXAPI",195,0)
+ ; set checkin
+"RTN","BSDXAPI",196,0)
+ S DIE="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"
+"RTN","BSDXAPI",197,0)
+ S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),DA=IEN
+"RTN","BSDXAPI",198,0)
+ S DR="309///"_BSDR("CDT")_";302///`"_BSDR("USR")_";305///"_$$NOW^XLFDT
+"RTN","BSDXAPI",199,0)
+ D ^DIE
+"RTN","BSDXAPI",200,0)
+ ;
+"RTN","BSDXAPI",201,0)
+ ; set after status
+"RTN","BSDXAPI",202,0)
+ S SDDA=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",203,0)
+ S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",204,0)
+ D AFTER^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+"RTN","BSDXAPI",205,0)
+ ;
+"RTN","BSDXAPI",206,0)
+ ; call event driver
+"RTN","BSDXAPI",207,0)
+ D EVT^SDAMEVT(.SDATA,4,SDMODE,SDCIHDL)
+"RTN","BSDXAPI",208,0)
+ Q 0
+"RTN","BSDXAPI",209,0)
+ ;
+"RTN","BSDXAPI",210,0)
+CANCEL1(DFN,CLIN,TYP,APDATE,REASON,INFO) ; PEP w/ parameters for $$CANCEL - cancelling appointment
+"RTN","BSDXAPI",211,0)
+ ; Call like this for DFN 23435 cancelling an appointment at Hospital Location 33,
+"RTN","BSDXAPI",212,0)
+ ; cancellation initiated by patient ("PC" rather than clinic "C"),
+"RTN","BSDXAPI",213,0)
+ ; cancelling appt at Dec 20, 2009 @ 10:11:59 because of reason 1 in file 409.2 IEN (weather)
+"RTN","BSDXAPI",214,0)
+ ; because foxes come out during bad weather.
+"RTN","BSDXAPI",215,0)
+ ; S RESULT=$$CANCEL1^BSDXAPI(23435,33,"PC",3091220.221159,1,"Afraid of foxes")
+"RTN","BSDXAPI",216,0)
+ S BSDR("PAT")=DFN
+"RTN","BSDXAPI",217,0)
+ S BSDR("CLN")=CLIN
+"RTN","BSDXAPI",218,0)
+ S BSDR("TYP")=TYP
+"RTN","BSDXAPI",219,0)
+ S BSDR("ADT")=APDATE
+"RTN","BSDXAPI",220,0)
+ S BSDR("CDT")=$$NOW^XLFDT
+"RTN","BSDXAPI",221,0)
+ S BSDR("USR")=DUZ
+"RTN","BSDXAPI",222,0)
+ S BSDR("CR")=REASON
+"RTN","BSDXAPI",223,0)
+ S BSDR("NOT")=INFO
+"RTN","BSDXAPI",224,0)
+ Q $$CANCEL(.BSDR)
+"RTN","BSDXAPI",225,0)
+ ;
+"RTN","BSDXAPI",226,0)
+CANCEL(BSDR) ;PEP; called to cancel appt
+"RTN","BSDXAPI",227,0)
+ ;
+"RTN","BSDXAPI",228,0)
+ ; Make call using: S ERR=$$CANCEL^BSDXAPI(.ARRAY)
+"RTN","BSDXAPI",229,0)
+ ;
+"RTN","BSDXAPI",230,0)
+ ; Input Array -
+"RTN","BSDXAPI",231,0)
+ ; BSDR("PAT") = ien of patient in file 2
+"RTN","BSDXAPI",232,0)
+ ; BSDR("CLN") = ien of clinic in file 44
+"RTN","BSDXAPI",233,0)
+ ; BSDR("TYP") = C for canceled by clinic; PC for patient canceled
+"RTN","BSDXAPI",234,0)
+ ; BSDR("ADT") = appointment date and time
+"RTN","BSDXAPI",235,0)
+ ; BSDR("CDT") = cancel date and time
+"RTN","BSDXAPI",236,0)
+ ; BSDR("USR") = user who canceled appt
+"RTN","BSDXAPI",237,0)
+ ; BSDR("CR")  = cancel reason - pointer to file 409.2
+"RTN","BSDXAPI",238,0)
+ ; BSDR("NOT") = cancel remarks - optional notes to 160 characters
+"RTN","BSDXAPI",239,0)
+ ;
+"RTN","BSDXAPI",240,0)
+ ;Output: error status and message
+"RTN","BSDXAPI",241,0)
+ ;   = 0 or null:  everything okay
+"RTN","BSDXAPI",242,0)
+ ;   = 1^message:  error and reason
+"RTN","BSDXAPI",243,0)
+ ;
+"RTN","BSDXAPI",244,0)
+ I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT"))
+"RTN","BSDXAPI",245,0)
+ I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN"))
+"RTN","BSDXAPI",246,0)
+ I ($G(BSDR("TYP"))'="C"),($G(BSDR("TYP"))'="PC") Q 1_U_"Cancel Status error: "_$G(BSDR("TYP"))
+"RTN","BSDXAPI",247,0)
+ I $G(BSDR("ADT")) S BSDR("ADT")=+$E(BSDR("ADT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",248,0)
+ I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+"RTN","BSDXAPI",249,0)
+ I $G(BSDR("CDT")) S BSDR("CDT")=+$E(BSDR("CDT"),1,12)  ;remove seconds
+"RTN","BSDXAPI",250,0)
+ I $G(BSDR("CDT"))'?7N.1".".4N Q 1_U_"Cancel Date/Time error: "_$G(BSDR("CDT"))
+"RTN","BSDXAPI",251,0)
+ I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Canceled Appt Error: "_$G(BSDR("USR"))
+"RTN","BSDXAPI",252,0)
+ I '$D(^SD(409.2,+$G(BSDR("CR")))) Q 1_U_"Cancel Reason error: "_$G(BSDR("CR"))
+"RTN","BSDXAPI",253,0)
+ ;
+"RTN","BSDXAPI",254,0)
+ NEW IEN,DIE,DA,DR
+"RTN","BSDXAPI",255,0)
+ S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",256,0)
+ I 'IEN Q 1_U_"Error trying to find appointment for cancel: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT")
+"RTN","BSDXAPI",257,0)
+ ;
+"RTN","BSDXAPI",258,0)
+ ; BSDX 1.5 3110125
+"RTN","BSDXAPI",259,0)
+ ; UJO/SMH - Add ability to remove check-in if the patient is checked in
+"RTN","BSDXAPI",260,0)
+ ; I $$CI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"),IEN) Q 1_U_"Patient already checked in; cannot cancel until checkin deleted: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT")
+"RTN","BSDXAPI",261,0)
+ ; Remove check-in if the patient is checked in.
+"RTN","BSDXAPI",262,0)
+ N BSDXRESULT S BSDXRESULT=0 ; Result; should be zero if success; -1 + message if failure
+"RTN","BSDXAPI",263,0)
+ I $$CI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"),IEN) SET BSDXRESULT=$$RMCI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+"RTN","BSDXAPI",264,0)
+ I BSDXRESULT Q BSDXRESULT
+"RTN","BSDXAPI",265,0)
+ ;
+"RTN","BSDXAPI",266,0)
+ ; remember before status
+"RTN","BSDXAPI",267,0)
+ NEW SDATA,DFN,SDT,SDCL,SDDA,SDCPHDL
+"RTN","BSDXAPI",268,0)
+ S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2,SDDA=IEN
+"RTN","BSDXAPI",269,0)
+ S SDCPHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",270,0)
+ D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCPHDL)
+"RTN","BSDXAPI",271,0)
+ ;
+"RTN","BSDXAPI",272,0)
+ ; get user who made appt and date appt made from ^SC
+"RTN","BSDXAPI",273,0)
+ ;    because data in ^SC will be deleted
+"RTN","BSDXAPI",274,0)
+ NEW USER,DATE
+"RTN","BSDXAPI",275,0)
+ S USER=$P($G(^SC(SDCL,"S",SDT,1,IEN,0)),U,6)
+"RTN","BSDXAPI",276,0)
+ S DATE=$P($G(^SC(SDCL,"S",SDT,1,IEN,0)),U,7)
+"RTN","BSDXAPI",277,0)
+ ;
+"RTN","BSDXAPI",278,0)
+ ; update file 2 info
+"RTN","BSDXAPI",279,0)
+ NEW DIE,DA,DR
+"RTN","BSDXAPI",280,0)
+ S DIE="^DPT("_DFN_",""S"",",DA(1)=DFN,DA=SDT
+"RTN","BSDXAPI",281,0)
+ S DR="3///"_BSDR("TYP")_";14///`"_BSDR("USR")_";15///"_BSDR("CDT")_";16///`"_BSDR("CR")_";19///`"_USER_";20///"_DATE
+"RTN","BSDXAPI",282,0)
+ S:$G(BSDR("NOT"))]"" DR=DR_";17///"_$E(BSDR("NOT"),1,160)
+"RTN","BSDXAPI",283,0)
+ D ^DIE
+"RTN","BSDXAPI",284,0)
+ ;
+"RTN","BSDXAPI",285,0)
+ ; delete data in ^SC
+"RTN","BSDXAPI",286,0)
+ NEW DIK,DA
+"RTN","BSDXAPI",287,0)
+ S DIK="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"
+"RTN","BSDXAPI",288,0)
+ S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),DA=IEN
+"RTN","BSDXAPI",289,0)
+ D ^DIK
+"RTN","BSDXAPI",290,0)
+ ;
+"RTN","BSDXAPI",291,0)
+ ; call event driver
+"RTN","BSDXAPI",292,0)
+ D CANCEL^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDMODE,SDCPHDL)
+"RTN","BSDXAPI",293,0)
+ Q 0
+"RTN","BSDXAPI",294,0)
+ ;
+"RTN","BSDXAPI",295,0)
+CI(PAT,CLINIC,DATE,SDIEN) ;PEP; -- returns 1 if appt already checked-in
+"RTN","BSDXAPI",296,0)
+ NEW X
+"RTN","BSDXAPI",297,0)
+ S X=$G(SDIEN)   ;ien sent in call
+"RTN","BSDXAPI",298,0)
+ I 'X S X=$$SCIEN(PAT,CLINIC,DATE) I 'X Q 0
+"RTN","BSDXAPI",299,0)
+ S X=$P($G(^SC(CLINIC,"S",DATE,1,X,"C")),U)
+"RTN","BSDXAPI",300,0)
+ Q $S(X:1,1:0)
+"RTN","BSDXAPI",301,0)
+ ;
+"RTN","BSDXAPI",302,0)
+RMCI(PAT,CLINIC,DATE)  ;PEP; -- Remove Check-in; $$
+"RTN","BSDXAPI",303,0)
+ ; PAT = DFN
+"RTN","BSDXAPI",304,0)
+ ; CLINIC = SC IEN
+"RTN","BSDXAPI",305,0)
+ ; DATE = FM Date/Time of Appointment
+"RTN","BSDXAPI",306,0)
+ ;
+"RTN","BSDXAPI",307,0)
+ ; Returns:
+"RTN","BSDXAPI",308,0)
+ ; 0 if okay
+"RTN","BSDXAPI",309,0)
+ ; -1 if failure
+"RTN","BSDXAPI",310,0)
+ ;
+"RTN","BSDXAPI",311,0)
+ ; Call like this: $$RMCI(233,33,3110102.1130)
+"RTN","BSDXAPI",312,0)
+ ;
+"RTN","BSDXAPI",313,0)
+ ; Move my variables into the ones used by SDAPIs (just a convenience)
+"RTN","BSDXAPI",314,0)
+ NEW SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL
+"RTN","BSDXAPI",315,0)
+ S DFN=PAT,SDT=DATE,SDCL=CLINIC,SDMODE=2,SDDA=$$SCIEN(DFN,SDCL,SDT)
+"RTN","BSDXAPI",316,0)
+ ;
+"RTN","BSDXAPI",317,0)
+ I SDDA<1 QUIT 0    ; Appt cancelled; cancelled appts rm'ed from file 44
+"RTN","BSDXAPI",318,0)
+ ;
+"RTN","BSDXAPI",319,0)
+ ; remember before status
+"RTN","BSDXAPI",320,0)
+ S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",321,0)
+ D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+"RTN","BSDXAPI",322,0)
+ ;
+"RTN","BSDXAPI",323,0)
+ ; remove check-in using filer.
+"RTN","BSDXAPI",324,0)
+ N BSDXIENS S BSDXIENS=SDDA_","_DATE_","_CLINIC_","
+"RTN","BSDXAPI",325,0)
+ S BSDXFDA(44.003,BSDXIENS,309)="@"	; CHECKED-IN
+"RTN","BSDXAPI",326,0)
+ S BSDXFDA(44.003,BSDXIENS,302)="@"	; CHECK IN USER
+"RTN","BSDXAPI",327,0)
+ S BSDXFDA(44.003,BSDXIENS,305)="@"	; CHECK IN ENTERED
+"RTN","BSDXAPI",328,0)
+ N BSDXERR
+"RTN","BSDXAPI",329,0)
+ D FILE^DIE("","BSDXFDA","BSDXERR")
+"RTN","BSDXAPI",330,0)
+ I $D(BSDXERR) QUIT "-1~Can't file for Pat "_PAT_" in Clinic "_CLINIC_" at "_DATE_". Fileman reported an error: "_BSDXERR("DIERR",1,"TEXT",1)
+"RTN","BSDXAPI",331,0)
+ ;
+"RTN","BSDXAPI",332,0)
+ ; set after status
+"RTN","BSDXAPI",333,0)
+ S SDDA=$$SCIEN(DFN,SDCL,SDT)
+"RTN","BSDXAPI",334,0)
+ S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","BSDXAPI",335,0)
+ D AFTER^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+"RTN","BSDXAPI",336,0)
+ ;
+"RTN","BSDXAPI",337,0)
+ ; call event driver
+"RTN","BSDXAPI",338,0)
+ D EVT^SDAMEVT(.SDATA,4,SDMODE,SDCIHDL)
+"RTN","BSDXAPI",339,0)
+ QUIT 0
+"RTN","BSDXAPI",340,0)
+ ;
+"RTN","BSDXAPI",341,0)
+SCIEN(PAT,CLINIC,DATE) ;PEP; returns ien for appt in ^SC
+"RTN","BSDXAPI",342,0)
+ NEW X,IEN
+"RTN","BSDXAPI",343,0)
+ S X=0 F  S X=$O(^SC(CLINIC,"S",DATE,1,X)) Q:'X  Q:$G(IEN)  D
+"RTN","BSDXAPI",344,0)
+ . Q:$P($G(^SC(CLINIC,"S",DATE,1,X,0)),U,9)["C"  ;cancelled
+"RTN","BSDXAPI",345,0)
+  . I +$G(^SC(CLINIC,"S",DATE,1,X,0))=PAT S IEN=X
+"RTN","BSDXAPI",346,0)
+ Q $G(IEN)
+"RTN","BSDXAPI",347,0)
+ ;
+"RTN","BSDXAPI",348,0)
+APPTYP(PAT,DATE) ;PEP; -- returns type of appt (scheduled or walk-in)
+"RTN","BSDXAPI",349,0)
+ NEW X S X=$P($G(^DPT(PAT,"S",DATE,0)),U,7)
+"RTN","BSDXAPI",350,0)
+ Q $S(X=3:"SCHED",X=4:"WALK-IN",1:"??")
+"RTN","BSDXAPI",351,0)
+ ;
+"RTN","BSDXAPI",352,0)
+CO(PAT,CLINIC,DATE,SDIEN) ;PEP; -- returns 1 if appt already checked-out
+"RTN","BSDXAPI",353,0)
+ NEW X
+"RTN","BSDXAPI",354,0)
+ S X=$G(SDIEN)   ;ien sent in call
+"RTN","BSDXAPI",355,0)
+ I 'X S X=$$SCIEN(PAT,CLINIC,DATE) I 'X Q 0
+"RTN","BSDXAPI",356,0)
+ S X=$P($G(^SC(CLINIC,"S",DATE,1,X,"C")),U,3)
+"RTN","BSDXAPI",357,0)
+ Q $S(X:1,1:0)
+"RTN","BSDXAPI",358,0)
+ ;
+"RTN","BSDXAPI",359,0)
+UPDATENOTE(PAT,CLINIC,DATE,NOTE) ; PEP; Update Note in ^SC for patient's appointment @ DATE
+"RTN","BSDXAPI",360,0)
+ ; PAT = DFN
+"RTN","BSDXAPI",361,0)
+ ; CLINIC = SC IEN
+"RTN","BSDXAPI",362,0)
+ ; DATE = FM Date/Time of Appointment
+"RTN","BSDXAPI",363,0)
+ ;
+"RTN","BSDXAPI",364,0)
+ ; Returns:
+"RTN","BSDXAPI",365,0)
+ ; 0 if okay
+"RTN","BSDXAPI",366,0)
+ ; -1 if failure
+"RTN","BSDXAPI",367,0)
+ N SCIEN S SCIEN=$$SCIEN(PAT,CLINIC,DATE) ; ien of appt in ^SC
+"RTN","BSDXAPI",368,0)
+ I SCIEN<1 QUIT 0    ; Appt cancelled; cancelled appts rm'ed from file 44
+"RTN","BSDXAPI",369,0)
+ N BSDXIENS S BSDXIENS=SCIEN_","_DATE_","_CLINIC_","
+"RTN","BSDXAPI",370,0)
+ S BSDXFDA(44.003,BSDXIENS,3)=$E(NOTE,1,150)
+"RTN","BSDXAPI",371,0)
+ N BSDXERR
+"RTN","BSDXAPI",372,0)
+ D FILE^DIE("","BSDXFDA","BSDXERR")
+"RTN","BSDXAPI",373,0)
+ I $D(BSDXERR) QUIT "-1~Can't file for Pat "_PAT_" in Clinic "_CLINIC_" at "_DATE_". Fileman reported an error: "_BSDXERR("DIERR",1,"TEXT",1)
+"RTN","BSDXAPI",374,0)
+ QUIT 0
+"RTN","BSDXGPRV")
+0^36^B4804670
+"RTN","BSDXGPRV",1,0)
+BSDXGPRV ; WV/SMH - WINDOWS SCHEDULING RPCS ; 11/2/10 4:27pm
+"RTN","BSDXGPRV",2,0)
+ ;;1.5V3;BSDX;;Mar 16, 2011;Build 13
+"RTN","BSDXGPRV",3,0)
+ ;
+"RTN","BSDXGPRV",4,0)
+ ;
+"RTN","BSDXGPRV",5,0)
+ERROR ;
+"RTN","BSDXGPRV",6,0)
+ D ERR("RPMS Error")
+"RTN","BSDXGPRV",7,0)
+ Q
+"RTN","BSDXGPRV",8,0)
+ ;
+"RTN","BSDXGPRV",9,0)
+ERR(BSDXERR) ;Error processing
+"RTN","BSDXGPRV",10,0)
+ D ^%ZTER
+"RTN","BSDXGPRV",11,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",12,0)
+ S ^BSDXTMP($J,BSDXI)=BSDXERR
+"RTN","BSDXGPRV",13,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",14,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDXGPRV",15,0)
+ Q
+"RTN","BSDXGPRV",16,0)
+ ;
+"RTN","BSDXGPRV",17,0)
+PD(BSDXY,HLIEN) ;EP Debugging entry point
+"RTN","BSDXGPRV",18,0)
+ ;
+"RTN","BSDXGPRV",19,0)
+ D DEBUG^%Serenji("P^BSDXGPRV(.BSDXY,HLIEN)","192.168.254.130")
+"RTN","BSDXGPRV",20,0)
+ ;
+"RTN","BSDXGPRV",21,0)
+ Q
+"RTN","BSDXGPRV",22,0)
+ ;
+"RTN","BSDXGPRV",23,0)
+P(BSDXY,HLIEN) ; Public Entry point; Get Providers for Hosp Location
+"RTN","BSDXGPRV",24,0)
+ ; Input: HLIEN - Hospital Location IEN
+"RTN","BSDXGPRV",25,0)
+ ; Output: ADO Datatable with columns:
+"RTN","BSDXGPRV",26,0)
+ ; - HOSPITAL_LOCATION_ID, BMXIEN, PROV_NAME, DEFAULT
+"RTN","BSDXGPRV",27,0)
+ ; If there are providers in the PROVIDER multiple of file 44 
+"RTN","BSDXGPRV",28,0)
+ ; (Hospital Location) return them;
+"RTN","BSDXGPRV",29,0)
+ ; If no providers in PROVIDER multiple of file 44, return nothing
+"RTN","BSDXGPRV",30,0)
+ ; Called by BSDX HOSP LOC PROVIDERS
+"RTN","BSDXGPRV",31,0)
+ ;
+"RTN","BSDXGPRV",32,0)
+ S BSDXI=0
+"RTN","BSDXGPRV",33,0)
+ I '$D(^SC(HLIEN,0)) D ERR("HOSPITAL LOCATION NOT FOUND") QUIT
+"RTN","BSDXGPRV",34,0)
+ D ^XBKVAR 
+"RTN","BSDXGPRV",35,0)
+ N $ET S $ET="G ERROR^BSDXGPRV"
+"RTN","BSDXGPRV",36,0)
+ K ^BSDXTMP($J)
+"RTN","BSDXGPRV",37,0)
+ S BSDXY=$NA(^BSDXTMP($J))
+"RTN","BSDXGPRV",38,0)
+ S $P(^BSDXTMP($J,BSDXI),U,1)="I00020HOSPITAL_LOCATION_ID"
+"RTN","BSDXGPRV",39,0)
+ S $P(^BSDXTMP($J,BSDXI),U,2)="I00020BMXIEN"
+"RTN","BSDXGPRV",40,0)
+ S $P(^BSDXTMP($J,BSDXI),U,3)="T00030NAME"
+"RTN","BSDXGPRV",41,0)
+ S $P(^BSDXTMP($J,BSDXI),U,4)="T00005DEFAULT"
+"RTN","BSDXGPRV",42,0)
+ S ^BSDXTMP($J,BSDXI)=^BSDXTMP($J,BSDXI)_$C(30)
+"RTN","BSDXGPRV",43,0)
+ ;
+"RTN","BSDXGPRV",44,0)
+ N OUTPUT
+"RTN","BSDXGPRV",45,0)
+ D GETS^DIQ(44,HLIEN_",","2600*","IE","OUTPUT") ; Provider Multiple
+"RTN","BSDXGPRV",46,0)
+ ; No results
+"RTN","BSDXGPRV",47,0)
+ I '$D(OUTPUT) S ^BSDXTMP($J,BSDXI+1)=$C(31) QUIT
+"RTN","BSDXGPRV",48,0)
+ ; if results, get them
+"RTN","BSDXGPRV",49,0)
+ N I S I=""
+"RTN","BSDXGPRV",50,0)
+ F  S I=$O(OUTPUT(44.1,I)) Q:I=""  D
+"RTN","BSDXGPRV",51,0)
+ . S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",52,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,1)=HLIEN                  ; HL IEN
+"RTN","BSDXGPRV",53,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,2)=$P(OUTPUT(44.1,I,.01,"I"),",") ; PROV IEN
+"RTN","BSDXGPRV",54,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,3)=$E(OUTPUT(44.1,I,.01,"E"),1,30) ; PROV NAME
+"RTN","BSDXGPRV",55,0)
+ . S $P(^BSDXTMP($J,BSDXI),U,4)=OUTPUT(44.1,I,.02,"E") ; Default - YES, NO
+"RTN","BSDXGPRV",56,0)
+ . S ^BSDXTMP($J,BSDXI)=^BSDXTMP($J,BSDXI)_$C(30)
+"RTN","BSDXGPRV",57,0)
+ S BSDXI=BSDXI+1
+"RTN","BSDXGPRV",58,0)
+ S ^BSDXTMP($J,BSDXI)=$C(31)
+"RTN","BSDXGPRV",59,0)
+ QUIT
+"SEC","^DIC",9002018.1,9002018.1,0,"AUDIT")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"DD")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"DEL")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"LAYGO")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"RD")
+@
+"SEC","^DIC",9002018.1,9002018.1,0,"WR")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"AUDIT")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"DD")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"DEL")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"LAYGO")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"RD")
+@
+"SEC","^DIC",9002018.15,9002018.15,0,"WR")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"AUDIT")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"DD")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"DEL")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"LAYGO")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"RD")
+@
+"SEC","^DIC",9002018.2,9002018.2,0,"WR")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"AUDIT")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"DD")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"DEL")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"LAYGO")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"RD")
+@
+"SEC","^DIC",9002018.3,9002018.3,0,"WR")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"AUDIT")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"DD")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"DEL")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"LAYGO")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"RD")
+@
+"SEC","^DIC",9002018.35,9002018.35,0,"WR")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"AUDIT")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"DD")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"DEL")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"LAYGO")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"RD")
+@
+"SEC","^DIC",9002018.38,9002018.38,0,"WR")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"AUDIT")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"DD")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"DEL")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"LAYGO")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"RD")
+@
+"SEC","^DIC",9002018.39,9002018.39,0,"WR")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"AUDIT")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"DD")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"DEL")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"LAYGO")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"RD")
+@
+"SEC","^DIC",9002018.4,9002018.4,0,"WR")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"AUDIT")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"DD")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"DEL")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"LAYGO")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"RD")
+@
+"SEC","^DIC",9002018.5,9002018.5,0,"WR")
+@
+"VER")
+8.0^22.0
+"^DD",9002018.1,9002018.1,0)
+FIELD^^2001^8
+"^DD",9002018.1,9002018.1,0,"DT")
+3040820
+"^DD",9002018.1,9002018.1,0,"IX","ALOC",9002018.1,.04)
+
+"^DD",9002018.1,9002018.1,0,"IX","ASSOC",9002018.12001,.01)
+
+"^DD",9002018.1,9002018.1,0,"IX","B",9002018.1,.01)
+
+"^DD",9002018.1,9002018.1,0,"NM","BSDX RESOURCE")
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.15,.01)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.21,.01)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.25,.02)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.3,.01)
+
+"^DD",9002018.1,9002018.1,0,"PT",9002018.4,.07)
+
+"^DD",9002018.1,9002018.1,0,"VRPK")
+BSDX
+"^DD",9002018.1,9002018.1,.01,0)
+NAME^RF^^0;1^K:$L(X)>30!($L(X)<1)!'(X'?1P.E) X
+"^DD",9002018.1,9002018.1,.01,1,0)
+^.1
+"^DD",9002018.1,9002018.1,.01,1,1,0)
+9002018.1^B
+"^DD",9002018.1,9002018.1,.01,1,1,1)
+S ^BSDXRES("B",$E(X,1,30),DA)=""
+"^DD",9002018.1,9002018.1,.01,1,1,2)
+K ^BSDXRES("B",$E(X,1,30),DA)
+"^DD",9002018.1,9002018.1,.01,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.1,9002018.1,.01,"DT")
+3040719
+"^DD",9002018.1,9002018.1,.02,0)
+INACTIVE^S^1:YES;0:NO;^0;2^Q
+"^DD",9002018.1,9002018.1,.02,3)
+
+"^DD",9002018.1,9002018.1,.02,"DT")
+3030520
+"^DD",9002018.1,9002018.1,.03,0)
+TIME SCALE^S^5:5;10:10;15:15;20:20;30:30;60:60;^0;3^Q
+"^DD",9002018.1,9002018.1,.03,"DT")
+3040212
+"^DD",9002018.1,9002018.1,.04,0)
+HOSPITAL LOCATION^P44'^SC(^0;4^Q
+"^DD",9002018.1,9002018.1,.04,1,0)
+^.1
+"^DD",9002018.1,9002018.1,.04,1,1,0)
+9002018.1^ALOC
+"^DD",9002018.1,9002018.1,.04,1,1,1)
+S ^BSDXRES("ALOC",$E(X,1,30),DA)=""
+"^DD",9002018.1,9002018.1,.04,1,1,2)
+K ^BSDXRES("ALOC",$E(X,1,30),DA)
+"^DD",9002018.1,9002018.1,.04,1,1,"%D",0)
+^^1^1^3040915^
+"^DD",9002018.1,9002018.1,.04,1,1,"%D",1,0)
+Cross reference on hospital location.
+"^DD",9002018.1,9002018.1,.04,1,1,"DT")
+3040915
+"^DD",9002018.1,9002018.1,.04,"DT")
+3040915
+"^DD",9002018.1,9002018.1,1,0)
+LETTER TEXT^9002018.11^^1;0
+"^DD",9002018.1,9002018.1,1201,0)
+NO SHOW LETTER^9002018.11201^^12;0
+"^DD",9002018.1,9002018.1,1301,0)
+CLINIC CANCELLATION LETTER^9002018.11301^^13;0
+"^DD",9002018.1,9002018.1,2001,0)
+ASSOCIATED RPMS CLINICS^9002018.12001P^^20;0
+"^DD",9002018.1,9002018.11,0)
+LETTER TEXT SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.11,0,"DT")
+3040212
+"^DD",9002018.1,9002018.11,0,"NM","LETTER TEXT")
+
+"^DD",9002018.1,9002018.11,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.11,.01,0)
+LETTER TEXT^W^^0;1^Q
+"^DD",9002018.1,9002018.11,.01,3)
+Enter the text of reminder letters sent to patients with appointments with this resource.
+"^DD",9002018.1,9002018.11,.01,"DT")
+3040212
+"^DD",9002018.1,9002018.11201,0)
+NO SHOW LETTER SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.11201,0,"DT")
+3040613
+"^DD",9002018.1,9002018.11201,0,"NM","NO SHOW LETTER")
+
+"^DD",9002018.1,9002018.11201,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.11201,.01,0)
+NO SHOW LETTER^W^^0;1^Q
+"^DD",9002018.1,9002018.11201,.01,"DT")
+3040613
+"^DD",9002018.1,9002018.11301,0)
+CLINIC CANCELLATION LETTER SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.11301,0,"DT")
+3040613
+"^DD",9002018.1,9002018.11301,0,"NM","CLINIC CANCELLATION LETTER")
+
+"^DD",9002018.1,9002018.11301,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.11301,.01,0)
+CLINIC CANCELLATION LETTER^W^^0;1^Q
+"^DD",9002018.1,9002018.11301,.01,"DT")
+3040613
+"^DD",9002018.1,9002018.12001,0)
+ASSOCIATED RPMS CLINICS SUB-FIELD^^.01^1
+"^DD",9002018.1,9002018.12001,0,"DT")
+3040820
+"^DD",9002018.1,9002018.12001,0,"IX","B",9002018.12001,.01)
+
+"^DD",9002018.1,9002018.12001,0,"NM","ASSOCIATED RPMS CLINICS")
+
+"^DD",9002018.1,9002018.12001,0,"UP")
+9002018.1
+"^DD",9002018.1,9002018.12001,.01,0)
+ASSOCIATED RPMS CLINICS^MP44'^SC(^0;1^Q
+"^DD",9002018.1,9002018.12001,.01,1,0)
+^.1
+"^DD",9002018.1,9002018.12001,.01,1,1,0)
+9002018.12001^B
+"^DD",9002018.1,9002018.12001,.01,1,1,1)
+S ^BSDXRES(DA(1),20,"B",$E(X,1,30),DA)=""
+"^DD",9002018.1,9002018.12001,.01,1,1,2)
+K ^BSDXRES(DA(1),20,"B",$E(X,1,30),DA)
+"^DD",9002018.1,9002018.12001,.01,1,2,0)
+9002018.1^ASSOC
+"^DD",9002018.1,9002018.12001,.01,1,2,1)
+S ^BSDXRES("ASSOC",$E(X,1,30),DA(1),DA)=""
+"^DD",9002018.1,9002018.12001,.01,1,2,2)
+K ^BSDXRES("ASSOC",$E(X,1,30),DA(1),DA)
+"^DD",9002018.1,9002018.12001,.01,1,2,"%D",0)
+^^1^1^3040915^
+"^DD",9002018.1,9002018.12001,.01,1,2,"%D",1,0)
+Cross reference on ASSOCIATED RPMS CLINICS
+"^DD",9002018.1,9002018.12001,.01,1,2,"DT")
+3040915
+"^DD",9002018.1,9002018.12001,.01,3)
+ENTER ASSOCIATED RPMS CLINIC
+"^DD",9002018.1,9002018.12001,.01,"DT")
+3040915
+"^DD",9002018.15,9002018.15,0)
+FIELD^^.05^5
+"^DD",9002018.15,9002018.15,0,"DT")
+3030703
+"^DD",9002018.15,9002018.15,0,"IX","AC",9002018.15,.02)
+
+"^DD",9002018.15,9002018.15,0,"IX","B",9002018.15,.01)
+
+"^DD",9002018.15,9002018.15,0,"NM","BSDX RESOURCE USER")
+
+"^DD",9002018.15,9002018.15,0,"VRPK")
+BSDX
+"^DD",9002018.15,9002018.15,.01,0)
+RESOURCENAME^RP9002018.1'^BSDXRES(^0;1^Q
+"^DD",9002018.15,9002018.15,.01,1,0)
+^.1
+"^DD",9002018.15,9002018.15,.01,1,1,0)
+9002018.15^B
+"^DD",9002018.15,9002018.15,.01,1,1,1)
+S ^BSDXRSU("B",$E(X,1,30),DA)=""
+"^DD",9002018.15,9002018.15,.01,1,1,2)
+K ^BSDXRSU("B",$E(X,1,30),DA)
+"^DD",9002018.15,9002018.15,.01,3)
+
+"^DD",9002018.15,9002018.15,.01,"DT")
+3030508
+"^DD",9002018.15,9002018.15,.02,0)
+USERNAME^P200'^VA(200,^0;2^Q
+"^DD",9002018.15,9002018.15,.02,1,0)
+^.1
+"^DD",9002018.15,9002018.15,.02,1,1,0)
+9002018.15^AC
+"^DD",9002018.15,9002018.15,.02,1,1,1)
+S ^BSDXRSU("AC",$E(X,1,30),DA)=""
+"^DD",9002018.15,9002018.15,.02,1,1,2)
+K ^BSDXRSU("AC",$E(X,1,30),DA)
+"^DD",9002018.15,9002018.15,.02,1,1,"DT")
+3030508
+"^DD",9002018.15,9002018.15,.02,"DT")
+3030508
+"^DD",9002018.15,9002018.15,.03,0)
+OVERBOOK^S^1:YES;0:NO;^0;3^Q
+"^DD",9002018.15,9002018.15,.03,3)
+
+"^DD",9002018.15,9002018.15,.03,"DT")
+3030703
+"^DD",9002018.15,9002018.15,.04,0)
+MODIFY SCHEDULE^S^1:YES;0:NO;^0;4^Q
+"^DD",9002018.15,9002018.15,.04,"DT")
+3030701
+"^DD",9002018.15,9002018.15,.05,0)
+MODIFY APPOINTMENTS^S^1:YES;0:NO;^0;5^Q
+"^DD",9002018.15,9002018.15,.05,3)
+
+"^DD",9002018.15,9002018.15,.05,"DT")
+3040722
+"^DD",9002018.2,9002018.2,0)
+FIELD^^1^3
+"^DD",9002018.2,9002018.2,0,"DDA")
+N
+"^DD",9002018.2,9002018.2,0,"DT")
+3030508
+"^DD",9002018.2,9002018.2,0,"IX","AB",9002018.21,.01)
+
+"^DD",9002018.2,9002018.2,0,"IX","B",9002018.2,.01)
+
+"^DD",9002018.2,9002018.2,0,"NM","BSDX RESOURCE GROUP")
+
+"^DD",9002018.2,9002018.2,0,"PT",9002018.25,.01)
+
+"^DD",9002018.2,9002018.2,0,"PT",9002018.35,.03)
+
+"^DD",9002018.2,9002018.2,0,"VRPK")
+BSDX
+"^DD",9002018.2,9002018.2,.01,0)
+NAME^RF^^0;1^K:$L(X)>30!(X?.N)!($L(X)<3)!'(X'?1P.E) X
+"^DD",9002018.2,9002018.2,.01,1,0)
+^.1
+"^DD",9002018.2,9002018.2,.01,1,1,0)
+9002018.2^B
+"^DD",9002018.2,9002018.2,.01,1,1,1)
+S ^BSDXDEPT("B",$E(X,1,30),DA)=""
+"^DD",9002018.2,9002018.2,.01,1,1,2)
+K ^BSDXDEPT("B",$E(X,1,30),DA)
+"^DD",9002018.2,9002018.2,.01,3)
+NAME MUST BE 3-30 CHARACTERS, NOT NUMERIC OR STARTING WITH PUNCTUATION
+"^DD",9002018.2,9002018.2,.02,0)
+INACTIVATION DATE^D^^0;2^S %DT="E" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.2,9002018.2,.02,"DT")
+3030508
+"^DD",9002018.2,9002018.2,1,0)
+RESOURCE^9002018.21P^^1;0
+"^DD",9002018.2,9002018.21,0)
+RESOURCE SUB-FIELD^^.01^1
+"^DD",9002018.2,9002018.21,0,"DT")
+3030508
+"^DD",9002018.2,9002018.21,0,"IX","B",9002018.21,.01)
+
+"^DD",9002018.2,9002018.21,0,"NM","RESOURCE")
+
+"^DD",9002018.2,9002018.21,0,"UP")
+9002018.2
+"^DD",9002018.2,9002018.21,.01,0)
+RESOURCE^MP9002018.1'^BSDXRES(^0;1^Q
+"^DD",9002018.2,9002018.21,.01,1,0)
+^.1
+"^DD",9002018.2,9002018.21,.01,1,1,0)
+9002018.21^B
+"^DD",9002018.2,9002018.21,.01,1,1,1)
+S ^BSDXDEPT(DA(1),1,"B",$E(X,1,30),DA)=""
+"^DD",9002018.2,9002018.21,.01,1,1,2)
+K ^BSDXDEPT(DA(1),1,"B",$E(X,1,30),DA)
+"^DD",9002018.2,9002018.21,.01,1,2,0)
+9002018.2^AB
+"^DD",9002018.2,9002018.21,.01,1,2,1)
+S ^BSDXDEPT("AB",$E(X,1,30),DA(1),DA)=""
+"^DD",9002018.2,9002018.21,.01,1,2,2)
+K ^BSDXDEPT("AB",$E(X,1,30),DA(1),DA)
+"^DD",9002018.2,9002018.21,.01,1,2,"DT")
+3030508
+"^DD",9002018.2,9002018.21,.01,"DT")
+3030508
+"^DD",9002018.3,9002018.3,0)
+FIELD^^1^6
+"^DD",9002018.3,9002018.3,0,"DT")
+3030508
+"^DD",9002018.3,9002018.3,0,"IX","ARSCT",9002018.3,.02)
+
+"^DD",9002018.3,9002018.3,0,"IX","B",9002018.3,.01)
+
+"^DD",9002018.3,9002018.3,0,"NM","BSDX ACCESS BLOCK")
+
+"^DD",9002018.3,9002018.3,0,"VRPK")
+BSDX
+"^DD",9002018.3,9002018.3,.01,0)
+RESOURCE^RP9002018.1'^BSDXRES(^0;1^Q
+"^DD",9002018.3,9002018.3,.01,1,0)
+^.1
+"^DD",9002018.3,9002018.3,.01,1,1,0)
+9002018.3^B
+"^DD",9002018.3,9002018.3,.01,1,1,1)
+S ^BSDXAB("B",$E(X,1,30),DA)=""
+"^DD",9002018.3,9002018.3,.01,1,1,2)
+K ^BSDXAB("B",$E(X,1,30),DA)
+"^DD",9002018.3,9002018.3,.01,3)
+
+"^DD",9002018.3,9002018.3,.01,"DT")
+3030508
+"^DD",9002018.3,9002018.3,.02,0)
+STARTTIME^D^^0;2^S %DT="ET" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.3,9002018.3,.02,1,0)
+^.1
+"^DD",9002018.3,9002018.3,.02,1,1,0)
+9002018.3^ARSCT^MUMPS
+"^DD",9002018.3,9002018.3,.02,1,1,1)
+D XR4S^BSDX03(DA)
+"^DD",9002018.3,9002018.3,.02,1,1,2)
+D XR4K^BSDX03(DA)
+"^DD",9002018.3,9002018.3,.02,1,1,"%D",0)
+^^1^1^3030512^
+"^DD",9002018.3,9002018.3,.02,1,1,"%D",1,0)
+Supports lookup of all access blocks for a given resource during a given time period
+"^DD",9002018.3,9002018.3,.02,1,1,"DT")
+3030512
+"^DD",9002018.3,9002018.3,.02,"DT")
+3030512
+"^DD",9002018.3,9002018.3,.03,0)
+ENDTIME^D^^0;3^S %DT="ET" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.3,9002018.3,.03,3)
+
+"^DD",9002018.3,9002018.3,.03,"DT")
+3030508
+"^DD",9002018.3,9002018.3,.04,0)
+SLOTS^NJ2,0^^0;4^K:+X'=X!(X>99)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.3,9002018.3,.04,3)
+Type a Number between 0 and 99, 0 Decimal Digits
+"^DD",9002018.3,9002018.3,.04,"DT")
+3030508
+"^DD",9002018.3,9002018.3,.05,0)
+ACCESS TYPE^P9002018.35'^BSDXTYPE(^0;5^Q
+"^DD",9002018.3,9002018.3,.05,"DT")
+3030508
+"^DD",9002018.3,9002018.3,1,0)
+NOTE^9002018.31^^1;0
+"^DD",9002018.3,9002018.31,0)
+NOTE SUB-FIELD^^.01^1
+"^DD",9002018.3,9002018.31,0,"DT")
+3030508
+"^DD",9002018.3,9002018.31,0,"NM","NOTE")
+
+"^DD",9002018.3,9002018.31,0,"UP")
+9002018.3
+"^DD",9002018.3,9002018.31,.01,0)
+NOTE^W^^0;1^Q
+"^DD",9002018.3,9002018.31,.01,"DT")
+3030508
+"^DD",9002018.35,9002018.35,0)
+FIELD^^.07^7
+"^DD",9002018.35,9002018.35,0,"DT")
+3030521
+"^DD",9002018.35,9002018.35,0,"IX","B",9002018.35,.01)
+
+"^DD",9002018.35,9002018.35,0,"NM","BSDX ACCESS TYPE")
+
+"^DD",9002018.35,9002018.35,0,"PT",9002018.3,.05)
+
+"^DD",9002018.35,9002018.35,0,"PT",9002018.39,.02)
+
+"^DD",9002018.35,9002018.35,0,"VRPK")
+BSDX
+"^DD",9002018.35,9002018.35,.01,0)
+ACCESS TYPE NAME^RF^^0;1^K:$L(X)>30!($L(X)<3)!'(X'?1P.E) X
+"^DD",9002018.35,9002018.35,.01,1,0)
+^.1
+"^DD",9002018.35,9002018.35,.01,1,1,0)
+9002018.35^B
+"^DD",9002018.35,9002018.35,.01,1,1,1)
+S ^BSDXTYPE("B",$E(X,1,30),DA)=""
+"^DD",9002018.35,9002018.35,.01,1,1,2)
+K ^BSDXTYPE("B",$E(X,1,30),DA)
+"^DD",9002018.35,9002018.35,.01,3)
+Answer must be 3-30 characters in length.
+"^DD",9002018.35,9002018.35,.01,"DT")
+3030508
+"^DD",9002018.35,9002018.35,.02,0)
+INACTIVE^S^1:YES;0:NO;^0;2^Q
+"^DD",9002018.35,9002018.35,.02,3)
+
+"^DD",9002018.35,9002018.35,.02,"DT")
+3030520
+"^DD",9002018.35,9002018.35,.03,0)
+DEPARTMENT NAME^P9002018.2'^BSDXDEPT(^0;3^Q
+"^DD",9002018.35,9002018.35,.03,"DT")
+3030508
+"^DD",9002018.35,9002018.35,.04,0)
+DISPLAY COLOR^F^^0;4^K:$L(X)>30!($L(X)<1) X
+"^DD",9002018.35,9002018.35,.04,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.35,9002018.35,.04,"DT")
+3030508
+"^DD",9002018.35,9002018.35,.05,0)
+RED^NJ3,0^^0;5^K:+X'=X!(X>255)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.35,9002018.35,.05,3)
+Type a Number between 0 and 255, 0 Decimal Digits
+"^DD",9002018.35,9002018.35,.05,"DT")
+3030521
+"^DD",9002018.35,9002018.35,.06,0)
+GREEN^NJ3,0^^0;6^K:+X'=X!(X>255)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.35,9002018.35,.06,3)
+Type a Number between 0 and 255, 0 Decimal Digits
+"^DD",9002018.35,9002018.35,.06,"DT")
+3030521
+"^DD",9002018.35,9002018.35,.07,0)
+BLUE^NJ3,0^^0;7^K:+X'=X!(X>255)!(X<0)!(X?.E1"."1N.N) X
+"^DD",9002018.35,9002018.35,.07,3)
+Type a Number between 0 and 255, 0 Decimal Digits
+"^DD",9002018.35,9002018.35,.07,"DT")
+3030521
+"^DD",9002018.38,9002018.38,0)
+FIELD^^.01^1
+"^DD",9002018.38,9002018.38,0,"DT")
+3030527
+"^DD",9002018.38,9002018.38,0,"IX","B",9002018.38,.01)
+
+"^DD",9002018.38,9002018.38,0,"NM","BSDX ACCESS GROUP")
+
+"^DD",9002018.38,9002018.38,0,"PT",9002018.39,.01)
+
+"^DD",9002018.38,9002018.38,0,"VRPK")
+BSDX
+"^DD",9002018.38,9002018.38,.01,0)
+ACCESS GROUP^RF^^0;1^K:$L(X)>30!($L(X)<3)!'(X'?1P.E) X
+"^DD",9002018.38,9002018.38,.01,1,0)
+^.1
+"^DD",9002018.38,9002018.38,.01,1,1,0)
+9002018.38^B
+"^DD",9002018.38,9002018.38,.01,1,1,1)
+S ^BSDXAGP("B",$E(X,1,30),DA)=""
+"^DD",9002018.38,9002018.38,.01,1,1,2)
+K ^BSDXAGP("B",$E(X,1,30),DA)
+"^DD",9002018.38,9002018.38,.01,3)
+Answer must be 3-30 characters in length.
+"^DD",9002018.38,9002018.38,.01,"DT")
+3030527
+"^DD",9002018.39,9002018.39,0)
+FIELD^^.02^2
+"^DD",9002018.39,9002018.39,0,"DDA")
+N
+"^DD",9002018.39,9002018.39,0,"DT")
+3030527
+"^DD",9002018.39,9002018.39,0,"IX","B",9002018.39,.01)
+
+"^DD",9002018.39,9002018.39,0,"NM","BSDX ACCESS GROUP TYPE")
+
+"^DD",9002018.39,9002018.39,0,"VRPK")
+BSDX
+"^DD",9002018.39,9002018.39,.01,0)
+ACCESS GROUP^RP9002018.38'^BSDXAGP(^0;1^Q
+"^DD",9002018.39,9002018.39,.01,1,0)
+^.1
+"^DD",9002018.39,9002018.39,.01,1,1,0)
+9002018.39^B
+"^DD",9002018.39,9002018.39,.01,1,1,1)
+S ^BSDXAGTP("B",$E(X,1,30),DA)=""
+"^DD",9002018.39,9002018.39,.01,1,1,2)
+K ^BSDXAGTP("B",$E(X,1,30),DA)
+"^DD",9002018.39,9002018.39,.01,3)
+
+"^DD",9002018.39,9002018.39,.01,"DT")
+3030720
+"^DD",9002018.39,9002018.39,.02,0)
+ACCESS TYPE^P9002018.35'^BSDXTYPE(^0;2^Q
+"^DD",9002018.39,9002018.39,.02,"DT")
+3030720
+"^DD",9002018.4,9002018.4,0)
+FIELD^^1^14
+"^DD",9002018.4,9002018.4,0,"DT")
+3040615
+"^DD",9002018.4,9002018.4,0,"IX","ARSRC",9002018.4,.07)
+
+"^DD",9002018.4,9002018.4,0,"IX","B",9002018.4,.01)
+
+"^DD",9002018.4,9002018.4,0,"IX","CPAT",9002018.4,.05)
+
+"^DD",9002018.4,9002018.4,0,"NM","BSDX APPOINTMENT")
+
+"^DD",9002018.4,9002018.4,0,"VRPK")
+BSDX
+"^DD",9002018.4,9002018.4,.01,0)
+STARTTIME^RD^^0;1^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.01,1,0)
+^.1
+"^DD",9002018.4,9002018.4,.01,1,1,0)
+9002018.4^B
+"^DD",9002018.4,9002018.4,.01,1,1,1)
+S ^BSDXAPPT("B",$E(X,1,30),DA)=""
+"^DD",9002018.4,9002018.4,.01,1,1,2)
+K ^BSDXAPPT("B",$E(X,1,30),DA)
+"^DD",9002018.4,9002018.4,.01,3)
+
+"^DD",9002018.4,9002018.4,.01,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.02,0)
+ENDTIME^RD^^0;2^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.02,3)
+
+"^DD",9002018.4,9002018.4,.02,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.03,0)
+CHECKIN^RD^^0;3^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.03,3)
+
+"^DD",9002018.4,9002018.4,.03,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.04,0)
+AUXTIME^RD^^0;4^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.04,3)
+
+"^DD",9002018.4,9002018.4,.04,"DT")
+3030508
+"^DD",9002018.4,9002018.4,.05,0)
+PATIENT^P9000001'^AUPNPAT(^0;5^Q
+"^DD",9002018.4,9002018.4,.05,1,0)
+^.1
+"^DD",9002018.4,9002018.4,.05,1,1,0)
+9002018.4^CPAT
+"^DD",9002018.4,9002018.4,.05,1,1,1)
+S ^BSDXAPPT("CPAT",$E(X,1,30),DA)=""
+"^DD",9002018.4,9002018.4,.05,1,1,2)
+K ^BSDXAPPT("CPAT",$E(X,1,30),DA)
+"^DD",9002018.4,9002018.4,.05,1,1,"%D",0)
+^^1^1^3040109^
+"^DD",9002018.4,9002018.4,.05,1,1,"%D",1,0)
+Cross reference of PATIENT field for lookup and sorting
+"^DD",9002018.4,9002018.4,.05,1,1,"DT")
+3040109
+"^DD",9002018.4,9002018.4,.05,"DT")
+3040109
+"^DD",9002018.4,9002018.4,.06,0)
+ACCESS TYPE ID^NJ6,0^^0;6^K:+X'=X!(X>999999)!(X<1)!(X?.E1"."1N.N) X
+"^DD",9002018.4,9002018.4,.06,3)
+Type a Number between 1 and 999999, 0 Decimal Digits
+"^DD",9002018.4,9002018.4,.06,"DT")
+3040614
+"^DD",9002018.4,9002018.4,.07,0)
+RESOURCE^P9002018.1'^BSDXRES(^0;7^Q
+"^DD",9002018.4,9002018.4,.07,1,0)
+^.1
+"^DD",9002018.4,9002018.4,.07,1,1,0)
+9002018.4^ARSRC^MUMPS
+"^DD",9002018.4,9002018.4,.07,1,1,1)
+D XR2S^BSDX03(DA)
+"^DD",9002018.4,9002018.4,.07,1,1,2)
+D XR2K^BSDX03(DA)
+"^DD",9002018.4,9002018.4,.07,1,1,"%D",0)
+^^1^1^3030512^
+"^DD",9002018.4,9002018.4,.07,1,1,"%D",1,0)
+This index is used to find all appointments for a given resource during a given time period
+"^DD",9002018.4,9002018.4,.07,1,1,"DT")
+3030512
+"^DD",9002018.4,9002018.4,.07,"DT")
+3030512
+"^DD",9002018.4,9002018.4,.08,0)
+DATA ENTRY CLERK^P200'^VA(200,^0;8^Q
+"^DD",9002018.4,9002018.4,.08,3)
+Enter the name of the clerk who made the appointment.
+"^DD",9002018.4,9002018.4,.08,21,0)
+^^1^1^3040214^
+"^DD",9002018.4,9002018.4,.08,21,1,0)
+Field contains the name of the clerk who made the appointment.
+"^DD",9002018.4,9002018.4,.08,"DT")
+3040214
+"^DD",9002018.4,9002018.4,.09,0)
+DATE APPT MADE^D^^0;9^S %DT="ETX" D ^%DT S X=Y K:X<1 X
+"^DD",9002018.4,9002018.4,.09,3)
+Enter the date the appointment was made.
+"^DD",9002018.4,9002018.4,.09,21,0)
+^^1^1^3040214^
+"^DD",9002018.4,9002018.4,.09,21,1,0)
+Field contains the date the appointment was made.
+"^DD",9002018.4,9002018.4,.09,"DT")
+3040214
+"^DD",9002018.4,9002018.4,.1,0)
+NOSHOW^S^1:YES;0:NO;^0;10^Q
+"^DD",9002018.4,9002018.4,.1,"DT")
+3040223
+"^DD",9002018.4,9002018.4,.11,0)
+REBOOK DATETIME^D^^0;11^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.11,"DT")
+3040613
+"^DD",9002018.4,9002018.4,.12,0)
+CANCEL DATETIME^D^^0;12^S %DT="ET" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.4,9002018.4,.12,"DT")
+3040613
+"^DD",9002018.4,9002018.4,.13,0)
+WALKIN^S^y:YES;n:NO;^0;13^Q
+"^DD",9002018.4,9002018.4,.13,"DT")
+3040615
+"^DD",9002018.4,9002018.4,1,0)
+NOTE^9002018.41^^1;0
+"^DD",9002018.4,9002018.41,0)
+NOTE SUB-FIELD^^.01^1
+"^DD",9002018.4,9002018.41,0,"DT")
+3030508
+"^DD",9002018.4,9002018.41,0,"NM","NOTE")
+
+"^DD",9002018.4,9002018.41,0,"UP")
+9002018.4
+"^DD",9002018.4,9002018.41,.01,0)
+NOTE^W^^0;1^Q
+"^DD",9002018.4,9002018.41,.01,"DT")
+3030508
+"^DD",9002018.5,9002018.5,0)
+FIELD^^.03^3
+"^DD",9002018.5,9002018.5,0,"DT")
+3040226
+"^DD",9002018.5,9002018.5,0,"IX","B",9002018.5,.01)
+
+"^DD",9002018.5,9002018.5,0,"NM","BSDX APPLICATION")
+
+"^DD",9002018.5,9002018.5,0,"VRPK")
+BSDX
+"^DD",9002018.5,9002018.5,.01,0)
+MAJOR VERSION^RF^^0;1^K:$L(X)>30!($L(X)<1)!'(X'?1P.E) X
+"^DD",9002018.5,9002018.5,.01,1,0)
+^.1
+"^DD",9002018.5,9002018.5,.01,1,1,0)
+9002018.5^B
+"^DD",9002018.5,9002018.5,.01,1,1,1)
+S ^BSDXAPPL("B",$E(X,1,30),DA)=""
+"^DD",9002018.5,9002018.5,.01,1,1,2)
+K ^BSDXAPPL("B",$E(X,1,30),DA)
+"^DD",9002018.5,9002018.5,.01,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.5,9002018.5,.01,"DT")
+3040226
+"^DD",9002018.5,9002018.5,.02,0)
+MINOR VERSION^RF^^0;2^K:$L(X)>30!($L(X)<1)!'(X'?1P.E) X
+"^DD",9002018.5,9002018.5,.02,3)
+Answer must be 1-30 characters in length.
+"^DD",9002018.5,9002018.5,.02,"DT")
+3040226
+"^DD",9002018.5,9002018.5,.03,0)
+BUILD^D^^0;3^S %DT="ETXR" D ^%DT S X=Y K:Y<1 X
+"^DD",9002018.5,9002018.5,.03,"DT")
+3040226
+"^DIC",9002018.1,9002018.1,0)
+BSDX RESOURCE^9002018.1
+"^DIC",9002018.1,9002018.1,0,"GL")
+^BSDXRES(
+"^DIC",9002018.1,"B","BSDX RESOURCE",9002018.1)
+
+"^DIC",9002018.15,9002018.15,0)
+BSDX RESOURCE USER^9002018.15
+"^DIC",9002018.15,9002018.15,0,"GL")
+^BSDXRSU(
+"^DIC",9002018.15,"B","BSDX RESOURCE USER",9002018.15)
+
+"^DIC",9002018.2,9002018.2,0)
+BSDX RESOURCE GROUP^9002018.2
+"^DIC",9002018.2,9002018.2,0,"GL")
+^BSDXDEPT(
+"^DIC",9002018.2,"B","BSDX RESOURCE GROUP",9002018.2)
+
+"^DIC",9002018.3,9002018.3,0)
+BSDX ACCESS BLOCK^9002018.3
+"^DIC",9002018.3,9002018.3,0,"GL")
+^BSDXAB(
+"^DIC",9002018.3,"B","BSDX ACCESS BLOCK",9002018.3)
+
+"^DIC",9002018.35,9002018.35,0)
+BSDX ACCESS TYPE^9002018.35
+"^DIC",9002018.35,9002018.35,0,"GL")
+^BSDXTYPE(
+"^DIC",9002018.35,"B","BSDX ACCESS TYPE",9002018.35)
+
+"^DIC",9002018.38,9002018.38,0)
+BSDX ACCESS GROUP^9002018.38
+"^DIC",9002018.38,9002018.38,0,"GL")
+^BSDXAGP(
+"^DIC",9002018.38,"B","BSDX ACCESS GROUP",9002018.38)
+
+"^DIC",9002018.39,9002018.39,0)
+BSDX ACCESS GROUP TYPE^9002018.39
+"^DIC",9002018.39,9002018.39,0,"GL")
+^BSDXAGTP(
+"^DIC",9002018.39,"B","BSDX ACCESS GROUP TYPE",9002018.39)
+
+"^DIC",9002018.4,9002018.4,0)
+BSDX APPOINTMENT^9002018.4
+"^DIC",9002018.4,9002018.4,0,"GL")
+^BSDXAPPT(
+"^DIC",9002018.4,"B","BSDX APPOINTMENT",9002018.4)
+
+"^DIC",9002018.5,9002018.5,0)
+BSDX APPLICATION^9002018.5
+"^DIC",9002018.5,9002018.5,0,"GL")
+^BSDXAPPL(
+"^DIC",9002018.5,"B","BSDX APPLICATION",9002018.5)
+
+**END**
+**END**
Index: Scheduling/branches/Radiology-Support/kids/sd0530_11310.k
===================================================================
--- Scheduling/branches/Radiology-Support/kids/sd0530_11310.k	(revision 1134)
+++ Scheduling/branches/Radiology-Support/kids/sd0530_11310.k	(revision 1134)
@@ -0,0 +1,458 @@
+KIDS Distribution saved on Jul 25, 2009@19:02:20
+Modified SDAMEVT routine to enable BSDX scheduling
+**KIDS**:SD*5.3*11310^
+
+**INSTALL NAME**
+SD*5.3*11310
+"BLD",7417,0)
+SD*5.3*11310^SCHEDULING^0^3090725^n
+"BLD",7417,4,0)
+^9.64PA^^
+"BLD",7417,6.3)
+2
+"BLD",7417,"KRN",0)
+^9.67PA^8989.52^19
+"BLD",7417,"KRN",.4,0)
+.4
+"BLD",7417,"KRN",.401,0)
+.401
+"BLD",7417,"KRN",.402,0)
+.402
+"BLD",7417,"KRN",.403,0)
+.403
+"BLD",7417,"KRN",.5,0)
+.5
+"BLD",7417,"KRN",.84,0)
+.84
+"BLD",7417,"KRN",3.6,0)
+3.6
+"BLD",7417,"KRN",3.8,0)
+3.8
+"BLD",7417,"KRN",9.2,0)
+9.2
+"BLD",7417,"KRN",9.8,0)
+9.8
+"BLD",7417,"KRN",9.8,"NM",0)
+^9.68A^1^1
+"BLD",7417,"KRN",9.8,"NM",1,0)
+SDAMEVT^^0^B29013195
+"BLD",7417,"KRN",9.8,"NM","B","SDAMEVT",1)
+
+"BLD",7417,"KRN",19,0)
+19
+"BLD",7417,"KRN",19.1,0)
+19.1
+"BLD",7417,"KRN",101,0)
+101
+"BLD",7417,"KRN",409.61,0)
+409.61
+"BLD",7417,"KRN",771,0)
+771
+"BLD",7417,"KRN",870,0)
+870
+"BLD",7417,"KRN",8989.51,0)
+8989.51
+"BLD",7417,"KRN",8989.52,0)
+8989.52
+"BLD",7417,"KRN",8994,0)
+8994
+"BLD",7417,"KRN","B",.4,.4)
+
+"BLD",7417,"KRN","B",.401,.401)
+
+"BLD",7417,"KRN","B",.402,.402)
+
+"BLD",7417,"KRN","B",.403,.403)
+
+"BLD",7417,"KRN","B",.5,.5)
+
+"BLD",7417,"KRN","B",.84,.84)
+
+"BLD",7417,"KRN","B",3.6,3.6)
+
+"BLD",7417,"KRN","B",3.8,3.8)
+
+"BLD",7417,"KRN","B",9.2,9.2)
+
+"BLD",7417,"KRN","B",9.8,9.8)
+
+"BLD",7417,"KRN","B",19,19)
+
+"BLD",7417,"KRN","B",19.1,19.1)
+
+"BLD",7417,"KRN","B",101,101)
+
+"BLD",7417,"KRN","B",409.61,409.61)
+
+"BLD",7417,"KRN","B",771,771)
+
+"BLD",7417,"KRN","B",870,870)
+
+"BLD",7417,"KRN","B",8989.51,8989.51)
+
+"BLD",7417,"KRN","B",8989.52,8989.52)
+
+"BLD",7417,"KRN","B",8994,8994)
+
+"MBREQ")
+0
+"PKG",48,-1)
+1^1
+"PKG",48,0)
+SCHEDULING^SD^APPOINTMENTS,PROFILES,LETTERS,AMIS REPORTS
+"PKG",48,22,0)
+^9.49I^1^1
+"PKG",48,22,1,0)
+5.3^3040324^2960613
+"PKG",48,22,1,"PAH",1,0)
+11310^3090725
+"QUES","XPF1",0)
+Y
+"QUES","XPF1","??")
+^D REP^XPDH
+"QUES","XPF1","A")
+Shall I write over your |FLAG| File
+"QUES","XPF1","B")
+YES
+"QUES","XPF1","M")
+D XPF1^XPDIQ
+"QUES","XPF2",0)
+Y
+"QUES","XPF2","??")
+^D DTA^XPDH
+"QUES","XPF2","A")
+Want my data |FLAG| yours
+"QUES","XPF2","B")
+YES
+"QUES","XPF2","M")
+D XPF2^XPDIQ
+"QUES","XPI1",0)
+YO
+"QUES","XPI1","??")
+^D INHIBIT^XPDH
+"QUES","XPI1","A")
+Want KIDS to INHIBIT LOGONs during the install
+"QUES","XPI1","B")
+NO
+"QUES","XPI1","M")
+D XPI1^XPDIQ
+"QUES","XPM1",0)
+PO^VA(200,:EM
+"QUES","XPM1","??")
+^D MG^XPDH
+"QUES","XPM1","A")
+Enter the Coordinator for Mail Group '|FLAG|'
+"QUES","XPM1","B")
+
+"QUES","XPM1","M")
+D XPM1^XPDIQ
+"QUES","XPO1",0)
+Y
+"QUES","XPO1","??")
+^D MENU^XPDH
+"QUES","XPO1","A")
+Want KIDS to Rebuild Menu Trees Upon Completion of Install
+"QUES","XPO1","B")
+NO
+"QUES","XPO1","M")
+D XPO1^XPDIQ
+"QUES","XPZ1",0)
+Y
+"QUES","XPZ1","??")
+^D OPT^XPDH
+"QUES","XPZ1","A")
+Want to DISABLE Scheduled Options, Menu Options, and Protocols
+"QUES","XPZ1","B")
+NO
+"QUES","XPZ1","M")
+D XPZ1^XPDIQ
+"QUES","XPZ2",0)
+Y
+"QUES","XPZ2","??")
+^D RTN^XPDH
+"QUES","XPZ2","A")
+Want to MOVE routines to other CPUs
+"QUES","XPZ2","B")
+NO
+"QUES","XPZ2","M")
+D XPZ2^XPDIQ
+"RTN")
+1
+"RTN","SDAMEVT")
+0^1^B29013195
+"RTN","SDAMEVT",1,0)
+SDAMEVT ;ALB/MJK - Appt Event Driver Utilities ; 12/1/91 [ 09/19/96  1:39 PM ]
+"RTN","SDAMEVT",2,0)
+ ;;5.3;Scheduling;**15,132,443,local**;Aug 13, 1993;Build 2
+"RTN","SDAMEVT",3,0)
+ ; localmods by WV/SMH; 
+"RTN","SDAMEVT",4,0)
+ ;
+"RTN","SDAMEVT",5,0)
+BEFORE(SDATA,DFN,SDT,SDCL,SDDA,SDHDL) ; -- get before values
+"RTN","SDAMEVT",6,0)
+ K ^TMP("SDAMEVT",$J)
+"RTN","SDAMEVT",7,0)
+ D CAPTURE("BEFORE",.SDATA,.DFN,.SDT,.SDCL,.SDDA,.SDHDL)
+"RTN","SDAMEVT",8,0)
+ Q
+"RTN","SDAMEVT",9,0)
+ ;
+"RTN","SDAMEVT",10,0)
+AFTER(SDATA,DFN,SDT,SDCL,SDDA,SDHDL) ; -- get after values
+"RTN","SDAMEVT",11,0)
+ D CAPTURE("AFTER",.SDATA,.DFN,.SDT,.SDCL,.SDDA,.SDHDL)
+"RTN","SDAMEVT",12,0)
+ Q
+"RTN","SDAMEVT",13,0)
+ ;
+"RTN","SDAMEVT",14,0)
+HANDLE(SDORG) ; -- get evt handle
+"RTN","SDAMEVT",15,0)
+ ;  SDORG = originating process (1=appt , 2=a/e , 3=disp)
+"RTN","SDAMEVT",16,0)
+ S (Y,^($J))=$G(^TMP("SDEVT HANDLE",$J))+1
+"RTN","SDAMEVT",17,0)
+ Q Y
+"RTN","SDAMEVT",18,0)
+ ;
+"RTN","SDAMEVT",19,0)
+CLEAN(SDHDL) ;
+"RTN","SDAMEVT",20,0)
+ K ^TMP("SDEVT",$J,SDHDL)
+"RTN","SDAMEVT",21,0)
+ Q
+"RTN","SDAMEVT",22,0)
+ ;
+"RTN","SDAMEVT",23,0)
+HDLKILL ; -- kill off handle data
+"RTN","SDAMEVT",24,0)
+ K SDHDL,^TMP("SDEVT HANDLE",$J),^TMP("SDEVT",$J)
+"RTN","SDAMEVT",25,0)
+ Q
+"RTN","SDAMEVT",26,0)
+ ;
+"RTN","SDAMEVT",27,0)
+CAPTURE(SDCAP,SDATA,DFN,SDT,SDCL,SDDA,SDHDL) ;
+"RTN","SDAMEVT",28,0)
+ N Z
+"RTN","SDAMEVT",29,0)
+ S (Z,^TMP("SDAMEVT",$J,SDCAP,"DPT"),^TMP("SDEVT",$J,SDHDL,1,"DPT",0,SDCAP))=$G(^DPT(DFN,"S",SDT,0))
+"RTN","SDAMEVT",30,0)
+ S (^TMP("SDAMEVT",$J,SDCAP,"SC"),^TMP("SDEVT",$J,SDHDL,1,"SC",0,SDCAP))=$G(^SC(SDCL,"S",SDT,1,+SDDA,0))
+"RTN","SDAMEVT",31,0)
+ S (^TMP("SDAMEVT",$J,SDCAP,"STATUS"),SDATA(SDCAP,"STATUS"))=$TR($$STATUS^SDAM1(DFN,SDT,SDCL,Z,SDDA),";","^")
+"RTN","SDAMEVT",32,0)
+ D:$P(Z,U,20) OE(.SDCAP,1,$P(Z,U,20),.SDHDL)
+"RTN","SDAMEVT",33,0)
+ Q
+"RTN","SDAMEVT",34,0)
+ ;
+"RTN","SDAMEVT",35,0)
+ ;
+"RTN","SDAMEVT",36,0)
+EVT(SDATA,SDAMEVT,SDMODE,SDHDL) ; -- calls the sdam event protocol
+"RTN","SDAMEVT",37,0)
+ N OROLD
+"RTN","SDAMEVT",38,0)
+ K DTOUT,DIROUT
+"RTN","SDAMEVT",39,0)
+ I $G(SDATA("BEFORE","STATUS"))=$G(SDATA("AFTER","STATUS")),'$$COMP^SDAMEVT4(SDHDL,SDAMEVT) G EVTQ  ; SD*5.3*443
+"RTN","SDAMEVT",40,0)
+ S:$P(SDATA,U,3) $P(SDATA,U,5)=$$REQ^SDM1A(+$P(SDATA,U,3))
+"RTN","SDAMEVT",41,0)
+ S X=+$O(^ORD(101,"B","SDAM APPOINTMENT EVENTS",0))_";ORD(101,"
+"RTN","SDAMEVT",42,0)
+ D EN^XQOR
+"RTN","SDAMEVT",43,0)
+EVTQ K XQORPOP,X,^TMP("SDAMEVT",$J) D CLEAN(SDHDL) Q
+"RTN","SDAMEVT",44,0)
+ ;
+"RTN","SDAMEVT",45,0)
+ ;
+"RTN","SDAMEVT",46,0)
+MAKE(DFN,SDT,SDCL,SDDA,SDMODE) ; -- make appt event #1
+"RTN","SDAMEVT",47,0)
+ N SDATA,%,SDMKHDL,SDHDL K ^TMP("SDAMEVT",$J)
+"RTN","SDAMEVT",48,0)
+ S SDMKHDL=$$HANDLE(1)
+"RTN","SDAMEVT",49,0)
+ S (^TMP("SDAMEVT",$J,"BEFORE","DPT"),^TMP("SDAMEVT",$J,"BEFORE","SC"),SDATA("BEFORE","STATUS"),^TMP("SDAMEVT",$J,"BEFORE","STATUS"),^TMP("SDEVT",$J,SDMKHDL,1,"DPT",0,"BEFORE"),^TMP("SDEVT",$J,SDMKHDL,1,"SC",0,"BEFORE"))=""
+"RTN","SDAMEVT",50,0)
+ D AFTER(.SDATA,DFN,SDT,SDCL,SDDA,SDMKHDL)
+"RTN","SDAMEVT",51,0)
+ S SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","SDAMEVT",52,0)
+ ; D EVT(.SDATA,1,+$G(SDAMODE),SDMKHDL) ; wrong line
+"RTN","SDAMEVT",53,0)
+ D EVT(.SDATA,1,+$G(SDMODE),SDMKHDL) ; //smh SDMODE was misspelt
+"RTN","SDAMEVT",54,0)
+ ; -- if appt d/t is less than NOW then check-in
+"RTN","SDAMEVT",55,0)
+ D NOW^%DTC
+"RTN","SDAMEVT",56,0)
+ ; I SDT<% W:'$G(SDMODE) ! D //smh
+"RTN","SDAMEVT",57,0)
+ I SDT<%,$G(SDMODE)<2 D  ; but only ask if you are in interactive mode. If SDMODE=2, don't ask.
+"RTN","SDAMEVT",58,0)
+ .N SDACT,SDCOQUIT
+"RTN","SDAMEVT",59,0)
+ .S SDDA=+SDATA,DFN=$P(SDATA,U,2),SDT=$P(SDATA,U,3),SDCL=$P(SDATA,U,4) K SDATA
+"RTN","SDAMEVT",60,0)
+ .I $$REQ^SDM1A(SDT)="CO",'$G(SDCOACT) D
+"RTN","SDAMEVT",61,0)
+ ..S SDACT=$S(SDT<DT:"CO",1:$$ASK^SDAMEX) I SDACT']"" S SDCOQUIT=1 Q
+"RTN","SDAMEVT",62,0)
+ ..I SDACT="CO" D CO^SDCO1(DFN,SDT,SDCL,SDDA,0,SDT)
+"RTN","SDAMEVT",63,0)
+ .I '$G(SDCOQUIT),$G(SDACT)'="CO" D ONE^SDAM2(DFN,SDCL,SDT,SDDA,0,SDT)
+"RTN","SDAMEVT",64,0)
+ Q
+"RTN","SDAMEVT",65,0)
+ ;
+"RTN","SDAMEVT",66,0)
+ ;
+"RTN","SDAMEVT",67,0)
+CANCEL(SDATA,DFN,SDT,SDCL,SDDA,SDMODE,SDHDL) ; -- cancel event #2
+"RTN","SDAMEVT",68,0)
+ D AFTER(.SDATA,DFN,SDT,SDCL,SDDA,SDHDL)
+"RTN","SDAMEVT",69,0)
+ I "^5^7^9^10^"[("^"_+SDATA("AFTER","STATUS")_"^"),$P($G(^DPT(DFN,"S",SDT,0)),"^",20) D EN^SDCODEL(+$P(^(0),"^",20),0,SDHDL),OENUL^SDAMEVT1("AFTER",SDHDL)
+"RTN","SDAMEVT",70,0)
+ S SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","SDAMEVT",71,0)
+ D EVT(.SDATA,2,0,SDHDL)
+"RTN","SDAMEVT",72,0)
+ Q
+"RTN","SDAMEVT",73,0)
+ ;
+"RTN","SDAMEVT",74,0)
+ ;
+"RTN","SDAMEVT",75,0)
+NOSHOW(SDATA,DFN,SDT,SDCL,SDDA,SDMODE,SDHDL) ; -- no-show event #3
+"RTN","SDAMEVT",76,0)
+ D AFTER(.SDATA,DFN,SDT,SDCL,SDDA,SDHDL)
+"RTN","SDAMEVT",77,0)
+ I "^4^6^"[("^"_+SDATA("AFTER","STATUS")_"^"),$P($G(^DPT(DFN,"S",SDT,0)),"^",20) D EN^SDCODEL(+$P(^(0),"^",20),0,SDHDL),OENUL^SDAMEVT1("AFTER",SDHDL)
+"RTN","SDAMEVT",78,0)
+ S SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+"RTN","SDAMEVT",79,0)
+ D EVT(.SDATA,3,0,SDHDL)
+"RTN","SDAMEVT",80,0)
+ Q
+"RTN","SDAMEVT",81,0)
+ ;
+"RTN","SDAMEVT",82,0)
+OE(SDCAP,SDORG,SDOE,SDHDL) ; -- set up encounter data
+"RTN","SDAMEVT",83,0)
+ N I,OP,FILE,X,SDKID
+"RTN","SDAMEVT",84,0)
+ ;
+"RTN","SDAMEVT",85,0)
+ ; -- set up 'OP'posite variable
+"RTN","SDAMEVT",86,0)
+ S OP=$S(SDCAP="BEFORE":"AFTER",1:"BEFORE")
+"RTN","SDAMEVT",87,0)
+ ;
+"RTN","SDAMEVT",88,0)
+ ; -- set zero of oe
+"RTN","SDAMEVT",89,0)
+ S X=$G(^SCE(SDOE,0))
+"RTN","SDAMEVT",90,0)
+ S ^TMP("SDEVT",$J,SDHDL,SDORG,"SDOE",SDOE,0,SDCAP)=X
+"RTN","SDAMEVT",91,0)
+ S:'$D(^TMP("SDEVT",$J,SDHDL,SDORG,"SDOE",SDOE,0,OP)) ^(OP)=""
+"RTN","SDAMEVT",92,0)
+ ;
+"RTN","SDAMEVT",93,0)
+ ; -- save other data
+"RTN","SDAMEVT",94,0)
+ S FILE=409.42
+"RTN","SDAMEVT",95,0)
+ S I=0 F  S I=$O(^SDD(FILE,"OE",SDOE,I)) Q:'I  D
+"RTN","SDAMEVT",96,0)
+ . S X=$G(^SDD(FILE,I,0))
+"RTN","SDAMEVT",97,0)
+ . S ^TMP("SDEVT",$J,SDHDL,SDORG,"SDOE",SDOE,"CL",I,0,SDCAP)=X
+"RTN","SDAMEVT",98,0)
+ . S:'$D(^TMP("SDEVT",$J,SDHDL,SDORG,"SDOE",SDOE,"CL",I,0,OP)) ^(OP)=""
+"RTN","SDAMEVT",99,0)
+ ;
+"RTN","SDAMEVT",100,0)
+ IF SDORG'=1,SDORG'=3 G OEQ
+"RTN","SDAMEVT",101,0)
+ ;
+"RTN","SDAMEVT",102,0)
+ ; -- gets children oe's
+"RTN","SDAMEVT",103,0)
+ S SDKID=0
+"RTN","SDAMEVT",104,0)
+ F  S SDKID=$O(^SCE("APAR",SDOE,SDKID)) Q:'SDKID  D
+"RTN","SDAMEVT",105,0)
+ . S X=$G(^SCE(SDKID,0))
+"RTN","SDAMEVT",106,0)
+ . IF $P(X,U,8)'=4 Q  ; -- must be a credit stop encounter
+"RTN","SDAMEVT",107,0)
+ . S ^TMP("SDEVT",$J,SDHDL,4,"SDOE",SDKID,0,SDCAP)=X
+"RTN","SDAMEVT",108,0)
+ . S:'$D(^TMP("SDEVT",$J,SDHDL,4,"SDOE",SDKID,0,OP)) ^(OP)=""
+"RTN","SDAMEVT",109,0)
+OEQ Q
+"RTN","SDAMEVT",110,0)
+ ;
+"RTN","SDAMEVT",111,0)
+OECHG(SDORG,SDHDL) ; -- compare befores and afters
+"RTN","SDAMEVT",112,0)
+ N Y,I,SDOE S (Y,SDOE)=0
+"RTN","SDAMEVT",113,0)
+ F  S SDOE=$O(^TMP("SDEVT",$J,SDHDL,SDORG,"SDOE",SDOE)) Q:'SDOE  D  Q:Y
+"RTN","SDAMEVT",114,0)
+ . S I=0
+"RTN","SDAMEVT",115,0)
+ . F  S I=$O(^TMP("SDEVT",$J,SDHDL,SDORG,"SDOE",SDOE,"CL",I)) Q:'I  I $G(^(I,0,"BEFORE"))='$G(^("AFTER")) S Y=1 Q
+"RTN","SDAMEVT",116,0)
+ Q Y
+"RTN","SDAMEVT",117,0)
+ ;
+"RTN","SDAMEVT",118,0)
+OEVT(SDOE,SDCAP,SDHDL,SDATA,SDOE0) ; -- event driver calls by oe
+"RTN","SDAMEVT",119,0)
+ ; SDATA only required for appts
+"RTN","SDAMEVT",120,0)
+ ; SDOE0 only required for check out deletion AFTER
+"RTN","SDAMEVT",121,0)
+ ;
+"RTN","SDAMEVT",122,0)
+ N SD0,SDORG,SDT,DFN,SDDA,SDCL,SDOEP
+"RTN","SDAMEVT",123,0)
+ S SD0=$S($D(^SCE(SDOE,0)):^(0),1:$G(SDOE0)),SDOEP=$P(SD0,U,6)
+"RTN","SDAMEVT",124,0)
+ I SD0']""!(SDOEP) G OEVTQ
+"RTN","SDAMEVT",125,0)
+ S SDT=+SD0,DFN=+$P(SD0,U,2),SDCL=+$P(SD0,U,4),SDORG=+$P(SD0,U,8),SDDA=$P(SD0,U,9)
+"RTN","SDAMEVT",126,0)
+ I SDCAP="BEFORE" D
+"RTN","SDAMEVT",127,0)
+ .I SDORG=1 D BEFORE(.SDATA,DFN,SDT,SDCL,SDDA,SDHDL) Q
+"RTN","SDAMEVT",128,0)
+ .I SDORG=2 D BEFORE^SDAMEVT2(SDOE,SDHDL) Q
+"RTN","SDAMEVT",129,0)
+ .I SDORG=3 D BEFORE^SDAMEVT3(DFN,SDT,9,SDHDL)
+"RTN","SDAMEVT",130,0)
+ I SDCAP="AFTER" D
+"RTN","SDAMEVT",131,0)
+ .I SDORG=1 S SDATA=SDDA_"^"_DFN_"^"_SDT_"^"_SDCL D AFTER(.SDATA,DFN,SDT,SDCL,SDDA,SDHDL),EVT(.SDATA,5,0,SDHDL) Q
+"RTN","SDAMEVT",132,0)
+ .I SDORG=2 D EVT^SDAMEVT2(SDOE,7,SDHDL) Q
+"RTN","SDAMEVT",133,0)
+ .I SDORG=3 D EVT^SDAMEVT3(DFN,SDT,9,SDHDL)
+"RTN","SDAMEVT",134,0)
+OEVTQ Q
+"RTN","SDAMEVT",135,0)
+ ;
+"RTN","SDAMEVT",136,0)
+ ; -- SEE SDAMEVT0 FOR DOC ON VARIABLES
+"VER")
+8.0^22.0
+**END**
+**END**
Index: Scheduling/branches/Radiology-Support/m/BSDX01.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX01.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX01.m	(revision 1134)
@@ -0,0 +1,319 @@
+BSDX01	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 3/16/11 7:08am
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+SUINFOD(BSDXY,BSDXDUZ)	;EP Debugging entry point
+	;D DEBUG^%Serenji("SUINFO^BSDX01(.BSDXY,BSDXDUZ)")
+	;
+	Q
+	;
+SUINFO(BSDXY,BSDXDUZ)	 ;EP
+	;Called by BSDX SCHEDULING USER INFO
+	;Returns ADO Recordset having column MANAGER
+	;MANAGER = YES if user has keys BSDXZMGR or XUPROGMODE
+	;
+	N BSDXMGR,BSDXERR
+	K ^BSDXTMP($J)
+	S BSDXY="^BSDXTMP("_$J_")"
+	S BSDXI=0
+	S BSDXERR=""
+	S ^BSDXTMP($J,BSDXI)="T00010MANAGER"_$C(30)
+	;Check SECURITY KEY file for BSDXZMGR or XUPROGMODE keys
+	I '+BSDXDUZ S BSDXDUZ=DUZ
+	S BSDXMGR=$$APSEC("BSDXZMGR",BSDXDUZ)
+	S BSDXMGR=$S(BSDXMGR=1:"YES",1:"NO")
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXMGR_$C(30)
+	S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+	Q
+DEPUSRD(BSDXY,BSDXDUZ)	;EP Debugging entry point
+	;
+	;
+	;D DEBUG^%Serenji("DEPUSR^BSDX01(.BSDXY,BSDXDUZ)")
+	;
+	Q
+	;
+DEPUSR(BSDXY,BSDXDUZ)	 ;EP
+	;Called by BSDX RESOURCE GROUPS BY USER
+	;Returns ADO Recordset with all ACTIVE resource group names to which user has access
+	;based on entries in BSDX RESOURCE USER file (Say this again for myself: Groups ONLY!!)
+	;If BSDXDUZ=0 then returns all department names for current DUZ
+	   ;if not linked, always returned.
+	;If user BSDXDUZ possesses the key BSDXZMGR or XUPROGMODE
+	;then ALL resource group names are returned regardless of whether any active resources
+	;are associated with the group or not.
+	;
+	;
+	N BSDXERR,BSDXRET,BSDXIEN,BSDXRES,BSDXDEP,BSDXDDR,BSDXDEPN,BSDXRDAT,BSDXRNOD,BSDXI
+	N BSDXMGR,BSDXNOD
+	K ^BSDXTEMP($J)
+	K ^BSDXTMP($J)
+	S BSDXY="^BSDXTMP("_$J_")"
+	S BSDXI=0
+	S BSDXERR=""
+	S ^BSDXTMP($J,BSDXI)="I00020RESOURCE_GROUPID^T00030RESOURCE_GROUP"_$C(30)
+	I '+BSDXDUZ S BSDXDUZ=DUZ
+	;Check SECURITY KEY file for BSDXZMGR or XUPROGMODE keys
+	S BSDXMGR=$$APSEC("BSDXZMGR",BSDXDUZ)
+	;
+	;User does not have BSDXZMGR or XUPROGMODE keys, so
+	;$O THRU AC XREF OF BSDX RESOURCE USER
+	I 'BSDXMGR,$D(^BSDXRSU("AC",BSDXDUZ)) S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRSU("AC",BSDXDUZ,BSDXIEN)) Q:'+BSDXIEN  D
+	. S BSDXRES=$P(^BSDXRSU(BSDXIEN,0),U)
+	. Q:'$D(^BSDXDEPT("AB",BSDXRES))  ; If not part of a group, quit ("AB" is the whole file index for the resource multiple in Group file)
+	   . ; Q:'$$INDIV2(BSDXRES)  ; If not in the same division as user, quit
+	. S BSDXRNOD=^BSDXRES(BSDXRES,0)
+	. ;QUIT if the resource is inactive
+	. Q:$P(BSDXRNOD,U,2)=1
+	. S BSDXDEP=0 F  S BSDXDEP=$O(^BSDXDEPT("AB",BSDXRES,BSDXDEP)) Q:'+BSDXDEP  D
+	. . Q:'$D(^BSDXDEPT(BSDXDEP,0))
+	. . Q:$D(^BSDXTEMP($J,BSDXDEP))
+	. . S ^BSDXTEMP($J,BSDXDEP)=""
+	. . S BSDXDEPN=$P(^BSDXDEPT(BSDXDEP,0),U)
+	. . S BSDXI=BSDXI+1
+	. . S ^BSDXTMP($J,BSDXI)=BSDXDEP_U_BSDXDEPN_$C(30)
+	. . Q
+	. Q
+	;
+	;User does have BSDXZMGR or XUPROGMODE keys, so
+	;$O THRU BSDX RESOURCE GROUP file directly
+	I BSDXMGR S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXDEPT(BSDXIEN)) Q:'+BSDXIEN  D
+	. Q:'$D(^BSDXDEPT(BSDXIEN,0))
+	. S BSDXNOD=^BSDXDEPT(BSDXIEN,0)
+	. S BSDXDEPN=$P(BSDXNOD,U)
+	. S BSDXI=BSDXI+1
+	. S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXDEPN_$C(30)
+	. Q
+	;
+	S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+	Q
+	;
+	;
+RESUSRD(BSDXY,BSDXDUZ)	;EP Debugging entry point
+	;
+	;
+	;D DEBUG^%Serenji("RESUSR^BSDX01(.BSDXY,BSDXDUZ)")
+	;
+	Q
+	;
+RESUSR(BSDXY,BSDXDUZ)	;EP
+	;Returns ADO Recordset with ALL RESOURCE names
+	;Inactive RESOURCES are NOT filtered out
+	;Called by BSDX RESOURCES BY USER
+	;
+	N BSDXERR,BSDXRET,BSDXIEN,BSDXRES,BSDXDEP,BSDXDDR,BSDXDEPN,BSDXRDAT,BSDXRNOD,BSDXI,BSDX,BSDXLTR
+	N BSDXNOS,BSDXCAN
+	K ^BSDXTMP($J)
+	S BSDXY="^BSDXTMP("_$J_")"
+	S BSDXI=0
+	S BSDXERR=""
+	S ^BSDXTMP($J,BSDXI)="I00010RESOURCEID^T00030RESOURCE_NAME^T00010INACTIVE^I00010TIMESCALE^I00010HOSPITAL_LOCATION_ID^T00030LETTER_TEXT^T00030NO_SHOW_LETTER"
+	S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^T00030CLINIC_CANCELLATION_LETTER^I00010VIEW^I00010OVERBOOK^I00010MODIFY_SCHEDULE^I00010MODIFY_APPOINTMENTS"_$C(30)
+	I '+BSDXDUZ S BSDXDUZ=DUZ
+	;$O THRU AC XREF OF BSDX RESOURCE USER
+	;Rmoved these lines in order to just return all resource names
+	;I $D(^BSDXRSU("AC",BSDXDUZ)) S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRSU("AC",BSDXDUZ,BSDXIEN)) Q:'+BSDXIEN  D
+	;. S BSDXRES=$P(^BSDXRSU(BSDXIEN,0),U)
+	;
+	;$O THRU BSDX RESOURCE File
+	S BSDXRES=0 F  S BSDXRES=$O(^BSDXRES(BSDXRES)) Q:'+BSDXRES  D
+	. Q:'$D(^BSDXRES(BSDXRES,0))
+	. S BSDXRNOD=^BSDXRES(BSDXRES,0)
+	. N BSDXSC S BSDXSC=$P(BSDXRNOD,U,4)  ; Hospital Location
+	   . ;Q:$P(BSDXRNOD,U,2)=1  ;Inactive resources not filtered
+	. ;S BSDXRDAT=$P(BSDXRNOD,U,1,4)
+	. ;I '$$INDIV(BSDXSC) QUIT  ; If not in division, quit
+	   . K BSDXRDAT
+	. F BSDX=1:1:4 S $P(BSDXRDAT,U,BSDX)=$P(BSDXRNOD,U,BSDX)
+	. S BSDXRDAT=BSDXRES_U_BSDXRDAT
+	. ;Get letter text from wp field
+	. S BSDXLTR=""
+	. I $D(^BSDXRES(BSDXRES,1)) D
+	. . S BSDXIEN=0
+	. . F  S BSDXIEN=$O(^BSDXRES(BSDXRES,1,BSDXIEN)) Q:'+BSDXIEN  D
+	. . . S BSDXLTR=BSDXLTR_$G(^BSDXRES(BSDXRES,1,BSDXIEN,0))
+	. . . S BSDXLTR=BSDXLTR_$C(13)_$C(10)
+	. S BSDXNOS=""
+	. I $D(^BSDXRES(BSDXRES,12)) D
+	. . S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRES(BSDXRES,12,BSDXIEN)) Q:'+BSDXIEN  D
+	. . . S BSDXNOS=BSDXNOS_$G(^BSDXRES(BSDXRES,12,BSDXIEN,0))
+	. . . S BSDXNOS=BSDXNOS_$C(13)_$C(10)
+	. S BSDXCAN=""
+	. I $D(^BSDXRES(BSDXRES,13)) D
+	. . S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRES(BSDXRES,13,BSDXIEN)) Q:'+BSDXIEN  D
+	. . . S BSDXCAN=BSDXCAN_$G(^BSDXRES(BSDXRES,13,BSDXIEN,0))
+	. . . S BSDXCAN=BSDXCAN_$C(13)_$C(10)
+	. N BSDXACC,BSDXMGR
+	. S BSDXACC="0^0^0^0"
+	. S BSDXMGR=$O(^DIC(19.1,"B","BSDXZMGR",0))
+	. I +BSDXMGR,$D(^VA(200,BSDXDUZ,51,BSDXMGR)) S BSDXACC="1^1^1^1"
+	. S BSDXMGR=$O(^DIC(19.1,"B","XUPROGMODE",0))
+	. I +BSDXMGR,$D(^VA(200,BSDXDUZ,51,BSDXMGR)) S BSDXACC="1^1^1^1"
+	. I BSDXACC="0^0^0^0" D
+	. . N BSDXNOD,BSDXRUID
+	. . S BSDXRUID=0
+	. . ;Get entry for this user and resource
+	. . F  S BSDXRUID=$O(^BSDXRSU("AC",BSDXDUZ,BSDXRUID)) Q:'+BSDXRUID  I $D(^BSDXRSU(BSDXRUID,0)),$P(^(0),U)=BSDXRES Q
+	. . Q:'+BSDXRUID
+	. . S $P(BSDXACC,U)=1
+	. . S BSDXNOD=$G(^BSDXRSU(BSDXRUID,0))
+	. . S $P(BSDXACC,U,2)=+$P(BSDXNOD,U,3)
+	. . S $P(BSDXACC,U,3)=+$P(BSDXNOD,U,4)
+	. . S $P(BSDXACC,U,4)=+$P(BSDXNOD,U,5)
+	. S BSDXRDAT=BSDXRDAT_U_BSDXLTR_U_BSDXNOS_U_BSDXCAN_U_BSDXACC
+	. S BSDXI=BSDXI+1
+	. S ^BSDXTMP($J,BSDXI)=BSDXRDAT_$C(30)
+	S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+	Q
+	;
+DEPRESD(BSDXY,BSDXDUZ)	;EP Debugging entry point
+	;
+	;
+	;D DEBUG^%Serenji("DEPRES^BSDX01(.BSDXY,BSDXDUZ)")
+	;
+	Q
+	;
+DEPRES(BSDXY,BSDXDUZ)	;EP
+	;Called by BSDX GROUP RESOURCE
+	;Returns ADO Recordset with all ACTIVE GROUP/RESOURCE combinations
+	;to which user has access based on entries in BSDX RESOURCE USER file
+	;If BSDXDUZ=0 then returns all ACTIVE GROUP/RESOURCE combinations for current DUZ
+	;If user BSDXDUZ possesses the key BSDXZMGR or XUPROGMODE
+	;then ALL ACTIVE resource group names are returned
+	;
+	N BSDXERR,BSDXRET,BSDXIEN,BSDXRES,BSDXDEP,BSDXDDR,BSDXDEPN,BSDXRDAT,BSDXRNOD,BSDXI
+	N BSDXRESN,BSDXMGR,BSDXRESD,BSDXNOD,BSDXSUBID
+	K ^BSDXTEMP($J)
+	K ^BSDXTMP($J)
+	S BSDXY="^BSDXTMP("_$J_")"
+	S BSDXI=0
+	S BSDXERR=""
+	S ^BSDXTMP($J,BSDXI)="I00020RESOURCE_GROUPID^T00030RESOURCE_GROUP^I00020RESOURCE_GROUP_ITEMID^T00030RESOURCE_NAME^I00020RESOURCEID"_$C(30)
+	I '+BSDXDUZ S BSDXDUZ=DUZ
+	;Check SECURITY KEY file for BSDXZMGR or XUPROGMODE keys
+	S BSDXMGR=$$APSEC("BSDXZMGR",BSDXDUZ)
+	;
+	;User does not have BSDXZMGR or XUPROGMODE keys, so
+	;$O THRU AC XREF OF BSDX RESOURCE USER
+	I 'BSDXMGR,$D(^BSDXRSU("AC",BSDXDUZ))  S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXRSU("AC",BSDXDUZ,BSDXIEN)) Q:'+BSDXIEN  D
+	. S BSDXRES=$P(^BSDXRSU(BSDXIEN,0),U)
+	. Q:'$D(^BSDXDEPT("AB",BSDXRES))  ; Quit if Resource isn't part of any Group
+	   . ;Q:'$$INDIV2(BSDXRES)  ; Quit if Resource isn't in same division as user.
+	. S BSDXRNOD=$G(^BSDXRES(BSDXRES,0))
+	. Q:BSDXRNOD=""
+	. ;QUIT if the resource is inactive
+	. Q:$P(BSDXRNOD,U,2)=1
+	. S BSDXRESN=$P(BSDXRNOD,U)
+	. S BSDXDEP=0 F  S BSDXDEP=$O(^BSDXDEPT("AB",BSDXRES,BSDXDEP)) Q:'+BSDXDEP  D
+	. . Q:'$D(^BSDXDEPT(BSDXDEP,0))
+	. . S BSDXDEPN=$P(^BSDXDEPT(BSDXDEP,0),U)
+	. . S BSDXSUBID=$O(^BSDXDEPT(BSDXDEP,1,"B",BSDXRES,0))
+	. . S BSDXI=BSDXI+1
+	. . S ^BSDXTMP($J,BSDXI)=BSDXDEP_U_BSDXDEPN_U_BSDXSUBID_U_BSDXRESN_U_BSDXRES_$C(30)
+	. Q
+	;
+	;User does have BSDXZMGR or XUPROGMODE keys, so
+	;$O THRU BSDX RESOURCE GROUP file directly
+	I BSDXMGR S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXDEPT(BSDXIEN)) Q:'+BSDXIEN  D
+	. Q:'$D(^BSDXDEPT(BSDXIEN,0))
+	. S BSDXNOD=^BSDXDEPT(BSDXIEN,0)
+	. S BSDXDEPN=$P(BSDXNOD,U)
+	. S BSDXRES=0 F  S BSDXRES=$O(^BSDXDEPT(BSDXIEN,1,BSDXRES)) Q:'+BSDXRES  D
+	. . N BSDXRESD
+	. . Q:'$D(^BSDXDEPT(BSDXIEN,1,BSDXRES,0))  ; Quit if zero node is invalid in multiple
+	. . S BSDXRESD=$P(^BSDXDEPT(BSDXIEN,1,BSDXRES,0),"^")
+	. . Q:'$D(^BSDXRES(BSDXRESD,0))  ; Quit if zero node of resouce file is invalid
+	   . . ;Q:'$$INDIV2(BSDXRESD)  ; Quit if resource is not in the same division
+	. . S BSDXRNOD=$G(^BSDXRES(BSDXRESD,0))
+	. . Q:BSDXRNOD=""
+	. . ;QUIT if the resource is inactive
+	. . Q:$P(BSDXRNOD,U,2)=1
+	. . S BSDXRESN=$P(BSDXRNOD,U)
+	. . S BSDXI=BSDXI+1
+	. . S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXDEPN_U_BSDXRES_U_BSDXRESN_U_BSDXRESD_$C(30)
+	. . Q
+	. Q
+	;
+	S ^BSDXTMP($J,BSDXI+1)=$C(31)_BSDXERR
+	Q
+	;
+APSEC(BSDXKEY,BSDXDUZ)	;EP - Return TRUE (1) if user has keys BSDXKEY or XUPROGMODE, otherwise, returns FALSE (0)
+	;
+	N BSDXIEN,BSDXPROG,BSDXPKEY
+	I '$G(BSDXDUZ) Q 0
+	;
+	;Test for programmer mode key
+	S BSDXPROG=0
+	I $D(^DIC(19.1,"B","XUPROGMODE")) D
+	. S BSDXPKEY=$O(^DIC(19.1,"B","XUPROGMODE",0))
+	. I '+BSDXPKEY Q
+	. I '$D(^VA(200,BSDXDUZ,51,BSDXPKEY,0)) Q
+	. S BSDXPROG=1
+	I BSDXPROG Q 1
+	;
+	I BSDXKEY="" Q 0
+	I '$D(^DIC(19.1,"B",BSDXKEY)) Q 0
+	S BSDXIEN=$O(^DIC(19.1,"B",BSDXKEY,0))
+	I '+BSDXIEN Q 0
+	I '$D(^VA(200,BSDXDUZ,51,BSDXIEN,0)) Q 0
+	Q 1
+SP(BSDXY,PARAM,YESNO)	; Save Param at User Level - EP
+	; Called by RPC: BSDX SET PARAM
+	; Input:
+	; - Param: Name of Parameter (prog name of course)
+	; - Yes/No: 1 or 0
+	; Output: Error Code as string; 0 is good
+	;
+	; Security Protection
+	IF $EXTRACT(PARAM,1,4)'="BSDX" S BSDXY="-1^BSDX Params only allowed" QUIT
+	;
+	N ERROR
+	D PUT^XPAR("USR",PARAM,1,YESNO,.ERROR)
+	S BSDXY=$G(ERROR)
+	QUIT
+	;
+GP(BSDXY,PARAM)	; Get Param - EP
+	; Called by RPC: BSDX GET PARAM
+	; Input: Name of Parameter
+	; Output: Value of parameter: 0 or 1, for now.
+	;
+	S BSDXY=$$GET^XPAR("USR^LOC^SYS^PKG",PARAM,1,"I")
+	QUIT
+	;
+INDIV(BSDXSC)	; PEP - Is ^SC clinic in the same DUZ(2) as user?
+	   ; Input: BSDXSC - Hospital Location IEN
+	   ; Output: True or False
+	   I '+BSDXSC QUIT 1  ;If not tied to clinic, yes
+	   I '$D(^SC(BSDXSC,0)) QUIT 1 ; If Clinic does not exist, yes
+	   ; Jump to Division:Medical Center Division:Inst File Pointer for
+	   ; Institution IEN (and get its internal value)
+	   N DIV S DIV=$$GET1^DIQ(44,BSDXSC_",","3.5:.07","I")
+	   I DIV="" Q 1 ; If clinic has no division, consider it avial to user.
+	   I DIV=DUZ(2) Q 1 ; If same, then User is in same Div as Clinic
+	   E  Q 0 ; Otherwise, no
+	   QUIT
+INDIV2(BSDXRES)	; PEP - Is Resource in the same DUZ(2) as user?
+	   ; Input BSDXRES - BSDX RESOURCE IEN
+	   ; Output: True of False
+	   Q $$INDIV($P($G(^BSDXRES(BSDXRES,0)),U,4)) ; Extract Hospital Location and send to $$INDIV
+UnitTestINDIV	
+	   W "Testing if they are the same",!
+	   S DUZ(2)=67
+	   I '$$INDIV(1) W "ERROR",!
+	   I '$$INDIV(2) W "ERROR",!
+	   W "Testing if Div not defined in 44, should be true",!
+	   I '$$INDIV(3) W "ERROR",!
+	   W "Testing empty string. Should be true",!
+	   I '$$INDIV("") W "ERROR",!
+	   W "Testing if they are different",!
+	   S DUZ(2)=899
+	   I $$INDIV(1) W "ERROR",!
+	   I $$INDIV(2) W "ERROR",!
+	   QUIT
+UnitTestINDIV2	
+	   W "Testing if they are the same",!
+	   S DUZ(2)=69
+	   I $$INDIV2(22)'=0 W "ERROR",!
+	   I $$INDIV2(25)'=1 W "ERROR",!
+	   I $$INDIV2(26)'=1 W "ERROR",!
+	   I $$INDIV2(27)'=1 W "ERROR",!
+	   QUIT
Index: Scheduling/branches/Radiology-Support/m/BSDX02.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX02.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX02.m	(revision 1134)
@@ -0,0 +1,117 @@
+BSDX02	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 3/21/11 11:49am
+	;;1.5V3;BSDX;;Mar 16, 2011
+	   ; 
+	   ; Change Log
+	   ; July 15 2010: UJO/SMH - Pass FM dates in instead of US dates for i18n
+	; March 21 2011: UJO/SMH (v 1.5) - Return new fields: Patient SEX, PID, and DOB
+	;
+	;
+CRSCHD(BSDXY,BSDXRES,BSDXSTART,BSDXEND)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("CRSCH^BSDX02(.BSDXY,BSDXRES,BSDXSTART,BSDXEND)")
+	Q
+	;
+CRSCH(BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXWKIN)	    ;
+	;Called by BSDX CREATE APPT SCHEDULE
+	;Create Resource Appointment Schedule recordset
+	;On error, returns 0 in APPOINTMENTID field and error text in NOTE field
+	;
+	;$O Thru ^BSDXAPPT("ARSRC", RESOURCE, STARTTIME, APPTID)
+	;BMXRES is a | delimited list of resource names
+	;BSDXWKIN - If 1, then return walkins, otherwise skip them
+	;9-27-2004 Added walkin to returned datatable
+	;TODO: Change BSDXRES from names to IDs
+	;
+	N BSDXERR,BSDXIEN,BSDXDEPD,BSDXDEPN,BSDXRESD,BSDXI,BSDXJ,BSDXRESN,BSDXS,BSDXAD,BSDXZ,BSDXQ,BSDXNOD
+	N BSDXPAT,BSDXNOT,BSDXZPCD,BSDXPCD
+	K ^BSDXTMP($J)
+	S BSDXERR=""
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="I00020APPOINTMENTID^D00030START_TIME^D00030END_TIME^D00030CHECKIN^D00030AUXTIME^I00020PATIENTID^T00030PATIENTNAME^T00030RESOURCENAME^I00005NOSHOW^T00020HRN^I00005ACCESSTYPEID^I00005WALKIN^T00250NOTE^T00006SEX^T00040PID^D00030DOB"_$C(30)
+	D ^XBKVAR S X="ETRAP^BSDX02",@^%ZOSF("TRAP")
+	;
+	; S %DT="T",X=BSDXSTART D ^%DT S BSDXSTART=Y
+	; I BSDXSTART=-1 S ^BSDXTMP($J,1)=$C(31) Q
+	; S %DT="T",X=BSDXEND D ^%DT S BSDXEND=Y
+	; I BSDXEND=-1 S ^BSDXTMP($J,1)=$C(31) Q
+	   ;
+	S BSDXI=0
+	D STRES
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+STRES	;
+	F BSDXJ=1:1:$L(BSDXRES,"|") S BSDXRESN=$P(BSDXRES,"|",BSDXJ) D
+	. Q:BSDXRESN=""
+	. Q:'$D(^BSDXRES("B",BSDXRESN))
+	. S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+	. Q:'+BSDXRESD
+	. Q:'$D(^BSDXAPPT("ARSRC",BSDXRESD))
+	. S BSDXS=BSDXSTART-.0001
+	. F  S BSDXS=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+	. . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D STCOMM(BSDXAD,BSDXRESN)
+	Q
+	;
+STCOMM(BSDXAD,BSDXRESN)	     ;
+	;BSDXAD is the appointment IEN
+	N BSDXC,BSDXQ,BSDXZ,BSDXSUBC,BSDXHRN,BSDXPATD,BSDXATID,BSDXISWK
+	Q:'$D(^BSDXAPPT(BSDXAD,0))
+	S BSDXNOD=^BSDXAPPT(BSDXAD,0)
+	Q:$P(BSDXNOD,U,12)]""  ;CANCELLED
+	S BSDXISWK=0
+	S:$P(BSDXNOD,U,13)="y" BSDXISWK=1
+	I +$G(BSDXWKIN) Q:BSDXISWK  ;Don't return walkins if appt is WALKIN and BSDXWKIN is 1
+	S BSDXZ=BSDXAD_"^"
+	F BSDXQ=1:1:4 D
+	. S Y=$P(BSDXNOD,U,BSDXQ)
+	. X ^DD("DD") S Y=$TR(Y,"@"," ")
+	. S BSDXZ=BSDXZ_Y_"^"
+	S BSDXPATD=$P(BSDXNOD,U,5)
+	S BSDXZ=BSDXZ_BSDXPATD_"^" ;PATIENT ID
+	S BSDXPAT=""
+	I BSDXPATD]"",$D(^DPT(BSDXPATD,0)) S BSDXPAT=$P(^DPT(BSDXPATD,0),U)
+	S BSDXZ=BSDXZ_BSDXPAT_"^" ;PATIENT NAME
+	S BSDXZ=BSDXZ_BSDXRESN_"^" ;RESOURCENAME
+	S BSDXZ=BSDXZ_+$P(BSDXNOD,U,10)_"^" ;NOSHOW
+	S BSDXHRN=""
+	I $D(DUZ(2)),DUZ(2)>0 S BSDXHRN=$P($G(^AUPNPAT(BSDXPATD,41,DUZ(2),0)),U,2) ;HRN
+	S BSDXZ=BSDXZ_BSDXHRN_"^"
+	S BSDXATID=$P(BSDXNOD,U,6)
+	S:'+BSDXATID BSDXATID=0 ;UNKNOWN TYPE
+	S BSDXZ=BSDXZ_BSDXATID_"^"_BSDXISWK_"^"
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXZ
+	;NOTE
+	S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXAD,1,BSDXQ)) Q:'+BSDXQ  D
+	. S BSDXNOT=$G(^BSDXAPPT(BSDXAD,1,BSDXQ,0))
+	. S:$E(BSDXNOT,$L(BSDXNOT)-1,$L(BSDXNOT))'=" " BSDXNOT=BSDXNOT_" "
+	. S BSDXI=BSDXI+1
+	. S ^BSDXTMP($J,BSDXI)=BSDXNOT
+	S ^BSDXTMP($J,BSDXI)=^BSDXTMP($J,BSDXI)_U ; Add "^" to separate note from next fields.
+	S BSDXI=BSDXI+1
+	; new code for V1.5. Extra fields to return.
+	N SEX S SEX=$$GET1^DIQ(2,BSDXPATD,.02)  ; SEX
+	N PID S PID=$$GET1^DIQ(2,BSDXPATD,.363) ; PRIMARY LONG ID
+	; Note strange way I retrieve the value. B/c DOB Output Transform
+	; Outputs it in MM/DD/YYYY format, which is ambigous for C#.
+	N DOB S DOB=$$FMTE^XLFDT($$GET1^DIQ(2,BSDXPATD,.03,"I"))  ; DOB
+	S ^BSDXTMP($J,BSDXI)=SEX_U_PID_U_DOB_$C(30)
+	; end new code
+	Q
+	;
+ERR(BSDXI,BSDXERR)	;Error processing
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)="0^^^^^^^^^^^"_BSDXERR_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+ETRAP	;EP Error trap entry
+	D ^%ZTER
+	I '$D(BSDXI) N BSDXI S BSDXI=999999
+	S BSDXI=BSDXI+1
+	D ERR(BSDXI,"BSDX31 Error: "_$G(%ZTERROR))
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX03.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX03.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX03.m	(revision 1134)
@@ -0,0 +1,58 @@
+BSDX03	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+	Q
+	;
+XR2S(BSDXDA)	;EP
+	;XR2 is the ARSRC xref for the
+	;RESOURCE field of the BSDX APPOINTMENT file
+	;Format is ^BSDXAPPT("ARSRC",RESOURCEID,STARTTIME,APPTID)
+	Q:'$D(^BSDXAPPT(BSDXDA,0))
+	N BSDXNOD,BSDXAPPID,BSDXRSID,BSDXS
+	S BSDXNOD=^BSDXAPPT(BSDXDA,0)
+	S BSDXAPPID=BSDXDA
+	S BSDXRSID=$P(BSDXNOD,U,7)
+	Q:'+BSDXAPPID>0
+	Q:'+BSDXRSID>0
+	S BSDXS=$P(BSDXNOD,U)
+	Q:'+BSDXS
+	S ^BSDXAPPT("ARSRC",BSDXRSID,BSDXS,BSDXAPPID)=""
+	Q
+	;
+XR2K(BSDXA)	;EP
+	Q:'$D(^BSDXAPPT(BSDXA,0))
+	N BSDXNOD,BSDXAPPID,BSDXRSID,BSDXS
+	S BSDXNOD=^BSDXAPPT(BSDXA,0)
+	S BSDXAPPID=BSDXA
+	S BSDXRSID=$P(BSDXNOD,U,7)
+	S BSDXS=$P(BSDXNOD,U)
+	Q:'+BSDXAPPID>0
+	Q:'+BSDXRSID>0
+	Q:'+BSDXS>0
+	K ^BSDXAPPT("ARSRC",BSDXRSID,BSDXS,BSDXAPPID)
+	Q
+XR4S(BSDXDA)	;EP
+	;XR4 is the ARSCT xref for the
+	;STARTTIME field of the BSDX ACCESS BLOCK file
+	;Format is ^BSDXAB("ARSCT",RESOURCEID,STARTTIME,DA)
+	Q:'$D(^BSDXAB(BSDXDA,0))
+	N BSDXNOD,BSDXR,BSDXS
+	S BSDXNOD=^BSDXAB(BSDXDA,0)
+	S BSDXR=$P(BSDXNOD,U)
+	S BSDXS=$P(BSDXNOD,U,2)
+	Q:'+BSDXR>0
+	Q:'+BSDXS>0
+	S ^BSDXAB("ARSCT",BSDXR,BSDXS,BSDXDA)=""
+	Q
+	;
+XR4K(BSDXDA)	;EP
+	Q:'$D(^BSDXAB(BSDXDA,0))
+	N BSDXNOD,BSDXR,BSDXS
+	S BSDXNOD=^BSDXAB(BSDXDA,0)
+	S BSDXR=$P(BSDXNOD,U)
+	S BSDXS=$P(BSDXNOD,U,2)
+	Q:'+BSDXR>0
+	Q:'+BSDXS>0
+	K ^BSDXAB("ARSCT",BSDXR,BSDXS,BSDXDA)
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX04.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX04.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX04.m	(revision 1134)
@@ -0,0 +1,164 @@
+BSDX04	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;  ; 2/27/11 6:32am
+	;;1.5V3;BSDX;;Mar 16, 2011
+	; Change Log:
+	; July 11 2010: Pass BSDXSTART and END as FM dates rather than US formatted dates
+	;       for i18n
+	; Feb 27 2010 (v. 1.5) SMH
+	; - Grab multiple resources instead of a single resource. 
+	;   --> Will be passed from C# as | delimited.
+	; - Change in algorithm. Padding part to pad start and end dates to coincide
+	;   --> with schedule now not performed. C# won't need that anymore.
+	;
+	;
+CASSCHD(BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXTYPES,BSDXSRCH)	;EP
+	;
+	;D DEBUG^%Serenji("CASSCH^BSDX04(.BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXTYPES,BSDXSRCH)")
+	;
+	Q
+	;
+CASSET	;EP
+	;Error Trap
+	D ^%ZTER
+	I '$D(BSDXI) N BSDXI S BSDXI=99999
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+CASSCH(BSDXY,BSDXRES,BSDXSTART,BSDXEND,BSDXTYPES,BSDXSRCH)	;EP  -- RPC: BSDX CREATE ASGND SLOT SCHED
+	;Create Assigned Slot Schedule recordset (Access Blocks, Availabilities, etc.)
+	;This call is used both to create a schedule of availability for the calendar display
+	;and to search for availability in the Find Appointment function
+	;
+	;BSDXRES is resources name, delimited by |
+	;
+	; BSDXSTART and BSDXEND both passed in FM Format.
+	; BSDXSTART is the Date Portion of FM Date
+	; BSDXEND -- pass date and h,m,s as well
+	;
+	;BSDXTYPES is |-delimited list of Access Type Names
+	;If BSDXTYPES is "" then the screen passes all types.
+	;
+	;BSDXSRCH is |-delimited search info for the Find Appointment function
+	;First piece is 1 if we are in a Find Appointment call
+	;Second piece is weekday info in the format MTWHFSU
+	;Third piece is AM PM info in the form AP
+	;If 2nd or 3rd pieces are null, the screen for that piece is skipped
+	;
+	;Test lines:
+	;D CASSCH^BSDX04(.RES,"REMILLARD,MIKE","<fmdate>","<fmdate>") ZW RES
+	;BSDX CREATE ASGND SLOT SCHED^ROGERS,BUCK^<fmdate>^<fmdate>^2
+	;S ^HW("BSDX04")=BSDXRES_U_BSDXSTART_U_BSDXEND
+	;
+	N BSDXERR,BSDXIEN,BSDXDEP,BSDXTYPED,BSDXTYPE,BSDXBS,BSDXI,BSDXNEND,BSDXNSTART,BSDXPEND,BSDXRESD,BSDXRESN,BSDXS,BSDXZ,BSDXTMP,BSDXQ,BSDXNOT,BSDXNOD,BSDXAD
+	N BSDXSUBCD
+	S X="CASSET^BSDX04",@^%ZOSF("TRAP")
+	K ^BSDXTMP($J)
+	S BSDXERR=""
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="D00030START_TIME^D00030END_TIME^I00010SLOTS^T00030RESOURCE^T00010ACCESS_TYPE^T00250NOTE^I00030AVAILABILITYID"_$C(30)
+	S BSDXI=2
+	;
+	;Get Access Type IDs
+	N BSDXK,BSDXTYPED,BSDXL
+	I '+BSDXSRCH S BSDXTYPED=""
+	I +BSDXSRCH F BSDXK=1:1:$L(BSDXTYPES,"|") D
+	. S BSDXL=$P(BSDXTYPES,"|",BSDXK)
+	. I BSDXL="" S $P(BSDXTYPED,"|",BSDXK)=0 Q
+	. I '$D(^BSDXTYPE("B",BSDXL)) S $P(BSDXTYPED,"|",BSDXK)=0 Q
+	. S $P(BSDXTYPED,"|",BSDXK)=$O(^BSDXTYPE("B",BSDXL,0))
+	;
+	N BSDXCOUN ; Counter
+	FOR BSDXCOUN=1:1:$L(BSDXRES,"|") DO  ;smh - d in algo to do multiple res
+	. S BSDXRESN=$P(BSDXRES,"|",BSDXCOUN)
+	. Q:BSDXRESN=""
+	. Q:'$D(^BSDXRES("B",BSDXRESN))
+	. S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0)) 
+	. Q:'+BSDXRESD
+	. Q:'$D(^BSDXAB("ARSCT",BSDXRESD))
+	. S BSDXBS=0
+	. D STRES(BSDXRESN,BSDXRESD)
+	. Q
+	;
+	; V 1.5 -- All of this commented out; algo changed on C# side.
+	;start, end, slots, resource, accesstype, note, availabilityid
+	;I '+BSDXSRCH,BSDXALO D
+	; I BSDXALO D
+	; . ;If first block start time > input start time then pad with new block
+	; . I BSDXBS>BSDXSTART K BSDXTMP D
+	; . . S Y=BSDXSTART X ^DD("DD") S Y=$TR(Y,"@"," ")
+	; . . S BSDXTMP=Y
+	; . . S Y=BSDXBS X ^DD("DD") S Y=$TR(Y,"@"," ")
+	; . . S BSDXTMP=BSDXTMP_"^"_Y_"^0^"_BSDXRESN_"^0^^0"_$C(30)
+	; . . S ^BSDXTMP($J,1)=BSDXTMP
+	; . ;
+	; . ;If first block start time < input start time then trim
+	; . I BSDXBS<BSDXSTART D
+	; . . S Y=BSDXSTART
+	; . . X ^DD("DD") S Y=$TR(Y,"@"," ")
+	; . . S $P(^BSDXTMP($J,2),U,1)=Y
+	; . ;
+	; . ;If last block end time < input end time then pad end with new block
+	; . I BSDXPEND<BSDXEND D
+	; . . S Y=BSDXPEND X ^DD("DD") S Y=$TR(Y,"@"," ")
+	; . . S BSDXTMP=Y
+	; . . S Y=BSDXEND X ^DD("DD") S Y=$TR(Y,"@"," ")
+	; . . S BSDXTMP=BSDXTMP_"^"_Y_"^0^"_BSDXRESN_"^0^^0"_$C(30)
+	; . . S ^BSDXTMP($J,BSDXI-1)=BSDXTMP
+	; . ;
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+STRES(BSDXRESN,BSDXRESD)	;
+	;BSDXRESD is a Resource ID
+	;$O THRU "ARSCT" XREF OF ^BSDXAB
+	S BSDXS=$P(BSDXSTART,"."),BSDXS=BSDXS-.0001
+	S BSDXNEND=0,BSDXNSTART=0,BSDXPEND=0
+	F  S BSDXS=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+	. S BSDXAD=0 F  S BSDXAD=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D STCOMM(BSDXRESN,BSDXRESD,BSDXS,BSDXAD) ;BSDXAD Is the AvailabilityID
+	. Q
+	Q
+	;
+STCOMM(BSDXRESN,BSDXRESD,BSDXS,BSDXAD)	;
+	N BSDXNSTART,BSDXNEND,BSDXNOD,Y,BSDXQ,BSDXZ,BSDXATID,BSDXATOK
+	Q:'$D(^BSDXAB(BSDXAD,0))
+	S BSDXNOD=^BSDXAB(BSDXAD,0)
+	S BSDXATID=$P(BSDXNOD,U,5)
+	;
+	;Screen for Access Type
+	;S BSDXATOK=0
+	;I BSDXTYPED="" S BSDXATOK=1
+	;E  D
+	;. F J=1:1:$L(BSDXTYPED,"|") I BSDXATID=$P(BSDXTYPED,"|",J) S BSDXATOK=1 Q
+	;Q:'BSDXATOK
+	;
+	;I +BSDXSRCH
+	;Screen for Weekday
+	;
+	;Screen for AM PM
+	;
+	S BSDXZ=""
+	S BSDXNSTART=$P(BSDXNOD,U,2)
+	S BSDXNEND=$P(BSDXNOD,U,3)
+	I BSDXNEND'>BSDXSTART Q  ;End is less than start
+	I +BSDXBS=0 S BSDXBS=$P(BSDXNOD,U,2) ;First block start time
+	F BSDXQ=2:1:3 D  ;Start and End times
+	. S Y=$P(BSDXNOD,U,BSDXQ)
+	. X ^DD("DD") S Y=$TR(Y,"@"," ")
+	. S BSDXZ=BSDXZ_Y_"^"
+	S BSDXZ=BSDXZ_$P(BSDXNOD,U,4)_"^" ;SLOTS
+	S BSDXZ=BSDXZ_BSDXRESN_"^" ;Resource name
+	S BSDXZ=BSDXZ_BSDXATID_"^" ;Access type ID
+	S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAB(BSDXAD,1,BSDXQ)) Q:'+BSDXQ  D
+	. S BSDXNOT=BSDXNOT_$G(^BSDXAB(BSDXAD,1,BSDXQ,0))_" "
+	S BSDXZ=BSDXZ_BSDXNOT ;_"^"
+	;I '+BSDXSRCH,BSDXPEND,BSDXNSTART>BSDXPEND D  ;Fill in gap between appointment
+	I BSDXPEND,BSDXNSTART>BSDXPEND D  ;Fill in gap between appointment
+	. S Y=BSDXPEND X ^DD("DD") S Y=$TR(Y,"@"," ")
+	. S BSDXTMP=Y
+	. S Y=BSDXNSTART X ^DD("DD") S Y=$TR(Y,"@"," ")
+	. S BSDXTMP=BSDXTMP_"^"_Y_"^0^"_BSDXRESN_"^0^^0"_$C(30)
+	. S ^BSDXTMP($J,BSDXI-1)=BSDXTMP
+	S BSDXPEND=BSDXNEND
+	S ^BSDXTMP($J,BSDXI)=BSDXZ_"^"_BSDXAD_$C(30)
+	S BSDXI=BSDXI+2
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX05.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX05.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX05.m	(revision 1134)
@@ -0,0 +1,68 @@
+BSDX05	 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 5:36pm
+	   ;;1.5V3;BSDX;;Mar 16, 2011
+	   ;
+	   ; Change Log:
+	   ; UJO/SMH - July 11 2010: pass FM Dates for Start and End rather than US Dates
+	   ; UJO/SMH - Dec 8 2010: In STCOMM, the logic was that an appointment 
+	   ;  that was a walk-in didn't count towards slot calculations.
+	   ;  I checked PIMS, and Walk-ins do indeed count towards slot calculations.
+	   ;  Therefore, I commented this line out:
+	   ;    ;Q:$P(BSDXNOD,U,13)="y"  ;WALKIN
+	   ;
+APBLKOV(BSDXY,BSDXSTART,BSDXEND,BSDXRES)	    ;EP
+	   ;Called by BSDX APPT BLOCKS OVERLAP
+	      ; July 11 2010 - pass FM Dates for Start and End rather than US Dates
+	   ;(Duplicates old qryAppointmentBlocksOverlapB)
+	   ;BSDXRES is resource name
+	   ;
+	   ;Test lines:
+	   ;D APBLKOV^BSDX05(.RES,"11-8-2000","11-8-2004","WHITT") ZW RES
+	   ;BSDX APPT BLOCKS OVERLAP^11-8-2000^11-8-2004^WHITT
+	   ;S ^HW("BSDXD05")=BSDXSTART_U_BSDXEND_U_BSDXRES
+	   ;
+	   N BSDXERR,BSDXIEN,BSDXDEP,BSDXBS,BSDXI,BSDXNEND,BSDXNSTART,BSDXPEND,BSDXRESD,BSDXRESN,BSDXS,BSDXAD,BSDXNOD
+	   K ^BSDXTMP($J)
+	   S BSDXERR=""
+	   S BSDXY="^BSDXTMP("_$J_")"
+	   S ^BSDXTMP($J,0)="D00030START_TIME^D00030END_TIME"_$C(30)
+	   D
+	   . S BSDXBS=0
+	   . S BSDXEND=BSDXEND+.9999 ;Go to end of day
+	   . S BSDXRESN=BSDXRES
+	   . Q:BSDXRESN=""
+	   . Q:'$D(^BSDXRES("B",BSDXRESN))
+	   . S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+	   . Q:'+BSDXRESD
+	   . Q:'$D(^BSDXAPPT("ARSRC",BSDXRESD))
+	   . D STRES(BSDXRESD,BSDXSTART,BSDXEND)
+	   . Q
+	   ;
+	   S BSDXI=$G(BSDXI)+1
+	   S ^BSDXTMP($J,BSDXI)=$C(31)
+	   Q
+	   ;
+STRES(BSDXRESD,BSDXSTART,BSDXEND)	  ;
+	   ;$O THRU "ARSRC" XREF OF ^BSDXAPPT
+	   ;Start at the beginning of the day -- appts can't overlap days
+	   S BSDXS=$P(BSDXSTART,"."),BSDXS=BSDXS-.0001
+	   S BSDXI=0
+	   F  S BSDXS=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+	   . S BSDXAD=0 F  S BSDXAD=$O(^BSDXAPPT("ARSRC",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D STCOMM(BSDXAD) ;BSDXAD Is the AppointmentID
+	   . Q
+	   Q
+	   ;
+STCOMM(BSDXAD)	 ;
+	   S BSDXNEND=0,BSDXNSTART=0,BSDXPEND=0
+	   Q:'$D(^BSDXAPPT(BSDXAD,0))
+	   S BSDXNOD=^BSDXAPPT(BSDXAD,0)
+	   Q:$P(BSDXNOD,U,10)=1  ;NO-SHOW Flag
+	   Q:$P(BSDXNOD,U,12)]""  ;CANCELLED APPT
+	   ; Q:$P(BSDXNOD,U,13)="y"  ;WALKIN -- new in V 1.42. See top comments.
+	   S BSDXNSTART=$P(BSDXNOD,U)
+	   S BSDXNEND=$P(BSDXNOD,U,2)
+	   I BSDXNEND'>BSDXSTART Q  ;End is less than start
+	   S Y=BSDXNSTART X ^DD("DD") S BSDXNSTART=$TR(Y,"@"," ")
+	   S Y=BSDXNEND X ^DD("DD") S BSDXNEND=$TR(Y,"@"," ")
+	   S BSDXI=BSDXI+1
+	   S ^BSDXTMP($J,BSDXI)=BSDXNSTART_U_BSDXNEND_$C(30)
+	   Q
Index: Scheduling/branches/Radiology-Support/m/BSDX06.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX06.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX06.m	(revision 1134)
@@ -0,0 +1,61 @@
+BSDX06	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 4:51pm
+	;;1.5V3;BSDX;;Mar 16, 2011
+	   ; Change Log:
+	   ; UJO/SMH: July 15 2010: Change in BSDXSTART and BSDXEND: get
+	   ; dates in FM format for i18n
+	;
+	;
+TPBLKOV(BSDXY,BSDXSTART,BSDXEND,BSDXRES)	 ;EP
+	;Called by BSDXD TYPE BLOCKS OVERLAP
+	;(Duplicates old qryTypeBlocksOverlapB)
+	;BSDXRES is resource name
+	;
+	;Test lines:
+	;D TPBLKOV^BSDX06(.RES,"3030513","3030516","REMILLARD,MIKE") ZW RES
+	;BSDX TYPE BLOCKS OVERLAP^303513^3030516^REMILLARD,MIKE
+	;S ^HW("BSDXD06")=BSDXSTART_U_BSDXEND_U_BSDXRES
+	;
+	N BSDXERR,BSDXIEN,BSDXDEP,BSDXBS,BSDXI,BSDXNEND,BSDXNSTART,BSDXPEND,BSDXRESD,BSDXRESN,BSDXS,BSDXTPID,BSDXNOD,BSDXAD
+	K ^BSDXTMP($J)
+	S BSDXERR=""
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="D00030StartTime^D00030EndTime^I00010AppointmentTypeID^I00010AvailabilityID^T00030ResourceName"_$C(30)
+	S BSDXI=0
+	D
+	. S BSDXBS=0
+	. I $L(BSDXEND,".")=1 S BSDXEND=BSDXEND+.9999 ;Go to end of day if only date (not time) is passed
+	. S BSDXRESN=BSDXRES
+	. Q:BSDXRESN=""
+	. Q:'$D(^BSDXRES("B",BSDXRESN))
+	. S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+	. Q:'+BSDXRESD
+	. D STCOMM(BSDXRESN,BSDXRESD)
+	. Q
+	;
+	S BSDXI=$G(BSDXI)+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+STCOMM(BSDXRESN,BSDXRESD)	;EP
+	;
+	Q:'$D(^BSDXAB("ARSCT",BSDXRESD))
+	Q:'$D(^BSDXRES(BSDXRESD,0))
+	;$O THRU "ARSCT" XREF OF ^BSDXAB
+	S BSDXNEND=0,BSDXNSTART=0,BSDXPEND=0
+	;Start at the beginning of the day -- AV Blocks can't overlap days
+	S BSDXS=$P(BSDXSTART,"."),BSDXS=BSDXS-.0001
+	F  S BSDXS=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS)) Q:'+BSDXS  Q:BSDXS>BSDXEND  D
+	. S BSDXAD=0 F  S BSDXAD=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXS,BSDXAD)) Q:'+BSDXAD  D
+	. . Q:'$D(^BSDXAB(BSDXAD,0))
+	. . S BSDXNOD=^BSDXAB(BSDXAD,0)
+	. . S BSDXNSTART=$P(BSDXNOD,U,2)
+	. . S BSDXNEND=$P(BSDXNOD,U,3)
+	. . I BSDXNEND'>BSDXSTART Q
+	. . S Y=BSDXNSTART X ^DD("DD") S BSDXNSTART=$TR(Y,"@"," ")
+	. . S Y=BSDXNEND X ^DD("DD") S BSDXNEND=$TR(Y,"@"," ")
+	. . S BSDXTPID=$P(BSDXNOD,U,5)
+	. . S BSDXI=BSDXI+1
+	. . S ^BSDXTMP($J,BSDXI)=BSDXNSTART_U_BSDXNEND_U_BSDXTPID_U_BSDXAD_U_BSDXRESN_$C(30)
+	. . Q
+	. Q
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX07.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX07.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX07.m	(revision 1134)
@@ -0,0 +1,353 @@
+BSDX07	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS  ; 3/15/11 11:50am
+	   ;;1.5V3;BSDX;;Mar 16, 2011
+	   ;
+	   ; Change Log:
+	   ; UJO/SMH
+	   ; v1.3 July 13 2010 - Add support i18n - Dates input as FM dates, not US.
+	   ; v1.42 Oct 22 2010 - Transaction now restartable by providing arguments
+	   ;   thanks to Rick Marshall and Zach Gonzalez at Oroville.
+	   ; v1.42 Oct 30 2010 - Extensive refactoring.
+	   ; v1.5  Mar 15 2011 - End time does not have to have time anymore.
+	   ;      It could be midnight of the next day
+	   ;
+	   ; Error Reference:
+	   ; -1: Patient Record is locked. This means something is wrong!!!!
+	   ; -2: Start Time is not a valid Fileman date
+	   ; -3: End Time is not a valid Fileman date
+	   ; v1.5:obsolete::-4: End Time does not have time inside of it.
+	   ; -5: BSDXPATID is not numeric
+	   ; -6: Patient Does not exist in ^DPT
+	   ; -7: Resource Name does not exist in B index of BSDX RESOURCE
+	   ; -8: Resouce doesn't exist in ^BSDXRES
+	   ; -9: Couldn't add appointment to BSDX APPOINTMENT
+	   ; -10: Couldn't add appointment to files 2 and/or 44
+	   ; -100: Mumps Error
+	
+APPADDD(BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID)	   ;EP
+	   ;Entry point for debugging
+	   D DEBUG^%Serenji("APPADD^BSDX07(.BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID)")
+	   Q
+	   ;
+UT	; Unit Tests
+	   N ZZZ
+	   ; Test for bad start date
+	   D APPADD(.ZZZ,2100123,3100123.3,2,"Dr Office",30,"Sam's Note",1)
+	   I +$P(^BSDXTMP($J,1),U,2)'=-2 W "Error in -2",!
+	   ; Test for bad end date
+	   D APPADD(.ZZZ,3100123,2100123.3,2,"Dr Office",30,"Sam's Note",1)
+	   I +$P(^BSDXTMP($J,1),U,2)'=-3 W "Error in -3",!
+	   ; Test for end date without time
+	   D APPADD(.ZZZ,3100123.1,3100123,2,"Dr Office",30,"Sam's Note",1)
+	   I +$P(^BSDXTMP($J,1),U,2)'=-4 W "Error in -4",!
+	   ; Test for mumps error
+	   S bsdxdie=1
+	   D APPADD(.ZZZ,3100123.09,3100123.093,2,"Dr Office",30,"Sam's Note",1)
+	   I +$P(^BSDXTMP($J,1),U,2)'=-100 W "Error in -100: M Error",!
+	   K bsdxdie
+	   ; Test for TRESTART
+	   s bsdxrestart=1
+	   D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1)
+	   I +$P(^BSDXTMP($J,1),U,2)'=0&(+$P(^BSDXTMP($J,1),U,2)'=-10) W "Error in TRESTART",!
+	   k bsdxrestart
+	   ; Test for non-numeric patient
+	   D APPADD(.ZZZ,3100123.09,3100123.093,"CAT,DOG","Dr Office",30,"Sam's Note",1)
+	   I +$P(^BSDXTMP($J,1),U,2)'=-5 W "Error in -5",!
+	   ; Test for a non-existent patient
+	   D APPADD(.ZZZ,3100123.09,3100123.093,8989898989,"Dr Office",30,"Sam's Note",1)
+	   I +$P(^BSDXTMP($J,1),U,2)'=-6 W "Error in -6",!
+	   ; Test for a non-existent resource name
+	   D APPADD(.ZZZ,3100123.09,3100123.093,3,"lkajsflkjsadf",30,"Sam's Note",1)
+	   I +$P(^BSDXTMP($J,1),U,2)'=-7 W "Error in -7",!
+	   ; Test for corrupted resource
+	   ; Can't test for -8 since it requires DB corruption
+	   ; Test for inability to add appointment to BSDX Appointment
+	   ; Also requires something wrong in the DB
+	   ; Test for inability to add appointment to 2,44
+	   ; Test by creating a duplicate appointment
+	   D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1)
+	   D APPADD(.ZZZ,3100123.09,3100123.093,3,"Dr Office",30,"Sam's Note",1)
+	   I +$P(^BSDXTMP($J,1),U,2)'=-10 W "Error in -10",!
+	   ; Test for normality:
+	   D APPADD(.ZZZ,3110123.09,3110123.093,3,"Dr Office",30,"Sam's Note",1)
+	   ; Does Appt exist?
+	   N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+	   I 'APPID W "Error Making Appt-1" QUIT
+	   I +^BSDXAPPT(APPID,0)'=3110123.09 W "Error Making Appt-2"
+	   I '$D(^DPT(3,"S",3110123.09)) W "Error Making Appt-3"
+	   I '$D(^SC(2,"S",3110123.09)) W "Error Making Appt-4"
+	   QUIT
+	   ; 
+APPADD(BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID)	;EP
+	   ;Called by RPC: BSDX ADD NEW APPOINTMENT
+	   ;
+	   ;Add new appointment to 3 files
+	   ; - BSDX APPOINTMENT
+	   ; - Hosp Location Appointment SubSubfile if Resource is linked to clinic
+	   ; - Patient Appointment Subfile if Resource is linked to clinic
+	   ;
+	   ;Paramters:
+	   ;BSDXY: Global Return (RPC must be set to Global Array)
+	   ;BSDXSTART: FM Start Date
+	   ;BSDXEND: FM End Date
+	   ;BSDXPATID: Patient DFN
+	   ;BSDXRES is ResourceName in BSDX RESOURCE file (not IEN)
+	   ;BSDXLEN is the appointment duration in minutes
+	   ;BSDXNOTE is the Appiontment Note
+	   ;BSDXATID is used for 2 purposes:
+	   ; if BSDXATID = "WALKIN" then BSDAPI is called to create a walkin appt.
+	   ; if BSDXATID = a number, then it is the access type id (used for rebooking)
+	   ;
+	   ;Return:
+	   ; ADO.net Recordset having fields:
+	   ; AppointmentID and ErrorNumber
+	   ;
+	   ;Test lines:
+	   ;BSDX ADD NEW APPOINTMENT^3091122.0930^3091122.1000^370^Dr Office^30^EXAM^WALKIN
+	   ;
+	   ; Return Array; set Return and clear array
+	   S BSDXY=$NA(^BSDXTMP($J))
+	   K ^BSDXTMP($J)
+	   ; $ET
+	   N $ET S $ET="G ETRAP^BSDX07"
+	   ; Counter
+	   N BSDXI S BSDXI=0
+	   ; Lock BSDX node, only to synchronize access to the globals.
+	   ; It's not expected that the error will ever happen as no filing
+	   ; is supposed to take 5 seconds.
+	   L +^BSDXAPPT(BSDXPATID):5 I '$T D ERR(BSDXI,"-1~Patient record is locked. Please contact technical support.") Q
+	   ; Header Node
+	   S ^BSDXTMP($J,BSDXI)="I00020APPOINTMENTID^T00100ERRORID"_$C(30)
+	   ;Restartable Transaction; restore paramters when starting.
+	   ; (Params restored are what's passed here + BSDXI)
+	   TSTART (BSDXY,BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXLEN,BSDXNOTE,BSDXATID,BSDXI):T="BSDX ADD NEW APPOINTMENT^BSDX07"
+	   ;
+	   ; Turn off SDAM APPT PROTOCOL BSDX Entries
+	   N BSDXNOEV
+	   S BSDXNOEV=1 ;Don't execute BSDX ADD APPOINTMENT protocol
+	   ;
+	   ; Set Error Message to be empty
+	   N BSDXERR S BSDXERR=0
+	   ;
+	   ;;;test for error inside transaction. See if %ZTER works
+	   I $G(bsdxdie) S X=1/0
+	   ;;;test
+	   ;;;test for TRESTART
+	   I $G(bsdxrestart) K bsdxrestart TRESTART
+	   ;;;test
+	   ;
+	   ; -- Start and End Date Processing --
+	   ; If C# sends the dates with extra zeros, remove them
+	   S BSDXSTART=+BSDXSTART,BSDXEND=+BSDXEND
+	   ; Are the dates valid? Must be FM Dates > than 2010
+	   I BSDXSTART'>3100000 D ERR(BSDXI,"-2~BSDX07 Error: Invalid Start Time") Q
+	   I BSDXEND'>3100000 D ERR(BSDXI,"-3~BSDX07 Error: Invalid End Time") Q
+	   ;
+	   ;; If Ending date doesn't have a time, this is an error --rm 1.5
+	   ; I $L(BSDXEND,".")=1 D ERR(BSDXI,"-4~BSDX07 Error: Invalid End Time") Q
+	   ;
+	   ; If the Start Date is greater than the end date, swap dates
+	   N BSDXTMP
+	   I BSDXSTART>BSDXEND S BSDXTMP=BSDXEND,BSDXEND=BSDXSTART,BSDXSTART=BSDXTMP
+	   ;
+	   ; Check if the patient exists:
+	   ; - DFN valid number?
+	   ; - Valid Patient in file 2?
+	   I '+BSDXPATID D ERR(BSDXI,"-5~BSDX07 Error: Invalid Patient ID") Q 
+	   I '$D(^DPT(BSDXPATID,0)) D ERR(BSDXI,"-6~BSDX07 Error: Invalid Patient ID") Q
+	   ;
+	   ;Validate Resource entry
+	   I '$D(^BSDXRES("B",BSDXRES)) D ERR(BSDXI,"-7~BSDX07 Error: Invalid Resource ID") Q
+	   N BSDXRESD ; Resource IEN
+	   S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0))
+	   N BSDXRNOD ; Resouce zero node
+	   S BSDXRNOD=$G(^BSDXRES(BSDXRESD,0))
+	   I BSDXRNOD="" D ERR(BSDXI,"-8~BSDX07 Error: invalid Resource entry.") Q
+	   ;
+	   ; Walk-in (Unscheduled) Appointment?
+	   N BSDXWKIN S BSDXWKIN=0
+	   I BSDXATID="WALKIN" S BSDXWKIN=1
+	   ; Reset Access Type ID if it doesn't say "WALKIN" and isn't a number
+	   I BSDXATID'?.N&(BSDXATID'="WALKIN") S BSDXATID=""
+	   ;
+	   ; Done with all checks, let's make appointment in BSDX APPOINTMENT
+	   N BSDXAPPTID
+	   S BSDXAPPTID=$$BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRESD,BSDXATID)
+	   I 'BSDXAPPTID D ERR(BSDXI,"-9~BSDX07 Error: Unable to add appointment to BSDX APPOINTMENT file.") Q
+	   I BSDXNOTE]"" D BSDXWP(BSDXAPPTID,BSDXNOTE)
+	   ;
+	   ; Then Create Subfiles in 2/44 Appointment
+	   N BSDXSCD S BSDXSCD=$P(BSDXRNOD,U,4)  ; Hosp Location IEN
+	   ; Only if we have a valid Hosp Loc can we make an appointment
+	   I +BSDXSCD,$D(^SC(BSDXSCD,0)) D  I +BSDXERR D ERR(BSDXI,"-10~BSDX07 Error: MAKE^BSDXAPI returned error code: "_BSDXERR) Q
+	   . N BSDXC
+	   . S BSDXC("PAT")=BSDXPATID
+	   . S BSDXC("CLN")=BSDXSCD
+	   . S BSDXC("TYP")=3 ;3 for scheduled appts, 4 for walkins
+	   . S:BSDXWKIN BSDXC("TYP")=4
+	   . S BSDXC("ADT")=BSDXSTART
+	   . S BSDXC("LEN")=BSDXLEN
+	   . S BSDXC("OI")=$E($G(BSDXNOTE),1,150) ;File 44 has 150 character limit on OTHER field
+	   . S BSDXC("OI")=$TR(BSDXC("OI"),";"," ") ;No semicolons allowed by MAKE^BSDXAPI
+	   . S BSDXC("OI")=$$STRIP(BSDXC("OI")) ;Strip control characters from note
+	   . S BSDXC("USR")=DUZ
+	   . S BSDXERR=$$MAKE^BSDXAPI(.BSDXC)
+	   . Q:BSDXERR
+	   . ;Update RPMS Clinic availability
+	   . D AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN)
+	   . Q
+	   ;
+	   ;Return Recordset
+	   TCOMMIT
+	   L -^BSDXAPPT(BSDXPATID)
+	   S BSDXI=BSDXI+1
+	   S ^BSDXTMP($J,BSDXI)=BSDXAPPTID_"^"_$C(30)
+	   S BSDXI=BSDXI+1
+	   S ^BSDXTMP($J,BSDXI)=$C(31)
+	   Q
+BSDXDEL(BSDXAPPTID)	;Deletes appointment BSDXAPPTID from BSDXAPPOINTMETN
+	   N DA,DIK
+	   S DIK="^BSDXAPPT(",DA=BSDXAPPTID
+	   D ^DIK
+	   Q
+	   ;
+STRIP(BSDXZ)	   ;Replace control characters with spaces
+	   N BSDXI
+	   F BSDXI=1:1:$L(BSDXZ) I (32>$A($E(BSDXZ,BSDXI))) S BSDXZ=$E(BSDXZ,1,BSDXI-1)_" "_$E(BSDXZ,BSDXI+1,999)
+	   Q BSDXZ
+	   ;
+BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRESD,BSDXATID)	 ;ADD BSDX APPOINTMENT ENTRY
+	   ;Returns ien in BSDXAPPT or 0 if failed
+	   ;Create entry in BSDX APPOINTMENT
+	   N BSDXAPPTID
+	   S BSDXFDA(9002018.4,"+1,",.01)=BSDXSTART
+	   S BSDXFDA(9002018.4,"+1,",.02)=BSDXEND
+	   S BSDXFDA(9002018.4,"+1,",.05)=BSDXPATID
+	   S BSDXFDA(9002018.4,"+1,",.07)=BSDXRESD
+	   S BSDXFDA(9002018.4,"+1,",.08)=$G(DUZ)
+	   S BSDXFDA(9002018.4,"+1,",.09)=$$NOW^XLFDT
+	   S:BSDXATID="WALKIN" BSDXFDA(9002018.4,"+1,",.13)="y"
+	   S:BSDXATID?.N BSDXFDA(9002018.4,"+1,",.06)=BSDXATID
+	   N BSDXIEN,BSDXMSG
+	   D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+	   S BSDXAPPTID=+$G(BSDXIEN(1))
+	   Q BSDXAPPTID
+	   ;
+BSDXWP(BSDXAPPTID,BSDXNOTE)	;
+	   ;Add WP field
+	   I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+	   I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+	   I $D(BSDXNOTE(.5)) D
+	   . D WP^DIE(9002018.4,BSDXAPPTID_",",1,"","BSDXNOTE","BSDXMSG")
+	   Q
+	   ;
+ADDEVT(BSDXPATID,BSDXSTART,BSDXSC,BSDXSCDA)	;EP
+	   ;Called by BSDX ADD APPOINTMENT protocol
+	   ;BSDXSC=IEN of clinic in ^SC
+	   ;BSDXSCDA=IEN for ^SC(BSDXSC,"S",BSDXSTART,1,BSDXSCDA). Use to get Length & Note
+	   ;
+	   N BSDXNOD,BSDXLEN,BSDXAPPTID,BSDXNODP,BSDXWKIN,BSDXRES
+	   Q:+$G(BSDXNOEV)
+	   I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0))
+	   E  I $D(^BSDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0))
+	   Q:'+$G(BSDXRES)
+	   S BSDXNOD=$G(^SC(BSDXSC,"S",BSDXSTART,1,BSDXSCDA,0))
+	   Q:BSDXNOD=""
+	   S BSDXNODP=$G(^DPT(BSDXPATID,"S",BSDXSTART,0))
+	   S BSDXWKIN=""
+	   S:$P(BSDXNODP,U,7)=4 BSDXWKIN="WALKIN" ;Purpose of Visit field of DPT Appointment subfile
+	   S BSDXLEN=$P(BSDXNOD,U,2)
+	   Q:'+BSDXLEN
+	   S BSDXEND=$$FMADD^XLFDT(BSDXSTART,0,0,BSDXLEN,0)
+	   S BSDXAPPTID=$$BSDXADD(BSDXSTART,BSDXEND,BSDXPATID,BSDXRES,BSDXWKIN)
+	   Q:'+BSDXAPPTID
+	   S BSDXNOTE=$P(BSDXNOD,U,4)
+	   I BSDXNOTE]"" D BSDXWP(BSDXAPPTID,BSDXNOTE)
+	   D ADDEVT3(BSDXRES)
+	   Q
+	   ;
+ADDEVT3(BSDXRES)	   ;
+	   ;Call RaiseEvent to notify GUI clients
+	   N BSDXRESN
+	   S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+	   Q:BSDXRESN=""
+	   S BSDXRESN=$P(BSDXRESN,"^")
+	   ;D EVENT^BSDX23("SCHEDULE-"_BSDXRESN,"","","")
+	   D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+	   Q
+	   ;
+ERR(BSDXI,BSDXERR)	 ;Error processing
+	   S BSDXI=BSDXI+1
+	   S BSDXERR=$TR(BSDXERR,"^","~")
+	   I $TL>0 TROLLBACK
+	   S ^BSDXTMP($J,BSDXI)="0^"_BSDXERR_$C(30)
+	   S BSDXI=BSDXI+1
+	   S ^BSDXTMP($J,BSDXI)=$C(31)
+	   L -^BSDXAPPT(BSDXPATID)
+	   Q
+	   ;
+ETRAP	  ;EP Error trap entry
+	   N $ET S $ET="D ^%ZTER HALT"  ; Emergency Error Trap
+	   ; Rollback, otherwise ^XTER will be empty from future rollback
+	   I $TL>0 TROLLBACK 
+	   D ^%ZTER
+	   S $EC=""  ; Clear Error
+	   ; Log error message and send to client
+	   I '$D(BSDXI) N BSDXI S BSDXI=0
+	   D ERR(BSDXI,"-100~BSDX07 Error: "_$G(%ZTERZE))
+	   Q
+	   ;
+DAY	;;^SUN^MON^TUES^WEDNES^THURS^FRI^SATUR
+	   ;
+DOW	S %=$E(X,1,3),Y=$E(X,4,5),Y=Y>2&'(%#4)+$E("144025036146",Y)
+	   F %=%:-1:281 S Y=%#4=1+1+Y
+	   S Y=$E(X,6,7)+Y#7
+	   Q
+	   ;
+AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN)	  ;Update RPMS Clinic availability
+	   ;SEE SDM1
+	   N Y,DFN
+	   N SL,STARTDAY,X,SC,SB,HSI,SI,STR,SDDIF,SDMAX,SDDATE,SDDMAX,SDSDATE,CCXN,MXOK,COV,SDPROG
+	   N X1,SDEDT,X2,SD,SM,SS,S,SDLOCK,ST,I
+	   S Y=BSDXSCD,DFN=BSDXPATID
+	   S SL=$G(^SC(+Y,"SL")),X=$P(SL,U,3),STARTDAY=$S($L(X):X,1:8),SC=Y,SB=STARTDAY-1/100,X=$P(SL,U,6),HSI=$S(X=1:X,X:X,1:4),SI=$S(X="":4,X<3:4,X:X,1:4),STR="#@!$* XXWVUTSRQPONMLKJIHGFEDCBA0123456789jklmnopqrstuvwxyz",SDDIF=$S(HSI<3:8/HSI,1:2) K Y
+	   ;Determine maximum days for scheduling
+	   S SDMAX(1)=$P($G(^SC(+SC,"SDP")),U,2) S:'SDMAX(1) SDMAX(1)=365
+	   S (SDMAX,SDDMAX)=$$FMADD^XLFDT(DT,SDMAX(1))
+	   S SDDATE=BSDXSTART
+	   S SDSDATE=SDDATE,SDDATE=SDDATE\1
+1	  ;L  Q:$D(SDXXX)  S CCXN=0 K MXOK,COV,SDPROT Q:DFN<0  S SC=+SC
+	   Q:$D(SDXXX)  S CCXN=0 K MXOK,COV,SDPROT Q:DFN<0  S SC=+SC
+	   S X1=DT,SDEDT=365 S:$D(^SC(SC,"SDP")) SDEDT=$P(^SC(SC,"SDP"),"^",2)
+	   S X2=SDEDT D C^%DTC S SDEDT=X
+	   S Y=BSDXSTART
+EN1	S (X,SD)=Y,SM=0 D DOW
+S	  I '$D(^SC(SC,"ST",$P(SD,"."),1)) S SS=+$O(^SC(+SC,"T"_Y,SD)) Q:SS'>0  Q:^(SS,1)=""  S ^SC(+SC,"ST",$P(SD,"."),1)=$E($P($T(DAY),U,Y+2),1,2)_" "_$E(SD,6,7)_$J("",SI+SI-6)_^(1),^(0)=$P(SD,".")
+	   S S=BSDXLEN
+	   ;Check if BSDXLEN evenly divisible by appointment length
+	   S RPMSL=$P(SL,U)
+	   I BSDXLEN<RPMSL S BSDXLEN=RPMSL
+	   I BSDXLEN#RPMSL'=0 D
+	   . S BSDXINC=BSDXLEN\RPMSL
+	   . S BSDXINC=BSDXINC+1
+	   . S BSDXLEN=RPMSL*BSDXINC
+	   S SL=S_U_$P(SL,U,2,99)
+SC	 S SDLOCK=$S('$D(SDLOCK):1,1:SDLOCK+1) Q:SDLOCK>9
+	   L +^SC(SC,"ST",$P(SD,"."),1):5 G:'$T SC
+	   S SDLOCK=0,S=^SC(SC,"ST",$P(SD,"."),1)
+	   S I=SD#1-SB*100,ST=I#1*SI\.6+($P(I,".")*SI),SS=SL*HSI/60*SDDIF+ST+ST
+	   I (I<1!'$F(S,"["))&(S'["CAN") L -^SC(SC,"ST",$P(SD,"."),1) Q
+	   I SM<7 S %=$F(S,"[",SS-1) S:'%!($P(SL,"^",6)<3) %=999 I $F(S,"]",SS)'<%!(SDDIF=2&$E(S,ST+ST+1,SS-1)["[") S SM=7
+	   ;
+SP	 I ST+ST>$L(S),$L(S)<80 S S=S_" " G SP
+	   S SDNOT=1
+	   S ABORT=0
+	   F I=ST+ST:SDDIF:SS-SDDIF D  Q:ABORT
+	   . S ST=$E(S,I+1) S:ST="" ST=" "
+	   . S Y=$E(STR,$F(STR,ST)-2)
+	   . I S["CAN"!(ST="X"&($D(^SC(+SC,"ST",$P(SD,"."),"CAN")))) S ABORT=1 Q
+	   . I Y="" S ABORT=1 Q
+	   . S:Y'?1NL&(SM<6) SM=6 S ST=$E(S,I+2,999) S:ST="" ST=" " S S=$E(S,1,I)_Y_ST
+	   . Q
+	   S ^SC(SC,"ST",$P(SD,"."),1)=S
+	   L -^SC(SC,"ST",$P(SD,"."),1)
+	   Q
Index: Scheduling/branches/Radiology-Support/m/BSDX08.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX08.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX08.m	(revision 1134)
@@ -0,0 +1,343 @@
+BSDX08	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 1/25/11 12:39pm
+	;;1.5V3;BSDX;;Mar 16, 2011
+	; 
+	; Original by HMW. New Written by Sam Habiel. Licensed under LGPL.
+	; 
+	; Change History
+	; 3101022 UJO/SMH v1.42
+	;  - Transaction now restartable. Thanks to 
+	;   --> Zach Gonzalez and Rick Marshall for fix.
+	;  - Extra TROLLBACK in Lock Statement when lock fails.
+	;   --> Removed--Rollback is already in ERR tag.
+	;  - Added new statements to old SD code in AVUPDT to obviate
+	;   --> need to restore variables in transaction
+	;  - Refactored this chunk of code. Don't really know whether it 
+	;   --> worked in the first place. Waiting for bug report to know.
+	;  - Refactored all of APPDEL.
+	; 
+	; 3111125 UJO/SMH v1.5
+	;  - Added ability to remove checked in appointments. Added a couple
+	;    of units tests for that under UT2.
+	;  - Minor reformatting because of how KIDS adds tabs.
+	; 
+	; Error Reference:
+	;  -1~BSDX08: Appt record is locked. Please contact technical support.
+	;  -2~BSDX08: Invalid Appointment ID
+	;  -3~BSDX08: Invalid Appointment ID
+	;  -4~BSDX08: Cancelled appointment does not have a Resouce ID  
+	;  -5~BSDX08: Resouce ID does not exist in BSDX RESOURCE
+	;  -6~BSDX08: Invalid Hosp Location stored in Database
+	;  -7~BSDX08: Patient does not have an appointment in PIMS Clinic
+	;  -8^BSDX08: Unable to find associated PIMS appointment for this patient
+	;  -9^BSDX08: BSDXAPI returned an error: (error)
+	;  -100~BSDX08 Error: (Mumps Error)
+	;
+APPDELD(BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT)	;EP
+	;Entry point for debugging
+	D DEBUG^%Serenji("APPDEL^BSDX08(.BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT)")
+	Q
+	;
+UT	; Unit Tests
+	; Test 1: Make normal appointment and cancel it. See if every thing works
+	N ZZZ
+	D APPADD^BSDX07(.ZZZ,3110123.2,3110123.3,4,"Dr Office",10,"Sam's Note",1)
+	S APPID=+$P(^BSDXTMP($J,1),U)
+	D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Sam's Cancel Note")
+	I $P(^BSDXAPPT(APPID,0),U,12)'>0 W "Error in Cancellation-1"
+	I $O(^SC(2,"S",3110123.2,1,0))]"" W "Error in Cancellation-2"
+	I $P(^DPT(4,"S",3110123.2,0),U,2)'="PC" W "Error in Cancellation-3"
+	I ^DPT(4,"S",3110123.2,"R")'="Sam's Cancel Note" W "Error in Cancellation-4"
+	;
+	; Test 2: Check for -1
+	; Make appt
+	D APPADD^BSDX07(.ZZZ,3110125.2,3110125.3,4,"Dr Office",10,"Sam's Note",1)
+	; Lock the node in another job
+	S APPID=+$P(^BSDXTMP($J,1),U)
+	; W "Lock ^BSDXAPPT("_APPID_") in another session. You have 10 seconds." H 10
+	D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Sam's Cancel Note")
+	;
+	; Test 3: Check for -100
+	S bsdxdie=1
+	D APPADD^BSDX07(.ZZZ,3110126.2,3110126.3,4,"Dr Office",10,"Sam's Note",1)
+	S APPID=+$P(^BSDXTMP($J,1),U)
+	D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Reasons")
+	I $P(^BSDXTMP($J,1),"~")'=-100 W "Error in -100",!
+	K bsdxdie
+	;
+	; Test 4: Restartable transaction
+	S bsdxrestart=1
+	D APPADD^BSDX07(.ZZZ,3110128.2,3110128.3,4,"Dr Office",10,"Sam's Note",1)
+	S APPID=+$P(^BSDXTMP($J,1),U)
+	D APPDEL^BSDX08(.ZZZ,APPID,"PC",1,"Reasons")
+	I $P(^DPT(4,"S",3110128.2,0),U,2)'="PC" W "Error in Restartable Transaction",!
+	;
+	; Test 5: for invalid Appointment ID (-2 and -3)
+	D APPDEL^BSDX08(.ZZZ,0,"PC",1,"Reasons")
+	I $P(^BSDXTMP($J,1),"~")'=-2 W "Error in -2",!
+	D APPDEL^BSDX08(.ZZZ,999999,"PC",1,"Reasons")
+	I $P(^BSDXTMP($J,1),"~")'=-3 W "Error in -3",!
+UT2	; More unit Tests
+	;
+	; Test 6: for Cancelling walkin and checked-in appointments 
+	S BSDXSTART=$E($$NOW^XLFDT,1,12),BSDXEND=BSDXSTART+.0001
+	D APPADD^BSDX07(.ZZZ,BSDXSTART,BSDXEND,4,"Dr Office",10,"Sam's Note",1) ; Add appt
+	S APPID=+$P(^BSDXTMP($J,1),U)
+	I APPID=0 W "Error in test 6",!
+	D CHECKIN^BSDX25(.ZZZ,APPID,$$NOW^XLFDT) ; check-in
+	D APPDEL^BSDX08(.ZZZ,APPID,"PC",10,"Cancel Note") ; Delete appt
+	I $P(^BSDXTMP($J,1),$C(30))'="" W "Error in test 6",!
+	;
+	; Test 7: for cancelling walkin and checked-in appointments
+	S BSDXSTART=$E($$NOW^XLFDT,1,12)+.0001,BSDXEND=BSDXSTART+.0001
+	D APPADD^BSDX07(.ZZZ,BSDXSTART,BSDXEND,4,"Dr Office",10,"Sam's Note",1) ; Add appt
+	S APPID=+$P(^BSDXTMP($J,1),U)
+	I APPID=0 W "Error in test 6",!
+	D CHECKIN^BSDX25(.ZZZ,APPID,$$NOW^XLFDT) ; Checkin
+	S BSDXRES=$O(^BSDXRES("B","Dr Office",""))
+	S BSDXCLN=$P(^BSDXRES(BSDXRES,0),U,4)
+	S BSDXRESULT=$$RMCI^BSDXAPI(4,BSDXCLN,BSDXSTART) ; remove checkin
+	D APPDEL^BSDX08(.ZZZ,APPID,"PC",10,"Cancel Note") ; delete appt
+	I $P(^BSDXTMP($J,1),$C(30))'="" W "Error in test 6",!
+	QUIT
+APPDEL(BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT)	       ;EP
+	;Called by RPC: BSDX CANCEL APPOINTMENT
+	;Cancels existing appointment in BSDX APPOINTMENT and 44/2 subfiles
+	;Input Parameters:
+	; - BSDXAPTID is entry number in BSDX APPOINTMENT file
+	; - BSDXTYP is C for clinic-cancelled and PC for patient cancelled
+	; - BSDXCR is pointer to CANCELLATION REASON File (409.2)
+	; - BSDXNOT is user note
+	;
+	; Returns error code in recordset field ERRORID. Empty string is success.
+	; Returns Global Array. Must use this type in RPC.
+	;
+	; Return Array: set Return and clear array
+	S BSDXY=$NA(^BSDXTMP($J))
+	K ^BSDXTMP($J)
+	;
+	; Set min DUZ vars if they don't exist
+	D ^XBKVAR
+	;
+	; $ET
+	N $ET S $ET="G ETRAP^BSDX08"
+	;
+	; Counter
+	N BSDXI S BSDXI=0
+	; Header Node
+	S ^BSDXTMP($J,BSDXI)="T00100ERRORID"_$C(30)
+	;
+	; Lock BSDX node, only to synchronize access to the globals.
+	; It's not expected that the error will ever happen as no filing
+	; is supposed to take 5 seconds.
+	L +^BSDXAPPT(BSDXAPTID):5 I '$T D ERR(BSDXI,"-1~BSDX08: Appt record is locked. Please contact technical support.") Q
+	;
+	;Restartable Transaction; restore paramters when starting.
+	; (Params restored are what's passed here + BSDXI)
+	TSTART (BSDXY,BSDXAPTID,BSDXTYP,BSDXCR,BSDXNOT,BSDXI):T="BSDX CANCEL APPOINTEMENT^BSDX08"
+	;
+	; Turn off SDAM APPT PROTOCOL BSDX Entries
+	N BSDXNOEV
+	S BSDXNOEV=1 ;Don't execute BSDX CANCEL APPOINTMENT protocol
+	;
+	;;;test for error inside transaction. See if %ZTER works
+	I $G(bsdxdie) S X=1/0
+	;;;test
+	;;;test for TRESTART
+	I $G(bsdxrestart) K bsdxrestart TRESTART
+	;;;test
+	;
+	; Check appointment ID and whether it exists
+	I '+BSDXAPTID D ERR(BSDXI,"-2~BSDX08: Invalid Appointment ID") Q
+	I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(BSDXI,"-3~BSDX08: Invalid Appointment ID") Q
+	;
+	; Start Processing:
+	; First, add cancellation date to appt entry in BSDX APPOINTMENT
+	N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPTID,0) ; BSDX Appt Node
+	N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) ; Patient ID
+	N BSDXSTART S BSDXSTART=$P(BSDXNOD,U) ; Start Time
+	D BSDXCAN(BSDXAPTID)  ; Add a cancellation date in BSDX APPOINTMENT
+	;
+	; Second, cancel appt in "S" nodes in file 2 and 44, then update Legacy PIMS Availability
+	N BSDXSC1 S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID
+	; If the resouce id doesn't exist...
+	I BSDXSC1="" D ERR(BSDXI,"-4~BSDX08: Cancelled appointment does not have a Resouce ID") QUIT
+	I '$D(^BSDXRES(BSDXSC1,0)) D ERR(BSDXI,"-5~BSDX08: Resouce ID does not exist in BSDX RESOURCE") QUIT
+	; Get zero node of resouce
+	S BSDXNOD=^BSDXRES(BSDXSC1,0)
+	; Get Hosp location
+	N BSDXLOC S BSDXLOC=$P(BSDXNOD,U,4)
+	; Error indicator for Hosp Location filing for getting out of routine
+	N BSDXERR S BSDXERR=0
+	; Only file in 2/44 if there is an associated hospital location
+	I BSDXLOC D  QUIT:BSDXERR  
+	. I '$D(^SC(BSDXLOC,0)) S BSDXERR=1 D ERR(BSDXI,"-6~BSDX08: Invalid Hosp Location stored in Database") QUIT
+	. ; Get the IEN of the appointment in the "S" node of ^SC
+	. N BSDXSCIEN
+	. S BSDXSCIEN=$$SCIEN^BSDXAPI(BSDXPATID,BSDXLOC,BSDXSTART)
+	. I BSDXSCIEN="" S BSDXERR=1 D ERR(BSDXI,"-7~BSDX08: Patient does not have an appointment in PIMS Clinic") QUIT
+	. ; Get the appointment node
+	. S BSDXNOD=$G(^SC(BSDXLOC,"S",BSDXSTART,1,BSDXSCIEN,0))
+	. I BSDXNOD="" S BSDXERR=1 D ERR(BSDXI,"-8^BSDX08: Unable to find associated PIMS appointment for this patient") QUIT
+	. N BSDXLEN S BSDXLEN=$P(BSDXNOD,U,2)
+	. ; Cancel through BSDXAPI
+	. N BSDXZ
+	. D APCAN(.BSDXZ,BSDXLOC,BSDXPATID,BSDXSTART)
+	. I +BSDXZ>0 S BSDXERR=1 D ERR(BSDXI,"-9^BSDX08: BSDXAPI returned an error: "_$P(BSDXZ,U,2)) QUIT
+	. ; Update Legacy PIMS clinic Availability
+	. D AVUPDT(BSDXLOC,BSDXSTART,BSDXLEN)
+	;
+	TCOMMIT
+	L -^BSDXAPPT(BSDXAPTID)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=""_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+AVUPDT(BSDXSCD,BSDXSTART,BSDXLEN)	;Update Legacy PIMS Clinic availability
+	;See SDCNP0
+	N SD,S  ; Start Date
+	S (SD,S)=BSDXSTART 
+	N I ; Clinic IEN in 44
+	S I=BSDXSCD
+	; if day has no schedule in legacy PIMS, forget about this update.
+	Q:'$D(^SC(I,"ST",SD\1,1))
+	N SL ; Clinic characteristics node (length of appt, when appts start etc)
+	S SL=^SC(I,"SL")
+	N X ; Hour Clinic Display Begins
+	S X=$P(SL,U,3)
+	N STARTDAY ; When does the day start?
+	S STARTDAY=$S($L(X):X,1:8) ; If defined, use it; otherwise, 8am
+	N SB ; ?? Who knows? Day Start - 1 divided by 100.
+	S SB=STARTDAY-1/100
+	S X=$P(SL,U,6) ; Now X is Display increments per hour
+	N HSI ; Slots per hour, try 1
+	S HSI=$S(X:X,1:4) ; if defined, use it; otherwise, 4
+	N SI ; Slots per hour, try 2
+	S SI=$S(X="":4,X<3:4,X:X,1:4) ; If slots "", or less than 3, then 4
+	N STR ; ??
+	S STR="#@!$* XXWVUTSRQPONMLKJIHGFEDCBA0123456789jklmnopqrstuvwxyz"
+	N SDDIF ; Slots per hour diff??
+	S SDDIF=$S(HSI<3:8/HSI,1:2)
+	S SL=BSDXLEN ; Dammit, reusing variable; SL now Appt Length from GUI
+	S S=^SC(I,"ST",SD\1,1) ; reusing var again; S now Day Pattern from PIMS
+	N Y ; Hours since start of Date
+	S Y=SD#1-SB*100 ;SD#1=FM Time portion; -SB minus start of day; conv to hrs
+	N ST  ; ??
+	; Y#1 -> Minutes; *SI -> * Slots per hour; \.6 trunc min to hour
+	; Y\1 -> Hours since start of day; * SI: * slots
+	S ST=Y#1*SI\.6+(Y\1*SI) 
+	N SS ; how many slots are supposed to be taken by appointment
+	S SS=SL*HSI/60 ; (nb: try SL: 30 min; HSI: 4 slots)
+	N I
+	I Y'<1 D  ; If Hours since start of Date is greater than 1
+	. ; loop through pattern. Tired of documenting.
+	. F I=ST+ST:SDDIF D  Q:Y=""  Q:SS'>0
+	. . S Y=$E(STR,$F(STR,$E(S,I+1))) Q:Y=""  
+	. . S S=$E(S,1,I)_Y_$E(S,I+2,999)
+	. . S SS=SS-1 
+	. . Q:SS'>0
+	S ^SC(BSDXSCD,"ST",SD\1,1)=S  ; new pattern; global set
+	Q
+	;
+APCAN(BSDXZ,BSDXLOC,BSDXDFN,BSDXSD)	        ;
+	;Cancel appointment for patient BSDXDFN in clinic BSDXSC1
+	;at time BSDXSD
+	N BSDXC,%H
+	S BSDXC("PAT")=BSDXPATID
+	S BSDXC("CLN")=BSDXLOC
+	S BSDXC("TYP")=BSDXTYP
+	S BSDXC("ADT")=BSDXSD
+	S %H=$H D YMD^%DTC
+	S BSDXC("CDT")=X+%
+	S BSDXC("NOT")=BSDXNOT
+	S:'+$G(BSDXCR) BSDXCR=11 ;Other
+	S BSDXC("CR")=BSDXCR
+	S BSDXC("USR")=DUZ
+	;
+	S BSDXZ=$$CANCEL^BSDXAPI(.BSDXC)
+	Q
+	;
+BSDXCAN(BSDXAPTID)	;
+	;Cancel BSDX APPOINTMENT entry
+	N %DT,X,BSDXDATE,Y,BSDXIENS,BSDXFDA,BSDXMSG
+	S %DT="XT",X="NOW" D ^%DT ; X ^DD("DD")
+	S BSDXDATE=Y
+	S BSDXIENS=BSDXAPTID_","
+	S BSDXFDA(9002018.4,BSDXIENS,.12)=BSDXDATE
+	K BSDXMSG
+	D FILE^DIE("","BSDXFDA","BSDXMSG")
+	Q
+	;
+CANEVT(BSDXPAT,BSDXSTART,BSDXSC)	;EP Called by BSDX CANCEL APPOINTMENT event
+	;when appointments cancelled via PIMS interface.
+	;Propagates cancellation to BSDXAPPT and raises refresh event to running GUI clients
+	N BSDXFOUND,BSDXRES
+	Q:+$G(BSDXNOEV)
+	Q:'+$G(BSDXSC)
+	S BSDXFOUND=0
+	I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$CANEVT1(BSDXRES,BSDXSTART,BSDXPAT)
+	I BSDXFOUND D CANEVT3(BSDXRES) Q
+	I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$CANEVT1(BSDXRES,BSDXSTART,BSDXPAT)
+	I BSDXFOUND D CANEVT3(BSDXRES)
+	Q
+	;
+CANEVT1(BSDXRES,BSDXSTART,BSDXPAT)	;
+	;Get appointment id in BSDXAPT
+	;If found, call BSDXCAN(BSDXAPPT) and return 1
+	;else return 0
+	N BSDXFOUND,BSDXAPPT
+	S BSDXFOUND=0
+	Q:'+BSDXRES BSDXFOUND
+	Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND
+	S BSDXAPPT=0 F  S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT  D  Q:BSDXFOUND
+	. S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""
+	. I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q
+	I BSDXFOUND,+$G(BSDXAPPT) D BSDXCAN(BSDXAPPT)
+	Q BSDXFOUND
+	;
+CANEVT3(BSDXRES)	;
+	;Call RaiseEvent to notify GUI clients
+	;
+	N BSDXRESN
+	S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+	Q:BSDXRESN=""
+	S BSDXRESN=$P(BSDXRESN,"^")
+	;D EVENT^BSDX23("SCHEDULE-"_BSDXRESN,"","","")
+	D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+	Q
+	;
+ERR(BSDXI,BSDXERR)	;Error processing
+	S BSDXI=BSDXI+1
+	S BSDXERR=$TR(BSDXERR,"^","~")
+	I $TL>0 TROLLBACK
+	S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	L -^BSDXAPPT(BSDXAPTID)
+	QUIT
+	;
+ETRAP	;EP Error trap entry
+	N $ET S $ET="D ^%ZTER HALT"  ; Emergency Error Trap
+	; Rollback, otherwise ^XTER will be empty from future rollback
+	I $TL>0 TROLLBACK 
+	D ^%ZTER
+	S $EC=""  ; Clear Error
+	; Log error message and send to client
+	I '$D(BSDXI) N BSDXI S BSDXI=0
+	D ERR(BSDXI,"-100~BSDX08 Error: "_$G(%ZTERZE))
+	QUIT
+	;
+	;;;NB: This is code that is unused in both original and port.
+	; ; If not appt in the "S" node is found in ^SC then check associated RPMS Clinic Multiple
+	; I BSDXSCIEN="" D  I 'BSDXZ Q  ;Q:BSDXZ
+	; . S BSDXERR="BSDX08: Unable to find associated RPMS appointment for this patient. "
+	; . S BSDXZ=1
+	; . ; Check if there are associated RPMS clinics. (not currently used) Does the multiple exist? No, then quit
+	; . I '$D(^BSDXRES(BSDXSC1,20)) S BSDXZ=0 QUIT
+	; . ; Loop through the multiple. Get Location and then the ^SC "S" node IEN.
+	; . N BSDX1 S BSDX1=0
+	; . F  S BSDX1=$O(^BSDXRES(BSDXSC1,20,BSDX1)) Q:'+BSDX1  Q:BSDXZ=0  D
+	; . . Q:'$D(^BSDXRES(BSDXSC1,20,BSDX1,0))
+	; . . S BSDXLOC=$P(^BSDXRES(BSDXSC1,20,BSDX1,0),U)
+	; . . S BSDXSCIEN=$$SCIEN^BSDXAPI(BSDXPATID,BSDXLOC,BSDXSTART) I +BSDXSCIEN S BSDXZ=0 Q
Index: Scheduling/branches/Radiology-Support/m/BSDX09.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX09.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX09.m	(revision 1134)
@@ -0,0 +1,196 @@
+BSDX09	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;  ; 10/20/10 4:16pm
+	;;1.5V3;BSDX;;Mar 16, 2011;Build 7
+	;
+	; Change Log:
+	; UJO/TH - v 1.3 on 3100714 - Extra Demographics:
+	; - Email
+	; - Cell Phone
+	; - Country
+	; - + refactoring of routine
+	; 
+	; UJO/TH - v 1.3 on 3100715 - Change SSN to PID and get PID field instead
+	;
+	   ; UJO/TH - v 1.42 on 3101020 - Add Sex field.
+	   ;
+GETREGA(BSDXRET,BSDXPAT)	       ;EP
+	;
+	   ; See below for the returned fields
+	;
+	;For patient with ien BSDXPAT
+	;K ^BSDXTMP($J)
+	S BSDXERR=""
+	S BSDXRET="^BSDXTMP("_$J_")"
+	;
+	N OUT S OUT=$NA(^BSDXTMP($J,0))
+	S $P(@OUT,U,1)="T00030IEN"
+	S $P(@OUT,U,2)="T00030STREET"
+	S $P(@OUT,U,3)="T00030CITY"
+	S $P(@OUT,U,4)="T00030STATE"
+	S $P(@OUT,U,5)="T00030ZIP"
+	S $P(@OUT,U,6)="T00030NAME"
+	S $P(@OUT,U,7)="D00030DOB"
+	S $P(@OUT,U,8)="T00030PID"
+	S $P(@OUT,U,9)="T00030HRN"
+	S $P(@OUT,U,10)="T00030HOMEPHONE"
+	S $P(@OUT,U,11)="T00030OFCPHONE"
+	S $P(@OUT,U,12)="T00030MSGPHONE"
+	S $P(@OUT,U,13)="T00030NOK NAME"
+	S $P(@OUT,U,14)="T00030RELATIONSHIP"
+	S $P(@OUT,U,15)="T00030PHONE"
+	S $P(@OUT,U,16)="T00030STREET"
+	S $P(@OUT,U,17)="T00030CITY"
+	S $P(@OUT,U,18)="T00030STATE"
+	S $P(@OUT,U,19)="T00030ZIP"
+	S $P(@OUT,U,20)="D00030DATAREVIEWED"
+	S $P(@OUT,U,21)="T00030RegistrationComments"
+	S $P(@OUT,U,22)="T00050EMAIL ADDRESS"
+	S $P(@OUT,U,23)="T00020PHONE NUMBER [CELLULAR]"
+	S $P(@OUT,U,24)="T00030COUNTRY"
+	S $P(@OUT,U,25)="T00030SEX"
+	S $E(@OUT,$L(@OUT)+1)=$C(30)
+	;
+	;
+	N BSDXNOD,BSDXNAM,Y,U
+	S U="^"
+	S BSDXY="ERROR"
+	K NAME
+	I '+BSDXPAT S ^BSDXTMP($J,1)=$C(31) Q
+	I '$D(^DPT(+BSDXPAT,0)) S ^BSDXTMP($J,1)=$C(31) Q
+	S BSDXY=""
+	S $P(BSDXY,U)=BSDXPAT
+	;//smh S $P(BSDXY,U,23)=""
+	S $P(BSDXY,U,21)=""
+	S BSDXNOD=^DPT(+BSDXPAT,0)
+	S $P(BSDXY,"^",6)=$P(BSDXNOD,U) ;NAME
+	S $P(BSDXY,"^",8)=$$GET1^DIQ(2,BSDXPAT,"PRIMARY LONG ID") ;PID
+	S Y=$P(BSDXNOD,U,3) I Y]""  X ^DD("DD") S Y=$TR(Y,"@"," ")
+	S $P(BSDXY,"^",7)=Y ;DOB
+	S $P(BSDXY,"^",9)=""
+	I $D(DUZ(2)) I DUZ(2)>0 S $P(BSDXY,"^",9)=$P($G(^AUPNPAT(BSDXPAT,41,DUZ(2),0)),U,2) ;HRN
+	D MAIL
+	D PHONE
+	D NOK
+	D DATAREV
+	;/smh D MEDICARE
+	D REGCMT
+	S $P(BSDXY,"^",22)=$$GET1^DIQ(2,BSDXPAT,"EMAIL ADDRESS")
+	S $P(BSDXY,"^",23)=$$GET1^DIQ(2,BSDXPAT,"PHONE NUMBER [CELLULAR]")
+	S $P(BSDXY,"^",24)=$$GET1^DIQ(2,BSDXPAT,"COUNTRY:DESCRIPTION")
+	S $P(BSDXY,"^",25)=$$GET1^DIQ(2,BSDXPAT,"SEX")
+	N BSDXBEG,BSDXEND,BSDXLEN,BSDXI
+	S BSDXLEN=$L(BSDXY)
+	S BSDXBEG=0,BSDXI=2
+	F  D  Q:BSDXEND=BSDXLEN
+	. S BSDXEND=BSDXBEG+100
+	. S:BSDXEND>BSDXLEN BSDXEND=BSDXLEN
+	. S BSDXI=BSDXI+1
+	. S ^BSDXTMP($J,BSDXI)=$E(BSDXY,BSDXBEG,BSDXEND)
+	. S BSDXBEG=BSDXBEG+101
+	S ^BSDXTMP($J,BSDXI+1)=$C(30)_$C(31)
+	Q
+	;
+MAIL	N BSDXST
+	Q:'$D(^DPT(+BSDXPAT,.11))
+	S BSDXNOD=^DPT(+BSDXPAT,.11)
+	Q:BSDXNOD=""
+	S $P(BSDXY,"^",2)=$E($P(BSDXNOD,U),1,50) ;STREET
+	S $P(BSDXY,"^",3)=$P(BSDXNOD,U,4) ;CITY
+	S BSDXST=$P(BSDXNOD,U,5)
+	I +BSDXST,$D(^DIC(5,+BSDXST,0)) S BSDXST=$P(^DIC(5,+BSDXST,0),U,2)
+	S $P(BSDXY,"^",4)=BSDXST ;STATE
+	S $P(BSDXY,"^",5)=$P(BSDXNOD,U,6) ;ZIP
+	Q
+	;
+PHONE	;PHONE 10,11,12 HOME,OFC,MSG
+	I $D(^DPT(+BSDXPAT,.13)) D
+	. S BSDXNOD=^DPT(+BSDXPAT,.13)
+	. S $P(BSDXY,U,10)=$P(BSDXNOD,U,1)
+	. S $P(BSDXY,U,11)=$P(BSDXNOD,U,2)
+	I $D(^DPT(+BSDXPAT,.121)) D
+	. S BSDXNOD=^DPT(+BSDXPAT,.121)
+	. S $P(BSDXY,U,12)=$P(BSDXNOD,U,10)
+	Q
+	;
+NOK	;NOK
+	;   13 NOK NAME^RELATIONSHIP^PHONE^STREET^CITY^STATE^ZIP
+	N Y,BSDXST
+	I $D(^DPT(+BSDXPAT,.21)) D
+	. S BSDXNOD=^DPT(+BSDXPAT,.21)
+	. S $P(BSDXY,U,13)=$P(BSDXNOD,U,1)
+	. S $P(BSDXY,U,14)=$$VAL^XBDIQ1(9000001,BSDXPAT,2802)
+	. S $P(BSDXY,U,15)=$P(BSDXNOD,U,9)
+	. S $P(BSDXY,U,16)=$P(BSDXNOD,U,3)
+	. S $P(BSDXY,U,17)=$P(BSDXNOD,U,6)
+	. S BSDXST=$P(BSDXNOD,U,7)
+	. I +BSDXST D
+	. . I $D(^DIC(5,+BSDXST,0)) S BSDXST=$P(^DIC(5,+BSDXST,0),U,2),$P(BSDXY,U,18)=BSDXST
+	. S $P(BSDXY,U,19)=$P(BSDXNOD,U,8)
+	Q
+	;
+DATAREV	S $P(BSDXY,U,20)=$P($$VAL^XBDIQ1(9000001,BSDXPAT,16651),"@")
+	Q
+	;
+REGCMT	N BSDXI,BSDXM,BSDXR
+	S BSDXR=""
+	D ENP^XBDIQ1(9000001,BSDXPAT,1301,"BSDXM(")
+	S BSDXI=0 F  S BSDXI=$O(BSDXM(1301,BSDXI)) Q:'+BSDXI  D
+	. S BSDXR=BSDXR_" "_BSDXM(1301,BSDXI)
+	; S $P(BSDXY,U,23)=$TR($E(BSDXR,1,1024),U," ") ; MJL 1/17/2007 //smh
+	S $P(BSDXY,U,21)=$TR($E(BSDXR,1,1024),U," ") ;
+	Q
+	;
+GETMCAID(BSDXY,BSDXPAT)	; not in wv
+	;Returns PATIENTIEN^ENTRY#^MEDICAID#^SUBENTRY#^ELIG.BEGIN^ELIG.END |
+	;File is not dinum
+	N C,N,ASDGX,BSDXM,BSDXBLD,BSDXCNT
+	N BSDXIEN
+	S BSDXBLD=""
+	S BSDXIEN=0
+	S BSDXCNT=1
+	F  S BSDXIEN=$O(^AUPNMCD("B",BSDXPAT,BSDXIEN)) Q:'+BSDXIEN  D
+	. S BSDXNUM=$$VAL^XBDIQ1(9000004,BSDXIEN,.03) ;MCAID#
+	. D ENPM^XBDIQ1(9000004.11,BSDXIEN_",0",".01:.02","ASDGX(")
+	. S C=1,N=0,BSDXM=""
+	. F  S N=$O(ASDGX(N)) Q:'N  D
+	. . S $P(BSDXY,"|",C)=BSDXPAT_U_BSDXIEN_U_BSDXNUM_U_N_U_ASDGX(N,.01)_U_ASDGX(N,.02)
+	. . S C=C+1
+	. . Q
+	. Q
+	Q
+	;
+MEDICARE	; not in WV
+	S $P(BSDXY,U,21)=$$VAL^XBDIQ1(9000003,BSDXPAT,.03)
+	S $P(BSDXY,U,22)=$$VAL^XBDIQ1(9000003,BSDXPAT,.04)
+	Q
+	;
+GETMCARE(BSDXY,BSDXPAT)	     ;
+	;Returns IEN^MEDICARE#^SUFFIX^SUBENTRY#^TYPE^ELIG.BEGIN^ELIG.END |
+	;File is dinum
+	;
+	N ASDGX,C,N,BSDXNUM,BSDXSUF,BSDXBLD
+	S BSDXNUM=$$VAL^XBDIQ1(9000003,BSDXPAT,.03)
+	S BSDXSUF=$$VAL^XBDIQ1(9000003,BSDXPAT,.04)
+	D ENPM^XBDIQ1(9000003.11,BSDXPAT_",0",".01:.03","ASDGX(")
+	S C=1,N=0,BSDXBLD=""
+	F  S N=$O(ASDGX(N)) Q:'N  D
+	. S $P(BSDXY,"|",C)=BSDXPAT_U_BSDXNUM_U_BSDXSUF_U_N_U_ASDGX(N,.03)_U_ASDGX(N,.01)_U_ASDGX(N,.02)
+	. S C=C+1
+	. Q
+	Q
+	;
+GETPVTIN(BSDXY,BSDXPAT)	;
+	;Returns IEN^SUBENTRY^INSURER^POLICYNUMBER^ELIG.BEGIN^ELIG.END|...
+	;File is dinum
+	;
+	N ASDGX,C,N
+	D ENPM^XBDIQ1(9000006.11,BSDXPAT_",0",".01;.02;.06;.07","ASDGX(")
+	S C=1,N=0
+	F  S N=$O(ASDGX(N)) Q:'N  D
+	. S $P(BSDXY,"|",C)=BSDXPAT_U_N_U_ASDGX(N,.01)_U_ASDGX(N,.02)_U_ASDGX(N,.06)_U_ASDGX(N,.07)
+	. S C=C+1
+	. Q
+	Q
+	;
+DFN(FILE,BSDXPAT)	; -- returns ien for file
+	I FILE'[9000004 Q BSDXPAT
+	Q +$O(^AUPNMCD("B",BSDXPAT,0))
Index: Scheduling/branches/Radiology-Support/m/BSDX11.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX11.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX11.m	(revision 1134)
@@ -0,0 +1,71 @@
+BSDX11	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+ENV0100	;EP Version 1.0 Environment check
+	I '$G(IOM) D HOME^%ZIS
+	I '$G(DUZ) W !,"DUZ UNDEFINED OR 0." D SORRY(2) Q
+	I '$L($G(DUZ(0))) W !,"DUZ(0) UNDEFINED OR NULL." D SORRY(2) Q
+	I '(DUZ(0)["@") W:'$D(ZTQUEUED) !,"DUZ(0) DOES NOT CONTAIN AN '@'." D SORRY(2) Q
+	S X=$$GET1^DIQ(200,DUZ,.01)
+	W !!,$$CJ^XLFSTR("Hello, "_$P(X,",",2)_" "_$P(X,","),IOM)
+	W !!,$$CJ^XLFSTR("Checking Environment...",IOM)
+	;
+	;is the PIMS requirement present?
+	I '$$INSTALLD("PIMS*5.3*1003") D
+	.D BMES^XPDUTL("Version 1.0 of the BSDX Package")
+	. D BMES^XPDUTL("Cannot Be Installed Unless")
+	. D BMES^XPDUTL("Patch 1003 of version 5.3 of the PIMS Package has been installed.")
+	. D SORRY(2)
+	. Q
+	;is the BMX requirement present?
+	I '$$INSTALLD("BMX 1.0") D
+	.D BMES^XPDUTL("Version 1.0 of the BSDX Package")
+	. D BMES^XPDUTL("Cannot Be Installed Unless")
+	. D BMES^XPDUTL("version 1.0 of the BMX Package has been installed.")
+	. D SORRY(2)
+	. Q
+	Q
+	;End Environment check
+	;
+V0100	;EP Version 1.0 PostInit
+	;Add Protocol items to BSDAM APPOINTMENT EVENTS protocol
+	;
+	N BSDXDA,BSDXFDA,BSDXDA1,BSDXSEQ,BSDXDAT,BSDXNOD,BSDXIEN,BSDXMSG
+	S BSDXDA=$O(^ORD(101,"B","BSDAM APPOINTMENT EVENTS",0))
+	Q:'+BSDXDA
+	S BSDXDAT="BSDX ADD APPOINTMENT;10.2^BSDX CANCEL APPOINTMENT;10.4^BSDX CHECKIN APPOINTMENT;10.6^BSDX NOSHOW APPOINTMENT;10.8"
+	F J=1:1:$L(BSDXDAT,U) D
+	. K BSDXIEN,BSDXMSG,BSDXFDA
+	. S BSDXNOD=$P(BSDXDAT,U,J)
+	. S BSDXDA1=$P(BSDXNOD,";")
+	. S BSDXSEQ=$P(BSDXNOD,";",2)
+	. S BSDXDA1=$O(^ORD(101,"B",BSDXDA1,0))
+	. Q:'+BSDXDA1
+	. Q:$D(^ORD(101,BSDXDA,10,"B",BSDXDA1))
+	. S BSDXFDA(101.01,"+1,"_BSDXDA_",",".01")=BSDXDA1
+	. S BSDXFDA(101.01,"+1,"_BSDXDA_",","3")=BSDXSEQ
+	. D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+	. Q
+	Q
+	;
+SORRY(X)	;
+	KILL DIFQ
+	S XPDQUIT=X
+	W *7,!,$$CJ^XLFSTR("Sorry....Please fix it.",IOM)
+	Q
+	;
+INSTALLD(BMXPKG)	;
+	;Determine if BMXPKG is present.
+	Q 1
+	;S BSDXFIN=$O(^XPD(9.7,"B","PIMS*5.3*1003",""))
+	S BSDXFIN=$O(^XPD(9.7,"B",BMXPKG,""))
+	I $G(BSDXFIN)="" Q 0
+	S BSDXSTAT=$P($G(^XPD(9.7,BSDXFIN,0)),U,9)
+	;'0' Loaded from Distribution
+	;'1' Queued for Install 
+	;'2' Start of Install 
+	;'3' Install Completed 
+	;'4' FOR De-Installed; 
+	;
+	I BSDXSTAT'=3 Q 0
+	Q 1
Index: Scheduling/branches/Radiology-Support/m/BSDX12.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX12.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX12.m	(revision 1134)
@@ -0,0 +1,76 @@
+BSDX12	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/18/10 2:14pm
+	;;1.5V3;BSDX;;Mar 16, 2011
+	   ; 
+	   ; Change Log:
+	   ; v 1.3 - i18n support - 3100718
+	   ; BSDXSTART and BSDXEND passed in FM Dates, not US dates
+	;
+	;
+AVADD(BSDXY,BSDXSTART,BSDXEND,BSDXTYPID,BSDXRES,BSDXSLOTS,BSDXNOTE)	 ;EP
+	;Called by BSDX ADD NEW AVAILABILITY
+	;Create entry in BSDX ACCESS BLOCK
+	;
+	;BSDXRES is Resource Name
+	;Returns recordset having fields 
+	; AvailabilityID and ErrorNumber
+	;
+	;Test lines:
+	;D AVADD^BSDX12(.RES,"3091227.09","3091227.0930","1","WHITT",2,"SCRATCH AV NOTE") ZW RES
+	;BSDX ADD NEW AVAILABILITY^3091227.09^3091227.0930^1^WHITT^2^SCRATCH AVAILABILITY NOTE
+	;
+	N BSDXERR,BSDXIEN,BSDXDEP,BSDXI,BSDXAVID,BSDXI,BSDXERR,BSDXFDA,BSDXMSG,BSDXRESD
+	K ^BSDXTMP($J)
+	S BSDXERR=0
+	S BSDXI=0
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="I00020AVAILABILITYID^I00020ERRORID"_$C(30)
+	;Check input data for errors
+	   ; i18n - FM Dates passed in
+	; S:BSDXSTART["@0000" BSDXSTART=$P(BSDXSTART,"@")
+	; S:BSDXEND["@0000" BSDXEND=$P(BSDXEND,"@")
+	; S %DT="T",X=BSDXSTART D ^%DT S BSDXSTART=Y
+	; I BSDXSTART=-1 D ERR(70) Q
+	; S %DT="T",X=BSDXEND D ^%DT S BSDXEND=Y
+	; I BSDXEND=-1 D ERR(70) Q
+	   ; Make sure dates are canonical and don't contain extra zeros
+	   S BSDXSTART=+BSDXSTART,BSDXEND=+BSDXEND
+	   ;
+	I $L(BSDXEND,".")=1 D ERR(70) Q
+	I BSDXSTART>BSDXEND S BSDXTMP=BSDXEND,BSDXEND=BSDXSTART,BSDXSTART=BSDXTMP
+	;Validate Access Type
+	I '+BSDXTYPID,'$D(^BSDXTYPE(BSDXTYPID,0)) D ERR(70) Q
+	;Validate Resource
+	I '$D(^BSDXRES("B",BSDXRES)) S BSDXERR=70 D ERR(BSDXERR) Q
+	S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0)) I '+BSDXRESD S BSDXERR=70 D ERR(BSDXERR) Q
+	;
+	;Create entry in BSDX ACCESS BLOCK
+	S BSDXFDA(9002018.3,"+1,",.01)=BSDXRESD
+	S BSDXFDA(9002018.3,"+1,",.02)=BSDXSTART
+	S BSDXFDA(9002018.3,"+1,",.03)=BSDXEND
+	S BSDXFDA(9002018.3,"+1,",.04)=BSDXSLOTS
+	S BSDXFDA(9002018.3,"+1,",.05)=BSDXTYPID
+	K BSDXIEN,BSDXMSG
+	D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+	S BSDXAVID=+$G(BSDXIEN(1))
+	I 'BSDXAVID D ERR(70) Q
+	;
+	;Add WP field
+	I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+	I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+	I $D(BSDXNOTE(.5)) D
+	. D WP^DIE(9002018.3,BSDXAVID_",",1,"","BSDXNOTE","BSDXMSG")
+	;
+	;Return Recordset
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXAVID_"^-1"_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+ERR(ERRNO)	;Error processing
+	S BSDXERR=ERRNO+134234112 ;vbObjectError
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)="0^"_BSDXERR_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX13.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX13.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX13.m	(revision 1134)
@@ -0,0 +1,135 @@
+BSDX13	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 6:05pm
+	;;1.5V3;BSDX;;Mar 16, 2011
+	   ;
+	   ; Change Log:
+	   ; V 1.3 - i18n support - Dates passed to Routine as FM Date - WV/SMH
+	Q
+AVDELDTD(BSDXY,BSDXRESD,BSDXSTART,BSDXEND)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("AVDELDT^BSDX13(.BSDXY,BSDXRESD,BSDXSTART,BSDXEND)")
+	Q
+	;
+AVDELDT(BSDXY,BSDXRESD,BSDXSTART,BSDXEND)	;EP
+	;Cancel availability in a date range
+	;Called by BSDX CANCEL AV BY DATE
+	;
+	;BSDXRESD is BSDX RESOURCE ien
+	;BSDXSTART and BSDXEND are FM dates (change in v 1.3)
+	;
+	S X="ERROR^BSDX13",@^%ZOSF("TRAP")
+	N BMXIEN,BSDXI
+	S BSDXI=0
+	S BSDXY="^BSDXTMP("_$J_")"
+	K ^BSDXTMP($J)
+	S ^BSDXTMP($J,BSDXI)="I00020ERRORID^T00030ERRORTEXT"_$C(30)
+	; S X=BSDXSTART ; commented out *v1.3
+	; S %DT="X" D ^%DT
+	; I Y=-1 D ERR(0,"AVDELDT-BSDX13: Invalid Start Date") Q
+	; S BSDXSTART=$P(Y,".")
+	; S X=BSDXEND
+	; S %DT="X" D ^%DT
+	; I Y=-1 D ERR(0,"AVDELDT-BSDX13: Invalid End Date") Q
+	S BSDXEND=$P(BSDXEND,".")_".99999"
+	I '+BSDXRESD D ERR(0,"AVDELDT-BSDX13: Invalid Resource ID") Q
+	;
+	F  S BSDXSTART=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXSTART)) Q:'+BSDXSTART  Q:BSDXSTART>BSDXEND  D
+	. S BMXIEN=0
+	. F  S BMXIEN=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXSTART,BMXIEN)) Q:'+BMXIEN  D
+	. . D CALLDIK(BMXIEN)
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)="-1^"_$C(30)_$C(31)
+	Q
+ERROR	;
+	D ^%ZTER
+	I '+$G(BSDXI) N BSDXI S BSDXI=999999
+	S BSDXI=BSDXI+1
+	D ERR(0,"BSDX13 M Error: <"_$G(%ZTERZE)_">")
+	Q
+	;
+ERR(BSDXERID,ERRTXT)	;Error processing
+	S:'+$G(BSDXI) BSDXI=999999
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+AVDEL(BSDXY,BSDXAVID)	;EP
+	;Called by BSDX CANCEL AVAILABILITY
+	;Deletes Access block
+	;BSDXAVID is entry number in BSDX AVAILABILITY file
+	;Returns error code in recordset field ERRORID
+	;
+	S X="ERROR^BSDX13",@^%ZOSF("TRAP")
+	N BSDXNOD,BSDXSTART,DIK,DA,BSDXID,BSDXI,BSDXEND,BSDXRSID
+	;
+	S BSDXI=0
+	S BSDXY="^BSDXTMP("_$J_")"
+	K ^BSDXTMP($J)
+	S ^BSDXTMP($J,0)="I00020ERRORID^T00030ERRORTEXT"_$C(30)
+	I '+BSDXAVID D ERR(70) Q
+	I '$D(^BSDXAB(BSDXAVID,0)) D ERR(70) Q
+	;
+	;
+	;TODO: Test for existing appointments in availability block
+	; (corresponds to old qryAppointmentBlocksOverlapC
+	;  and AVBlockHasAppointments)
+	;
+	;I $$APTINBLK(BSDXAVID) D ERR(20) Q
+	;
+	;Delete AVAILABILITY entries
+	D CALLDIK(BSDXAVID)
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)="-1^"_$C(30)_$C(31)
+	Q
+	;
+CALLDIK(BSDXAVID)	;
+	;Delete AVAILABILITY entries
+	;
+	S DIK="^BSDXAB("
+	S DA=BSDXAVID
+	D ^DIK
+	;
+	Q
+	;
+APTINBLK(BSDXAVID)	;
+	;
+	;NOTE: This Subroutine Not called in current version.  Keep code for later use.
+	;
+	;N BSDXS,BSDXID,BSDXHIT,BSDXNOD,BSDXE,BSDXSTART,BSDXEND,BSDXRSID
+	;S BSDXNOD=^BSDXAB(BSDXAVID,0)
+	;S BSDXSTART=$P(BSDXNOD,U,3)
+	;S BSDXEND=$P(BSDXNOD,U,4)
+	;S BSDXRSID=$P(BSDXNOD,U,1)
+	;I '$D(^BSDXDAPRS("ARSRC",BSDXRSID)) Q 0
+	;;If any appointments start at the AV block start time:
+	;I $D(^BSDXDAPRS("ARSRC",BSDXRSID,BSDXSTART)) Q 1
+	;;Find the first appt time BSDXS on the same day as the av block
+	;S BSDXS=$O(^BSDXDAPRS("ARSRC",BSDXRSID,$P(BSDXSTART,".")))
+	;I BSDXS>BSDXEND Q 0
+	;;For all the appts that day with start times less
+	;;than the av block's end time, find any whose end time is
+	;;greater than the av block's start time
+	;S BSDXHIT=0
+	;S BSDXS=BSDXS-.0001
+	;F  S BSDXS=$O(^BSDXDAPRS("ARSRC",BSDXRSID,BSDXS)) Q:'+BSDXS  Q:BSDXS'<BSDXEND  D  Q:BSDXHIT
+	;. S BSDXID=0 F  S BSDXID=$O(^BSDXDAPRS("ARSRC",BSDXRSID,BSDXS,BSDXID)) Q:'+BSDXID  D  Q:BSDXHIT
+	;. . Q:'$D(^BSDXDAPT(BSDXID,0))
+	;. . S BSDXNOD=^BSDXDAPT(BSDXID,0)
+	;. . S BSDXE=$P(BSDXNOD,U,2)
+	;. . I BSDXE>BSDXSTART S BSDXHIT=1 Q
+	;;
+	;I BSDXHIT Q 1
+	Q 0
+	;
+	;ERR(ERRNO) ;Error processing
+	;N BSDXERR
+	;S BSDXERR=ERRNO+134234112 ;vbObjectError
+	;S BSDXI=BSDXI+1
+	;S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+	;S BSDXI=BSDXI+1
+	;S ^BSDXTMP($J,BSDXI)=$C(31)
+	;Q
Index: Scheduling/branches/Radiology-Support/m/BSDX14.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX14.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX14.m	(revision 1134)
@@ -0,0 +1,72 @@
+BSDX14	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+ACCTYPD(BSDXY,BSDXVAL)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("ACCTYP^BSDX14(.BSDXY,BSDXVAL)")
+	Q
+	;
+ACCTYP(BSDXY,BSDXVAL)	;EP
+	;Called by BSDX ADD/EDIT ACCESS TYPE
+	;Add/Edit ACCESS TYPE entry
+	;BSDXVAL is IEN|NAME|INACTIVE|COLOR|RED|GREEN|BLUE
+	;If IEN=0 Then this is a new ACCTYPE
+	;Test Line:
+	;D ACCTYP^BSDX14(.RES,"0|ORAL HYGIENE|false|Red")
+	;
+	S X="ERROR^BSDX14",@^%ZOSF("TRAP")
+	N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXNAM
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="I00020ACCESSTYPEID^T00030ERRORTEXT"_$C(30)
+	I BSDXVAL="" D ERR(0,"BSDX14: Invalid null input Parameter") Q
+	S BSDXIEN=$P(BSDXVAL,"|")
+	I +BSDXIEN D
+	. S BSDX="EDIT"
+	. S BSDXIENS=BSDXIEN_","
+	E  D
+	. S BSDX="ADD"
+	. S BSDXIENS="+1,"
+	;
+	S BSDXNAM=$P(BSDXVAL,"|",2)
+	I BSDXNAM="" D ERR(0,"BSDX14: Invalid null Access Type name.") Q
+	;
+	;Prevent adding entry with duplicate name
+	I $D(^BSDXTYPE("B",BSDXNAM)),$O(^BSDXTYPE("B",BSDXNAM,0))'=BSDXIEN D  Q
+	. D ERR(0,"BSDX14: Cannot have two Access Types with the same name.")
+	. Q
+	;
+	S BSDXINA=$P(BSDXVAL,"|",3)
+	S BSDXINA=$S(BSDXINA="YES":1,1:0)
+	;
+	S BSDXFDA(9002018.35,BSDXIENS,.01)=$P(BSDXVAL,"|",2) ;NAME
+	S BSDXFDA(9002018.35,BSDXIENS,.02)=BSDXINA ;INACTIVE
+	S BSDXFDA(9002018.35,BSDXIENS,.04)=$P(BSDXVAL,"|",4) ;COLOR
+	S BSDXFDA(9002018.35,BSDXIENS,.05)=$P(BSDXVAL,"|",5) ;RED
+	S BSDXFDA(9002018.35,BSDXIENS,.06)=$P(BSDXVAL,"|",6) ;GREEN
+	S BSDXFDA(9002018.35,BSDXIENS,.07)=$P(BSDXVAL,"|",7) ;BLUE
+	K BSDXMSG
+	I BSDX="ADD" D
+	. K BSDXIEN
+	. D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+	. S BSDXIEN=+$G(BSDXIEN(1))
+	E  D
+	. D FILE^DIE("","BSDXFDA","BSDXMSG")
+	S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^-1"_$C(30)_$C(31)
+	Q
+	;
+ERR(BSDXERID,ERRTXT)	;Error processing
+	S:'+$G(BSDXI) BSDXI=999999
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+ERROR	;
+	D ^%ZTER
+	I '+$G(BSDXI) N BSDXI S BSDXI=999999
+	S BSDXI=BSDXI+1
+	D ERR(0,"BSDX14 M Error: <"_$G(%ZTERROR)_">")
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX15.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX15.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX15.m	(revision 1134)
@@ -0,0 +1,75 @@
+BSDX15	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+GRPTYP(BSDXY)	;EP
+	;Called by BSDX GET ACCESS GROUP TYPES
+	;Returns ADO recordset containing ACTIVE Access types ordered alphabetically
+	;by Access Group
+	;AccessGroupID, AccessGroup, AccessTypeID, AccessType
+	;
+	;Test Code:
+	;D GRPTYP^BSDX15(.RES) ZW RES
+	;
+	S BSDXY="^BSDXTMP("_$J_")"
+	N BSDX1
+	S BSDXI=0
+	S X="ETRAP^BSDX15",@^%ZOSF("TRAP")
+	S ^BSDXTMP($J,BSDXI)="I00020ACCESS_GROUP_TYPEID^I00020ACCESS_GROUP_ID^T00030ACCESS_GROUP^I00020ACCESS_TYPE_ID^T00030ACCESS_TYPE"_$C(30)
+	;
+	;N BSDX0,BSDX1,BSDXNOD,BSDXGPN,BSDXTN
+	;$O Through "B" x-ref of BSDX ACCESS GROUP file
+	;S BSDXGPN=0 F  S BSDXGPN=$O(^BSDXAGP("B",BSDXGPN)) Q:BSDXGPN=""  D
+	;. S BSDX0=$O(^BSDXAGP("B",BSDXGPN,0))
+	;. Q:'+BSDX0
+	;. Q:'$D(^BSDXAGP(BSDX0,0))  ;INDEX VALIDITY CHECK
+	;. Q:'$D(^BSDXAGTP("B",BSDX0))
+	;. ;$O through "B" x-ref of BSDX ACCESS GROUP TYPE
+	;. S BSDX1=0 F  S BSDX1=$O(^BSDXAGTP("B",BSDX0,BSDX1)) Q:'+BSDX1  D
+	;. . Q:'$D(^BSDXAGTP(BSDX1,0))
+	;. . S BSDX2=$P(^BSDXAGTP(BSDX1,0),U,2)
+	;. . Q:'+BSDX2
+	;. . Q:'$D(^BSDXTYPE(BSDX2,0))
+	;. . S BSDXNOD=^BSDXTYPE(BSDX2,0)
+	;. . Q:$P(BSDXNOD,U,2)=1  ;INACTIVE
+	;. . S BSDXTN=$P(BSDXNOD,U)
+	;. . S BSDXI=BSDXI+1
+	;. . S ^BSDXTMP($J,BSDXI)=BSDX1_U_BSDX0_U_BSDXGPN_U_BSDX2_U_BSDXTN_$C(30)
+	;. . Q
+	;. Q
+	;
+	;$O Through "AC" x-ref of BSDX ACCESS GROUP TYPE file
+	N BSDXAGID,BSDXAGN,BSDXATID,BSDXATN,BSDXAGTID
+	S BSDXAGID=0
+	F  S BSDXAGID=$O(^BSDXAGTP("AC",BSDXAGID)) Q:'+BSDXAGID  D
+	. I '$D(^BSDXAGP(BSDXAGID,0)) Q
+	. S BSDXAGN=$P(^BSDXAGP(BSDXAGID,0),U)
+	. S BSDXATID=0 F  S BSDXATID=$O(^BSDXAGTP("AC",BSDXAGID,BSDXATID)) Q:'+BSDXATID  D
+	. . S BSDXNOD=$G(^BSDXTYPE(BSDXATID,0))
+	. . I BSDXNOD="" Q
+	. . I $P(BSDXNOD,U,2)=1 Q  ;Inactive
+	. . S BSDXATN=$P(BSDXNOD,U)
+	. . S BSDXAGTID=$O(^BSDXAGTP("AC",BSDXAGID,BSDXATID,0))
+	. . I '+BSDXAGTID Q
+	. . I '$D(^BSDXAGTP(BSDXAGTID,0)) Q
+	. . S BSDXI=BSDXI+1
+	. . S ^BSDXTMP($J,BSDXI)=BSDXAGTID_U_BSDXAGID_U_BSDXAGN_U_BSDXATID_U_BSDXATN_$C(30)
+	. . Q
+	. Q
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+ERR(BSDXI,BSDXID,BSDXERR)	;Error processing
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXERR_"^^^^"_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+ETRAP	;EP Error trap entry
+	I '$D(BSDXI) N BSDXI S BSDXI=999
+	S BSDXI=BSDXI+1
+	D ERR(BSDXI,99,70)
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX16.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX16.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX16.m	(revision 1134)
@@ -0,0 +1,105 @@
+BSDX16	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+RSRCD(BSDXY,BSDXVAL)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("RSRC^BSDX16(.BSDXY,BSDXVAL)")
+	Q
+	;
+RSRC(BSDXY,BSDXVAL)	;EP
+	;
+	;Called by BSDX ADD/EDIT RESOURCE
+	;Add/Edit BSDX RESOURCE entry
+	;BSDXVAL is sResourceID|sResourceName|sInactive|sHospLocID|TIME_SCALE|LETTER_TEXT|NO_SHOW_LETTER|CANCELLATION_LETTER
+	;If IEN=0 Then this is a new Resource
+	;Test Line:
+	;D RSRC^BSDX16(.RES,"sResourceID|sResourceName|sInactive|sHospLocID")
+	;
+	S X="ERROR^BSDX16",@^%ZOSF("TRAP")
+	N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXINA,BSDXNOTE,BSDXNAM
+	S BSDXY="^BSDXTMP("_$J_")"
+	K ^BSDXTMP($J)
+	S ^BSDXTMP($J,0)="I00020RESOURCEID^T00030ERRORTEXT"_$C(30)
+	; Changed following from a $G = "" to $D check: $G didn't work since BSDXVAL is an array. MJL 10/18/2006
+	I BSDXVAL="",$D(BSDXVAL)<2 D ERR(0,"BSDX16: Invalid null input Parameter") Q
+	;Unpack array at @XWBARY
+	I BSDXVAL="" D
+	. N BSDXC S BSDXC=0 F  S BSDXC=$O(BSDXVAL(BSDXC)) Q:'BSDXC  D
+	. . S BSDXVAL=BSDXVAL_BSDXVAL(BSDXC)
+	S BSDXIEN=$P(BSDXVAL,"|")
+	I +BSDXIEN D
+	. S BSDX="EDIT"
+	. S BSDXIENS=BSDXIEN_","
+	E  D
+	. S BSDX="ADD"
+	. S BSDXIENS="+1,"
+	;
+	S BSDXNAM=$P(BSDXVAL,"|",2)
+	;Prevent adding entry with duplicate name
+	I $D(^BSDXRES("B",BSDXNAM)),$O(^BSDXRES("B",BSDXNAM,0))'=BSDXIEN D  Q
+	. D ERR(0,"BSDX16: Cannot have two Resources with the same name.")
+	. Q
+	;
+	S BSDXINA=$P(BSDXVAL,"|",3)
+	S BSDXINA=$S(BSDXINA="YES":1,1:0)
+	;
+	S BSDXFDA(9002018.1,BSDXIENS,.01)=$P(BSDXVAL,"|",2) ;NAME
+	S BSDXFDA(9002018.1,BSDXIENS,.02)=BSDXINA ;INACTIVE
+	I +$P(BSDXVAL,"|",5) S BSDXFDA(9002018.1,BSDXIENS,.03)=+$P(BSDXVAL,"|",5) ;TIME SCALE
+	I +$P(BSDXVAL,"|",4) S BSDXFDA(9002018.1,BSDXIENS,.04)=$P(BSDXVAL,"|",4) ;HOSPITAL LOCATION
+	K BSDXMSG
+	I BSDX="ADD" D  ;TODO: Check for error
+	. K BSDXIEN
+	. D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+	. S BSDXIEN=+$G(BSDXIEN(1))
+	E  D
+	. D FILE^DIE("","BSDXFDA","BSDXMSG")
+	;
+	;LETTER TEXT wp field
+	S BSDXNOTE=$P(BSDXVAL,"|",6)
+	;
+	I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+	I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+	;
+	I $D(BSDXNOTE(.5)) D
+	. D WP^DIE(9002018.1,BSDXIEN_",",1,"","BSDXNOTE","BSDXMSG")
+	;
+	;NO SHOW LETTER wp fields
+	K BSDXNOTE
+	S BSDXNOTE=$P(BSDXVAL,"|",7)
+	;
+	I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+	I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+	;
+	I $D(BSDXNOTE(.5)) D
+	. D WP^DIE(9002018.1,BSDXIEN_",",1201,"","BSDXNOTE","BSDXMSG")
+	;
+	;CANCELLATION LETTER wp field
+	K BSDXNOTE
+	S BSDXNOTE=$P(BSDXVAL,"|",8)
+	;
+	I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+	I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+	;
+	I $D(BSDXNOTE(.5)) D
+	. D WP^DIE(9002018.1,BSDXIEN_",",1301,"","BSDXNOTE","BSDXMSG")
+	;
+	S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^"_$C(30)_$C(31)
+	Q
+	;
+ERROR	;
+	D ^%ZTER
+	I '+$G(BSDXI) N BSDXI S BSDXI=999999
+	S BSDXI=BSDXI+1
+	D ERR(0,"BSDX16 M Error: <"_$G(%ZTERROR)_">")
+	Q
+	;
+ERR(BSDXERID,ERRTXT)	;Error processing
+	S:'+$G(BSDXI) BSDXI=999999
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX17.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX17.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX17.m	(revision 1134)
@@ -0,0 +1,37 @@
+BSDX17	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+SCHUSRD(BSDXY)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("SCHUSR^BSDX17(.BSDXY)")
+	Q
+	;
+SCHUSR(BSDXY)	;EP
+	;Return recordset of all users in NEW PERSON having BSDXZMENU key
+	;Called by BSDX SCHEDULE USER
+	;Test Line:
+	;D SCHUSR^BSDX17(.RES)
+	;
+	N BSDXDUZ,BSDXKEY,BSDXI,BSDXNAM,BSDXKEYN
+	S BSDXY="^BSDXTMP("_$J_")"
+	K ^TEMP($J,"BSDX17")
+	S BSDXI=0
+	S ^BSDXTMP($J,0)="I00020USERID^T00030USERNAME"_$C(30)
+	;$O Through ^VA(200,"AB",
+	F BSDXKEYN="BSDXZMENU","BSDXZMGR","XUPROGMODE" S BSDXKEY=+$O(^DIC(19.1,"B",BSDXKEYN,0)) D
+	. Q:'+BSDXKEY  S BSDXDUZ=0 F  S BSDXDUZ=$O(^VA(200,"AB",BSDXKEY,BSDXDUZ)) Q:'+BSDXDUZ  D
+	. . Q:BSDXDUZ<1  ;IHS/HMW **1**
+	. . Q:'$D(^VA(200,BSDXDUZ,0))
+	. . Q:$D(^TEMP($J,"BSDX17",BSDXDUZ))
+	. . S BSDXNAM=$P(^VA(200,BSDXDUZ,0),U)
+	. . S BSDXI=BSDXI+1
+	. . S ^TEMP($J,"BSDX17",BSDXDUZ)=""
+	. . S ^BSDXTMP($J,BSDXI)=BSDXDUZ_"^"_BSDXNAM_$C(30)
+	. . Q
+	. Q
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX18.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX18.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX18.m	(revision 1134)
@@ -0,0 +1,310 @@
+BSDX18	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+DELRUD(BSDXY,BSDXIEN)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("DELRU^BSDX18(.BSDXY,BSDXIEN)")
+	Q
+	;
+DELRU(BSDXY,BSDXIEN)	;EP
+	;Deletes entry BSDXIEN from RESOURCE USERS file
+	;Return recordset containing error message or "" if no error
+	;Called by BSDX DELETE RESOURCEUSER
+	;Test Line:
+	;D DELRU^BSDX18(.RES,99)
+	;
+	N BSDXI,DIK,DA
+	S BSDXI=0
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="I00020RESOURCEUSERID^I00020ERRORID"_$C(30)
+	I '+BSDXIEN D ERR(BSDXI,BSDXIEN,70) Q
+	I '$D(^BSDXRSU(BSDXIEN,0)) D ERR(BSDXI,BSDXIEN,70) Q
+	;Delete entry BSDXIEN
+	S DIK="^BSDXRSU("
+	S DA=BSDXIEN
+	D ^DIK
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_"-1"_$C(30)_$C(31)
+	Q
+	;
+ADDRUD(BSDXY,BSDXVAL)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("ADDRU^BSDX18(.BSDXY,BSDXVAL)")
+	Q
+	;
+ADDRU(BSDXY,BSDXVAL)	;EP
+	;
+	;Called by BSDX ADD/EDIT RESOURCEUSER
+	;Add/Edit BSDX RESOURCEUSER entry
+	;BSDXVAL is sResourceUserID|sOverbook|sModifySchedule|ResourceID|UserID|sModifyAppointments
+	;If IEN=0 Then this is a new ResourceUser entry
+	;Test Line:
+	;D ADDRU^BSDX18(.RES,"sResourceUserID|sOverbook|sModifySchedule|sResourceID|sUserID|sModifyAppointments")
+	;
+	N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXOVB,BSDXMOD,BSDXI,BSDXUID,BSDXRID
+	N BSDXRES,BSDXRSU,BSDXF,BSDXAPPT
+	S BSDXY="^BSDXTMP("_$J_")"
+	S BSDXI=0
+	S ^BSDXTMP($J,BSDXI)="I00020RESOURCEID^I00020ERRORID"_$C(30)
+	S BSDXIEN=$P(BSDXVAL,"|")
+	I +BSDXIEN D
+	. S BSDX="EDIT"
+	. S BSDXIENS=BSDXIEN_","
+	E  D
+	. S BSDX="ADD"
+	. S BSDXIENS="+1,"
+	;
+	I '+$P(BSDXVAL,"|",4) D ERR(BSDXI,BSDXIEN,70) Q
+	I '+$P(BSDXVAL,"|",5) D ERR(BSDXI,BSDXIEN,70) Q
+	;
+	S BSDXRID=$P(BSDXVAL,"|",4) ;ResourceID
+	S BSDXUID=$P(BSDXVAL,"|",5) ;UserID
+	S BSDXRSU=0 ;ResourceUserID
+	S BSDXF=0 ;flag
+	;If this is an add, check if the user is already assigned to the resource.
+	;If so, then change to an edit
+	I BSDX="ADD" F  S BSDXRSU=$O(^BSDXRSU("AC",BSDXUID,BSDXRSU)) Q:'+BSDXRSU  D  Q:BSDXF
+	. S BSDXRES=$G(^BSDXRSU(BSDXRSU,0))
+	. S BSDXRES=$P(BSDXRES,U) ;ResourceID
+	. S:BSDXRES=BSDXRID BSDXF=1
+	I BSDXF S BSDX="EDIT",BSDXIEN=BSDXRSU,BSDXIENS=BSDXIEN_","
+	;
+	S BSDXOVB=$P(BSDXVAL,"|",2)
+	S BSDXOVB=$S(BSDXOVB="YES":1,1:0)
+	S BSDXMOD=$P(BSDXVAL,"|",3)
+	S BSDXMOD=$S(BSDXMOD="YES":1,1:0)
+	S BSDXAPPT=$P(BSDXVAL,"|",6)
+	S BSDXAPPT=$S(BSDXAPPT="YES":1,1:0)
+	;
+	S BSDXFDA(9002018.15,BSDXIENS,.01)=$P(BSDXVAL,"|",4) ;RESOURCE ID
+	S BSDXFDA(9002018.15,BSDXIENS,.02)=$P(BSDXVAL,"|",5) ;USERID
+	S BSDXFDA(9002018.15,BSDXIENS,.03)=BSDXOVB ;OVERBOOK
+	S BSDXFDA(9002018.15,BSDXIENS,.04)=BSDXMOD ;MODIFY SCHEDULE
+	S BSDXFDA(9002018.15,BSDXIENS,.05)=BSDXAPPT ;ADD, EDIT, DELETE APPOINMENTS
+	K BSDXMSG
+	I BSDX="ADD" D
+	. K BSDXIEN
+	. D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+	. S BSDXIEN=+$G(BSDXIEN(1))
+	E  D
+	. D FILE^DIE("","BSDXFDA","BSDXMSG")
+	S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^-1"_$C(31)
+	Q
+	;
+ERR(BSDXI,BSDXID,BSDXERR)	;Error processing
+	S BSDXERR=BSDXERR+134234112 ;vbObjectError
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXID_"^"_BSDXERR_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+MADERR(BSDXMSG)	;
+	W !,BSDXMSG
+	Q
+	;
+MADSCR(BSDXDUZ,BSDXZMGR,BSDXZMENU,BSDXZPROG)	;EP - File 200 screening code for MADDRU
+	;Called from DIR to screen for scheduling users
+	I $D(^VA(200,BSDXDUZ,51,"B",BSDXZMENU)) Q 1
+	I $D(^VA(200,BSDXDUZ,51,"B",BSDXZMGR)) Q 1
+	I $D(^VA(200,BSDXDUZ,51,"B",BSDXZPROG)) Q 1
+	Q 0
+	;
+MADDRU	;EP -Command line utility to bulk-add users and set access rights IHS/HMW 20060420 **1**
+	;Main entry point
+	;
+	N BSDX,BSDXZMENU,BSDXZMGR,BSDXZPROG,DIR
+	;
+	;INIT
+	K ^TMP($J)
+	S BSDXZMENU=$O(^DIC(19.1,"B","BSDXZMENU",0)) I '+BSDXZMENU D MADERR("Error: BSDXZMENU KEY NOT FOUND.") Q
+	S BSDXZMGR=$O(^DIC(19.1,"B","BSDXZMGR",0)) I '+BSDXZMGR D MADERR("Error: BSDXZMGR KEY NOT FOUND.") Q
+	S BSDXZPROG=$O(^DIC(19.1,"B","XUPROGMODE",0)) I '+BSDXZPROG D MADERR("Error: XUPROGMODE KEY NOT FOUND.") Q
+	;
+	D MADUSR
+	I '$D(^TMP($J,"BSDX MADDRU","USER")) D MADERR("Cancelled:  No Users selected.") Q
+	D MADRES
+	I '$D(^TMP($J,"BSDX MADDRU","RESOURCE")) D MADERR("Cancelled:  No Resources selected.") Q
+	I '$$MADACC(.BSDX) ;D MADERR("Selected users will have no access to the selected clinics.")
+	I '$$MADCONF(.BSDX) W ! D MADERR("--Cancelled") Q
+	D MADASS(.BSDX)
+	W ! D MADERR("--Done")
+	;
+	Q
+	;
+MADUSR	;Prompt for users from file 200 who have BSDXUSER key
+	;Store results in ^TMP($J,"BSDX MADDRU","USER",DUZ) array
+	N DIRUT,Y,DIR
+	S DIR(0)="PO^200:EMZ",DIR("S")="I $$MADSCR^BSDX18(Y,BSDXZMGR,BSDXZMENU,BSDXZPROG)"
+	S Y=0
+	K ^TMP($J,"BSDX MADDRU","USER")
+	W !!,"-------Select Users-------"
+	F  D ^DIR Q:$G(DIRUT)  Q:'Y  D
+	. S ^TMP($J,"BSDX MADDRU","USER",+Y)=""
+	Q
+	;
+MADRES	;Prompt for Resources
+	;Store results in ^TMP($J,"BSDX MADDRU","RESOURCE",ResourceID) array
+	N DIRUT,Y,DIR
+	S DIR(0)="PO^9002018.1:EMZ"
+	S Y=0
+	K ^TMP($J,"BSDX MADDRU","RESOURCE")
+	W !!,"-------Select Resources-------"
+	F  D ^DIR Q:$G(DIRUT)  Q:'Y  D
+	. S ^TMP($J,"BSDX MADDRU","RESOURCE",+Y)=""
+	Q
+	;
+MADACC(BSDX)	;Prompt for access level.
+	;Start with Overbook and go to read-only access.
+	;Store results in variables for:
+	;sOverbook, sModifySchedule, sModifyAppointments
+	;
+	N DIRUT,Y,DIR,J
+	W !!,"-------Select Access Level-------"
+	S Y=0
+	F J="MODIFY","OVERBOOK","WRITE","READ" S BSDX(J)=1
+	S DIR(0)="Y"
+	;
+	S DIR("A")="Allow users to Modify Clinic Availability"
+	D ^DIR
+	Q:$G(DIRUT) 0
+	Q:Y 1
+	S BSDX("MODIFY")=0
+	;
+	S DIR("A")="Allow users to Overbook the selected clinics"
+	D ^DIR
+	Q:$G(DIRUT) 0
+	Q:Y 1
+	S BSDX("OVERBOOK")=0
+	;
+	S DIR("A")="Allow users to Add, Edit and Delete appointments in the selected resources"
+	D ^DIR
+	Q:$G(DIRUT)
+	Q:Y 1
+	S BSDX("WRITE")=0
+	;
+	S DIR("A")="Allow users to View appointments in the selected resources"
+	D ^DIR
+	Q:$G(DIRUT)
+	Q:Y 1
+	S BSDX("READ")=0
+	;
+	Q 0
+	;
+MADCONF(BSDX)	;Confirm selections
+	N DIR,DIRUT,Y
+	S DIR(0)="Y"
+	W !!,"-------Confirm Selections-------"
+	I BSDX("READ")=0 D
+	. S DIR("A")="Are you sure you want to remove all access to these clinics for these users"
+	E  D
+	. W !,"Selected users will be assigned the following access:"
+	. W !,"Modify clinic availability:  ",?50,BSDX("MODIFY")
+	. W !,"Overbook Appointments:  ",?50,BSDX("OVERBOOK")
+	. W !,"Add, Edit and Delete Appointments:  ",?50,BSDX("WRITE")
+	. W !,"View Clinic Appointments:  ",?50,BSDX("READ")
+	. S DIR("A")="Are you sure you want to assign these access rights to the selected users"
+	D ^DIR
+	Q:$G(DIRUT) 0
+	Q:$G(Y) 1
+	Q 0
+	;
+MADASS(BSDX)	;
+	;Assign access level to selected users and resources
+	;Loop through selected users
+	;. Loop through selected resources
+	; . . If an entry in ^BSDXRSU for this user/resource combination exists, then
+	; . . . S sResourceUserID = to it
+	; . . Else
+	; . . . S sResourceUserID = 0
+	; . . Call MADFILE
+	N BSDXU,BSDXR,BSDXRUID,BSDXVAL
+	S BSDXU=0
+	F  S BSDXU=$O(^TMP($J,"BSDX MADDRU","USER",BSDXU)) Q:'+BSDXU  D
+	. S BSDXR=0 F  S BSDXR=$O(^TMP($J,"BSDX MADDRU","RESOURCE",BSDXR)) Q:'+BSDXR  D
+	. . S BSDXRUID=$$MADEXST(BSDXU,BSDXR)
+	. . S BSDXVAL=BSDXRUID_"|"_BSDX("OVERBOOK")_"|"_BSDX("MODIFY")_"|"_BSDXR_"|"_BSDXU_"|"_BSDX("WRITE")
+	. . I +BSDXRUID,BSDX("READ")=0 D MADDEL(BSDXRUID)
+	. . Q:BSDX("READ")=0
+	. . D MADFILE(BSDXVAL)
+	. . Q
+	. Q
+	Q
+	;
+MADDEL(BSDXRUID)	;
+	;Delete entry BSDXRUID from BSDX RESOURCE USER file
+	N DIK,DA
+	Q:'+BSDXRUID
+	Q:'$D(^BSDXRSU(BSDXRUID))
+	S DIK="^BSDXRSU("
+	S DA=BSDXRUID
+	D ^DIK
+	Q
+	;
+MADFILE(BSDXVAL)	;
+	;
+	;Add/Edit BSDX RESOURCEUSER entry
+	;BSDXVAL is sResourceUserID|sOverbook|sModifySchedule|ResourceID|UserID|sModifyAppointments
+	;If sResourceUserID=0 Then this is a new ResourceUser entry
+	;
+	N BSDXIENS,BSDXFDA,BSDXIEN,BSDXMSG,BSDX,BSDXOVB,BSDXMOD,BSDXI,BSDXUID,BSDXRID
+	N BSDXRES,BSDXRSU,BSDXF,BSDXAPPT
+	S BSDXIEN=$P(BSDXVAL,"|")
+	I +BSDXIEN D
+	. S BSDX="EDIT"
+	. S BSDXIENS=BSDXIEN_","
+	E  D
+	. S BSDX="ADD"
+	. S BSDXIENS="+1,"
+	;
+	I '+$P(BSDXVAL,"|",4) D MADERR("Error in MADFILE^BSDX18: No Resource ID") Q
+	I '+$P(BSDXVAL,"|",5) D MADERR("Error in MADFILE^BSDX18: No User ID") Q
+	;
+	S BSDXRID=$P(BSDXVAL,"|",4) ;ResourceID
+	S BSDXUID=$P(BSDXVAL,"|",5) ;UserID
+	S BSDXRSU=0 ;ResourceUserID
+	S BSDXF=0 ;flag
+	;If this is an add, check if the user is already assigned to the resource.
+	;If so, then change to an edit
+	I BSDX="ADD" F  S BSDXRSU=$O(^BSDXRSU("AC",BSDXUID,BSDXRSU)) Q:'+BSDXRSU  D  Q:BSDXF
+	. S BSDXRES=$G(^BSDXRSU(BSDXRSU,0))
+	. S BSDXRES=$P(BSDXRES,U) ;ResourceID
+	. S:BSDXRES=BSDXRID BSDXF=1
+	I BSDXF S BSDX="EDIT",BSDXIEN=BSDXRSU,BSDXIENS=BSDXIEN_","
+	;
+	S BSDXOVB=$P(BSDXVAL,"|",2)
+	S BSDXMOD=$P(BSDXVAL,"|",3)
+	S BSDXAPPT=$P(BSDXVAL,"|",6)
+	;
+	S BSDXFDA(9002018.15,BSDXIENS,.01)=$P(BSDXVAL,"|",4) ;RESOURCE ID
+	S BSDXFDA(9002018.15,BSDXIENS,.02)=$P(BSDXVAL,"|",5) ;USERID
+	S BSDXFDA(9002018.15,BSDXIENS,.03)=BSDXOVB ;OVERBOOK
+	S BSDXFDA(9002018.15,BSDXIENS,.04)=BSDXMOD ;MODIFY SCHEDULE
+	S BSDXFDA(9002018.15,BSDXIENS,.05)=BSDXAPPT ;ADD, EDIT, DELETE APPOINMENTS
+	K BSDXMSG
+	I BSDX="ADD" D
+	. K BSDXIEN
+	. D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+	. S BSDXIEN=+$G(BSDXIEN(1))
+	E  D
+	. D FILE^DIE("","BSDXFDA","BSDXMSG")
+	Q
+	;
+MADEXST(BSDXU,BSDXR)	;
+	;Returns BSDX RESOURCE USER ID
+	;if there is a BSDX RESOURCE USER entry for
+	;user BSDXU and resource BSDXR
+	;Otherwise, returns 0
+	;
+	N BSDXID,BSDXFOUND,BSDXNOD
+	I '$D(^BSDXRSU("AC",BSDXU)) Q 0
+	S BSDXID=0,BSDXFOUND=0
+	F  S BSDXID=$O(^BSDXRSU("AC",BSDXU,BSDXID)) Q:'+BSDXID  D  Q:BSDXFOUND
+	. S BSDXNOD=$G(^BSDXRSU(BSDXID,0))
+	. I +BSDXNOD=BSDXR S BSDXFOUND=BSDXID
+	. Q
+	Q BSDXFOUND
Index: Scheduling/branches/Radiology-Support/m/BSDX19.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX19.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX19.m	(revision 1134)
@@ -0,0 +1,89 @@
+BSDX19	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+ADDRGD(BSDXY,BSDXVAL)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("ADDRG^BSDX19(.BSDXY,BSDXVAL)")
+	Q
+	;
+ADDRG(BSDXY,BSDXVAL)	;EP
+	;Called by BSDX ADD/EDIT RESOURCE GROUP
+	;Add a new BSDX RESOURCE GROUP entry
+	;BSDXVAL is IEN|NAME of the entry
+	;Returns IEN of added/edited entry or 0 if error
+	;
+	S X="ERROR^BSDX19",@^%ZOSF("TRAP")
+	N BSDXIENS,BSDXFDA,BSDXMSG,BSDXIEN,BSDX,BSDXNAM
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="I00020RESOURCEGROUPID^T00030ERRORTEXT"_$C(30)
+	I BSDXVAL="" D ERR(0,"BSDX16: Invalid null input Parameter") Q
+	S BSDXIEN=$P(BSDXVAL,"|")
+	S BSDXNAM=$P(BSDXVAL,"|",2)
+	I +BSDXIEN D
+	. S BSDX="EDIT"
+	. S BSDXIENS=BSDXIEN_","
+	E  D
+	. S BSDX="ADD"
+	. S BSDXIENS="+1,"
+	;
+	;Prevent adding entry with duplicate name
+	I $D(^BSDXDEPT("B",BSDXNAM)),$O(^BSDXDEPT("B",BSDXNAM,0))'=BSDXIEN D  Q
+	. D ERR(0,"BSDX19: Cannot have two Resource Groups with the same name.")
+	. Q
+	;
+	S BSDXFDA(9002018.2,BSDXIENS,.01)=BSDXNAM ;NAME
+	I BSDX="ADD" D
+	. K BSDXIEN
+	. D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+	. S BSDXIEN=+$G(BSDXIEN(1))
+	E  D
+	. D FILE^DIE("","BSDXFDA","BSDXMSG")
+	S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^"_$C(30)_$C(31)
+	Q
+	;
+DELRGD(BSDXY,BSDXGRP)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("DELRG^BSDX19(.BSDXY,BSDXGRP)")
+	Q
+	;
+DELRG(BSDXY,BSDXGRP)	;EP
+	;Deletes entry name BSDXGRP from BSDX RESOURCE GROUP file
+	;Return recordset containing error message or "" if no error
+	;Called by BSDX DELETE RESOURCE GROUP
+	;Test Line:
+	;D DELRU^BSDX18(.RES,99)
+	;
+	N BSDXI,DIK,DA,BSDXIEN
+	S BSDXI=0
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="I00020RESOURCEGROUPID^T00030ERRORTEXT"_$C(30)
+	I BSDXGRP="" D ERR(0,"DELRG~BSDX19: Invalid null Resource Group Name") Q
+	S BSDXIEN=$O(^BSDXDEPT("B",BSDXGRP,0))
+	I '+BSDXIEN D ERR(0,"DELRG~BSDX19: Invalid Resource Group Name") Q
+	I '$D(^BSDXDEPT(BSDXIEN,0)) D ERR(0,"DELRG~BSDX19: Invalid Resource Group IEN") Q
+	;Delete entry BSDXIEN
+	S DIK="^BSDXDEPT("
+	S DA=BSDXIEN
+	D ^DIK
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_$C(30)_$C(31)
+	Q
+	;
+ERR(BSDXERID,ERRTXT)	;Error processing
+	S:'+$G(BSDXI) BSDXI=999999
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+ERROR	;
+	D ^%ZTER
+	I '+$G(BSDXI) N BSDXI S BSDXI=999999
+	S BSDXI=BSDXI+1
+	D ERR(0,"BSDX19 M Error: <"_$G(%ZTERROR)_">")
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX20.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX20.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX20.m	(revision 1134)
@@ -0,0 +1,79 @@
+BSDX20	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+DELRGID(BSDXY,BSDXIEN)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("DELRGI^BSDX20(.BSDXY,BSDXIEN)")
+	Q
+	;
+DELRGI(BSDXY,BSDXIEN,BSDXIEN1)	;EP
+	;Deletes entry BSDXIEN1 from entry BSDXIEN in the RESOURCE GROUP file
+	;Return recordset containing error message or "" if no error
+	;Called by BSDX DELETE RES GROUP ITEM
+	;Test Line:
+	;D DELRU^BSDX18(.RES,99)
+	;
+	N BSDXI,DIK,DA
+	S BSDXI=0
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="I00020RESOURCEGROUPID^I00020ERRORID"_$C(30)
+	I '+BSDXIEN D ERR(BSDXI,BSDXIEN,70) Q
+	I '+BSDXIEN1 D ERR(BSDXI,BSDXIEN,70) Q
+	I '$D(^BSDXDEPT(BSDXIEN,1,BSDXIEN1,0)) D ERR(BSDXI,BSDXIEN,70) Q
+	;
+	;Delete entry BSDXIEN1
+	S DIK="^BSDXDEPT("_BSDXIEN_",1,"
+	S DA=BSDXIEN1,DA(1)=BSDXIEN
+	D ^DIK
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_"-1"_$C(30)_$C(31)
+	Q
+	;
+ADDRGID(BSDXY,BSDXIEN,BSDXIEN1)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("ADDRGI^BSDX20(.BSDXY,BSDXIEN,BSDXIEN1)")
+	Q
+	;
+ADDRGI(BSDXY,BSDXIEN,BSDXIEN1)	;EP
+	;Adds RESOURCEID BSEDXIEN1 to RESOURCE GROUP entry BSDXIEN
+	;Return recordset containing added subentry number error message or "" if no error
+	;Called by BSDX ADD RES GROUP ITEM
+	;Test Line:
+	;D ADDRGI^BSDX20(.RES,1,1)
+	;
+	N BSDXI,BSDXIENS,BSDXMSG,BSDXFDA
+	S X="ETRAP^BSDX20",@^%ZOSF("TRAP")
+	S BSDXI=0
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="I00020RESOURCEGROUPITEMID^I00020ERRORID"_$C(30)
+	I '+BSDXIEN D ERR(BSDXI,BSDXIEN,70) Q
+	I '+BSDXIEN1 D ERR(BSDXI,BSDXIEN,70) Q
+	I '$D(^BSDXDEPT(BSDXIEN,0)) D ERR(BSDXI,BSDXIEN,70) Q
+	I '$D(^BSDXRES(BSDXIEN1,0)) D ERR(BSDXI,BSDXIEN1,70) Q
+	I $D(^BSDXDEPT(BSDXIEN,1,"B",BSDXIEN1)) D ERR(BSDXI,0,0) Q
+	;^BSDXDEPT(3,1,"B",3,1)=
+	;
+	S BSDXIENS="+1,"_BSDXIEN_","
+	S BSDXFDA(9002018.21,BSDXIENS,.01)=BSDXIEN1 ;RESOURCEID
+	K BSDXIEN
+	D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=+$G(BSDXIEN(1))_"^"_"-1"_$C(30)_$C(31)
+	Q
+	;
+ERR(BSDXI,BSDXID,BSDXERR)	;Error processing
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXID_"^"_BSDXERR_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+ETRAP	;EP Error trap entry
+	I '$D(BSDXI) N BSDXI S BSDXI=999
+	S BSDXI=BSDXI+1
+	D ERR(BSDXI,99,70)
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX21.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX21.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX21.m	(revision 1134)
@@ -0,0 +1,103 @@
+BSDX21	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 5/21/10 9:42pm
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+ADDAGD(BSDXY,BSDXVAL)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("ADDAG^BSDX21(.BSDXY,BSDXVAL)")
+	Q
+	;
+ADDAG(BSDXY,BSDXVAL)	;EP
+	;Called by BSDX ADD/EDIT ACCESS GROUP
+	;Add a new BSDX ACCESS GROUP entry
+	;BSDXVAL is NAME of the entry
+	;
+	S X="ERROR^BSDX21",@^%ZOSF("TRAP")
+	N BSDXIENS,BSDXFDA,BSDXMSG,BSDXIEN,BSDX,BSDXNAM
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="I00020ACCESSGROUPID^T00030ERRORTEXT"_$C(30)
+	I BSDXVAL="" D ERR(0,"BSDX21: Invalid null input Parameter") Q
+	S BSDXIEN=$P(BSDXVAL,"|")
+	S BSDXNAM=$P(BSDXVAL,"|",2)
+	I +BSDXIEN D
+	. S BSDX="EDIT"
+	. S BSDXIENS=BSDXIEN_","
+	E  D
+	. S BSDX="ADD"
+	. S BSDXIENS="+1,"
+	;
+	S BSDXNAM=$P(BSDXVAL,"|",2)
+	I BSDXNAM="" D ERR(0,"BSDX14: Invalid null Access Type name.") Q
+	;
+	;Prevent adding entry with duplicate name
+	I $D(^BSDXAGP("B",BSDXNAM)),$O(^BSDXAGP("B",BSDXNAM,0))'=BSDXIEN D  Q
+	. D ERR(0,"BSDX21: Cannot have two Access Groups with the same name.")
+	. Q
+	;
+	S BSDXFDA(9002018.38,BSDXIENS,.01)=BSDXNAM ;NAME
+	I BSDX="ADD" D
+	. K BSDXIEN
+	. D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+	. S BSDXIEN=+$G(BSDXIEN(1))
+	E  D
+	. D FILE^DIE("","BSDXFDA","BSDXMSG")
+	S ^BSDXTMP($J,1)=$G(BSDXIEN)_"^"_$C(30)_$C(31)
+	Q
+	;
+DELAGD(BSDXY,BSDXGRP)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("DELAG^BSDX21(.BSDXY,BSDXGRP)")
+	Q
+	;
+DELAG(BSDXY,BSDXGRP)	;EP
+	;Deletes entry having IEN BSDXGRP from BSDX ACCESS GROUP file
+	;Also deletes all entries in BSDX ACCESS GROUP TYPE that point to this group
+	;Return recordset containing error message or "" if no error
+	;Called by BSDX DELETE ACCESS GROUP
+	;Test Line:
+	;D DELAG^BSDX21(.RES,99)
+	;
+	S X="ERROR^BSDX21",@^%ZOSF("TRAP")
+	N BSDXI,DIK,DA,BSDXIEN,BSDXIEN1
+	S BSDXI=0
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="I00020ACCESSGROUPID^T00030ERRORTEXT"_$C(30)
+	S BSDXIEN=BSDXGRP
+	;I '$D(^BSDXAGP("B",BSDXGRP)) D ERR(BSDXI,0,0) Q
+	;S BSDXIEN=$O(^BSDXAGP("B",BSDXGRP,0))
+	I '+BSDXIEN D ERR(BSDXI,BSDXIEN) Q
+	I '$D(^BSDXAGP(BSDXIEN,0)) D ERR(0,"BSDX14: Invalid Access Group ID name.") Q
+	;
+	;Delete BSDXACCESS GROUP TYPE entries
+	;
+	S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXAGTP("B",BSDXIEN,BSDXIEN1)) Q:'BSDXIEN1  D
+	. S DIK="^BSDXAGTP("
+	. S DA=BSDXIEN1
+	. D ^DIK
+	. Q
+	;
+	;Delete entry BSDXIEN in BSDX ACCESS GROUP
+	S DIK="^BSDXAGP("
+	S DA=BSDXIEN
+	D ^DIK
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXIEN_"^"_""_$C(30)_$C(31)
+	Q
+	;
+ERR(BSDXERID,ERRTXT)	;Error processing
+	S:'+$G(BSDXI) BSDXI=999999
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+ERROR	;
+	D ^%ZTER
+	I '+$G(BSDXI) N BSDXI S BSDXI=999999
+	S BSDXI=BSDXI+1
+	D ERR(0,"BSDX21 M Error: <"_$G(%ZTERROR)_">")
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX22.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX22.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX22.m	(revision 1134)
@@ -0,0 +1,90 @@
+BSDX22	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+DELAGID(BSDXY,BSDXIEN,BSDXIEN1)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("DELAGI^BSDX22(.BSDXY,BSDXIEN,BSDXIEN1)")
+	Q
+	;
+DELAGI(BSDXY,BSDXIEN,BSDXIEN1)	;EP
+	;Deletes entry having Access Group BSDXIEN and Access Type BSDXIEN1 the ACCESS GROUP TYPE file
+	;Return recordset containing error message or "" if no error
+	;Called by BSDX DELETE ACCESS GROUP ITEM
+	;Test Line:
+	;D DELAGI^BSDX22(.RES,99)
+	;
+	S X="ERROR^BSDX22",@^%ZOSF("TRAP")
+	N BSDXI,DIK,DA,BSDXIEN2
+	S BSDXI=0
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="I00020ACCESSGROUPTYPEID^T00030ERRORTEXT"_$C(30)
+	I '+BSDXIEN D ERR(0,"BSDX22: Invalid null Access Group ID") Q
+	I '+BSDXIEN1 D ERR(0,"BSDX22: Invalid null Access Type ID") Q
+	I '$D(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1)) D  Q
+	. D ERR(0,"BSDX22: Invalid null Access Group Type ID")
+	. Q
+	S BSDXIEN2=$O(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1,0))
+	I '+BSDXIEN2 D ERR(0,"BSDX22: Invalid null Access Group Type ID") Q
+	;
+	;Delete entry
+	S DIK="^BSDXAGTP("
+	S DA=BSDXIEN2
+	D ^DIK
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXIEN2_"^"_"-1"_$C(30)_$C(31)
+	Q
+	;
+ADDAGID(BSDXY,BSDXIEN,BSDXIEN1)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("ADDAGI^BSDX22(.BSDXY,BSDXIEN,BSDXIEN1)")
+	Q
+	;
+ADDAGI(BSDXY,BSDXIEN,BSDXIEN1)	;EP
+	;Adds ACCESS GROUP TYPE file entry having access group BSDXIEN and access type BSDXIEN1
+	;Return recordset containing added entry number error message or "" if no error
+	;Called by BSDX ADD ACCESS GROUP ITEM
+	;Test Line:
+	;D ADDAGI^BSDX22(.RES,1,1)
+	;
+	S X="ERROR^BSDX22",@^%ZOSF("TRAP")
+	N BSDXI,BSDXIENS,BSDXMSG,BSDXFDA
+	S BSDXI=0
+	S BSDXY="^BSDXTMP("_$J_")"
+	;S ^BSDXTMP($J,0)="I00020ACCESSGROUPTYPEID^I00020ERRORID"_$C(30)
+	S ^BSDXTMP($J,0)="I00020ACCESSGROUPTYPEID^T00030ERRORTEXT"_$C(30)
+	I '+BSDXIEN D ERR(0,"BSDX22: Invalid null Access Group ID") Q
+	I '+BSDXIEN1 D ERR(0,"BSDX22: Invalid null Access Type ID") Q
+	I '$D(^BSDXAGP(BSDXIEN,0)) D ERR(0,"BSDX22: Invalid Access Group ID") Q
+	I '$D(^BSDXTYPE(BSDXIEN1,0)) D ERR(0,"BSDX22: Invalid Access Type ID") Q
+	I $D(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1)) D  Q
+	. S BSDXIENS=$O(^BSDXAGTP("AC",BSDXIEN,BSDXIEN1,0))
+	. S ^BSDXTMP($J,BSDXI+1)=+BSDXIENS_"^"_$C(30)_$C(31)
+	. Q
+	;
+	S BSDXIENS="+1,"
+	S BSDXFDA(9002018.39,BSDXIENS,.01)=BSDXIEN ;ACCESS GROUP ID
+	S BSDXFDA(9002018.39,BSDXIENS,.02)=BSDXIEN1 ;ACCESS TYPE ID
+	K BSDXIEN
+	D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=+$G(BSDXIEN(1))_"^"_$C(30)_$C(31)
+	Q
+	;
+ERR(BSDXERID,ERRTXT)	;Error processing
+	S:'+$G(BSDXI) BSDXI=999999
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+ERROR	;
+	D ^%ZTER
+	I '+$G(BSDXI) N BSDXI S BSDXI=999999
+	S BSDXI=BSDXI+1
+	D ERR(0,"BSDX22 M Error: <"_$G(%ZTERROR)_">")
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX23.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX23.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX23.m	(revision 1134)
@@ -0,0 +1,104 @@
+BSDX23	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+EVENT(BSDXEVENT,BSDXPARAM,BSDXSIP,BSDXSPT)	;EP
+	;Raise event to interested clients
+	;Clients are listed in ^BSDXTMP("EVENT",EVENT_NAME,IP,PORT)
+	;BSDXSIP and BSDXSPT represent the sender's IP and PORT.  
+	;The event will not be raised back to the sender if these are non-null
+	;
+	Q:'$D(^BSDXTMP("EVENT",BSDXEVENT))
+	S BSDXIP=0 F  S BSDXIP=$O(^BSDXTMP("EVENT",BSDXEVENT,BSDXIP)) Q:BSDXIP=""  D
+	. S BSDXPORT=0 F  S BSDXPORT=$O(^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)) Q:'+BSDXPORT  D
+	. . I BSDXIP=BSDXSIP Q  ;,BSDXPORT=BSDXSPT Q
+	. . D CALL^%ZISTCP(BSDXIP,BSDXPORT,5)
+	. . I POP K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT) Q
+	. . ;U IO R X#3:5
+	. . I X'="ACK" K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT) Q
+	. . S BSDXPARAM=$S(BSDXPARAM="":"",1:U_BSDXPARAM)
+	. . U IO W BSDXEVENT,BSDXPARAM,!
+	. . D ^%ZISC
+	. . Q
+	. Q
+	Q
+	;
+EVERR(BSDXEVENT,BSDXIP,BSDXPORT)	;
+	;
+	Q:$G(BSDXEVENT)=""
+	Q:$G(BSDXIP)=""
+	Q:$G(BSDXIP)=""
+	K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)
+	Q
+	;
+REGET	;EP
+	;Error trap from REGEVNT
+	;
+	I '$D(BSDXI) N BSDXI S BSDXI=999
+	S BSDXI=BSDXI+1
+	D REGERR(BSDXI,99)
+	Q
+	;
+REGERR(BSDXI,BSDXERID)	;Error processing
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXERID_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+	;
+REGEVNT(BSDXY,BSDXEVENT,BSDXIP,BSDXPORT)	;EP
+	;RPC Called by client to inform RPMS server of client's interest in BSDXEVENT
+	;Returns RECORDSET with field ERRORID.
+	;If everything ok then ERRORID = 0;
+	;
+	N BSDXI
+	S BSDXI=0
+	S X="REGET^BSDX23",@^%ZOSF("TRAP")
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="I00020ERRORID"_$C(30)
+	I '+BSDXPORT D REGERR(BSDXI,1) Q
+	I BSDXIP="" D REGERR(BSDXI,2) Q
+	S ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)=""
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)="0"_$C(30)_$C(31)
+	Q
+	;
+UNREG(BSDXY,BSDXEVENT,BSDXIP,BSDXPORT)	;EP
+	;RPC Called by client to Unregister client's interest in BSDXEVENT
+	;Returns RECORDSET with field ERRORID.
+	;If everything ok then ERRORID = 0;
+	;
+	N BSDXI
+	S BSDXI=0
+	S X="REGET^BSDX23",@^%ZOSF("TRAP")
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="I00020ERRORID"_$C(30)
+	I '+BSDXPORT D REGERR(BSDXI,1) Q
+	I BSDXIP="" D REGERR(BSDXI,2) Q
+	K ^BSDXTMP("EVENT",BSDXEVENT,BSDXIP,BSDXPORT)
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)="0"_$C(30)_$C(31)
+	Q
+	;
+RAISEVNT(BSDXY,BSDXEVENT,BSDXPARAM,BSDXSIP,BSDXSPT)	;EP
+	;RPC Called to raise event BSDXEVENT with parameter BSDXPARAM
+	;BSDXSIP and BSDXSPT represent the sender's IP and PORT.
+	;If not null, these will prevent the event from being raised back
+	;to the sender.
+	;Returns a RECORDSET wit the field ERRORID.
+	;If everything ok then ERRORID = 0;
+	;
+	N BSDXI
+	S BSDXI=0
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="I00020ERRORID"_$C(30)
+	S X="REGET^BSDX23",@^%ZOSF("TRAP")
+	;
+	D EVENT(BSDXEVENT,BSDXPARAM,BSDXSIP,BSDXSPT)
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)="0"_$C(30)_$C(31)
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX24.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX24.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX24.m	(revision 1134)
@@ -0,0 +1,127 @@
+BSDX24	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+	Q
+CRCONTXT(RESULT,OPTION)	;EP
+	;Entry point for debugging XWBSEC
+	;
+	;D DEBUG^%Serenji("CRCONTXT^XWBSEC(.RESULT,OPTION)")
+	;;H .5
+	;;D CRCONTXT^XWBSEC(.RESULT,OPTION)
+	;;S BSDX="^BSDXTMP($J,"
+	;;S ^BSDXTMP($J,0)=RESULT
+	;;S RESULT=1
+	Q
+TEST0(BSDX)	;EP Delete user from 200
+	S DIK="^VA(200,"
+	S DA=BSDX
+	D ^DIK
+	;
+	Q
+KILLM	;EP Delete BMXMENU entry
+	S DIK="^DIC(19,"
+	S DA=$O(^DIC(19,"B","BMXMENU",0))
+	Q:'+DA
+	D ^DIK
+	Q
+	;
+TEST1	;EP Adding an entry to 200
+	;
+	S BSDXFDA(200,"+1,",.01)="BMXNET,APPLICATION"
+	K BSDXIEN,BSDXMSG
+	S DIC(0)=""
+	D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+	;
+	Q
+TEST2	;EP
+	;How to change the ACCESS CODE, VERIFY CODE, DATE VERIFY CODE LAST CHANGED field
+	;ACCESS CODE BSDXXX1^1_(a>yr}:3x3ja9\8vbH
+	;VERIFY CODE BSDXXX2^$;HOSs|:3w25lLD}Be=
+	N BSDXFDA
+	S BSDXFDA(200,"36,",2)="1_(a>yr}:3x3ja9\8vbH"
+	S BSDXFDA(200,"36,",11)="$;HOSs|:3w25lLD}Be="
+	S BSDXFDA(200,"36,",11.2)="88888,88888"
+	S BSDXFDA(200,"36,",201)="BMXRPC"
+	D FILE^DIE("","BSDXFDA","BSDXMSG")
+	Q
+	;
+	;
+SEARCHD(BSDXY,BSDXRES,BSDXSTRT,BSDXEND,BSDXTYPES,BSDXAMPM,BSDXWKDY)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("SEARCH^BSDX24(.RES,""ROGERS,BUCK|FUNAKOSHI,GICHIN"","""","""","""","""","""")")
+	;D DEBUG^%Serenji("SEARCH^BSDX24(.BSDXY,BSDXRES,BSDXSTRT,BSDXEND,BSDXTYPES,BSDXAMPM,BSDXWKDY)")
+	Q
+	;
+SEARCH(BSDXY,BSDXRES,BSDXSTRT,BSDXEND,BSDXTYPES,BSDXAMPM,BSDXWKDY)	;EP
+	;Searches availability database for availability blocks between
+	;BSDXSTRT and BSDXEND for each of the resources in BSDXRES.
+	;The av blocks must be one of the types in BSDXTYPES, must be
+	;AM or PM depending on value in BSDXAMPM and
+	;must be on one of the weekdays listed in BSDXWKDY.
+	;
+	;Return recordset containing the start times of availability blocks
+	;meeting the search criteria.
+	;
+	;Variables:
+	;BSDXRES |-Delimited list of resource names
+	;BSDXSTRT FM-formatted beginning date of search
+	;BSDXEND FM-Formatted ending date of search
+	;BSDXTYPES |-Delimited list of access type IENs
+	;BSDXAMPM "AM" for am-only, "PM" for pm-only, "BOTH" for both
+	;BSDXWKDY "" if any weekday, else |-delimited list of weekdays
+	;
+	;NOTE: If BSDXEND="" Then:
+	; either ONE record is returned matching the first available block
+	; -or- NO record is returned indicating no available block exists
+	;
+	;Called by BSDX SEARCH AVAILABILITY
+	;Test Line:
+	;D SEARCH^BSDX24(.RES,"ROGERS,BUCK|FUNAKOSHI,GICHIN","","","","","") ZW RES
+	;
+	;
+	S X=BSDXSTRT,%DT="X" D ^%DT S BSDXSTRT=$P(Y,".")
+	S:+BSDXSTRT<0 BSDXSTRT=DT
+	S X=BSDXEND,%DT="X" D ^%DT S BSDXEND=$P(Y,".")
+	S:+BSDXEND<0 BSDXEND=9990101
+	S BSDXEND=BSDXEND_".99"
+	N BSDXRESN,BSDXRESD,BSDXDATE,BSDXI,BSDXABD,BSDXNOD,BSDXATD,BSDXATN
+	N BSDXTYPE
+	;
+	;Set up access types array
+	F BSDX=1:1:$L(BSDXTYPES,"|") D
+	. S BSDXATD=$P(BSDXTYPES,"|",BSDX)
+	. S:+BSDXATD BSDXTYPE(BSDXTYPD)=""
+	;
+	S BSDXI=0
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="T00030RESOURCENAME^D00030DATE^T00030ACCESSTYPE^T00030COMMENT"_$C(30)
+	F BSDX=1:1:$L(BSDXRES,"|") S BSDXRESN=$P(BSDXRES,"|",BSDX) D
+	. Q:'$D(^BSDXRES("B",BSDXRESN))
+	. S BSDXRESD=$O(^BSDXRES("B",BSDXRESN,0))
+	. Q:'+BSDXRESD
+	. Q:'$D(^BSDXRES(BSDXRESD,0))
+	. Q:'$D(^BSDXAB("ARSCT",BSDXRESD))
+	. S BSDXDATE=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXSTRT))
+	. Q:BSDXDATE=""
+	. Q:BSDXDATE>BSDXEND
+	. ;TODO: Screen for AMPM
+	. ;TODO: Screen for Weekday
+	. ;
+	. S BSDXI=BSDXI+1
+	. S BSDXABD=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXDATE,0))
+	. S BSDXNOD=$G(^BSDXAB(BSDXABD,0))
+	. Q:BSDXNOD=""
+	. S Y=$P(BSDXDATE,".")
+	. D DD^%DT
+	. S BSDXATD=$P(BSDXNOD,U,5) ;ACCESS TYPE POINTER
+	. S BSDXATD=$G(^BSDXTYPE(+BSDXATD,0))
+	. S BSDXATN=$P(BSDXATD,U)
+	. I +BSDXATD,BSDXTYPES]"" Q:'$D(BSDXTYPES(BSDXATD))
+	. ;TODO: Screen for TYPE ----DONE!
+	. ;TODO: Comment
+	. S ^BSDXTMP($J,BSDXI)=BSDXRESN_U_Y_U_BSDXATN_U_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX25.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX25.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX25.m	(revision 1134)
@@ -0,0 +1,242 @@
+BSDX25	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 3/16/11 2:21am
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	; Change Log:
+	; 3110106: SMH -> Changed Check-in EP - Removed unused paramters. Will change C#
+	;
+	;
+UT	; Unit Tests
+	; Make appointment, checkin, then uncheckin
+	N ZZZ
+	N APPTTIME S APPTTIME=$E($$NOW^XLFDT(),1,12)
+	D APPADD^BSDX07(.ZZZ,APPTTIME,APPTTIME+.0001,3,"Dr Office",30,"Sam's Note",1)
+	N APPTID S APPTID=+^BSDXTMP($J,1)
+	N HL S HL=$$GET1^DIQ(9002018.4,APPTID,".07:.04","I")
+	D CHECKIN^BSDX25(.ZZZ,APPTID,$$NOW^XLFDT())
+	IF '$P(^BSDXAPPT(APPTID,0),U,3) WRITE "ERROR IN CHECKIN 1",!
+	IF '+$G(^SC(HL,"S",APPTTIME,1,1,"C")) WRITE "ERROR IN CHECKIN 2",!
+	D RMCI^BSDX25(.ZZZ,APPTID)
+	IF $P(^BSDXAPPT(APPTID,0),U,3) WRITE "ERROR IN UNCHECKIN 1",!
+	IF $G(^SC(HL,"S",APPTTIME,1,1,"C")) WRITE "ERROR IN UNCHECKIN 2",!
+	D RMCI^BSDX25(.ZZZ,APPTID)  ; again, test sanity in repeat
+	IF $P(^BSDXAPPT(APPTID,0),U,3) WRITE "ERROR IN UNCHECKIN 1",!
+	IF $G(^SC(HL,"S",APPTTIME,1,1,"C")) WRITE "ERROR IN UNCHECKIN 2",!
+	; now test various error conditions
+	; Test Error 1
+	D RMCI^BSDX25(.ZZZ,)
+	IF +^BSDXTMP($J,1)'=-1 WRITE "ERROR IN ETest 1",!
+	; Test Error 2
+	D RMCI^BSDX25(.ZZZ,234987234398)
+	IF +^BSDXTMP($J,1)'=-2 WRITE "ERROR IN Etest 2",!
+	; Tests for 3 to 5 difficult to produce
+	; Error tests follow: Mumps error test; Transaction restartability
+	N bsdxdie S bsdxdie=1
+	D RMCI^BSDX25(.ZZZ,APPTID)
+	IF +^BSDXTMP($J,1)'=-20 WRITE "ERROR IN Etest 3",!
+	K bsdxdie
+	N bsdxrestart S bsdxrestart=1
+	D RMCI^BSDX25(.ZZZ,APPTID)
+	IF +^BSDXTMP($J,1)'=0 WRITE "Error in Etest 4",!
+	QUIT
+CHECKIND(BSDXY,BSDXAPTID,BSDXCDT,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG)	;EP
+	;Entry point for debugging
+	;
+	;I +$G(^BSDXDBUG("BREAK","CHECKIN")),+$G(^BSDXDBUG("BREAK"))=DUZ D DEBUG^%Serenji("CHECKIN^BSDX25(.BSDXY,BSDXAPTID,BSDXCDT,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG)",$P(^BSDXDBUG("BREAK"),U,2))
+	Q
+	;
+CHECKIN(BSDXY,BSDXAPTID,BSDXCDT)	; ,BSDXCC,BSDXPRV,BSDXROU,BSDXVCL,BSDXVFM,BSDXOG)	;EP Check in appointment
+	; Private to GUI; use BSDXAPI for general API to checkin patients
+	; Parameters:
+	; BSDXY: Global Out
+	; BSDXAPTID: Appointment ID in ^BSDXAPPT
+	; BSDXCDT: Checkin Date --> Changed
+	; BSDXCC: Clinic Stop IEN (not used)
+	; BSDXPRV: Provider IEN (not used)
+	; BSDXROU: Print Routing Slip? (not used)
+	; BSDXVCL: PCC+ Clinic IEN (not used)
+	; BSDXVFM: PCC+ Form IEN (not used)
+	; BSDXOG: PCC+ Outguide (true or false)
+	;
+	; Output:
+	; ADO.net table with 1 column ErrorID, 1 row result
+	; - 0 if all okay
+	; - Another number or text if not
+	
+	N BSDXNOD,BSDXPATID,BSDXSTART,DIK,DA,BSDXID,BSDXI,BSDXZ,BSDXIENS,BSDXVEN
+	N BSDXNOEV
+	S BSDXNOEV=1 ;Don't execute protocol
+	;
+	D ^XBKVAR S X="ERROR^BSDX25",@^%ZOSF("TRAP")
+	S BSDXI=0
+	K ^BSDXTMP($J)
+	S BSDXY="^BSDXTMP("_$J_")"
+	S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30)
+	I '+BSDXAPTID D ERR("BSDX25: Invalid Appointment ID") Q
+	I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR("BSDX08: Invalid Appointment ID") Q
+	; Remove Date formatting v.1.5. Client will send date as FM Date.
+	;S:BSDXCDT["@0000" BSDXCDT=$P(BSDXCDT,"@")
+	;S %DT="T",X=BSDXCDT D ^%DT S BSDXCDT=Y
+	   S BSDXCDT=+BSDXCDT  ; Strip off zeros if C# sends them
+	I BSDXCDT=-1 D ERR(70) Q
+	I BSDXCDT>$$NOW^XLFDT S BSDXCDT=$$NOW^XLFDT
+	;Checkin BSDX APPOINTMENT entry
+	D BSDXCHK(BSDXAPTID,BSDXCDT)
+	S BSDXNOD=^BSDXAPPT(BSDXAPTID,0)
+	S BSDXPATID=$P(BSDXNOD,U,5)
+	S BSDXSTART=$P(BSDXNOD,U)
+	;
+	S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID
+	I BSDXSC1]"",$D(^BSDXRES(BSDXSC1,0)) D  I +$G(BSDXZ) D ERR($P(BSDXZ,U,2)) Q
+	. S BSDXNOD=^BSDXRES(BSDXSC1,0)
+	. S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION
+	. I BSDXSC1]"",$D(^SC(BSDXSC1,0)) D APCHK(.BSDXZ,BSDXSC1,BSDXPATID,BSDXCDT,BSDXSTART)
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)="0"_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+BSDXCHK(BSDXAPTID,BSDXCDT)	;
+	;
+	S BSDXIENS=BSDXAPTID_","
+	S BSDXFDA(9002018.4,BSDXIENS,.03)=BSDXCDT
+	D FILE^DIE("","BSDXFDA","BSDXMSG")
+	Q
+	;
+APCHK(BSDXZ,BSDXSC1,BSDXDFN,BSDXCDT,BSDXSTART)	        ;
+	;Checkin appointment for patient BSDXDFN in clinic BSDXSC1
+	;at time BSDXSTART
+	S BSDXZ=$$CHECKIN1^BSDXAPI(BSDXDFN,BSDXSC1,BSDXSTART)
+	Q
+	;
+RMCI(BSDXY,BSDXAPPTID)	; EP - Remove Check-in from BSDX APPT and 2/44
+	; Called by RPC [Fill in later]
+	; 
+	; Parameters to pass:
+	; APPTID: IEN in file BSDX APPOINTMENT
+	;
+	; Return in global array:
+	; Record set with Column ERRORID; value of 0 AOK; other value 
+	;  --> means that something went wrong
+	; 
+	; Error Reference:
+	; -1~Invalid Appointment ID (not passed)
+	; -2~Invalid Appointment ID (Doesn't exist in ^BSDXAPPT)
+	; -3~DB has corruption. Call Tech Support. (Resource ID doesn't exist in BSDXAPPT)
+	; -4~DB has corruption. Call Tech Support. (Resource ID in BSDXAPPT doesnt exist in BSDXRES)
+	; -5~BSDXAPI Error. Message depends on error.
+	; -20~Mumps Error
+	; 
+	N BSDXNOEV S BSDXNOEV=1 ;Don't execute protocol
+	;
+	N $ET S $ET="G ERROR^BSDX25" ; Error Trap
+	;
+	; Set return variable and kill contents
+	S BSDXY=$NAME(^BSDXTMP($J))
+	K @BSDXY
+	; 
+	N BSDXI S BSDXI=0 ; Initialize Counter
+	;
+	S ^BSDXTMP($J,BSDXI)="T00020ERRORID"_$C(30) ; Header of ADO recordset
+	;
+	TSTART (BSDXI):SERIAL ; Perform Autolocking
+	;
+	;;;test
+	I $g(bsdxdie) S X=8/0
+	;;;
+	I $g(bsdxrestart) k bsdxrestart TRESTART
+	;;;test
+	;
+	; Check for Appointment ID (passed and exists in file)
+	I '+$G(BSDXAPPTID) D ERR("-1~Invalid Appointment ID") QUIT
+	I '$D(^BSDXAPPT(BSDXAPPTID,0)) D ERR("-2~Invalid Appointment ID") QUIT
+	;
+	; Remove checkin from BSDX APPOINTMENT entry
+	D BSDXCHK(BSDXAPPTID,"@")
+	;
+	; Now, remove checkin from PIMS files 2/44
+	N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPPTID,0)
+	N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5)	; DFN
+	N BSDXSTART S BSDXSTART=$P(BSDXNOD,U)	; Start Date
+	N BSDXSC1 S BSDXSC1=$P(BSDXNOD,U,7) ; Resource ID
+	; 
+	; If the resource doesn't exist, error out. DB is corrupt.
+	I 'BSDXSC1 D ERR("-3~DB has corruption. Call Tech Support.") QUIT
+	I '$D(^BSDXRES(BSDXSC1,0)) D ERR("-4~DB has corruption. Call Tech Support.") QUIT 
+	;
+	N BSDXNOD S BSDXNOD=^BSDXRES(BSDXSC1,0) ; Resource 0 node
+	S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION
+	;
+	N BSDXZ ; Scratch variable to hold error message
+	I BSDXSC1]"",$D(^SC(BSDXSC1,0)) S BSDXZ=$$RMCI^BSDXAPI(BSDXPATID,BSDXSC1,BSDXSTART)
+	I +$G(BSDXZ) D ERR("-5~"_$P(BSDXZ,U,2)) QUIT
+	; 
+	TCOMMIT  ; Save Data into Globals
+	;
+	; Return ADO recordset
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)="0"_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+CHKEVT(BSDXPAT,BSDXSTART,BSDXSC)	;EP Called by BSDX CHECKIN APPOINTMENT event
+	;when appointments CHECKIN via PIMS interface.
+	;Propagates CHECKIN to BSDXAPPT and raises refresh event to running GUI clients
+	;
+	Q:+$G(BSDXNOEV)
+	Q:'+$G(BSDXSC)
+	N BSDXSTAT,BSDXFOUND,BSDXRES
+	S BSDXSTAT=""
+	S:$G(SDATA("AFTER","STATUS"))["CHECKED IN" BSDXSTAT=$P(SDATA("AFTER","STATUS"),"^",4)
+	S BSDXFOUND=0
+	I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$CHKEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+	I BSDXFOUND D CHKEVT3(BSDXRES) Q
+	I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$CHKEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+	I BSDXFOUND D CHKEVT3(BSDXRES)
+	Q
+	;
+CHKEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)	;
+	;Get appointment id in BSDXAPT
+	;If found, call BSDXNOS(BSDXAPPT) and return 1
+	;else return 0
+	N BSDXFOUND,BSDXAPPT
+	S BSDXFOUND=0
+	Q:'+$G(BSDXRES) BSDXFOUND
+	Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND
+	S BSDXAPPT=0 F  S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT  D  Q:BSDXFOUND
+	. S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""
+	. I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q
+	I BSDXFOUND,+$G(BSDXAPPT) D BSDXCHK(BSDXAPPT,BSDXSTAT)
+	Q BSDXFOUND
+	;
+CHKEVT3(BSDXRES)	;
+	;Call RaiseEvent to notify GUI clients
+	;
+	N BSDXRESN
+	S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+	Q:BSDXRESN=""
+	S BSDXRESN=$P(BSDXRESN,"^")
+	D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+	Q
+	;
+ERROR	;
+	S $ETRAP="D ^%ZTER HALT"  ; Emergency Error Trap for the wise
+	   ; Rollback, otherwise ^XTER will be empty from future rollback
+	   I $TL>0 TROLLBACK
+	   D ^%ZTER
+	   S $EC=""  ; Clear Error
+	   ; Log error message and send to client
+	D ERR("-20~Mumps Error")
+	Q
+	;
+ERR(BSDXERR)	;Error processing
+	I $TLEVEL>0 TROLLBACK
+	S BSDXERR=$G(BSDXERR)
+	S BSDXERR=$P(BSDXERR,"~")_"~"_$TEXT(+0)_":"_$P(BSDXERR,"~",2) ; Append Routine Name
+	S BSDXI=$G(BSDXI)+1
+	S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	QUIT
Index: Scheduling/branches/Radiology-Support/m/BSDX26.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX26.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX26.m	(revision 1134)
@@ -0,0 +1,132 @@
+BSDX26	 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:38pm
+	   ;;1.5V3;BSDX;;Mar 16, 2011
+	   ; Change History:
+	   ; 3101023 - UJO/SMH - Addition of restartable transaction; relocation of tx.
+	   ; --> Thanks to Zach Gonzalez and Rick Marshall
+	   ; 3101205 - UJO/SMH - Extensive refactoring.
+	   ;
+	   ; Error Reference:
+	   ; -1: Appt ID is not a number
+	   ; -2: Appt IEN is not in ^BSDXAPPT
+	   ; -3: FM Failure to file WP field in ^BSDXAPPT
+	   ;
+EDITAPTD(BSDXY,BSDXAPTID,BSDXNOTE)	 ;EP
+	   ;Entry point for debugging
+	   ;
+	   D DEBUG^%Serenji("EDITAPT^BSDX26(.BSDXY,BSDXAPTID,BSDXNOTE)")
+	   Q
+UT	; Unit Tests
+	   ; Test 1: Make sure this damn thing works
+	   N ZZZ
+	   N %H S %H=$H
+	   N NOTE S NOTE="New Note "_%H
+	   D EDITAPT(.ZZZ,188,NOTE)
+	   I ^BSDXAPPT(188,1,1,0)'=NOTE W "ERROR",! B
+	   ; Test 2: Test Errors -1 and -2
+	   N ZZZ
+	   N NOTE S NOTE="Nothing important"
+	   D EDITAPT(.ZZZ,"BLAHBLAH",NOTE)
+	   I +^BSDXTMP($J,1)'=-1 W "ERROR IN -1",! B
+	   D EDITAPT(.ZZZ,298734322,NOTE)
+	   I +^BSDXTMP($J,1)'=-2 W "ERROR IN -2",! B
+	   ; Test 4: M Error
+	   N bsdxdie S bsdxdie=1
+	   D EDITAPT(.ZZZ,188,NOTE)
+	   I +^BSDXTMP($J,1)'=-100 W "ERROR IN -100",! B
+	   k bsdxdie
+	   ; Test 5: Trestart
+	   N bsdxrestart S bsdxrestart=1
+	   N %H S %H=$H
+	   N NOTE S NOTE="New Note "_%H
+	   D EDITAPT(.ZZZ,188,NOTE)
+	   I ^BSDXAPPT(188,1,1,0)'=NOTE W "ERROR in TRESTART",! B
+	   ; Test 6: for Hosp Location Update
+	   N DATE S DATE=$$NOW^XLFDT()
+	   S DATE=$E(DATE,1,12) ; Just get minutes b/c of HL file input transform
+	   D APPADD^BSDX07(.ZZZ,DATE,DATE+.001,3,"Dr Office",30,"Old Note",1)
+	   N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+	   D EDITAPT(.ZZZ,APPID,"New Note")
+	   I ^BSDXAPPT(APTID,1,1,0)'="New Note" W "Error in HL Section",! B
+	   I $P(^SC(2,"S",DATE,1,1,0),U,4)'="New Note" W "Error in HL Section",! B
+	   QUIT
+	   ;
+EDITAPT(BSDXY,BSDXAPTID,BSDXNOTE)	  ;EP Edit appointment (only note text can be edited)
+	   ; Called by RPC: BSDX EDIT APPOINTMENT
+	   ;
+	   ; Edits Appointment Text in BSDX APPOINTMENT file & Hosp Location (44) file
+	   ;
+	   ; Parameters:
+	   ; - BSDXY: Global Return (RPC must be set to Global Array)
+	   ; - BSDXAPTID: Appointment IEN in BSDX APPOINTMENT
+	   ; - BSDXNOTE: New note
+	   ;
+	   ; Return:
+	   ; ADO.net Recordset having 1 field: ERRORID
+	   ; If Okay: -1; otherwise, positive integer with message
+	   ;
+	   ; Return Array; set Return and clear array
+	   S BSDXY=$NA(^BSDXTMP($J))
+	   K ^BSDXTMP($J)
+	   ; ET
+	   N $ET S $ET="G ETRAP^BSDX26"
+	   ; Set up basic DUZ variables
+	   D ^XBKVAR
+	   ; Counter
+	   N BSDXI S BSDXI=0
+	   ; Header Node
+	   S ^BSDXTMP($J,BSDXI)="T00100ERRORID"_$C(30)
+	   ; Restartable txn for GT.M. Restored vars are Params + BSDXI.
+	   TSTART (BSDXY,BSDXAPTID,BSDXNOTE,BSDXI):T="BSDX EDIT APPOINTMENT^BSDX26"
+	   ;
+	   ;;;test for error inside transaction. See if %ZTER works
+	   I $G(bsdxdie) S X=1/0
+	   ;;;test
+	   ;;;test for TRESTART
+	   I $G(bsdxrestart) K bsdxrestart TRESTART
+	   ;;;test
+	   ;
+	   ; Validate Appointment ID
+	   I '+BSDXAPTID D ERR(BSDXI,"-1~BSDX26: Invalid Appointment ID") QUIT
+	   I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(BSDXI,"-2~BSDX26: Invalid Appointment ID") QUIT
+	   ; Put the WP in decendant fields from the root to file as a WP field
+	   S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE=""
+	   I $D(BSDXNOTE(0)) S BSDXNOTE(.5)=BSDXNOTE(0) K BSDXNOTE(0)
+	   N BSDXMSG ; Message in case of error in filing.
+	   I $D(BSDXNOTE(.5)) D
+	   . D WP^DIE(9002018.4,BSDXAPTID_",",1,"","BSDXNOTE","BSDXMSG")
+	   I $D(BSDXMSG) D ERR(BSDXI,"-3~BSDX26: Fileman failure to file data into 9002018.4") QUIT
+	   ;
+	   ; Now file in file 44:
+	   N PTIEN S PTIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".05","I") ; Patient IEN
+	   N HLIEN S HLIEN=$$GET1^DIQ(9002018.4,BSDXAPTID,".07:.04","I") ; HL Location IEN pointed to by Resource ID
+	   N DATE S DATE=+^BSDXAPPT(BSDXAPTID,0) ; Date of APPT
+	   N BSDXRES S BSDXRES=0 ; Result
+	   ; Update Note only if we have a linked hospital location.
+	   I HLIEN S BSDXRES=$$UPDATENOTE^BSDXAPI(PTIEN,HLIEN,DATE,BSDXNOTE(.5))
+	   ; If we get an error (denoted by -1 in BSDXRES), return error to client
+	   I BSDXRES<0 D ERR(BSDXI,"-4~BSDX26: BSDXAPI reports an error: "_BSDXRES) QUIT
+	   ;Return Recordset
+	   TCOMMIT
+	   S BSDXI=BSDXI+1
+	   S ^BSDXTMP($J,BSDXI)="-1"_$C(30)
+	   S BSDXI=BSDXI+1
+	   S ^BSDXTMP($J,BSDXI)=$C(31)
+	   QUIT
+	   ;
+ERR(BSDXI,BSDXERR)	 ;Error processing
+	   S BSDXI=BSDXI+1
+	   S BSDXERR=$TR(BSDXERR,"^","~")
+	   I $TL>0 TROLLBACK
+	   S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+	   S BSDXI=BSDXI+1
+	   S ^BSDXTMP($J,BSDXI)=$C(31)
+	   QUIT
+	   ;
+ETRAP	  ;EP Error trap entry
+	   N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+	   I $TL>0 TROLLBACK
+	   D ^%ZTER
+	   S $EC=""
+	   I '$D(BSDXI) N BSDXI S BSDXI=0
+	   D ERR(BSDXI,"-100~BSDX26 Error: "_$G(%ZTERZE))
+	   Q
Index: Scheduling/branches/Radiology-Support/m/BSDX27.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX27.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX27.m	(revision 1134)
@@ -0,0 +1,266 @@
+BSDX27	 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 4:52pm
+	   ;;1.5V3;BSDX;;Mar 16, 2011
+	   ; 
+	   ; Change Log: July 15, 2010
+	   ; UJO/SMH - i18n: FM Dates passed into routine for Clinic Letters - CLDISP ta
+	   ; v 1.42 - 3101208 - SMH
+	   ; - Added check to skip cancelled appointments. Check was forgotten
+	   ;   in original code.
+	   ;   . N BSDXFLAGS S BSDXFLAGS=$P(BSDXNOD,U,2)  ; No show and Cancel Flags
+	   ;   . Q:BSDXFLAGS["C"  ; if appt is cancelled, quit
+	   ;
+	   Q
+	   ;
+PADISPD(BSDXY,BSDXPAT)	 ;EP
+	   ;Entry point for debugging
+	   ;
+	   ;D DEBUG^%Serenji("PADISP^BSDX27(.BSDXY,BSDXPAT)")
+	   Q
+	   ;
+PADISP(BSDXY,BSDXPAT)	  ;EP
+	   ;Return recordset of patient appointments used in listing
+	   ;a patient's appointments and generating patient letters.
+	   ;Called by rpc BSDX PATIENT APPT DISPLAY
+	   ;
+	   ; Sam's Notes:
+	   ; Relatively complex algorithm.
+	   ; 1. First, loop through ^DPT(DA,"S", and get all appointments. 
+	   ;   Exclude cancelled appts. Store in BSDXDPT array.
+	   ; 2. Go through ^BSDXAPPT("CPAT", (patient index) . 
+	   ;   Get the info from there and compar with BSDXDPT array. If 
+	   ;   they are the same, get all info, and rm entry from BSDXDPT array.
+	   ; 3. If there are any remaining entries in BSDXDPT (PIMS leftovers),
+	   ;   Get the data from file 2 and 44.
+	   ;
+	   N BSDXI,BSDXIEN,BSDXNOD,BSDXNAM,BSDXDOB,BSDXHRN,BSDXSEX,BSDXCNID,BSDXCNOD,BSDXMADE,BSDXCLRK,BSDXNOT,BSDXQ
+	   N BSDXSTRT
+	   N BSDXSTRE,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+	   S BSDXY="^BSDXTMP("_$J_")"
+	   S BSDXI=0
+	   S ^BSDXTMP($J,BSDXI)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030ApptDate^T00030Clinic^T00030TypeStatus"
+	   S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE"_$C(30)
+	   S X="ERROR^BSDX27",@^%ZOSF("TRAP")
+	   ;Get patient info
+	   ;
+	   I '+BSDXPAT S ^BSDXTMP($J,1)=$C(31) Q
+	   I '$D(^DPT(+BSDXPAT,0)) S ^BSDXTMP($J,1)=$C(31) Q
+	   S BSDXNOD=$$PATINFO(BSDXPAT)
+	   S BSDXNAM=$P(BSDXNOD,U) ;NAME
+	   S BSDXSEX=$P(BSDXNOD,U,2) ;SEX
+	   S BSDXDOB=$P(BSDXNOD,U,3) ;DOB
+	   S BSDXHRN=$P(BSDXNOD,U,4) ;Health Record Number for location DUZ(2)
+	   S BSDXSTRE=$P(BSDXNOD,U,5) ;Street
+	   S BSDXCITY=$P(BSDXNOD,U,6) ;City
+	   S BSDXST=$P(BSDXNOD,U,7) ;State
+	   S BSDXZIP=$P(BSDXNOD,U,8) ;zip
+	   S BSDXPHON=$P(BSDXNOD,U,9) ;homephone
+	   ;
+	   ;Organize ^DPT(BSDXPAT,"S," nodes
+	   ; into BSDXDPT(CLINIC,DATE)
+	   ;
+	   I $D(^DPT(BSDXPAT,"S")) S BSDXDT=0 F  S BSDXDT=$O(^DPT(BSDXPAT,"S",BSDXDT)) Q:'+BSDXDT  D
+	   . S BSDXNOD=$G(^DPT(BSDXPAT,"S",BSDXDT,0))
+	   . S BSDXCID=$P(BSDXNOD,U)
+	   . Q:'+BSDXCID
+	   . Q:'$D(^SC(BSDXCID,0))
+	   . N BSDXFLAGS S BSDXFLAGS=$P(BSDXNOD,U,2)  ; No show and Cancel Flags
+	   . Q:BSDXFLAGS["C"  ; if appt is cancelled, quit
+	   . S BSDXDPT(BSDXCID,BSDXDT)=BSDXNOD
+	   ;
+	   ;$O Through ^BSDX("CPAT",
+	   S BSDXIEN=0
+	   I $D(^BSDXAPPT("CPAT",BSDXPAT)) F  S BSDXIEN=$O(^BSDXAPPT("CPAT",BSDXPAT,BSDXIEN)) Q:'BSDXIEN  D
+	   . N BSDXNOD,BSDXAPT,BSDXCID,BSDXCNOD,BSDXCLN,BSDX44,BSDXDNOD,BSDXSTAT,BSDX,BSDXTYPE,BSDXLIN
+	   . S BSDXNOD=$G(^BSDXAPPT(BSDXIEN,0))
+	   . Q:BSDXNOD=""
+	   . Q:$P(BSDXNOD,U,12)]""  ;CANCELLED
+	   . S Y=$P(BSDXNOD,U)
+	   . Q:'+Y
+	   . X ^DD("DD") S Y=$TR(Y,"@"," ")
+	   . S BSDXAPT=Y ;Appointment date time
+	   . S BSDXCLRK=$P(BSDXNOD,U,8) ;Appointment made by
+	   . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+	   . S Y=$P(BSDXNOD,U,9) ;Date Appointment Made
+	   . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+	   . S BSDXMADE=Y
+	   . ;NOTE
+	   . S BSDXNOT=""
+	   . I $D(^BSDXAPPT(BSDXIEN,1,0)) S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXIEN,1,BSDXQ)) Q:'+BSDXQ  D
+	   . . S BSDXLIN=$G(^BSDXAPPT(BSDXIEN,1,BSDXQ,0))
+	   . . S:(BSDXLIN'="")&($E(BSDXLIN,$L(BSDXLIN)-1,$L(BSDXLIN))'=" ") BSDXLIN=BSDXLIN_" "
+	   . . S BSDXNOT=BSDXNOT_BSDXLIN
+	   . ;Resource
+	   . S BSDXCID=$P(BSDXNOD,U,7) ;IEN of BSDX RESOURCE
+	   . Q:'+BSDXCID
+	   . Q:'$D(^BSDXRES(BSDXCID,0))
+	   . S BSDXCNOD=$G(^BSDXRES(BSDXCID,0)) ;BSDX RESOURCE node
+	   . Q:BSDXCNOD=""
+	   . S BSDXCLN=$P(BSDXCNOD,U) ;Text name of BSDX Resource
+	   . S BSDX44=$P(BSDXCNOD,U,4) ;File 44 pointer
+	   . ;If appt entry in ^DPT(PAT,"S" exists for this clinic, get the TYPE/STATUS info from
+	   . ;the BSDXDPT array and delete the BSDXDPT node
+	   . S BSDXTYPE=""
+	   . I +BSDX44,$D(BSDXDPT(BSDX44,$P(BSDXNOD,U))) D  ;BSDXNOD is the BSDX APPOINTMENT node
+	   . . S BSDXDNOD=BSDXDPT(BSDX44,$P(BSDXNOD,U)) ;BSDXDNOD is a copy of the ^DPT(PAT,"S" node
+	   . . S BSDXTYPE=$$STATUS(BSDXPAT,$P(BSDXNOD,U),BSDXDNOD) ;IHS/OIT/HMW 20050208 Added
+	   . . K BSDXDPT(BSDX44,$P(BSDXNOD,U))
+	   . S BSDXI=BSDXI+1
+	   . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXAPT_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_BSDXCID_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_$C(30)
+	   . Q
+	   ;
+	   ;Go through remaining BSDXDPT( entries
+	   I $D(BSDXDPT) S BSDX44=0 D
+	   . F  S BSDX44=$O(BSDXDPT(BSDX44)) Q:'+BSDX44  S BSDXDT=0 D
+	   . . F  S BSDXDT=$O(BSDXDPT(BSDX44,BSDXDT)) Q:'+BSDXDT  D
+	   . . . S BSDXDNOD=BSDXDPT(BSDX44,BSDXDT)
+	   . . . S Y=BSDXDT
+	   . . . Q:'+Y
+	   . . . X ^DD("DD") S Y=$TR(Y,"@"," ")
+	   . . . S BSDXAPT=Y
+	   . . . S BSDXTYPE=$$STATUS(BSDXPAT,BSDXDT,BSDXDNOD) ;IHS/OIT/HMW 20050208 Added
+	   . . . S BSDXCLN=$P($G(^SC(BSDX44,0)),U)
+	   . . . S BSDXCLRK=$P(BSDXDNOD,U,18)
+	   . . . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+	   . . . S Y=$P(BSDXDNOD,U,19)
+	   . . . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+	   . . . S BSDXMADE=Y
+	   . . . S BSDXNOT=""
+	   . . . S BSDXI=BSDXI+1
+	   . . . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXAPT_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_$C(30)
+	   . . . K BSDXDPT(BSDX44,BSDXDT)
+	   ;
+	   S BSDXI=BSDXI+1
+	   S ^BSDXTMP($J,BSDXI)=$C(31)
+	   Q
+	   ;
+STATUS(PAT,DATE,NODE)	  ; returns appt status
+	   ;IHS/OIT/HMW 20050208 Added from BSDDPA
+	   NEW TYP
+	   S TYP=$$APPTYP^BSDXAPI(PAT,DATE)    ;sched vs. walkin
+	   I $P(NODE,U,2)["C" Q TYP_" - CANCELLED"
+	   I $P(NODE,U,2)'="NT",$P(NODE,U,2)["N" Q TYP_" - NO SHOW"
+	   I $$CO^BSDXAPI(PAT,+NODE,DATE) Q TYP_" - CHECKED OUT"
+	   I $$CI^BSDXAPI(PAT,+NODE,DATE) Q TYP_" - CHECKED IN"
+	   Q TYP
+	   ;
+ERROR	  ;
+	   D ERR(BSDXI,"RPMS Error")
+	   Q
+	   ;
+ERR(BSDXI,ERRNO,MSG)	   ;Error processing
+	   S:'$D(BSDXI) BSDXI=999
+	   I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+	   E  S BSDXERR=ERRNO
+	   S BSDXI=BSDXI+1
+	   S ^BSDXTMP($J,BSDXI)=MSG_"^^^^^^^^^^^^^^^"_$C(30)
+	   S BSDXI=BSDXI+1
+	   S ^BSDXTMP($J,BSDXI)=$C(31)
+	   Q
+PATINFO(BSDXPAT)	   ;EP
+	   ;Intrisic Function returns NAME^SEX^DOB^HRN^STREET^CITY^STATE^ZIP^PHONE for patient ien BSDXPAT
+	   ;DOB is in external format
+	   ;HRN depends on existence of DUZ(2)
+	   ;
+	   N BSDXNOD,BSDXNAM,BSDXSEX,BSDXDOB,BSDXHRN,BSDXSTRT,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+	   S BSDXNOD=^DPT(+BSDXPAT,0)
+	   S BSDXNAM=$P(BSDXNOD,U) ;NAME
+	   S BSDXSEX=$P(BSDXNOD,U,2)
+	   S BSDXSEX=$S(BSDXSEX="F":"FEMALE",BSDXSEX="M":"MALE",1:"")
+	   S Y=$P(BSDXNOD,U,3) I Y]""  X ^DD("DD") S Y=$TR(Y,"@"," ")
+	   S BSDXDOB=Y ;DOB
+	   S BSDXHRN=""
+	   I $D(DUZ(2)) I DUZ(2)>0 S BSDXHRN=$P($G(^AUPNPAT(BSDXPAT,41,DUZ(2),0)),U,2) ;HRN
+	   ;
+	   S BSDXNOD=$G(^DPT(+BSDXPAT,.11))
+	   S (BSDXSTRT,BSDXCITY,BSDXST,BSDXZIP)=""
+	   I BSDXNOD]"" D
+	   . S BSDXSTRT=$E($P(BSDXNOD,U),1,50) ;STREET
+	   . S BSDXCITY=$P(BSDXNOD,U,4) ;CITY
+	   . S BSDXST=$P(BSDXNOD,U,5) ;STATE
+	   . I +BSDXST,$D(^DIC(5,+BSDXST,0)) S BSDXST=$P(^DIC(5,+BSDXST,0),U,2)
+	   . S BSDXZIP=$P(BSDXNOD,U,6) ;ZIP
+	   ;
+	   S BSDXNOD=$G(^DPT(+BSDXPAT,.13)) ;PHONE
+	   S BSDXPHON=$P(BSDXNOD,U)
+	   ;
+	   Q BSDXNAM_U_BSDXSEX_U_BSDXDOB_U_BSDXHRN_U_BSDXSTRT_U_BSDXCITY_U_BSDXST_U_BSDXZIP_U_BSDXPHON
+	   ;
+CLDISPD(BSDXY,BSDXCLST,BSDXBEG,BSDXEND)	;EP
+	   ;Entry point for debugging
+	   ;
+	   ;D DEBUG^%Serenji("CLDISP^BSDX27(.BSDXY,BSDXCLST,BSDXBEG,BSDXEND)")
+	   Q
+	   ;
+CLDISP(BSDXY,BSDXCLST,BSDXBEG,BSDXEND)	 ;EP
+	   ;
+	   ;Return recordset of patient appointments
+	   ;between dates BSDXBEG and BSDXEND for each clinic in BSDXCLST.
+	   ;Used in listing a patient's appointments and generating patient letters.
+	   ;BSDXCLST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+	   ;BSDXBEG and BSDXEND are in external date form.
+	   ;Called by BSDX CLINIC LETTERS
+	   ;
+	      ; July 10, 2010 -- to support i18n, we pass dates from client in
+	      ; locale-neutral Fileman format. No need to convert it.
+	   N BSDXI,BSDXNOD,BSDXNAM,BSDXDOB,BSDXHRN,BSDXSEX,BSDXCID,BSDXCNOD,BSDXDT
+	   N BSDXJ,BSDXAID,BSDXPAT,BSDXPNOD,BSDXCLN,BSDXCLRK,BSDXMADE,BSDXNOT,BSDXLIN
+	   N BSDXSTRT
+	   N BSDXSTRE,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+	   S BSDXY="^BSDXTMP("_$J_")"
+	   K ^BSDXTMP($J)
+	   S BSDXI=0
+	   S ^BSDXTMP($J,BSDXI)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030ApptDate^T00030Clinic^T00030TypeStatus"
+	   S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE"_$C(30)
+	   S X="ERROR^BSDX27",@^%ZOSF("TRAP")
+	   ;
+	   ;Convert beginning and ending dates
+	   ;
+	   S BSDXBEG=BSDXBEG-1,BSDXBEG=BSDXBEG_".9999"
+	   S BSDXEND=BSDXEND_".9999"
+	   I BSDXCLST="" D ERR(BSDXI,0,"Routine: BSDX27, Error: Null clinic list") Q
+	   ;
+	   ;For each clinic in BSDXCLST $O through ^BSDXAPPT("ARSRC",ResourceIEN,FMDate,ApptIEN)
+	   ;
+	   F BSDXJ=1:1:$L(BSDXCLST,"|")-1 S BSDXCID=$P(BSDXCLST,"|",BSDXJ) D
+	   . S BSDXCLN=$G(^BSDXRES(BSDXCID,0)) S BSDXCLN=$P(BSDXCLN,U) Q:BSDXCLN=""
+	   . S BSDXSTRT=BSDXBEG F  S BSDXSTRT=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT)) Q:'+BSDXSTRT  Q:BSDXSTRT>BSDXEND  D
+	   . . S BSDXAID=0 F  S BSDXAID=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT,BSDXAID)) Q:'+BSDXAID  D
+	   . . . S BSDXNOD=$G(^BSDXAPPT(BSDXAID,0))
+	   . . . Q:BSDXNOD=""
+	   . . . Q:$P(BSDXNOD,U,12)]""  ;CANCELLED
+	   . . . Q:$P(BSDXNOD,U,13)="y"  ;WALKIN
+	   . . . S Y=$P(BSDXNOD,U)
+	   . . . Q:'+Y
+	   . . . X ^DD("DD") S Y=$TR(Y,"@"," ")
+	   . . . S BSDXAPT=Y ;Appointment date time
+	   . . . ;
+	   . . . ;NOTE
+	   . . . S BSDXNOT=""
+	   . . . I $D(^BSDXAPPT(BSDXAID,1,0)) S BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXAID,1,BSDXQ)) Q:'+BSDXQ  D
+	   . . . . S BSDXLIN=$G(^BSDXAPPT(BSDXAID,1,BSDXQ,0))
+	   . . . . S:(BSDXLIN'="")&($E(BSDXLIN,$L(BSDXLIN)-1,$L(BSDXLIN))'=" ") BSDXLIN=BSDXLIN_" "
+	   . . . . S BSDXNOT=BSDXNOT_BSDXLIN
+	   . . . ;
+	   . . . S BSDXPAT=$P(BSDXNOD,U,5)
+	   . . . S BSDXPNOD=$$PATINFO(BSDXPAT)
+	   . . . S BSDXNAM=$P(BSDXPNOD,U) ;NAME
+	   . . . S BSDXSEX=$P(BSDXPNOD,U,2) ;SEX
+	   . . . S BSDXDOB=$P(BSDXPNOD,U,3) ;DOB
+	   . . . S BSDXHRN=$P(BSDXPNOD,U,4) ;Health Record Number for location DUZ(2)
+	   . . . S BSDXSTRE=$P(BSDXPNOD,U,5) ;Street
+	   . . . S BSDXCITY=$P(BSDXPNOD,U,6) ;City
+	   . . . S BSDXST=$P(BSDXPNOD,U,7) ;State
+	   . . . S BSDXZIP=$P(BSDXPNOD,U,8) ;zip
+	   . . . S BSDXPHON=$P(BSDXPNOD,U,9) ;homephone
+	   . . . S BSDXTYPE="" ;Type/status doesn't exist for BSDX APPT clinics and it's not needed for clinic letters
+	   . . . S BSDXCLRK=$P(BSDXNOD,U,8)
+	   . . . S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+	   . . . S Y=$P(BSDXNOD,U,9)
+	   . . . I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+	   . . . S BSDXMADE=Y
+	   . . . S BSDXI=BSDXI+1
+	   . . . S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXAPT_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_BSDXCID_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_$C(30)
+	   ;
+	   S BSDXI=BSDXI+1
+	   S ^BSDXTMP($J,BSDXI)=$C(31)
+	   Q
Index: Scheduling/branches/Radiology-Support/m/BSDX28.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX28.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX28.m	(revision 1134)
@@ -0,0 +1,144 @@
+BSDX28	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/18/10 2:30pm
+	;;1.5V3;BSDX;;Mar 16, 2011
+	; 
+	   ; Change Log:
+	; HMW 3050721 Added test for inactivated record
+	   ; V1.3 WV/SMH 3100714 
+	   ; - add PID search
+	   ; - return PID instead of SSN (change header and logic)
+	   ; - Change Error trap to new style.
+	;
+PTLOOKRS(BSDXY,BSDXP,BSDXC)	 ;EP Patient Lookup
+	;
+	;Find up to BSDXC patients matching BSDXP*
+	;Supports DOB Lookup, Primary Long ID lookup
+	;
+	N $ET S $ET="G ERROR^BSDX28"
+	   ; rm ctrl chars
+	S BSDXP=$TR(BSDXP,$C(13),"")
+	S BSDXP=$TR(BSDXP,$C(10),"")
+	S BSDXP=$TR(BSDXP,$C(9),"")
+	   ; num of pts to find
+	S:BSDXC="" BSDXC=10
+	N BSDXHRN,BSDXZ,BSDXDLIM,BSDXRET,BSDXDPT,BSDXRET,BSDXIEN,BSDXFILE
+	N BSDXIENS,BSDXFIELDS,BSDXFLAGS,BSDXVALUE,BSDXNUMBER,BSDXINDEXES,BSDXSCREEN
+	N BSDXTARG,BSDXMSG,BSDXRSLT
+	S BSDXDLIM="^"
+	S BSDXRET="T00030NAME^T00030HRN^T00030PID^D00030DOB^T00030IEN"_$C(30)
+	I '+$G(DUZ) S BSDXY=BSDXRET_$C(31) Q
+	I '$D(DUZ(2)) S BSDXY=BSDXRET_$C(31) Q
+	
+PID	;PID Lookup
+	   ; If this ID exists, go get it. If "UJOPID" index doesn't exist,
+	   ; won't work anyways.
+	   I $D(^DPT("UJOPID",BSDXP)) DO  SET BSDXY=BSDXRET_$C(31) QUIT
+	   . S BSDXIEN=$O(^DPT("UJOPID",BSDXP,""))
+	   . Q:'$D(^DPT(BSDXIEN,0))
+	   . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+	   . S BSDXZ=$P(BSDXDPT,U) ;NAME
+	   . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+	   . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+	   . ; Inactivated Chart get an *
+	   . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q
+	   . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+	   . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+	   . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+	   . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+	   . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+	   . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+	;
+DOB	;DOB Lookup
+	I +DUZ(2),((BSDXP?1.2N1"/"1.2N1"/"1.4N)!(BSDXP?1.2N1" "1.2N1" "1.4N)!(BSDXP?1.2N1"-"1.2N1"-"1.4N)) D  S BSDXY=BSDXRET_$C(31) Q
+	. S X=BSDXP S %DT="P" D ^%DT S BSDXP=Y Q:'+Y
+	. Q:'$D(^DPT("ADOB",BSDXP))
+	. S BSDXIEN=0 F  S BSDXIEN=$O(^DPT("ADOB",BSDXP,BSDXIEN)) Q:'+BSDXIEN  D
+	. . Q:'$D(^DPT(BSDXIEN,0))
+	. . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+	. . S BSDXZ=$P(BSDXDPT,U) ;NAME
+	. . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+	. . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+	. . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+	. . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+	   . . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+	. . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+	. . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+	. . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+	. . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+	. . Q
+	. Q
+	;
+CHART	
+	   ;Chart# Lookup
+	I +DUZ(2),BSDXP]"",$D(^AUPNPAT("D",BSDXP)) D  S BSDXY=BSDXRET_$C(31) Q
+	. S BSDXIEN=0 F  S BSDXIEN=$O(^AUPNPAT("D",BSDXP,BSDXIEN)) Q:'+BSDXIEN  I $D(^AUPNPAT("D",BSDXP,BSDXIEN,DUZ(2))) D  Q
+	. . Q:'$D(^DPT(BSDXIEN,0))
+	. . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+	. . S BSDXZ=$P(BSDXDPT,U) ;NAME
+	. . S BSDXHRN=BSDXP ;CHART
+	. . I $D(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),$P(^(0),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+	. . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+	   . . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+	. . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+	. . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+	. . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+	. . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+	. . Q
+	. Q
+	   ;
+SSN	;SSN Lookup
+	I (BSDXP?9N)!(BSDXP?3N1"-"2N1"-"4N),$D(^DPT("SSN",BSDXP)) D  S BSDXY=BSDXRET_$C(31) Q
+	. S BSDXIEN=0 F  S BSDXIEN=$O(^DPT("SSN",BSDXP,BSDXIEN)) Q:'+BSDXIEN  D  Q
+	. . Q:'$D(^DPT(BSDXIEN,0))
+	. . S BSDXDPT=$G(^DPT(BSDXIEN,0))
+	. . S BSDXZ=$P(BSDXDPT,U) ;NAME
+	. . S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+	. . I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+	. . I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+	. . S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+	   . . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+	. . S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+	. . S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+	. . S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+	. . S BSDXRET=BSDXRET_BSDXZ_$C(30)
+	. . Q
+	. Q
+	;
+	S BSDXFILE=9000001
+	S BSDXIENS=""
+	S BSDXFIELDS=".01"
+	S BSDXFLAGS="M"
+	S BSDXVALUE=BSDXP
+	S BSDXNUMBER=BSDXC
+	S BSDXINDEXES=""
+	S BSDXSCREEN=$S(+DUZ(2):"I $D(^AUPNPAT(Y,41,DUZ(2),0))",1:"")
+	S BSDXIDEN=""
+	S BSDXTARG="BSDXRSLT"
+	S BSDXMSG=""
+	D FIND^DIC(BSDXFILE,BSDXIENS,BSDXFIELDS,BSDXFLAGS,BSDXVALUE,BSDXNUMBER,BSDXINDEXES,BSDXSCREEN,BSDXIDEN,BSDXTARG,BSDXMSG)
+	I '+$G(BSDXRSLT("DILIST",0)) S BSDXY=BSDXRET_$C(31) Q
+	N BSDXCNT S BSDXCNT=2
+	F BSDXX=1:1:$P(BSDXRSLT("DILIST",0),U) D
+	. S BSDXIEN=BSDXRSLT("DILIST",2,BSDXX)
+	. S BSDXZ=BSDXRSLT("DILIST","ID",BSDXX,.01) ;NAME
+	. S BSDXHRN=$P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,2) ;CHART
+	. I BSDXHRN="" Q  ;NO CHART AT THIS DUZ2
+	. I $P($G(^AUPNPAT(BSDXIEN,41,DUZ(2),0)),U,3) S BSDXHRN=BSDXHRN_"(*)" Q  ;HMW 20050721 Record Inactivated
+	. S $P(BSDXZ,BSDXDLIM,2)=BSDXHRN
+	. S BSDXDPT=$G(^DPT(BSDXIEN,0))
+	   . S $P(BSDXZ,BSDXDLIM,3)=$P(^DPT(BSDXIEN,.36),U,3) ;PID
+	. S Y=$P(BSDXDPT,U,3) X ^DD("DD")
+	. S $P(BSDXZ,BSDXDLIM,4)=Y ;DOB
+	. S $P(BSDXZ,BSDXDLIM,5)=BSDXIEN
+	. S $P(BSDXRET,$C(30),BSDXCNT)=BSDXZ
+	. S BSDXCNT=BSDXCNT+1
+	. Q
+	S BSDXY=BSDXRET_$C(30)_$C(31)
+	Q
+	;
+ERROR	;
+	D ERR("RPMS Error")
+	Q
+	;
+ERR(ERRNO)	;Error processing
+	S BSDXRET="T00030NAME^T00030HRN^T00030SSN^D00030DOB^T00030IEN"_$C(30)_"^^^^"_$C(30)_$C(31)
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX29.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX29.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX29.m	(revision 1134)
@@ -0,0 +1,224 @@
+BSDX29	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:39pm
+	;;1.5V3;BSDX;;Mar 16, 2011
+	; 
+	; Change Log:
+	; v1.3 by WV/SMH on 3100713
+	; - Beginning and Ending dates passed as FM Dates
+	   ; v1.42 by WV/SMH on 3101023
+	   ; - Transaction moved; now restartable too.
+	   ; --> Thanks to Zach Gonzalez and Rick Marshall.
+	   ; - Refactoring of major portions of routine
+	;
+BSDXCPD(BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND)	;EP
+	;Entry point for debugging
+	;
+	D DEBUG^%Serenji("BSDXCP^BSDX29(.BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND)")
+	Q
+	;
+BSDXCP(BSDXY,BSDXRES,BSDX44,BSDXBEG,BSDXEND)	;EP
+	;Copy appointments from HOSPITAL LOCATION entry BSDX44 to BSDX RESOURCE entry BSDXRES
+	;Beginning with appointments on day BSDXBEG and ending on BSDXEND, inclusive
+	   ;Called by RPC: BSDX COPY APPOINTMENTS
+	;
+	   ; Parameters:
+	   ; - BSDXY: Global Return
+	   ; - BSDXRES: BSDX RESOURCE to copy appointments to
+	   ; - BSDX44: Hospital Location IEN to copy appointments from
+	   ; - BSDXBEG: Beginning Date in FM Format
+	   ; - BSDXEND: End Date in FM Format
+	   ;
+	;Returns ADO Recordset containing TASK_NUMBER and ERRORID
+	;
+	   ; Return Array
+	S BSDXY=$NA(^BSDXTMP($J))
+	   K ^BSDXTMP($J)
+	   ; $ET
+	   N $ET S $ET="G ETRAP^BSDX29"
+	; Counter
+	   N BSDXI S BSDXI=0
+	   ; Header Node
+	S ^BSDXTMP($J,0)="T00010TASK_NUMBER^T00100ERRORID"_$C(30)
+	;
+	   ; Make dates inclusive; add 1 to FM dates
+	   S BSDXBEG=BSDXBEG-1
+	S BSDXEND=BSDXEND+1
+	;
+	   ; Taskman variables
+	   N ZTSK,ZTRTN,ZTDTH,ZTDESC,ZTSAVE 
+	; Task Load
+	S ZTRTN="ZTM^BSDX29",ZTDTH=$H,ZTDESC="COPY PATIENT APPTS"
+	S ZTSAVE("BSDXBEG")="",ZTSAVE("BSDXEND")="",ZTSAVE("BSDX44")="",ZTSAVE("BSDXRES")=""
+	D ^%ZTLOAD
+	; Set up return ADO.net dataset
+	N BSDXST S BSDXST=$S($G(ZTSK)>0:"OK",1:"Unable to create task.")
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$G(ZTSK)_"^"_BSDXST_$C(30)_$C(31)
+	QUIT
+	;
+ZTMD	;EP - Debug entry point
+	;D DEBUG^%Serenji("ZTM^BSDX29")
+	Q
+	;
+ZTM	;EP - Taskman entry point
+	   ; Variables set up in ZTSAVE above
+	   ;
+	Q:'$D(ZTSK)
+	   ; $ET
+	   N $ET S $ET="G ZTMERR^BSDX29"
+	; Txn
+	   TSTART (BSDXBEG,BSDXEND,BSDX44,BSDXRES):T="BSDX COPY APPOINTMENT^BSDX29"
+	;$O through ^SC(BSDX44,"S",
+	N BSDXCNT S BSDXCNT=0  ; Count of Copied Appointments
+	   N BSDXQUIT S BSDXQUIT=0  ; Quit Flag to be retrieved from an external proc
+	; Set Count
+	   S ^BSDXTMP("BSDXCOPY",ZTSK)=BSDXCNT
+	; Loop through dates here.
+	   F  S BSDXBEG=$O(^SC(BSDX44,"S",BSDXBEG)) Q:'+BSDXBEG  Q:BSDXBEG>BSDXEND  Q:BSDXQUIT  D
+	   . ; Loop through Entries in each date in the subsubfile.
+	   . ; Quit if we are at the end or if a remote process requests a quit.
+	   . N BSDXIEN S BSDXIEN=0
+	. F  S BSDXIEN=$O(^SC(BSDX44,"S",BSDXBEG,1,BSDXIEN)) Q:'+BSDXIEN  Q:BSDXQUIT  D
+	. . N BSDXNOD S BSDXNOD=$G(^SC(BSDX44,"S",BSDXBEG,1,BSDXIEN,0)) ; Node
+	. . Q:'+BSDXNOD  ; Quit if no node
+	. . N BSDXCAN S BSDXCAN=$P(BSDXNOD,U,9) ; Cancel flag
+	. . Q:BSDXCAN="C"  ; Quit if appt cancelled
+	   . . N BSDXPAT S BSDXPAT=$P(BSDXNOD,U) ; Patient
+	   . . N BSDXLEN S BSDXLEN=$P(BSDXNOD,U,2) ;duration in minutes
+	. . N BSDXCLRK S BSDXCLRK=$P(BSDXNOD,U,6) ;appt made by (clerk)
+	. . N BSDXMADE S BSDXMADE=$P(BSDXNOD,U,7) ;date appt made
+	. . N BSDXNOTE S BSDXNOTE=$P(BSDXNOD,U,4) ;'OTHER' field contains note
+	. . S BSDXCNT=BSDXCNT+$$XFER(BSDXRES,BSDXBEG,BSDXPAT,BSDXLEN,BSDXCLRK,BSDXMADE,BSDXNOTE)
+	. . I +BSDXCNT,BSDXCNT#10=0 S ^BSDXTMP("BSDXCOPY",ZTSK)=BSDXCNT_" records copied." ;every 10th record
+	. . I $D(^BSDXTMP("BSDXCOPY",ZTSK,"CANCEL")) S BSDXQUIT=1 ;Check for cancel flag
+	. . Q
+	. Q
+	I 'BSDXQUIT TCOMMIT
+	E  TROLLBACK
+	S ^BSDXTMP("BSDXCOPY",ZTSK)=$S(BSDXQUIT:"Cancelled.  No records copied.",1:"Finished.  "_BSDXCNT_" records copied.")
+	Q
+	;
+ZTMERR	; For now, error from TM is only in trap; not returned to client.
+	N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+	   ; Rollback before logging the error
+	   I $TL>0 TROLLBACK
+	D ^%ZTER
+	   S $EC="" ; Clear Error
+	QUIT
+	;
+XFER(BSDXRES,BSDXBEG,BSDXPAT,BSDXLEN,BSDXCLRK,BSDXMADE,BSDXNOTE)	;EP
+	;
+	;Copy record to BSDX APPOINTMENT file
+	;Return 1 if record copied, otherwise 0
+	;
+	;$O Thru ^BSDXAPPT to determine if this appt already added
+	N BSDXEND,BSDXIEN,BSDXFND,BSDXPAT2
+	S BSDXIEN=0,BSDXFND=0
+	F  S BSDXIEN=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXBEG,BSDXIEN)) Q:'+BSDXIEN  D  Q:BSDXFND
+	. S BSDXNOD=$G(^BSDXAPPT(BSDXIEN,0))
+	. Q:'+BSDXNOD
+	. S BSDXPAT2=$P(BSDXNOD,U,5)
+	. S BSDXFND=0
+	. I BSDXPAT2=BSDXPAT S BSDXFND=1
+	. Q
+	Q:BSDXFND 0
+	;
+	;Add to BSDX APPOINTMENT
+	S BSDXEND=BSDXBEG
+	;Calculate ending time from beginning time and duration.
+	S BSDXEND=$$ADDMIN(BSDXBEG,BSDXLEN)
+	S BSDXIENS="+1,"
+	S BSDXFDA(9002018.4,BSDXIENS,.01)=BSDXBEG
+	S BSDXFDA(9002018.4,BSDXIENS,.02)=BSDXEND
+	S BSDXFDA(9002018.4,BSDXIENS,.05)=BSDXPAT
+	S BSDXFDA(9002018.4,BSDXIENS,.07)=BSDXRES
+	S BSDXFDA(9002018.4,BSDXIENS,.08)=BSDXCLRK
+	S BSDXFDA(9002018.4,BSDXIENS,.09)=BSDXMADE
+	;
+	K BSDXIEN
+	D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+	S BSDXIEN=+$G(BSDXIEN(1))
+	I '+BSDXIEN Q 0
+	;
+	;Add WP field
+	I BSDXNOTE]"" S BSDXNOTE(.5)=BSDXNOTE,BSDXNOTE="" D
+	. D WP^DIE(9002018.4,BSDXIEN_",",1,"","BSDXNOTE","BSDXMSG")
+	;
+	Q 1
+	;
+ERR(BSDXI,BSDXCNT,BSDXERR)	;Error processing
+	S BSDXI=BSDXI+1
+	   S BSDXERR=$TR(BSDXERR,"^","~")
+	S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_BSDXERR_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+ETRAP	;EP Error trap entry
+	; No Txn here. So don't rollback anything
+	   N $ET S $ET="D ^%ZTER HALT" ; Emergency Error Trap
+	   D ^%ZTER
+	   S $EC="" ; Clear error
+	I '$D(BSDXI) N BSDXI S BSDXI=0
+	D ERR(BSDXI,$G(BSDXCNT),"~100~BSDX29, Error: "_$G(%ZTERZE))
+	Q
+	;
+CPSTAT(BSDXY,BSDXTSK)	;EP - Note: As of Dec 6 2010: Inactive Code
+	;Return status (copied record count) of tasked job having ZTSK=BSDXTSK
+	;
+	S BSDXY="^BSDXTMP("_$J_")"
+	N BSDXI,BSDXCNT
+	S BSDXI=0
+	S X="ETRAP^BSDX29",@^%ZOSF("TRAP")
+	S ^BSDXTMP($J,0)="T00020RECORD_COUNT^T00020ERRORID"_$C(30)
+	S BSDXCNT=$G(^BSDXTMP("BSDXCOPY",BSDXTSK))
+	I BSDXCNT["Finished" K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+	I BSDXCNT["Cancelled" K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+	;I $D(^BSDXTMP("BSDXCOPY",BSDXTSK,"CANCEL")) K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_"OK"_$C(30)_$C(31)
+	Q
+	;
+CPCANC(BSDXY,BSDXTSK)	;EP Note: As of Dec 6 2010: Inactive code.
+	;Signal tasked job having ZTSK=BSDXTSK to cancel
+	;Returns current record count of copy process
+	;
+	S BSDXY="^BSDXTMP("_$J_")"
+	N BSDXI,BSDXCNT
+	S BSDXI=0
+	S X="ETRAP^BSDX29",@^%ZOSF("TRAP")
+	S ^BSDXTMP($J,0)="T00020RECORD_COUNT^T00020ERRORID"_$C(30)
+	S BSDXCNT=$G(^BSDXTMP("BSDXCOPY",BSDXTSK))
+	I BSDXCNT["FINISHED" K ^BSDXTMP("BSDXCOPY",BSDXTSK)
+	E  S ^BSDXTMP("BSDXCOPY",BSDXTSK,"CANCEL")=""
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXCNT_"^"_"OK"_$C(30)_$C(31)
+	Q
+	;
+ADDMIN(BSDXSTRT,BSDXLEN)	;
+	;
+	;Add BSDXLEN minutes to time BSDXSTRT and return end time
+	N BSDXEND,BSDXH,BSDXM,BSDXSTIM,BSDXETIM
+	S BSDXEND=$P(BSDXSTRT,".")
+	;
+	;Convert start time to minutes past midnight
+	S BSDXSTIM=$P(BSDXSTRT,".",2)
+	S BSDXSTIM=BSDXSTIM_"0000"
+	S BSDXSTIM=$E(BSDXSTIM,1,4)
+	S BSDXH=$E(BSDXSTIM,1,2)
+	S BSDXH=BSDXH*60
+	S BSDXH=BSDXH+$E(BSDXSTIM,3,4)
+	;
+	;Add duration to find minutes past midnight of end time
+	S BSDXETIM=BSDXH+BSDXLEN
+	;
+	;Convert back to a time
+	S BSDXH=BSDXETIM\60
+	S BSDXH="00"_BSDXH
+	S BSDXH=$E(BSDXH,$L(BSDXH)-1,$L(BSDXH))
+	S BSDXM=BSDXETIM#60
+	S BSDXM="00"_BSDXM
+	S BSDXM=$E(BSDXM,$L(BSDXM)-1,$L(BSDXM))
+	S BSDXETIM=BSDXH_BSDXM
+	I BSDXETIM>2400 S BSDXETIM=2400
+	S $P(BSDXEND,".",2)=BSDXETIM
+	Q BSDXEND
Index: Scheduling/branches/Radiology-Support/m/BSDX2E.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX2E.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX2E.m	(revision 1134)
@@ -0,0 +1,139 @@
+BSDX2E	;IHS/OIT/MJL - ENVIRONMENT CHECK FOR WINDOWS SCHEDULING [3/16/11 9:54am]
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	S LINE="",$P(LINE,"*",81)=""
+	S XPDNOQUE="NO QUE"  ;NO QUEUING ALLOWED
+	S XPDABORT=0
+	I '$G(DUZ) D SORRY("DUZ UNDEFINED OR 0") Q
+	;
+	I '$L($G(DUZ(0))) D SORRY("DUZ(0) UNDEFINED OR NULL") Q
+	;
+	D HOME^%ZIS,DT^DICRW
+	S X=$P($G(^VA(200,DUZ,0)),U)
+	I $G(X)="" W !,$$C^XBFUNC("Who are you????") D SORRY("Unknown User") Q
+	;
+VERSION	;
+	W !,$$C^XBFUNC("Hello, "_$P(X,",",2)_" "_$P(X,","))
+	W !!,$$C^XBFUNC("Checking Environment for Install of Version "_$P($T(+2),";",3)_" of "_$P($T(+2),";",4)_".")
+	;
+	Q:'$$VERCHK("VA FILEMAN",22)
+	Q:'$$VERCHK("KERNEL",8)
+	Q:'$$VERCHK("XB",3)
+	;Is the PIMS requirement present?
+	Q:'$$VERCHK("SD",5.3)
+	; Q:'$$PATCHCK("PIMS*5.3*1003") D
+	Q:'$$VERCHK("BMX",2)
+	;
+OTHER	;
+	;Other checks
+	;
+ENVOK	; If this is just an environ check, end here.
+	W !!,$$C^XBFUNC("ENVIRONMENT OK.")
+	;
+	; The following line prevents the "Disable Options..." and "Move
+	; Routines..." questions from being asked during the install.
+	I $G(XPDENV)=1 S (XPDDIQ("XPZ1"),XPDDIQ("XPZ2"))=0
+	;
+	;
+	;VERIFY BACKUPS HAVE BEEN DONE
+	;W !!
+	;S DIR(0)="Y"
+	;S DIR("B")="NO"
+	;S DIR("A")="Has a SUCCESSFUL system backup been performed??"
+	;D ^DIR
+	;I $D(DIRUT)!($G(Y)=0) S XPDABORT=1 S XPX="BACKUP" D SORRY Q
+	;S ^TMP("BPCPRE",$J,"BACKUPS CONFIRMED BY "_DUZ)=$H
+	;
+	Q
+	;
+VERCHK(XPXPKG,XVRMIN)	;
+	S X=$$VERSION^XPDUTL(XPXPKG)
+	W !!,$$C^XBFUNC("Need at least "_XPXPKG_" "_XVRMIN_"....."_XPXPKG_" "_$S(X'="":X,1:"Is Not")_" Present")
+	I X<XVRMIN  D SORRY(XPXPKG_" "_XVRMIN_" Is Not Installed") Q 0
+	Q 1
+	;
+PATCHCK(XPXPCH)	;
+	S X=$$PATCH^XPDUTL(XPXPCH)
+	W !!,$$C^XBFUNC("Need "_XPXPCH_"....."_XPXPCH_" "_$S(X:"Is",1:"Is Not")_" Present")
+	Q X
+	;
+V0200	;EP Version 1.5 PostInit
+	;Add Protocol items to SDAM APPOINTMENT EVENTS protocol
+	;Remove protocols known to cause problems from SDAM APPOINTMENT EVENTS
+	;Set Default Values for Parameters
+	N BSDXDA,BSDXFDA,BSDXDA1,BSDXSEQ,BSDXDAT,BSDXNOD,BSDXIEN,BSDXMSG
+	;
+	; 1st, add the BSDX event protocols
+	; Get SDAM APPOINTMENT EVENTS IEN in 101
+	S BSDXDA=$O(^ORD(101,"B","SDAM APPOINTMENT EVENTS",0))
+	Q:'+BSDXDA
+	; Add each of those protocols unless they already exist.
+	S BSDXDAT="BSDX ADD APPOINTMENT;10.2^BSDX CANCEL APPOINTMENT;10.4^BSDX CHECKIN APPOINTMENT;10.6^BSDX NOSHOW APPOINTMENT;10.8"
+	; For each
+	F J=1:1:$L(BSDXDAT,U) D
+	. K BSDXIEN,BSDXMSG,BSDXFDA
+	. ; Get Item
+	. S BSDXNOD=$P(BSDXDAT,U,J)
+	. ; Get Item Name (BSDX ADD APPOINTMENT)
+	. S BSDXDA1=$P(BSDXNOD,";")
+	. ; Get Item Sequence (10.2)
+	. S BSDXSEQ=$P(BSDXNOD,";",2)
+	. ; Get Item Reference (Item is already in the protocol file)
+	. S BSDXDA1=$O(^ORD(101,"B",BSDXDA1,0))
+	. ; Quit if not found
+	. Q:'+BSDXDA1
+	. ; Quit if already exists in the SDAM protocol
+	. Q:$D(^ORD(101,BSDXDA,10,"B",BSDXDA1))
+	. ; Go ahead and save it.
+	. S BSDXFDA(101.01,"+1,"_BSDXDA_",",".01")=BSDXDA1
+	. S BSDXFDA(101.01,"+1,"_BSDXDA_",","3")=BSDXSEQ
+	. D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+	. ; Error message
+	. I $D(BSDXMSG) W $C(7),"Error: ",BSDXMSG("DIERR",1,"TEXT",1)
+	;
+	; Remove nassssty protocols ORU PATIENT MOVMT and DVBA C&P SCHD EVENT
+	; SDAM APPOINTMENT EVENTS IENS for use in FIND1^DIC
+	N SDEVTIENS S SDEVTIENS=","_BSDXDA_","
+	; Subfile entry for ORU...
+	N ORUIEN S ORUIEN=$$FIND1^DIC(101.01,SDEVTIENS,"","ORU PATIENT MOVMT")
+	; Subfile entry for DVBA...
+	N DVBAIEN S DVBAIEN=$$FIND1^DIC(101.01,SDEVTIENS,"","DVBA C&P SCHD EVENT")
+	; Deletion code
+	N BSDXFDA,BSDXMSG
+	S:ORUIEN>0 BSDXFDA(101.01,ORUIEN_SDEVTIENS,.01)="@"
+	S:DVBAIEN>0 BSDXFDA(101.01,DVBAIEN_SDEVTIENS,.01)="@"
+	D:$D(BSDXFDA) FILE^DIE("","BSDXFDA","BSDXMSG")
+	; If error
+	I $D(BSDXMSG) W $C(7),"Error: ",BSDXMSG("DIERR",1,"TEXT",1)
+	;
+	;
+	; Now put in the default values for parameters
+	; BSDX AUTO PRINT RS as false
+	; BSDX AUTO PRINT AS as false
+	;
+	N BSDXERR
+	D PUT^XPAR("PKG","BSDX AUTO PRINT RS",1,0,.BSDXERR)
+	I $G(BSDXERR) W $C(7),"Error: ",BSDXERR
+	D PUT^XPAR("PKG","BSDX AUTO PRINT AS",1,0,.BSDXERR)
+	I $G(BSDXERR) W $C(7),"Error: ",BSDXERR
+	QUIT
+	;
+SORRY(XPX)	;
+	K DIFQ
+	S XPDABORT=1
+	W !,$$C^XBFUNC($P($T(+2),";",3)_" of "_$P($T(+2),";",4)_" Cannot Be Installed!")
+	W !,$$C^XBFUNC("Reason: "_XPX_".")
+	W *7,!!!,$$C^XBFUNC("Sorry....something is wrong with your environment")
+	W !,$$C^XBFUNC("Aborting "_XPDNM_" install!")
+	W !,$$C^XBFUNC("Correct error and reinstall otherwise")
+	W !,$$C^XBFUNC("please print/capture this screen and notify")
+	W !,$$C^XBFUNC("technical support")
+	W !!,LINE
+	D BMES^XPDUTL("Sorry....something is wrong with your environment")
+	D BMES^XPDUTL("Enviroment ERROR "_$G(XPX))
+	D BMES^XPDUTL("Aborting "_XPDNM_" install!")
+	D BMES^XPDUTL("Correct error and reinstall otherwise")
+	D BMES^XPDUTL("please print/capture this screen and notify")
+	D BMES^XPDUTL("technical support")
+	Q
+	;
Index: Scheduling/branches/Radiology-Support/m/BSDX30.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX30.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX30.m	(revision 1134)
@@ -0,0 +1,89 @@
+BSDX30	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; [ 09/12/2007  1:54 PM ]
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+SPACED(BSDXY,BSDXDIC,BSDXVAL)	;EP
+	;Entry point for debugging
+	;
+	D DEBUG^%Serenji("SPACE^BSDX30(.BSDXY,BSDXDIC,BSDXVAL)")
+	Q
+	;
+SPACE(BSDXY,BSDXDIC,BSDXVAL)	;EP
+	;Update ^DISV with most recent lookup value BSDXVAL from file BSDXDIC
+	;BSDXDIC is the data global in the form GLOBAL(
+	;BSDXVAL is the entry number (IEN) in the file
+	;
+	;Return Status = 1 if success, 0 if fail
+	;
+	S BSDXY="^BSDXTMP("_$J_")"
+	N BSDX1,BSDXRES
+	S BSDXI=0
+	S X="ETRAP^BSDX30",@^%ZOSF("TRAP")
+	I (BSDXDIC="")!('+$G(BSDXVAL)) D ERR(BSDXI+1,99) Q
+	S BSDXDIC="^"_BSDXDIC
+	S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30)
+	;Note:  Naked reference below is immediately preceded
+	;by the full global reference per SAC 2.2.2.8
+	I $D(@(BSDXDIC_"BSDXVAL,0)")),'$D(^(-9)) D
+	. S ^DISV(DUZ,BSDXDIC)=BSDXVAL
+	. S BSDXRES=1
+	E  S BSDXRES=0
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXRES_$C(30)_$C(31)
+	Q
+	;
+ERR(BSDXI,BSDXERR)	;Error processing
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXERR_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+ETRAP	;EP Error trap entry
+	I '$D(BSDXI) N BSDXI S BSDXI=999
+	S BSDXI=BSDXI+1
+	D ERR(99,0)
+	Q
+	;
+EHRPTD(BSDXY,BSDXWID,BSDXDFN)	;
+	;
+	D DEBUG^%Serenji("EHRPT^BSDX30(.BSDXY,BSDXWID,BSDXDFN)")
+	Q
+	;
+EHRPT(BSDXY,BSDXWID,BSDXDFN)	;
+	;
+	;Return Status = 1 if success, 0 if error
+	;
+	S BSDXY="^BSDXTMP("_$J_")"
+	N BSDX1,BSDXRES
+	S BSDXI=0,BSDXRES=1
+	S X="ETRAP^BSDX30",@^%ZOSF("TRAP")
+	S ^BSDXTMP($J,0)="T00020ERRORID"_$C(30)
+	I '+BSDXDFN D ERR(BSDXI+1,0) Q
+	;
+	D PEVENT(BSDXWID,BSDXDFN) ;Raise patient selected event
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXRES_$C(30)_$C(31)
+	Q
+	;
+PEVENT(BSDXWID,DFN)	;EP - Raise patient selection event to EHR
+	;
+	;Change patient context to patient DFN
+	;on all EHR client sessions associated with user DUZ
+	;and workstation BSDXWID.
+	;
+	;If BSDXWID is "", the context change is sent to
+	;all EHR client sessions belonging to user DUZ.
+	;
+	Q:'$G(DUZ)
+	;N X
+	;S X="CIANBUTL" X ^%ZOSF("TEST") Q:'$T
+	;S X="CIANBEVT" X ^%ZOSF("TEST") Q:'$T
+	N UID,BRET
+	S BRET=0,UID=0
+	F  S BRET=$$NXTUID^CIANBUTL(.UID,1) Q:'UID  D
+	. Q:DUZ'=$$GETVAR^CIANBUTL("DUZ",,,UID)
+	. I BSDXWID'="" Q:BSDXWID'=$TR($$GETVAR^CIANBUTL("WID",,,UID),"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
+	. D QUEUE^CIANBEVT("CONTEXT.PATIENT",+DFN,UID)
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX31.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX31.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX31.m	(revision 1134)
@@ -0,0 +1,219 @@
+BSDX31	 ; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 12/6/10 12:39pm
+	   ;;1.5V3;BSDX;;Mar 16, 2011
+	   ; Change Log:
+	   ; v1.42 Oct 23 2010 WV/SMH
+	   ; - Change transaction to restartable. Thanks to Zach Gonzalez
+	   ; --> and Rick Marshall for their help.
+	   ; v1.42 Dec 6 2010: Extensive refactoring
+	   ; 
+	   ; Error Reference:
+	   ; -1: zero or null Appt ID
+	   ; -2: Invalid APPT ID (doesn't exist in ^BSDXAPPT)
+	   ; -3: No-show flag is invalid
+	   ; -4: Filing of No-show in ^BSDXAPPT failed
+	   ; -5: Filing of No-show in ^DPT failed (BSDXAPI error)
+	   ; -100: M Error
+	   ;
+	   ;
+NOSHOWD(BSDXY,BSDXAPTID,BSDXNS)	;EP
+	   ;Entry point for debugging
+	   ;
+	   D DEBUG^%Serenji("NOSHOW^BSDX31(.BSDXY,BSDXAPTID,BSDXNS)")
+	   Q
+	   ;
+UT	; Unit Tests
+	   ; Test 1: Sanity Check
+	   N ZZZ ; Garbage return variable
+	   N DATE S DATE=$$NOW^XLFDT()
+	   S DATE=$E(DATE,1,12) ; Just get minutes b/c of HL file input transform
+	   D APPADD^BSDX07(.ZZZ,DATE,DATE+.0001,3,"Dr Office",30,"Old Note",1)
+	   N APPID S APPID=+$P(^BSDXTMP($J,1),U)
+	   D NOSHOW(.ZZZ,APPID,1)
+	   I $P(^BSDXAPPT(APPID,0),U,10)'=1 W "ERROR T1",! B
+	   I $P(^DPT(3,"S",DATE,0),U,2)'="N" W "ERROR T1",! B
+	   ; Test 2: Undo noshow
+	   D NOSHOW(.ZZZ,APPID,0)
+	   I $P(^BSDXAPPT(APPID,0),U,10)'="0" W "ERROR T2",! B
+	   I $P(^DPT(3,"S",DATE,0),U,2)'="" W "ERROR T2",! B
+	   ; Test 3: -1
+	   D NOSHOW(.ZZZ,"",0)
+	   I $P(^BSDXTMP($J,1),U)'=-1 W "ERROR T3",! B
+	   ; Test 4: -2
+	   D NOSHOW(.ZZZ,2938748233,0)
+	   I $P(^BSDXTMP($J,1),U)'=-2 W "ERROR T4",! B
+	   ; Test 5: -3
+	   D NOSHOW(.ZZZ,APPID,3)
+	   I $P(^BSDXTMP($J,1),U)'=-3 W "ERROR T5",! B
+	   ; Test 6: Mumps error (-100)
+	   s bsdxdie=1
+	   D NOSHOW(.ZZZ,APPID,1)
+	   I $P(^BSDXTMP($J,1),U)'=-100 W "ERROR T6",! B
+	   k bsdxdie
+	   ; Test 7: Restartable transaction
+	   s bsdxrestart=1
+	   D NOSHOW(.ZZZ,APPID,1)
+	   I $P(^BSDXAPPT(APPID,0),U,10)'=1 W "ERROR T7",! B
+	   QUIT
+NOSHOW(BSDXY,BSDXAPTID,BSDXNS)	        ;EP - No show a patient
+	   ; Called by RPC: BSDX NOSHOW
+	   ; Sets appointment noshow flag in BSDX APPOINTMENT file and "S" node in File 2
+	   ;
+	   ; Parameters:
+	   ; BSDXY: Global Return
+	   ; BSDXAPTID is entry number in BSDX APPOINTMENT file
+	   ; BSDXNS = 1: NOSHOW, 0: CANCEL NOSHO
+	   ; 
+	   ; Returns ADO.net record set with fields
+	   ; - ERRORID; ERRORTEXT
+	   ; ERRORID of 1 is okay
+	   ; Anything else is an error.
+	   ;
+	   ; Return Array; set and clear
+	   S BSDXY=$NA(^BSDXTMP($J))
+	   K ^BSDXTMP($J)
+	   ; $ET
+	   N $ET S $ET="G ETRAP^BSDX31"
+	   ; Basline vars
+	   D ^XBKVAR  ; Set up baseline variables (DUZ, DUZ(2)) if they don't exist
+	   ; Counter
+	   N BSDXI S BSDXI=0
+	   ; Header Node
+	   S ^BSDXTMP($J,BSDXI)="I00100ERRORID^T00030ERRORTEXT"_$C(30)
+	   ; Begin transaction
+	   TSTART (BSDXI,BSDXY,BSDXAPTID,BSDXNS):T="BSDX NOSHOW CANCEL^BSDX29"
+	   ;;;test for error inside transaction. See if %ZTER works
+	   I $G(bsdxdie) S X=1/0
+	   ;;;TEST
+	   ;;;test for TRESTART
+	   I $G(bsdxrestart) K bsdxrestart TRESTART
+	   ;;;test
+	   ; Turn off SDAM APPT PROTOCOL BSDX Entries
+	   N BSDXNOEV S BSDXNOEV=1 ;Don't execute protocol
+	   ; Appointment ID check
+	   I '+BSDXAPTID D ERR(-1,"BSDX31: Invalid Appointment ID") Q
+	   I '$D(^BSDXAPPT(BSDXAPTID,0)) D ERR(-2,"BSDX31: Invalid Appointment ID") Q
+	   ; Noshow value check - Must be 1 or 0
+	   S BSDXNS=+BSDXNS
+	   I BSDXNS'=1&(BSDXNS'=0) D ERR(-3,"BSDX31: Invalid No Show value") Q
+	   ; Get Some data
+	   N BSDXNOD S BSDXNOD=^BSDXAPPT(BSDXAPTID,0) ; Node
+	   N BSDXPATID S BSDXPATID=$P(BSDXNOD,U,5) ; DFN
+	   N BSDXSTART S BSDXSTART=$P(BSDXNOD,U)  ; Start Date/Time
+	   ; Edit BSDX APPOINTMENT entry
+	   N BSDXMSG  ; 
+	   D BSDXNOS(BSDXAPTID,BSDXNS,.BSDXMSG)  ;Edit BSDX APPOINTMENT entry NOSHOW field 
+	   I $D(BSDXMSG("DIERR")) S BSDXMSG=$G(BSDXMSG("DIERR",1,"TEXT",1)) D ERR(-4,"BSDX31: "_BSDXMSG) Q
+	   ; Edit File 2 "S" node entry
+	   N BSDXZ,BSDXERR ; Error variables to control looping
+	   S BSDXSC1=$P(BSDXNOD,U,7) ;RESOURCEID
+	   ; If Resource ID exists, and HL exists (means that Resource is linked), No show in File 2
+	   I BSDXSC1]"",$D(^BSDXRES(BSDXSC1,0)) D  I $G(BSDXZ)]"" S BSDXERR="BSDX31: APNOSHO Returned: "_BSDXZ D ERR(-5,BSDXERR) Q
+	   . S BSDXNOD=^BSDXRES(BSDXSC1,0)
+	   . S BSDXSC1=$P(BSDXNOD,U,4) ;HOSPITAL LOCATION
+	   . I BSDXSC1]"",$D(^SC(BSDXSC1,0)) D APNOSHO(.BSDXZ,BSDXSC1,BSDXPATID,BSDXSTART,BSDXNS)
+	   ;
+	   TCOMMIT
+	   S BSDXI=BSDXI+1
+	   S ^BSDXTMP($J,BSDXI)="1^"_$C(30) ; 1 means everything okay
+	   S BSDXI=BSDXI+1
+	   S ^BSDXTMP($J,BSDXI)=$C(31)
+	   QUIT
+	   ;
+APNOSHO(BSDXZ,BSDXSC1,BSDXDFN,BSDXSD,BSDXNS)	           ;
+	   ; update file 2 info
+	   ;Set noshow for patient BSDXDFN in clinic BSDXSC1
+	   ;at time BSDXSD
+	   N BSDXC,%H,BSDXCDT,BSDXIEN
+	   N BSDXIENS,BSDXFDA,BSDXMSG
+	   S %H=$H D YMD^%DTC
+	   S BSDXCDT=X+%
+	   ;
+	   S BSDXIENS=BSDXSD_","_BSDXDFN_","
+	   I +BSDXNS D
+	   . S BSDXFDA(2.98,BSDXIENS,3)="N"
+	   . S BSDXFDA(2.98,BSDXIENS,14)=DUZ
+	   . S BSDXFDA(2.98,BSDXIENS,15)=BSDXCDT
+	   E  D
+	   . S BSDXFDA(2.98,BSDXIENS,3)=""
+	   . S BSDXFDA(2.98,BSDXIENS,14)=""
+	   . S BSDXFDA(2.98,BSDXIENS,15)=""
+	   K BSDXIEN
+	   D UPDATE^DIE("","BSDXFDA","BSDXIEN","BSDXMSG")
+	   S BSDXZ=$G(BSDXMSG("DIERR",1,"TEXT",1))
+	   Q
+	   ;
+BSDXNOS(BSDXAPTID,BSDXNS,BSDXMSG)	  ;
+	   ;
+	   N BSDXFDA,BSDXIENS
+	   S BSDXIENS=BSDXAPTID_","
+	   S BSDXFDA(9002018.4,BSDXIENS,.1)=BSDXNS ;NOSHOW
+	   D FILE^DIE("","BSDXFDA","BSDXMSG")
+	   QUIT
+	   ;
+NOSEVT(BSDXPAT,BSDXSTART,BSDXSC)	   ;EP Called by BSDX NOSHOW APPOINTMENT event
+	   ;when appointments NOSHOW via PIMS interface.
+	   ;Propagates NOSHOW to BSDXAPPT and raises refresh event to running GUI clients
+	   ;
+	   Q:+$G(BSDXNOEV)
+	   Q:'+$G(BSDXSC)
+	   Q:$G(SDATA("AFTER","STATUS"))["AUTO RE-BOOK"
+	   N BSDXSTAT,BSDXFOUND,BSDXRES
+	   S BSDXSTAT=1
+	   S:$G(SDATA("BEFORE","STATUS"))["NO-SHOW" BSDXSTAT=0
+	   S BSDXFOUND=0
+	   I $D(^BSDXRES("ALOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ALOC",BSDXSC,0)) S BSDXFOUND=$$NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+	   I BSDXFOUND D NOSEVT3(BSDXRES) Q
+	   I $D(^BXDXRES("ASSOC",BSDXSC)) S BSDXRES=$O(^BSDXRES("ASSOC",BSDXSC,0)) S BSDXFOUND=$$NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)
+	   I BSDXFOUND D NOSEVT3(BSDXRES)
+	   Q
+	   ;
+NOSEVT1(BSDXRES,BSDXSTART,BSDXPAT,BSDXSTAT)	;
+	   ;Get appointment id in BSDXAPT
+	   ;If found, call BSDXNOS(BSDXAPPT) and return 1
+	   ;else return 0
+	   N BSDXFOUND,BSDXAPPT
+	   S BSDXFOUND=0
+	   Q:'+$G(BSDXRES) BSDXFOUND
+	   Q:'$D(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART)) BSDXFOUND
+	   S BSDXAPPT=0 F  S BSDXAPPT=$O(^BSDXAPPT("ARSRC",BSDXRES,BSDXSTART,BSDXAPPT)) Q:'+BSDXAPPT  D  Q:BSDXFOUND
+	   . S BSDXNOD=$G(^BSDXAPPT(BSDXAPPT,0)) Q:BSDXNOD=""
+	   . I $P(BSDXNOD,U,5)=BSDXPAT,$P(BSDXNOD,U,12)="" S BSDXFOUND=1 Q
+	   I BSDXFOUND,+$G(BSDXAPPT) D BSDXNOS(BSDXAPPT,BSDXSTAT)
+	   Q BSDXFOUND
+	   ;
+NOSEVT3(BSDXRES)	   ;
+	   ;Call RaiseEvent to notify GUI clients
+	   ;
+	   N BSDXRESN
+	   S BSDXRESN=$G(^BSDXRES(BSDXRES,0))
+	   Q:BSDXRESN=""
+	   S BSDXRESN=$P(BSDXRESN,"^")
+	   D EVENT^BMXMEVN("BSDX SCHEDULE",BSDXRESN)
+	   Q
+	   ;
+	   ;
+ERR(BSDXERID,ERRTXT)	   ;Error processing
+	   S BSDXI=BSDXI+1
+	   S ERRTXT=$TR(ERRTXT,"^","~")
+	   I $TL>0 TROLLBACK
+	   S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+	   S BSDXI=BSDXI+1
+	   S ^BSDXTMP($J,BSDXI)=$C(31)
+	   QUIT
+	   ;
+ETRAP	  ;EP Error trap entry
+	   N $ET S $ET="D ^%ZTER HALT"  ; Emergency Error Trap
+	   ; Rollback, otherwise ^XTER will be empty from future rollback
+	   I $TL>0 TROLLBACK
+	   D ^%ZTER
+	   S $EC="" ; Clear Error
+	   ; Send to client
+	   I '$D(BSDXI) N BSDXI S BSDXI=0
+	   D ERR(-100,"BSDX31 Error: "_$G(%ZTERZE))
+	   QUIT
+	   ;
+IMHERE(BSDXRES)	;EP
+	   ;Entry point for BSDX IM HERE remote procedure
+	   S BSDXRES=1
+	   Q
+	   ;
Index: Scheduling/branches/Radiology-Support/m/BSDX32.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX32.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX32.m	(revision 1134)
@@ -0,0 +1,96 @@
+BSDX32	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 9/29/10 10:21am
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+ERROR	;
+	D ERR("RPMS Error")
+	Q
+	;
+ERR(BSDXERR)	;Error processing
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+HOSPLOCD(BSDXY)	;EP Debugging entry point
+	;
+	;D DEBUG^%Serenji("HOSPLOC^BSDX32(.BSDXY)")
+	;
+	Q
+	;
+HOSPLOC(BSDXY)	;EP
+	;Called by BSDX HOSPITAL LOCATION
+	   ;Returns all hospital locations that are active 
+	;
+	N BSDXI,BSDXIEN,BSDXNOD,BSDXNAM,BSDXINA,BSDXREA,BSDXSCOD
+	D ^XBKVAR S X="ERROR^BSDX32",@^%ZOSF("TRAP")
+	K ^BSDXTMP($J)
+	S BSDXY="^BSDXTMP("_$J_")"
+	S BSDXI=0
+	;"SELECT BSDXIEN 'HOSPITAL_LOCATION_ID', NAME 'HOSPITAL_LOCATION', DEFAULT_PROVIDER, STOP_CODE_NUMBER, INACTIVATE_DATE, REACTIVATE_DATE FROM HOSPITAL_LOCATION";
+	S ^BSDXTMP($J,BSDXI)="I00020HOSPITAL_LOCATION_ID^T00040HOSPITAL_LOCATION^T00030DEFAULT_PROVIDER^T00030STOP_CODE_NUMBER^D00020INACTIVATE_DATE^D00020REACTIVATE_DATE"_$C(30)
+	;
+	S BSDXNAM="" F  S BSDXNAM=$O(^SC("B",BSDXNAM)) Q:BSDXNAM=""  D
+	. S BSDXIEN=$O(^SC("B",BSDXNAM,0))
+	. Q:'+BSDXIEN>0
+	. Q:'$D(^SC(+BSDXIEN,0))
+	   . ;Q:'$$INDIV^BSDX01(+BSDXIEN)  ; if not in the same division, quit
+	. S BSDXINA=$$GET1^DIQ(44,BSDXIEN_",",2505) ;INACTIVATE
+	. S BSDXREA=$$GET1^DIQ(44,BSDXIEN_",",2506) ;REACTIVATE
+	. I BSDXINA]""&(BSDXREA="") Q  ;Clinic is inactivated and has no reactivate date
+	. S BSDXNOD=^SC(BSDXIEN,0)
+	. S BSDXNAM=$P(BSDXNOD,U)
+	. S BSDXSCOD=$$GET1^DIQ(44,BSDXIEN_",",8) ;STOP CODE
+	. ;Calculate default provider
+	. S BSDXPRV=""
+	. I $D(^SC(BSDXIEN,"PR")) D
+	. . S BSDXIEN1=0 F  S BSDXIEN1=$O(^SC(BSDXIEN,"PR",BSDXIEN1)) Q:'+BSDXIEN1  Q:BSDXPRV]""  D
+	. . . S BSDXNOD1=$G(^SC(BSDXIEN,"PR",BSDXIEN1,0))
+	. . . S:$P(BSDXNOD1,U,2)="1" BSDXPRV=$$GET1^DIQ(200,$P(BSDXNOD1,U),.01)
+	. . . Q
+	. . Q
+	. S BSDXI=BSDXI+1
+	. S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXNAM_U_BSDXPRV_U_BSDXSCOD_U_BSDXINA_U_BSDXREA_$C(30)
+	. Q
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+CLNSETD(BSDXY)	;EP Debugging entry point
+	;
+	;D DEBUG^%Serenji("CLNSET^BSDX32(.BSDXY)")
+	;
+	Q
+	;
+CLNSET(BSDXY)	;EP
+	;Called by BSDX CLINIC SETUP
+	;Returns CLINIC SETUP file entries for clinics which
+	;are active in ^SC
+	N BSDXI,BSDXIEN,BSDXNOD,BSDXNAM,BSDXINA,BSDXREA
+	N BSDXCRV,BSDXVSC,BSDXMULT,BSDXREQ,BSDXPCC
+	D ^XBKVAR S X="ERROR^BSDX32",@^%ZOSF("TRAP")
+	K ^BSDXTMP($J)
+	S BSDXY="^BSDXTMP("_$J_")"
+	S BSDXI=0
+	;SELECT BMXIEN 'HOSPITAL_LOCATION_ID', CLINIC_NAME 'HOSPITAL_LOCATION', CREATE_VISIT_AT_CHECK-IN? 'CREATE_VISIT', VISIT_SERVICE_CATEGORY,  MULTIPLE_CLINIC_CODES_USED?, VISIT_PROVIDER_REQUIRED,
+	;GENERATE_PCCPLUS_FORMS? FROM CLINIC_SETUP_PARAMETERS
+	S ^BSDXTMP($J,BSDXI)="I00020HOSPITAL_LOCATION_ID^T00040HOSPITAL_LOCATION^T00030CREATE_VISIT^T00030VISIT_SERVICE_CATEGORY^T00030MULTIPLE_CLINIC_CODES_USED?^T00030VISIT_PROVIDER_REQUIRED^T00030GENERATE_PCCPLUS_FORMS?"_$C(30)
+	;
+	S BSDXIEN=0 F  S BSDXIEN=$O(^BSDSC(BSDXIEN)) Q:'+BSDXIEN  D
+	. Q:'$D(^SC(+BSDXIEN,0))
+	. Q:'$D(^BSDSC(+BSDXIEN,0))
+	. S BSDXINA=$$GET1^DIQ(44,BSDXIEN_",",2505) ;INACTIVATE
+	. S BSDXREA=$$GET1^DIQ(44,BSDXIEN_",",2506) ;REACTIVATE
+	. I BSDXINA]""&(BSDXREA="") Q  ;Clinic is inactivated and has no reactivate date
+	. S BSDXNOD=^BSDSC(BSDXIEN,0)
+	. S BSDXNAM=$$GET1^DIQ(44,BSDXIEN_",",.01)
+	. S BSDXCRV=$$GET1^DIQ(9009017.2,BSDXIEN_",",.09)
+	. S BSDXVSC=$$GET1^DIQ(9009017.2,BSDXIEN_",",.12)
+	. S BSDXMULT=$$GET1^DIQ(9009017.2,BSDXIEN_",",.13)
+	. S BSDXREQ=$$GET1^DIQ(9009017.2,BSDXIEN_",",.14)
+	. S BSDXPCC=$$GET1^DIQ(9009017.2,BSDXIEN_",",.15)
+	. S BSDXI=BSDXI+1
+	. S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXNAM_U_BSDXCRV_U_BSDXVSC_U_BSDXMULT_U_BSDXREQ_U_BSDXPCC_$C(30)
+	. Q
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX33.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX33.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX33.m	(revision 1134)
@@ -0,0 +1,127 @@
+BSDX33	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 12:33pm
+	;;1.5V3;BSDX;;Mar 16, 2011
+	   ; Mods by WV/STAR
+	   ;
+	   ; Change Log:
+	   ; July 13, 2010
+	   ; v 1.3 adds fixes Rebooking behavior in application (see RBNEXT)
+	   ; also adds i18 support - Dates passed in FM format from application
+	   ; in tag SETRBK and RBNEXT
+	;
+	;
+	Q
+RBNEXTD(BSDXY,BSDXDATE,BSDXRES,BSDXTPID)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("RBNEXT^BSDX33(.BSDXY,BSDXDATE,BSDXRES,BSDXTPID)")
+	Q
+	;
+RBNEXT(BSDXY,BSDXDATE,BSDXRES,BSDXTPID)	;EP
+	;Called by BSDX REBOOK NEXT BLOCK to find
+	;the next ACCESS BLOCK in resource BSDXRES after BSDXDATE
+	;Returns 1 in ERRORID and date in NEXTBLOCK if a block was found or NULL in NEXTBLOCK of no date found
+	;Otherwise, returns 0 and error message in ERRORTEXT
+	;If BSDXTPID = 0 then any access type match
+	;
+	S X="ERROR2^BSDX33",@^%ZOSF("TRAP")
+	N BSDXI,BSDXIENS,%DT,BSDXMSG,Y,BSDXRESD,BSDXFND,BSDXIEN,BSDXNOD,BSDXATID
+	S BSDXY="^BSDXTMP("_$J_")"
+	S BSDXI=0
+	S ^BSDXTMP($J,BSDXI)="I00020ERRORID^D00010NEXTBLOCK^T00030ERRORTEXT"_$C(30)
+	;
+	I BSDXRES="" D ERR2("BSDX REBOOK NEXT BLOCK: Invalid resource name") Q
+	I '$D(^BSDXRES("B",BSDXRES)) D ERR2("BSDX REBOOK NEXT BLOCK: Invalid resource name") Q
+	S BSDXRESD=$O(^BSDXRES("B",BSDXRES,0))
+	I '+BSDXRESD D ERR2("BSDX REBOOK NEXT BLOCK: Invalid resource name") Q
+	;
+	   ; i18n fix
+	   ; S X=BSDXDATE,%DT="XT" D ^%DT
+	; I Y=-1 D ERR2(1,"BSDX REBOOK NEXT BLOCK: Invalid datetime") Q
+	;
+	   ; S BSDXDATE=$P(Y,".")
+	;
+	S BSDXFND=0
+	F  S BSDXDATE=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXDATE)) Q:'+BSDXDATE  D  Q:BSDXFND
+	. S BSDXIEN=0 F  S BSDXIEN=$O(^BSDXAB("ARSCT",BSDXRESD,BSDXDATE,BSDXIEN)) Q:'+BSDXIEN  D  Q:BSDXFND
+	. . Q:'$D(^BSDXAB(BSDXIEN,0))
+	. . S BSDXNOD=^BSDXAB(BSDXIEN,0)
+	. . Q:+$P(BSDXNOD,U,4)=0  ;Slots
+	. . S BSDXATID=$P(BSDXNOD,U,5)
+	. . I BSDXTPID=0!(BSDXATID=BSDXTPID) S BSDXFND=$P(BSDXNOD,U,2) Q
+	;
+	I BSDXFND=0 S BSDXFND=""
+	E  S Y=BSDXFND X ^DD("DD") S BSDXFND=Y
+	S BSDXI=BSDXI+1
+	   ;//smh - bug (V 1.3): Need to replace @ in FM date for C# to recognize it
+	   S BSDXFND=$TR(BSDXFND,"@"," ")
+	   ;//smh end fix
+	S ^BSDXTMP($J,BSDXI)="1^"_BSDXFND_"^"_$C(30)_$C(31)
+	Q
+SETRBKD(BSDXY,BSDXAPPT,BSDXDATE)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("SETRBK^BSDX33(.BSDXY,BSDXAPPT,BSDXDATE)")
+	Q
+	;
+SETRBK(BSDXY,BSDXAPPT,BSDXDATE)	;EP
+	;
+	;Sets rebook date into appointment
+	;BSDXAPPT - Appointment ID
+	;BSDXDATE - Rebook Datetime in internal format
+	;Called by BSDX REBOOK SET
+	;
+	;ErrorID:
+	; 0 if a problem.  Message in ERRORTEXT
+	; 1 if OK
+	;
+	S X="ERROR^BSDX33",@^%ZOSF("TRAP")
+	N BSDXI,BSDXIENS,%DT,BSDXMSG,Y
+	S BSDXY="^BSDXTMP("_$J_")"
+	S BSDXI=0
+	S ^BSDXTMP($J,BSDXI)="I00020ERRORID^T00030ERRORTEXT"_$C(30)
+	;
+	I '+BSDXAPPT
+	I '$D(^BSDXAPPT(BSDXAPPT,0)) D ERR(1,"BSDX REBOOK SET: Invalid appointment ID") Q
+	; i18n (v 1.3)
+	   ;S X=BSDXDATE,%DT="XT" D ^%DT
+	;I Y=-1 D ERR(1,"BSDX REBOOK SET: Invalid rebook datetime") Q
+	;S BSDXDATE=Y
+	S BSDXIENS=BSDXAPPT_","
+	S BSDXFDA(9002018.4,BSDXIENS,.11)=+BSDXDATE
+	;
+	K BSDXMSG
+	D FILE^DIE("","BSDXFDA","BSDXMSG")
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)="1^"_$C(31)
+	;
+	Q
+	;
+ERR(BSDXERID,ERRTXT)	;Error processing
+	S:'+$G(BSDXI) BSDXI=999999
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXERID_"^"_ERRTXT_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+ERROR	;
+	D ^%ZTER
+	I '+$G(BSDXI) N BSDXI S BSDXI=999999
+	S BSDXI=BSDXI+1
+	D ERR(0,"BSDX33 M Error: <"_$G(%ZTERROR)_">")
+	Q
+	;
+ERR2(BSDXERID,ERRTXT)	;Error processing
+	S:'+$G(BSDXI) BSDXI=999999
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXERID_"^^"_ERRTXT_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+ERROR2	;
+	D ^%ZTER
+	I '+$G(BSDXI) N BSDXI S BSDXI=999999
+	S BSDXI=BSDXI+1
+	D ERR2(0,"BSDX33 M Error: <"_$G(%ZTERROR)_">")
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX34.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX34.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX34.m	(revision 1134)
@@ -0,0 +1,176 @@
+BSDX34	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ; 7/15/10 12:37pm
+	;;1.5V3;BSDX;;Mar 16, 2011
+	   ;
+	   ; Change Log:
+	   ; July 10 2010: 
+	; CANCLIN AND RBCLIN: Dates passed in FM format for i18n
+	;
+	Q
+	;
+RBCLIND(BSDXY,BSDXCLST,BSDXBEG,BSDXEND)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("RBCLIN^BSDX34(.BSDXY,BSDXCLST,BSDXBEG,BSDXEND)")
+	Q
+	;
+RBERR	;
+	;Called from RBCLIN on error to set up header
+	K ^BSDXTMP($J)
+	S ^BSDXTMP($J,0)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030NewApptDate^T00030Clinic^T00030TypeStatus^I00010RESOURCEID"
+	S ^BSDXTMP($J,0)=^(0)_"^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE^D00030OldApptDate"_$C(30)
+	D ERR(999)
+	Q
+	;
+CANCLIN(BSDXY,BSDXCLST,BSDXBEG,BSDXEND)	;EP
+	;
+	;Return recordset of CANCELLED patient appointments
+	;between dates BSDXBEG and BSDXEND for each clinic in BSDXCLST.
+	;Used in generating cancellation letters for a clinic
+	;BSDXCLST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+	   ;v 1.3 BSDXBEG and BSDXEND are in fm format
+	;Called by BSDX CANCEL CLINIC LIST
+	N BSDXCAN
+	S BSDXCAN=1
+	D RBCLIN(.BSDXY,BSDXCLST,BSDXBEG,BSDXEND)
+	;
+	Q
+	;
+RBCLIN(BSDXY,BSDXCLST,BSDXBEG,BSDXEND)	;EP
+	;
+	;Return recordset of rebooked patient appointments
+	;between dates BSDXBEG and BSDXEND for each clinic in BSDXCLST.
+	;Used in generating rebook letters for a clinic
+	;BSDXCLST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+	;Called by BSDX REBOOK CLINIC LIST and BSDX CANCEL CLINIC LIST via entry point CANCLIN above
+	;Jul 11 2010 (smh):
+	   ;for i18n, pass BSDXBEG and BSDXEND in FM format.
+	;
+	S X="RBERR^BSDX34",@^%ZOSF("TRAP")
+	;
+	S BSDXY="^BSDXTMP("_$J_")"
+	N %DT,Y,BSDXJ,BSDXCID,BSDXCLN,BSDXSTRT,BSDXAID,BSDXNOD,BSDXLIST,BSDX,BSDY
+	;Convert beginning and ending dates
+	;TODO: Validation of date to make sure it's a right FM Date
+	   S BSDXBEG=$P(BSDXBEG,".")
+	   S BSDXEND=$P(BSDXEND,".")
+	S BSDXBEG=BSDXBEG-1,BSDXBEG=BSDXBEG_".9999"
+	S BSDXEND=BSDXEND_".9999"
+	   ;
+	I BSDXCLST="" D RBERR Q
+	;
+	;
+	;If BSDXCLST is a list of resource NAMES, look up each name and convert to IEN
+	F BSDXJ=1:1:$L(BSDXCLST,"|")-1 S BSDX=$P(BSDXCLST,"|",BSDXJ) D  S $P(BSDXCLST,"|",BSDXJ)=BSDY
+	. S BSDY=""
+	. I BSDX]"",$D(^BSDXRES(BSDX,0)) S BSDY=BSDX Q
+	. I BSDX]"",$D(^BSDXRES("B",BSDX)) S BSDY=$O(^BSDXRES("B",BSDX,0)) Q
+	. Q
+	;
+	;For each clinic in BSDXCLST $O through ^BSDXAPPT("ARSRC",ResourceIEN,FMDate,ApptIEN)
+	;
+	S BSDXLIST=""
+	F BSDXJ=1:1:$L(BSDXCLST,"|")-1 S BSDXCID=$P(BSDXCLST,"|",BSDXJ) D:+BSDXCID
+	. S BSDXCLN=$G(^BSDXRES(BSDXCID,0)) S BSDXCLN=$P(BSDXCLN,U) Q:BSDXCLN=""
+	. S BSDXSTRT=BSDXBEG F  S BSDXSTRT=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT)) Q:'+BSDXSTRT  Q:BSDXSTRT>BSDXEND  D
+	. . S BSDXAID=0 F  S BSDXAID=$O(^BSDXAPPT("ARSRC",BSDXCID,BSDXSTRT,BSDXAID)) Q:'+BSDXAID  D
+	. . . S BSDXNOD=$G(^BSDXAPPT(BSDXAID,0))
+	. . . I $D(BSDXCAN) D  Q
+	. . . . I $P(BSDXNOD,U,12) S BSDXLIST=BSDXLIST_BSDXAID_"|" ;Cancelled appt
+	. . . I $P(BSDXNOD,U,11) S BSDXLIST=BSDXLIST_BSDXAID_"|" ;Rebooked appt
+	D RBLETT(.BSDXY,BSDXLIST)
+	Q
+	;
+RBLETTD(BSDXY,BSDXLIST)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("RBLETT^BSDX34(.BSDXY,BSDXLIST)")
+	Q
+	;
+RBLETT(BSDXY,BSDXLIST)	;EP
+	;Return recordset of patient appointments used in listing
+	;REBOOKED appointments for a list of appointmentIDs.
+	;Called by rpc BSDX REBOOK LIST
+	;BSDXLIST is a |-delimited list of BSDX APPOINTMENT iens (the last |-piece is null)
+	;
+	N BSDXI,BSDXIEN,BSDXNOD,BSDXCNID,BSDXCNOD,BSDXMADE,BSDXCLRK,BSDXNOT,BSDXQ,BSDX
+	S BSDXY="^BSDXTMP("_$J_")"
+	S BSDXI=0
+	S ^BSDXTMP($J,BSDXI)="T00030Name^D00020DOB^T00030Sex^T00030HRN^D00030NewApptDate^T00030Clinic^T00030TypeStatus"
+	S ^BSDXTMP($J,BSDXI)=^(BSDXI)_"^I00010RESOURCEID^T00030APPT_MADE_BY^D00020DATE_APPT_MADE^T00250NOTE^T00030STREET^T00030CITY^T00030STATE^T00030ZIP^T00030HOMEPHONE^D00030OldApptDate"_$C(30)
+	S X="ERROR^BSDX34",@^%ZOSF("TRAP")
+	;
+	;Iterate through BSDXLIST
+	S BSDXIEN=0
+	F BSDX=1:1:$L(BSDXLIST,"|")-1 S BSDXIEN=$P(BSDXLIST,"|",BSDX) D
+	. N BSDXNOD,BSDXAPT,BSDXCID,BSDXCNOD,BSDXCLN,BSDX44,BSDXDNOD,BSDXSTAT,BSDX,BSDXTYPE,BSDXLIN,BSDXPAT
+	. N BSDXSTRE,BSDXCITY,BSDXST,BSDXZIP,BSDXPHON
+	. N BSDXNAM,BSDXDOB,BSDXHRN,BSDXSEX
+	. N BSDXREBK
+	. S BSDXNOD=$G(^BSDXAPPT(BSDXIEN,0))
+	. Q:BSDXNOD=""
+	. S BSDXPAT=$P(BSDXNOD,U,5) ;PATIENT ien
+	. Q:'+BSDXPAT
+	. Q:'$D(^DPT(BSDXPAT))
+	. D PINFO(BSDXPAT)
+	. S Y=$P(BSDXNOD,U)
+	. Q:'+Y
+	. X ^DD("DD") S Y=$TR(Y,"@"," ")
+	. S BSDXAPT=Y ;Appointment date time
+	. S BSDXREBK=""
+	. S Y=$P(BSDXNOD,U,11)
+	. I +Y X ^DD("DD") S Y=$TR(Y,"@"," ") S BSDXREBK=Y ;Rebook date time
+	. S BSDXCLRK=$P(BSDXNOD,U,8) ;Appointment made by
+	. S:+BSDXCLRK BSDXCLRK=$G(^VA(200,BSDXCLRK,0)),BSDXCLRK=$P(BSDXCLRK,U)
+	. S Y=$P(BSDXNOD,U,9) ;Date Appointment Made
+	. I +Y X ^DD("DD") S Y=$TR(Y,"@"," ")
+	. S BSDXMADE=Y
+	. ;NOTE
+	. S BSDXNOT=""
+	. I $D(^BSDXAPPT(BSDXIEN,1,0)) S BSDXNOT="",BSDXQ=0 F  S BSDXQ=$O(^BSDXAPPT(BSDXIEN,1,BSDXQ)) Q:'+BSDXQ  D
+	. . S BSDXLIN=$G(^BSDXAPPT(BSDXIEN,1,BSDXQ,0))
+	. . S:(BSDXLIN'="")&($E(BSDXLIN,$L(BSDXLIN)-1,$L(BSDXLIN))'=" ") BSDXLIN=BSDXLIN_" "
+	. . S BSDXNOT=BSDXNOT_BSDXLIN
+	. ;Resource
+	. S BSDXCID=$P(BSDXNOD,U,7) ;IEN of BSDX RESOURCE
+	. Q:'+BSDXCID
+	. Q:'$D(^BSDXRES(BSDXCID,0))
+	. S BSDXCNOD=$G(^BSDXRES(BSDXCID,0)) ;BSDX RESOURCE node
+	. Q:BSDXCNOD=""
+	. S BSDXCLN=$P(BSDXCNOD,U) ;Text name of BSDX Resource
+	. S BSDXTYPE="" ;Unused in this recordset
+	. S BSDXI=BSDXI+1
+	. S ^BSDXTMP($J,BSDXI)=BSDXNAM_"^"_BSDXDOB_"^"_BSDXSEX_"^"_BSDXHRN_"^"_BSDXREBK_"^"_BSDXCLN_"^"_BSDXTYPE_"^"_BSDXCID_"^"_BSDXCLRK_"^"_BSDXMADE_"^"_BSDXNOT_"^"_BSDXSTRE_"^"_BSDXCITY_"^"_BSDXST_"^"_BSDXZIP_"^"_BSDXPHON_"^"_BSDXAPT_$C(30)
+	. Q
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+PINFO(BSDXPAT)	;
+	;Get patient info
+	N BSDXNOD
+	S BSDXNOD=$$PATINFO^BSDX27(BSDXPAT)
+	S BSDXNAM=$P(BSDXNOD,U) ;NAME
+	S BSDXSEX=$P(BSDXNOD,U,2) ;SEX
+	S BSDXDOB=$P(BSDXNOD,U,3) ;DOB
+	S BSDXHRN=$P(BSDXNOD,U,4) ;Health Record Number for location DUZ(2)
+	S BSDXSTRE=$P(BSDXNOD,U,5) ;Street
+	S BSDXCITY=$P(BSDXNOD,U,6) ;City
+	S BSDXST=$P(BSDXNOD,U,7) ;State
+	S BSDXZIP=$P(BSDXNOD,U,8) ;zip
+	S BSDXPHON=$P(BSDXNOD,U,9) ;homephone
+	Q
+	;
+ERROR	;
+	D ERR("RPMS Error")
+	Q
+	;
+ERR(ERRNO)	;Error processing
+	S:'$D(BSDXI) BSDXI=999
+	I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+	E  S BSDXERR=ERRNO
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)="^^^^^^^^^^^^^^^^"_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDX35.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDX35.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDX35.m	(revision 1134)
@@ -0,0 +1,74 @@
+BSDX35	; IHS/OIT/HMW - WINDOWS SCHEDULING RPCS ;
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+	Q
+	;
+RSRCLTRD(BSDXY,BSDXLIST)	;EP
+	;Entry point for debugging
+	;
+	;D DEBUG^%Serenji("RSRCLTR^BSDX35(.BSDXY,BSDXLIST)")
+	Q
+	;
+RSRCLTR(BSDXY,BSDXLIST)	;EP
+	;
+	;Return recordset of RESOURCES and associated LETTERS
+	;Used in generating rebook letters for a clinic
+	;BSDXLIST is a |-delimited list of BSDX RESOURCE iens.  (The last |-piece is null, so discard it.)
+	;Called by BSDX RESOURCE LETTERS
+	;
+	;
+	S X="ERROR^BSDX35",@^%ZOSF("TRAP")
+	S BSDXY="^BSDXTMP("_$J_")"
+	N BSDXIEN,BSDX,BSDXLTR,BSDXNOS,BSDXCAN,BSDXIEN1
+	S BSDXI=0
+	S ^BSDXTMP($J,BSDXI)="I00010RESOURCEID^T00030RESOURCE_NAME^T00030LETTER_TEXT^T00030NO_SHOW_LETTER^T00030CLINIC_CANCELLATION_LETTER"_$C(30)
+	;
+	;
+	;If BSDXLIST is a list of resource NAMES, look up each name and convert to IEN
+	F BSDXJ=1:1:$L(BSDXLIST,"|")-1 S BSDX=$P(BSDXLIST,"|",BSDXJ) D  S $P(BSDXLIST,"|",BSDXJ)=BSDY
+	. S BSDY=""
+	. I BSDX]"",$D(^BSDXRES(BSDX,0)) S BSDY=BSDX Q
+	. I BSDX]"",$D(^BSDXRES("B",BSDX)) S BSDY=$O(^BSDXRES("B",BSDX,0)) Q
+	. Q
+	;
+	;Get letter text from wp fields
+	S BSDXIEN=0
+	F BSDX=1:1:$L(BSDXLIST,"|")-1 S BSDXIEN=$P(BSDXLIST,"|",BSDX) D
+	. Q:'$D(^BSDXRES(BSDXIEN))
+	. S BSDXNAM=$P(^BSDXRES(BSDXIEN,0),U)
+	. S BSDXLTR=""
+	. I $D(^BSDXRES(BSDXIEN,1)) D
+	. . S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXRES(BSDXIEN,1,BSDXIEN1)) Q:'+BSDXIEN1  D
+	. . . S BSDXLTR=BSDXLTR_$G(^BSDXRES(BSDXIEN,1,BSDXIEN1,0))
+	. . . S BSDXLTR=BSDXLTR_$C(13)_$C(10)
+	. S BSDXNOS=""
+	. I $D(^BSDXRES(BSDXIEN,12)) D
+	. . S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXRES(BSDXIEN,12,BSDXIEN1)) Q:'+BSDXIEN1  D
+	. . . S BSDXNOS=BSDXNOS_$G(^BSDXRES(BSDXIEN,12,BSDXIEN1,0))
+	. . . S BSDXNOS=BSDXNOS_$C(13)_$C(10)
+	. S BSDXCAN=""
+	. I $D(^BSDXRES(BSDXIEN,13)) D
+	. . S BSDXIEN1=0 F  S BSDXIEN1=$O(^BSDXRES(BSDXIEN,13,BSDXIEN1)) Q:'+BSDXIEN1  D
+	. . . S BSDXCAN=BSDXCAN_$G(^BSDXRES(BSDXIEN,13,BSDXIEN1,0))
+	. . . S BSDXCAN=BSDXCAN_$C(13)_$C(10)
+	. S BSDXI=BSDXI+1
+	. S ^BSDXTMP($J,BSDXI)=BSDXIEN_U_BSDXNAM_U_BSDXLTR_U_BSDXNOS_U_BSDXCAN_$C(30)
+	;
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+ERROR	;
+	D ERR("RPMS Error")
+	Q
+	;
+ERR(ERRNO)	;Error processing
+	S:'$D(BSDXI) BSDXI=999
+	I +ERRNO S BSDXERR=ERRNO+134234112 ;vbObjectError
+	E  S BSDXERR=ERRNO
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)="^^^^"_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
Index: Scheduling/branches/Radiology-Support/m/BSDXAPI.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDXAPI.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDXAPI.m	(revision 1134)
@@ -0,0 +1,374 @@
+BSDXAPI	; IHS/ANMC/LJF - SCHEDULING APIs ; 1/26/11 11:47am
+	;;1.5V3;BSDX;;Mar 16, 2011;Build 7
+	;Orignal routine is BSDAPI by IHS/LJF, HMW, and MAW
+	;local mods (many) by WV/SMH
+	;Move to BSDX namespace as BSDXAPI from BSDAPI by WV/SMH
+	; Change History:
+	; 2010-11-5: (1.42)
+	; - Fixed errors having to do uncanceling patient appointments if it was a patient cancelled appointment.
+	; - Use new style Fileman API for storing appointments in file 44 in $$MAKE due to problems with legacy API.
+	; 2010-11-12: (1.42)
+	; - Changed ="C" to ["C" in SCIEN. Cancelled appointments can be "PC" as well. 
+	; 2010-12-5 (1.42)
+	; Added an entry point to update the patient note in file 44.
+	; 2010-12-6 (1.42)
+	; MAKE1 incorrectly put info field in BSDR("INFO") rather than BSDR("OI")
+	; 2010-12-8 (1.42)
+	; Removed restriction on max appt length. Even though this restriction
+	; exists in fileman (120 minutes), PIMS ignores it. Therefore, I 
+	; will ignore it here too.
+	; 2011-01-25 (v.1.5)
+	; Added entry point $$RMCI to remove checked in appointments.
+	; In $$CANCEL, if the appointment is checked in, delete check-in rather than
+	;  spitting an error message to the user saying 'Delete the check-in'
+	; Changed all lines that look like this:
+	;  I $G(BSDR("ADT"))'?7N1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+	; to:
+	;  I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+	; to allow for date at midnight which does not have a dot at the end.
+	; 2011-01-26 (v.1.5)
+	; More user friendly message if patient already has appointment in $$MAKE:
+	;  Spits out pt name and user friendly date.
+	;  
+	;
+MAKE1(DFN,CLIN,TYP,DATE,LEN,INFO)	; Simplified PEP w/ parameters for $$MAKE - making appointment
+	; Call like this for DFN 23435 having an appointment at Hospital Location 33
+	; have 3 (scheduled) or 4 (walkin) appt at Dec 20, 2009 @ 10:11:59 for 30 minutes appt
+	; for Baby foxes hallucinations.
+	; S RESULT=$$MAKE1^BSDXAPI(23435,33,(3 or 4),3091220.221159,30,"I see Baby foxes")
+	S BSDR("PAT")=DFN       ;DFN
+	S BSDR("CLN")=CLIN      ;Hosp Loc IEN
+	S BSDR("TYP")=TYP       ;3 sched or 4 walkin
+	S BSDR("ADT")=DATE      ;Appointment date in FM format
+	S BSDR("LEN")=LEN       ;Appt len upto 240 (min)
+	S BSDR("OI")=INFO     ;Reason for appt - up to 150 char
+	S BSDR("USR")=DUZ       ;Person who made appt - current user
+	Q $$MAKE(.BSDR)
+	;
+MAKE(BSDR)	;PEP; call to store appt made
+	;
+	; Make call using: S ERR=$$MAKE^BSDXAPI(.ARRAY)
+	;
+	; Input Array -
+	; BSDR("PAT") = ien of patient in file 2
+	; BSDR("CLN") = ien of clinic in file 44
+	; BSDR("TYP") = 3 for scheduled appts, 4 for walkins
+	; BSDR("ADT") = appointment date and time
+	; BSDR("LEN") = appointment length in minutes (*1.42 limit removed)
+	; BSDR("OI")  = reason for appt - up to 150 characters
+	; BSDR("USR") = user who made appt
+	;
+	;Output: error status and message
+	;   = 0 or null:  everything okay
+	;   = 1^message:  error and reason
+	;
+	I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT"))
+	I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN"))
+	I ($G(BSDR("TYP"))<3)!($G(BSDR("TYP"))>4) Q 1_U_"Appt Type error: "_$G(BSDR("TYP"))
+	I $G(BSDR("ADT")) S BSDR("ADT")=+$E(BSDR("ADT"),1,12)  ;remove seconds
+	I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+	;
+	;I ($G(BSDR("LEN"))<5)!($G(BSDR("LEN"))>240) Q 1_U_"Appt Length error: "_$G(BSDR("LEN")) ; v 1.42 - no check on length is done anymore. see top comments for details.
+	I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Made Appt Error: "_$G(BSDR("USR"))
+	;I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)'["C" Q 1_U_"Patient "_BSDR("PAT")_" already has appt at "_BSDR("ADT") ; v.1.5 more user friendly err msg
+	;
+	; Following block to give an error message to user if there is already an appointment for patient. More verbose than others.
+	N BSDXERR ; place to store error message
+	I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)'["C" DO  QUIT BSDXERR  ; If there's an appt in the "S" node of file 2 and it's not cancelled
+	. S BSDXERR=1_U_"Patient "_$P(^DPT(BSDR("PAT"),0),U)_" ("_BSDR("PAT")_") "
+	. S BSDXERR=BSDXERR_"already has appt at "_$$FMTE^XLFDT(BSDR("ADT"))
+	. N BSDXSCIEN S BSDXSCIEN=$P(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0),U)  ; Clinic IEN in ^SC (0 piece of 0 node of "S" multiple in file 2)
+	. N BSDXSCNAM S BSDXSCNAM=$P(^SC(BSDXSCIEN,0),U) ; PIMS Name of Clinic
+	. S BSDXERR=BSDXERR_$C(13,10)_"PIMS clinic: "_BSDXSCNAM ; tell the user of the PIMS clinic
+	. I $D(^BSDXRES("ALOC",BSDXSCIEN)) DO  ; if the Clinic is linked to a BSDX Resource (we find out using the index ALOC in the BSDX RESOURCE file)
+	. . N BSDXRESIEN S BSDXRESIEN=$O(^BSDXRES("ALOC",BSDXSCIEN,""))
+	. . QUIT:'BSDXRESIEN  ; Safeguard if index is corrupt
+	. . N BSDXRESNAM S BSDXRESNAM=$P(^BSDXRES(BSDXRESIEN,0),U)
+	. . S BSDXERR=BSDXERR_$C(13,10)_"Scheduling GUI clinic: "_BSDXRESNAM ; tell the user of the BSDX clinic
+	;
+	NEW DIC,DA,Y,X,DD,DO,DLAYGO
+	;
+	I $D(^DPT(BSDR("PAT"),"S",BSDR("ADT"),0)),$P(^(0),U,2)["C" D
+	. ; "un-cancel" existing appt in file 2
+	. N BSDXFDA,BSDXIENS,BSDXMSG
+	. S BSDXIENS=BSDR("ADT")_","_BSDR("PAT")_","
+	. S BSDXFDA(2.98,BSDXIENS,".01")=BSDR("CLN")
+	. S BSDXFDA(2.98,BSDXIENS,"3")=""
+	. S BSDXFDA(2.98,BSDXIENS,"9")=BSDR("TYP")
+	. S BSDXFDA(2.98,BSDXIENS,"9.5")=9
+	. S BSDXFDA(2.98,BSDXIENS,"14")=""
+	. S BSDXFDA(2.98,BSDXIENS,"15")=""
+	. S BSDXFDA(2.98,BSDXIENS,"16")=""
+	. S BSDXFDA(2.98,BSDXIENS,"19")=""
+	. S BSDXFDA(2.98,BSDXIENS,"20")=$$NOW^XLFDT
+	. D FILE^DIE("","BSDXFDA","BSDXMSG")
+	. N BSDXTEMP S BSDXTEMP=$G(BSDXMSG)
+	E  D  I $G(BSDXERR(1)) Q 1_U_"FileMan add to DPT error: Patient="_BSDR("PAT")_" Appt="_BSDR("ADT")  
+	. N BSDXFDA,BSDXIENS,BSDXMSG
+	. S BSDXIENS="?+2,"_BSDR("PAT")_","
+	. S BSDXIENS(2)=BSDR("ADT")
+	. S BSDXFDA(2.98,BSDXIENS,.01)=BSDR("CLN")
+	. S BSDXFDA(2.98,BSDXIENS,"9")=BSDR("TYP")
+	. S BSDXFDA(2.98,BSDXIENS,"9.5")=9
+	. S BSDXFDA(2.98,BSDXIENS,"20")=$$NOW^XLFDT
+	. D UPDATE^DIE("","BSDXFDA","BSDXIENS","BSDXERR(1)")
+	; add appt to file 44
+	K DIC,DA,X,Y,DLAYGO,DD,DO
+	I '$D(^SC(BSDR("CLN"),"S",0)) S ^SC(BSDR("CLN"),"S",0)="^44.001DA^^"
+	I '$D(^SC(BSDR("CLN"),"S",BSDR("ADT"),0)) D  I Y<1 Q 1_U_"Error adding date to file 44: Clinic="_BSDR("CLN")_" Date="_BSDR("ADT")
+	. S DIC="^SC("_BSDR("CLN")_",""S"",",DA(1)=BSDR("CLN"),(X,DINUM)=BSDR("ADT")
+	. S DIC("P")="44.001DA",DIC(0)="L",DLAYGO=44.001
+	. S Y=1 I '$D(@(DIC_X_")")) D FILE^DICN
+	;
+	; Sep 28 2010: Changed old style API to new style API. Keep for reference //smh
+	;K DIC,DA,X,Y,DLAYGO,DD,DO,DINUM
+	;S DIC="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"
+	;S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),X=BSDR("PAT")
+	;S DIC("DR")="1///"_BSDR("LEN")_";3///"_$E($G(BSDR("OI")),1,150)_";7///`"_BSDR("USR")_";8///"_$P($$NOW^XLFDT,".")
+	;S DIC("P")="44.003PA",DIC(0)="L",DLAYGO=44.003
+	;D FILE^DICN
+	;
+	N BSDXIENS S BSDXIENS="?+1,"_BSDR("ADT")_","_BSDR("CLN")_","
+	N BSDXFDA
+	S BSDXFDA(44.003,BSDXIENS,.01)=BSDR("PAT")
+	S BSDXFDA(44.003,BSDXIENS,1)=BSDR("LEN")
+	S BSDXFDA(44.003,BSDXIENS,3)=$E($G(BSDR("OI")),1,150)
+	S BSDXFDA(44.003,BSDXIENS,7)=BSDR("USR")
+	S BSDXFDA(44.003,BSDXIENS,8)=$P($$NOW^XLFDT,".")
+	N BSDXERR
+	D UPDATE^DIE("","BSDXFDA","","BSDXERR")
+	;
+	I $D(BSDXERR) Q 1_U_"Error adding appt to file 44: Clinic="_BSDR("CLN")_" Date="_BSDR("ADT")_" Patient="_BSDR("PAT")_" Error: "_BSDXERR("DIERR",1,"TEXT",1)
+	;
+	; call event driver
+	NEW DFN,SDT,SDCL,SDDA,SDMODE
+	S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2
+	S SDDA=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+	D MAKE^SDAMEVT(DFN,SDT,SDCL,SDDA,SDMODE)
+	Q 0
+	;
+CHECKIN1(DFN,CLIN,APDATE)	; Simplified PEP w/ parameters for $$CHECKIN - Checking in
+	; Call like this for DFN 23435 checking in now at Hospital Location 33
+	; for appt at Dec 20, 2009 @ 10:11:59 
+	; S RESULT=$$CHECKIN1^BSDXAPI(23435,33,3091220.221159)
+	S BSDR("PAT")=DFN          ;DFN
+	S BSDR("CLN")=CLIN         ;Hosp Loc IEN
+	S BSDR("ADT")=APDATE       ;Appt Date
+	S BSDR("CDT")=$$NOW^XLFDT  ;Check-in date defaults to now
+	S BSDR("USR")=DUZ          ;Check-in user defaults to current
+	Q $$CHECKIN(.BSDR)
+	;
+CHECKIN(BSDR)	;EP; call to add checkin info to appt; IHS/ITSC/LJF 12/23/2004 PATCH 1002
+	;
+	; Make call by using:  S ERR=$$CHECKIN^BSDXAPI(.ARRAY)
+	;
+	; Input array -
+	;  BSDR("PAT") = ien of patient in file 2
+	;  BSDR("CLN") = ien of clinic in file 44
+	;  BSDR("ADT") = appt date/time
+	;  BSDR("CDT") = checkin date/time
+	;  BSDR("USR") = checkin user
+	;
+	; Output value -
+	;              = 0 means everything worked
+	;              = 1^message means error with reason message
+	;
+	I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT"))
+	I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN"))
+	I $G(BSDR("ADT")) S BSDR("ADT")=+$E(BSDR("ADT"),1,12)  ;remove seconds
+	I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+	I $G(BSDR("CDT")) S BSDR("CDT")=+$E(BSDR("CDT"),1,12)  ;remove seconds
+	I $G(BSDR("CDT"))'?7N.1".".4N Q 1_U_"Checkin Date/Time error: "_$G(BSDR("CDT"))
+	I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Made Appt Error: "_$G(BSDR("USR"))
+	;
+	; find ien for appt in file 44
+	NEW IEN,DIE,DA,DR
+	S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+	I 'IEN Q 1_U_"Error trying to find appointment for checkin: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT")
+	;
+	; remember before status
+	NEW SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL
+	S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2,SDDA=IEN
+	S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+	D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+	;
+	; set checkin
+	S DIE="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"
+	S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),DA=IEN
+	S DR="309///"_BSDR("CDT")_";302///`"_BSDR("USR")_";305///"_$$NOW^XLFDT
+	D ^DIE
+	;
+	; set after status
+	S SDDA=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+	S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+	D AFTER^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+	;
+	; call event driver
+	D EVT^SDAMEVT(.SDATA,4,SDMODE,SDCIHDL)
+	Q 0
+	;
+CANCEL1(DFN,CLIN,TYP,APDATE,REASON,INFO)	; PEP w/ parameters for $$CANCEL - cancelling appointment
+	; Call like this for DFN 23435 cancelling an appointment at Hospital Location 33,
+	; cancellation initiated by patient ("PC" rather than clinic "C"),
+	; cancelling appt at Dec 20, 2009 @ 10:11:59 because of reason 1 in file 409.2 IEN (weather)
+	; because foxes come out during bad weather.
+	; S RESULT=$$CANCEL1^BSDXAPI(23435,33,"PC",3091220.221159,1,"Afraid of foxes")
+	S BSDR("PAT")=DFN
+	S BSDR("CLN")=CLIN
+	S BSDR("TYP")=TYP
+	S BSDR("ADT")=APDATE
+	S BSDR("CDT")=$$NOW^XLFDT
+	S BSDR("USR")=DUZ
+	S BSDR("CR")=REASON
+	S BSDR("NOT")=INFO
+	Q $$CANCEL(.BSDR)
+	;
+CANCEL(BSDR)	;PEP; called to cancel appt
+	;
+	; Make call using: S ERR=$$CANCEL^BSDXAPI(.ARRAY)
+	;
+	; Input Array -
+	; BSDR("PAT") = ien of patient in file 2
+	; BSDR("CLN") = ien of clinic in file 44
+	; BSDR("TYP") = C for canceled by clinic; PC for patient canceled
+	; BSDR("ADT") = appointment date and time
+	; BSDR("CDT") = cancel date and time
+	; BSDR("USR") = user who canceled appt
+	; BSDR("CR")  = cancel reason - pointer to file 409.2
+	; BSDR("NOT") = cancel remarks - optional notes to 160 characters
+	;
+	;Output: error status and message
+	;   = 0 or null:  everything okay
+	;   = 1^message:  error and reason
+	;
+	I '$D(^DPT(+$G(BSDR("PAT")),0)) Q 1_U_"Patient not on file: "_$G(BSDR("PAT"))
+	I '$D(^SC(+$G(BSDR("CLN")),0)) Q 1_U_"Clinic not on file: "_$G(BSDR("CLN"))
+	I ($G(BSDR("TYP"))'="C"),($G(BSDR("TYP"))'="PC") Q 1_U_"Cancel Status error: "_$G(BSDR("TYP"))
+	I $G(BSDR("ADT")) S BSDR("ADT")=+$E(BSDR("ADT"),1,12)  ;remove seconds
+	I $G(BSDR("ADT"))'?7N.1".".4N Q 1_U_"Appt Date/Time error: "_$G(BSDR("ADT"))
+	I $G(BSDR("CDT")) S BSDR("CDT")=+$E(BSDR("CDT"),1,12)  ;remove seconds
+	I $G(BSDR("CDT"))'?7N.1".".4N Q 1_U_"Cancel Date/Time error: "_$G(BSDR("CDT"))
+	I '$D(^VA(200,+$G(BSDR("USR")),0)) Q 1_U_"User Who Canceled Appt Error: "_$G(BSDR("USR"))
+	I '$D(^SD(409.2,+$G(BSDR("CR")))) Q 1_U_"Cancel Reason error: "_$G(BSDR("CR"))
+	;
+	NEW IEN,DIE,DA,DR
+	S IEN=$$SCIEN(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+	I 'IEN Q 1_U_"Error trying to find appointment for cancel: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT")
+	;
+	; BSDX 1.5 3110125
+	; UJO/SMH - Add ability to remove check-in if the patient is checked in
+	; I $$CI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"),IEN) Q 1_U_"Patient already checked in; cannot cancel until checkin deleted: Patient="_BSDR("PAT")_" Clinic="_BSDR("CLN")_" Appt="_BSDR("ADT")
+	; Remove check-in if the patient is checked in.
+	N BSDXRESULT S BSDXRESULT=0 ; Result; should be zero if success; -1 + message if failure
+	I $$CI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"),IEN) SET BSDXRESULT=$$RMCI(BSDR("PAT"),BSDR("CLN"),BSDR("ADT"))
+	I BSDXRESULT Q BSDXRESULT
+	;
+	; remember before status
+	NEW SDATA,DFN,SDT,SDCL,SDDA,SDCPHDL
+	S DFN=BSDR("PAT"),SDT=BSDR("ADT"),SDCL=BSDR("CLN"),SDMODE=2,SDDA=IEN
+	S SDCPHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+	D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCPHDL)
+	;
+	; get user who made appt and date appt made from ^SC
+	;    because data in ^SC will be deleted
+	NEW USER,DATE
+	S USER=$P($G(^SC(SDCL,"S",SDT,1,IEN,0)),U,6)
+	S DATE=$P($G(^SC(SDCL,"S",SDT,1,IEN,0)),U,7)
+	;
+	; update file 2 info
+	NEW DIE,DA,DR
+	S DIE="^DPT("_DFN_",""S"",",DA(1)=DFN,DA=SDT
+	S DR="3///"_BSDR("TYP")_";14///`"_BSDR("USR")_";15///"_BSDR("CDT")_";16///`"_BSDR("CR")_";19///`"_USER_";20///"_DATE
+	S:$G(BSDR("NOT"))]"" DR=DR_";17///"_$E(BSDR("NOT"),1,160)
+	D ^DIE
+	;
+	; delete data in ^SC
+	NEW DIK,DA
+	S DIK="^SC("_BSDR("CLN")_",""S"","_BSDR("ADT")_",1,"
+	S DA(2)=BSDR("CLN"),DA(1)=BSDR("ADT"),DA=IEN
+	D ^DIK
+	;
+	; call event driver
+	D CANCEL^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDMODE,SDCPHDL)
+	Q 0
+	;
+CI(PAT,CLINIC,DATE,SDIEN)	;PEP; -- returns 1 if appt already checked-in
+	NEW X
+	S X=$G(SDIEN)   ;ien sent in call
+	I 'X S X=$$SCIEN(PAT,CLINIC,DATE) I 'X Q 0
+	S X=$P($G(^SC(CLINIC,"S",DATE,1,X,"C")),U)
+	Q $S(X:1,1:0)
+	;
+RMCI(PAT,CLINIC,DATE)	 ;PEP; -- Remove Check-in; $$
+	; PAT = DFN
+	; CLINIC = SC IEN
+	; DATE = FM Date/Time of Appointment
+	;
+	; Returns:
+	; 0 if okay
+	; -1 if failure
+	;
+	; Call like this: $$RMCI(233,33,3110102.1130)
+	;
+	; Move my variables into the ones used by SDAPIs (just a convenience)
+	NEW SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL
+	S DFN=PAT,SDT=DATE,SDCL=CLINIC,SDMODE=2,SDDA=$$SCIEN(DFN,SDCL,SDT)
+	;
+	I SDDA<1 QUIT 0    ; Appt cancelled; cancelled appts rm'ed from file 44
+	;
+	; remember before status
+	S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+	D BEFORE^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+	;
+	; remove check-in using filer.
+	N BSDXIENS S BSDXIENS=SDDA_","_DATE_","_CLINIC_","
+	S BSDXFDA(44.003,BSDXIENS,309)="@"	; CHECKED-IN
+	S BSDXFDA(44.003,BSDXIENS,302)="@"	; CHECK IN USER
+	S BSDXFDA(44.003,BSDXIENS,305)="@"	; CHECK IN ENTERED
+	N BSDXERR
+	D FILE^DIE("","BSDXFDA","BSDXERR")
+	I $D(BSDXERR) QUIT "-1~Can't file for Pat "_PAT_" in Clinic "_CLINIC_" at "_DATE_". Fileman reported an error: "_BSDXERR("DIERR",1,"TEXT",1)
+	;
+	; set after status
+	S SDDA=$$SCIEN(DFN,SDCL,SDT)
+	S SDCIHDL=$$HANDLE^SDAMEVT(1),SDATA=SDDA_U_DFN_U_SDT_U_SDCL
+	D AFTER^SDAMEVT(.SDATA,DFN,SDT,SDCL,SDDA,SDCIHDL)
+	;
+	; call event driver
+	D EVT^SDAMEVT(.SDATA,4,SDMODE,SDCIHDL)
+	QUIT 0
+	;
+SCIEN(PAT,CLINIC,DATE)	;PEP; returns ien for appt in ^SC
+	NEW X,IEN
+	S X=0 F  S X=$O(^SC(CLINIC,"S",DATE,1,X)) Q:'X  Q:$G(IEN)  D
+	. Q:$P($G(^SC(CLINIC,"S",DATE,1,X,0)),U,9)["C"  ;cancelled
+	 . I +$G(^SC(CLINIC,"S",DATE,1,X,0))=PAT S IEN=X
+	Q $G(IEN)
+	;
+APPTYP(PAT,DATE)	;PEP; -- returns type of appt (scheduled or walk-in)
+	NEW X S X=$P($G(^DPT(PAT,"S",DATE,0)),U,7)
+	Q $S(X=3:"SCHED",X=4:"WALK-IN",1:"??")
+	;
+CO(PAT,CLINIC,DATE,SDIEN)	;PEP; -- returns 1 if appt already checked-out
+	NEW X
+	S X=$G(SDIEN)   ;ien sent in call
+	I 'X S X=$$SCIEN(PAT,CLINIC,DATE) I 'X Q 0
+	S X=$P($G(^SC(CLINIC,"S",DATE,1,X,"C")),U,3)
+	Q $S(X:1,1:0)
+	;
+UPDATENOTE(PAT,CLINIC,DATE,NOTE)	; PEP; Update Note in ^SC for patient's appointment @ DATE
+	; PAT = DFN
+	; CLINIC = SC IEN
+	; DATE = FM Date/Time of Appointment
+	;
+	; Returns:
+	; 0 if okay
+	; -1 if failure
+	N SCIEN S SCIEN=$$SCIEN(PAT,CLINIC,DATE) ; ien of appt in ^SC
+	I SCIEN<1 QUIT 0    ; Appt cancelled; cancelled appts rm'ed from file 44
+	N BSDXIENS S BSDXIENS=SCIEN_","_DATE_","_CLINIC_","
+	S BSDXFDA(44.003,BSDXIENS,3)=$E(NOTE,1,150)
+	N BSDXERR
+	D FILE^DIE("","BSDXFDA","BSDXERR")
+	I $D(BSDXERR) QUIT "-1~Can't file for Pat "_PAT_" in Clinic "_CLINIC_" at "_DATE_". Fileman reported an error: "_BSDXERR("DIERR",1,"TEXT",1)
+	QUIT 0
Index: Scheduling/branches/Radiology-Support/m/BSDXGPRV.m
===================================================================
--- Scheduling/branches/Radiology-Support/m/BSDXGPRV.m	(revision 1134)
+++ Scheduling/branches/Radiology-Support/m/BSDXGPRV.m	(revision 1134)
@@ -0,0 +1,59 @@
+BSDXGPRV	; WV/SMH - WINDOWS SCHEDULING RPCS ; 11/2/10 4:27pm
+	;;1.5V3;BSDX;;Mar 16, 2011
+	;
+	;
+ERROR	;
+	D ERR("RPMS Error")
+	Q
+	;
+ERR(BSDXERR)	;Error processing
+	D ^%ZTER
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=BSDXERR
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	Q
+	;
+PD(BSDXY,HLIEN)	;EP Debugging entry point
+	;
+	D DEBUG^%Serenji("P^BSDXGPRV(.BSDXY,HLIEN)","192.168.254.130")
+	;
+	Q
+	;
+P(BSDXY,HLIEN)	; Public Entry point; Get Providers for Hosp Location
+	; Input: HLIEN - Hospital Location IEN
+	; Output: ADO Datatable with columns:
+	; - HOSPITAL_LOCATION_ID, BMXIEN, PROV_NAME, DEFAULT
+	; If there are providers in the PROVIDER multiple of file 44 
+	; (Hospital Location) return them;
+	; If no providers in PROVIDER multiple of file 44, return nothing
+	; Called by BSDX HOSP LOC PROVIDERS
+	;
+	S BSDXI=0
+	I '$D(^SC(HLIEN,0)) D ERR("HOSPITAL LOCATION NOT FOUND") QUIT
+	D ^XBKVAR 
+	N $ET S $ET="G ERROR^BSDXGPRV"
+	K ^BSDXTMP($J)
+	S BSDXY=$NA(^BSDXTMP($J))
+	S $P(^BSDXTMP($J,BSDXI),U,1)="I00020HOSPITAL_LOCATION_ID"
+	S $P(^BSDXTMP($J,BSDXI),U,2)="I00020BMXIEN"
+	S $P(^BSDXTMP($J,BSDXI),U,3)="T00030NAME"
+	S $P(^BSDXTMP($J,BSDXI),U,4)="T00005DEFAULT"
+	S ^BSDXTMP($J,BSDXI)=^BSDXTMP($J,BSDXI)_$C(30)
+	;
+	N OUTPUT
+	D GETS^DIQ(44,HLIEN_",","2600*","IE","OUTPUT") ; Provider Multiple
+	; No results
+	I '$D(OUTPUT) S ^BSDXTMP($J,BSDXI+1)=$C(31) QUIT
+	; if results, get them
+	N I S I=""
+	F  S I=$O(OUTPUT(44.1,I)) Q:I=""  D
+	. S BSDXI=BSDXI+1
+	. S $P(^BSDXTMP($J,BSDXI),U,1)=HLIEN                  ; HL IEN
+	. S $P(^BSDXTMP($J,BSDXI),U,2)=$P(OUTPUT(44.1,I,.01,"I"),",") ; PROV IEN
+	. S $P(^BSDXTMP($J,BSDXI),U,3)=$E(OUTPUT(44.1,I,.01,"E"),1,30) ; PROV NAME
+	. S $P(^BSDXTMP($J,BSDXI),U,4)=OUTPUT(44.1,I,.02,"E") ; Default - YES, NO
+	. S ^BSDXTMP($J,BSDXI)=^BSDXTMP($J,BSDXI)_$C(30)
+	S BSDXI=BSDXI+1
+	S ^BSDXTMP($J,BSDXI)=$C(31)
+	QUIT
