using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using VEPROMS.CSLA.Library;
using Volian.Print.Library;
//using Volian.Controls.Library;
using Volian.Base.Library;
namespace VEPROMS
{
	public partial class DlgPrintProcedure : DevComponents.DotNetBar.Office2007Form
	{
		public bool SaveLinks
		{
			get 
			{ 
				return swtbtnPDFLinks.Value;
			}
		}
		public bool RemoveTrailingHardReturnsAndManualPageBreaks
		{
			get { return cbxRemoveManualPageBreaks.Checked; }
		}
		private string _Prefix = "";  // RHM20150506 Multiline ItemID TextBox
		public string Prefix
		{
			get { return _Prefix; }
			set { _Prefix = value; }
		}
		public bool OpenAfterCreate  // RHM20150506 Multiline ItemID TextBox
		{
			get { return cbxOpenAfterCreate2.Checked; }
			set { cbxOpenAfterCreate2.Checked = value; }
		}
		private SessionInfo _MySessionInfo;
		public SessionInfo MySessionInfo
		{
			get { return _MySessionInfo; }
			set { _MySessionInfo = value; }
		}
		private bool _Automatic;
		public bool Automatic
		{
			get { return _Automatic; }
			set { _Automatic = value; }
		}
		// C2018-033 Used to turn off using the date/time PDF file prefix and suffix when doing batch file autmatic baseline print testing (frmVEPROMS.cs RunAutomatic())
		//           This is needed so the the automatic baselines can compare results from different runs of PROMS
		private bool _AllowDateTimePrefixSuffix = true;
		public bool AllowDateTimePrefixSuffix
		{
			get { return _AllowDateTimePrefixSuffix; }
			set 
			{ 
				_AllowDateTimePrefixSuffix = value;
				swtbtnPDFdtPrefixSuffix.Value = swtbtnPDFdtPrefixSuffix.Enabled = _AllowDateTimePrefixSuffix;
			}
		}
		private DateTime _PrefixSuffixDTS = DateTime.Now; // C2018-033 date/time used for the date/time PDF file prefix and suffix
		private bool _DateTimePrefixSuffixPrintingAllProcedures = true; // C2018-033 to control adding the Date/Time Prefix/Suffix to PFD name when printing All procedures
		private bool _IncludeWordSecTextInMetafile = true; // C2018-023 so that we can turn off including Word attachment text in metafile
		private void RunAutomatic()
		{
			cbxDebugPagination.Checked = true;
			cbxDebugText.Checked = true;
      cbxMetaFile.Checked = true; // C2018-004 create meta file for baseline compares
			_IncludeWordSecTextInMetafile = true;
			Application.DoEvents();
			string[] parameters = System.Environment.CommandLine.Split(" ".ToCharArray());
			bool ranAuto = false;
			foreach (string parameter in parameters)
			{
				if (parameter.ToUpper() == "/NT")
					cbxDebugText.Checked = false;
				else if (parameter.ToUpper() == "/NP")
					cbxDebugPagination.Checked = false;
				else if (parameter.ToUpper() == "/NC")
					cbxDebug.Checked = false;
				else if (parameter.ToUpper() == "/NM")
					cbxMetaFile.Checked = false; // C2018-004 turn off create meta file for baseline compares
        else if (parameter.ToUpper() == "/NW")
					_IncludeWordSecTextInMetafile = false; // C2018-023 turn off putting Word attachment text in the meta file for baseline compares
			}
			CreatePDFs();
			this.Close();
		}
		private DocVersionInfo _DocVersionInfo = null;
		private bool _AllProcedures;
		private DocVersionConfig _DocVersionConfig;
		public string RevNum
		{
			get { return txbRevNum.Text; }
			set { txbRevNum.Text = value; }
		}
		public string RevNumAndDate
		{
			get
			{
				// the RevDate and Rev number are stored in the procedure config separtly as strings
				// we put these two strings to gether to pass into the Print module.
				// the Rev Number followed by a forward slash or backslash logic is from the 16-bit code
				// and is treated as just string.
				// Therefore we need to build a revison number string with a revdate appended to it but only
				// if either the DoRevDate or the RevDateWithForwardSlash is true. otherwise we should use
				// only the RevNumber.
				if (RevDate == "" ||
					(RevNum.Contains("\\") || RevNum.Contains("/")) ||
					(!MyProcedure.ActiveFormat.PlantFormat.FormatData.PrintData.RevDateWithForwardSlash &&
					!MyProcedure.ActiveFormat.PlantFormat.FormatData.PrintData.DoRevDate))
					return RevNum;
				if (MyProcedure.ActiveFormat.PlantFormat.FormatData.PrintData.RevDateWithForwardSlash)
					return RevNum + "\\" + RevDate;
				else
					return RevNum + "/" + RevDate;
			}
		}
		public string ProcNum
		{
			get { return MyProcedure.DisplayNumber; }
		}
		public string PDFPath
		{
			get {// B2018-069 Revert to Temporary for Baseline testing
				if (PromsPrinter.BaselineTesting)
					return VlnSettings.TemporaryFolder;
				return txbPDFLocation.Text; 
			}
			set { txbPDFLocation.Text = value; }
		}
		public string RevDate
		{
			get { return txbRevDate.Text; }
			set { txbRevDate.Text = value; }
		}
		public string ReviewDate
		{
			get { return txbReviewDate.Text; }
			set { txbReviewDate.Text = value; }
		}
		public bool CreateContinuousActionSummary
		{
			get { return cbxGenerateConActSum.Checked; }
			set { cbxGenerateConActSum.Checked = value; }
		}
		public DlgPrintProcedure(DocVersionInfo dvi, bool automatic)
		{
			_Automatic = automatic;
			InitializeComponent();
			_AllProcedures = true;
			_DocVersionConfig = dvi.DocVersionConfig;
			_DocVersionInfo = dvi;
			MyProcedure = dvi.Procedures[0].MyProcedure;
			// C2019-004: Allow user to define duplex lank page text at the docversion level (this is used in baselines) 
			//  2nd line was added to other constructors (1st line already existed)
			swtbtnBlankPgsForDuplex.Value = dvi.DocVersionConfig.Print_AddBlankPagesWhenUsingDuplexFoldouts;
			tbBlankPage.Text = dvi.DocVersionConfig.Print_DuplexBlankPageText;
			// B2017-188: Don't allow user to uncheck the checkbox for printing blank pages if procedure has supplemental information
			//		This change was made to each of the DlgPrintProcedure methods.
			if (_MyProcedure != null && _MyProcedure.ProcHasSupInfoData)
			{
				swtbtnBlankPgsForDuplex.Enabled = false;
				tbBlankPage.Enabled = true;		// C2019-004: Allow user to define duplex blank page text (similar changes throughout file are not commented)
			}
			btnCreatePDF.Text = "Create PDFs";
			HandleDocVersionSettings();
			PrepForAllOrOne(false);
			Rtf2iTextSharp.DoingComparison = cbxDebug.Checked;  // RHM20150506 Multiline ItemID TextBox
			// don't open all PDFs if doing All Procedures
			//cbxOpenAfterCreate2.Checked = dvi.DocVersionConfig.Print_AlwaysViewPDFAfterCreate;
			// C2018-033 added the Prefix / Suffix switch to the expand Additional Settings check
			expPrnSetting.Expanded = swtbtnBlankPgsForDuplex.Value || swtbtnChgBar.Value || swtbtnGeneratePlacekeeper.Value || swtbtnPDFLinks.Value || swtbtnPROMSVersion.Value || swtbtnWaterMark.Value || swtbtnPDFdtPrefixSuffix.Value;
		}
		public DlgPrintProcedure(DocVersionInfo dvi)
		{
			_Automatic = false;
			InitializeComponent();
			_AllProcedures = true;
			_DocVersionConfig = dvi.DocVersionConfig;
			_DocVersionInfo = dvi;
			swtbtnBlankPgsForDuplex.Value = dvi.DocVersionConfig.Print_AddBlankPagesWhenUsingDuplexFoldouts;
			tbBlankPage.Text = dvi.DocVersionConfig.Print_DuplexBlankPageText;
			tbBlankPage.Enabled = swtbtnBlankPgsForDuplex.Value;
			MyProcedure = dvi.Procedures[0].MyProcedure;
			if (_MyProcedure != null && _MyProcedure.ProcHasSupInfoData)
			{
				swtbtnBlankPgsForDuplex.Enabled = false;
				tbBlankPage.Enabled = true;
			}
			btnCreatePDF.Text = "Create PDFs";
			HandleDocVersionSettings();
			PrepForAllOrOne(false);
			// don't open all PDFs if doing All Procedures
			// C2018-033 added the Prefix / Suffix switch to the expand Additional Settings check
			expPrnSetting.Expanded = swtbtnBlankPgsForDuplex.Value || swtbtnChgBar.Value || swtbtnGeneratePlacekeeper.Value || swtbtnPDFLinks.Value || swtbtnPROMSVersion.Value || swtbtnWaterMark.Value || swtbtnPDFdtPrefixSuffix.Value;
		}
		private void PrepForAllOrOne(bool oneProcedure)
		{
			txbPDFName.Visible = lblPDFFileName.Visible = oneProcedure;
			txbRevNum.Visible = lblRevNum.Visible = oneProcedure;
			txbReviewDate.Visible = lblReviewDate.Visible = oneProcedure;
			txbRevDate.Visible = lblRevDate.Visible = oneProcedure;
			cbxOpenAfterCreate2.Visible = oneProcedure;
			cbxOpenAfterCreate2.Checked = false;
			cbxOverwritePDF2.Visible = oneProcedure;
			cbxOverwritePDF2.Checked = true;
			gpnlDebug.Visible = Volian.Base.Library.VlnSettings.DebugMode;
			swtbtnGeneratePlacekeeper.Value = false;
			cbxGenerateConActSum.Checked = false;
			swtbtnGeneratePlacekeeper.Visible = lblGeneratePlacekeeper.Visible = oneProcedure && 
				((MyProcedure.ActiveFormat.PlantFormat.FormatData.PurchaseOptions & E_PurchaseOptions.AutoPlacekeeper) == E_PurchaseOptions.AutoPlacekeeper);
		}
		private string _UnitNumber;
		public string UnitNumber
		{
			get { return _UnitNumber; }
			set { _UnitNumber = value; }
		}
		private int _UnitIndex;
		public int UnitIndex
		{
			get { return _UnitIndex; }
			set { _UnitIndex = value; }
		}
		// C2018-012 - Code Cleanup - redesigned the Print Dialog to include a sliding panel and remplaced check boxes with ON/OFF switches
		public DlgPrintProcedure(ProcedureInfo pi)
		{
			InitializeComponent();
			_AllProcedures = false;
			_DocVersionConfig = pi.MyDocVersion.DocVersionConfig;
			swtbtnBlankPgsForDuplex.Value = pi.MyDocVersion.DocVersionConfig.Print_AddBlankPagesWhenUsingDuplexFoldouts;
			tbBlankPage.Text = pi.MyDocVersion.DocVersionConfig.Print_DuplexBlankPageText;
			tbBlankPage.Enabled = swtbtnBlankPgsForDuplex.Value;
			MyProcedure = pi;
			if (_MyProcedure != null && _MyProcedure.ProcHasSupInfoData)
			{
				swtbtnBlankPgsForDuplex.Enabled = false;
				tbBlankPage.Enabled = true;
			}
			btnCreatePDF.Text = "Create PDF";
			HandleDocVersionSettings();
			PrepForAllOrOne(true);
			cbxOpenAfterCreate2.Checked = pi.MyDocVersion.DocVersionConfig.Print_AlwaysViewPDFAfterCreate;
			// C2018-033 added the Prefix / Suffix switch to the expand Additional Settings check
			expPrnSetting.Expanded = swtbtnBlankPgsForDuplex.Value || swtbtnChgBar.Value || swtbtnGeneratePlacekeeper.Value || swtbtnPDFLinks.Value || swtbtnPROMSVersion.Value || swtbtnWaterMark.Value || swtbtnPDFdtPrefixSuffix.Value;
		}
		public DlgPrintProcedure(ProcedureInfo pi, bool automatic)  // RHM20150506 Multiline ItemID TextBox
		{		
			InitializeComponent();
			Automatic = automatic;
			Rtf2iTextSharp.DoingComparison = cbxDebug.Checked;
			_AllProcedures = false;
			_DocVersionConfig = pi.MyDocVersion.DocVersionConfig;
			swtbtnBlankPgsForDuplex.Value = pi.MyDocVersion.DocVersionConfig.Print_AddBlankPagesWhenUsingDuplexFoldouts;
			tbBlankPage.Text = pi.MyDocVersion.DocVersionConfig.Print_DuplexBlankPageText;
			tbBlankPage.Enabled = swtbtnBlankPgsForDuplex.Value;
			MyProcedure = pi;
			if (_MyProcedure != null && _MyProcedure.ProcHasSupInfoData)
			{
				swtbtnBlankPgsForDuplex.Enabled = false;
				tbBlankPage.Enabled = true;
			}
			btnCreatePDF.Text = "Create PDF";
			HandleDocVersionSettings();
			PrepForAllOrOne(true);
			cbxOpenAfterCreate2.Checked = pi.MyDocVersion.DocVersionConfig.Print_AlwaysViewPDFAfterCreate;
			// C2018-033 added the Prefix / Suffix switch to the expand Additional Settings check
			expPrnSetting.Expanded = swtbtnBlankPgsForDuplex.Value || swtbtnChgBar.Value || swtbtnGeneratePlacekeeper.Value || swtbtnPDFLinks.Value || swtbtnPROMSVersion.Value || swtbtnWaterMark.Value || swtbtnPDFdtPrefixSuffix.Value;
		}
		/// 
		/// RHM 20120925 Added so that the dialog would center over the PROMS window
		/// 
		/// 
		protected override void OnActivated(EventArgs e)
		{
			base.OnActivated(e);
			if (Owner != null)
				Location = new Point(Owner.Left + Owner.Width / 2 - Width / 2, Owner.Top + Owner.Height/2 - Height/2);
		}
		private void HandleDocVersionSettings()
		{
			GetDocVersionSettings();
			// set to a default PDF location if none was specified in the DocVersions property
			if (txbPDFLocation.Text == null || txbPDFLocation.Text.Length == 0 || !Directory.Exists(txbPDFLocation.Text))
				txbPDFLocation.Text = VlnSettings.TemporaryFolder;
			SetCompareVisibility();
			// if the default setting is 'SelectBeforePrinting', expand the Additional Print Settings panel
			if (_DocVersionConfig.Print_ChangeBar == PrintChangeBar.SelectBeforePrinting)
			{
					swtbtnChgBar.Value = false;
					cbxOvrrideDefChgBars.Checked = false;
					expPrnSetting.Expanded = true;
				}
		}
		private void GetDocVersionSettings()
		{
			_DocVersionConfig.SaveChangesToDocVersionConfig = false;
			_DocVersionConfig.ParentLookup = false;
			// PDF Location
			PDFPath = _DocVersionConfig.Print_PDFLocation;
			// Overwrite PDF
			cbxOverwritePDF2.Checked = _DocVersionConfig.Print_AlwaysOverwritePDF;
			// Open PDF After Create
			cbxOpenAfterCreate2.Checked = _DocVersionConfig.Print_AlwaysViewPDFAfterCreate;
			// Changebars on/off
			if (_DocVersionConfig.Print_ChangeBar == PrintChangeBar.Without)
				swtbtnChgBar.Value = false; 
			else
				swtbtnChgBar.Value = true; 
			// Watermark on/off
			if (_DocVersionConfig.Print_Watermark == PrintWatermark.None)
				swtbtnWaterMark.Value = false; 
			else
				swtbtnWaterMark.Value = true; 
			// Auto Duplexing on/off - Auto duplex was used only by Point Beach formats These buttons were removed from the dialog
			//                         There was not print coding to support this format flag
			//if ((_MyProcedure.ActiveParent as DocVersionInfo).ActiveFormat.PlantFormat.FormatData.PrintData.AllowDuplex)
			//{
			//	lblAutoDuplexing.Visible = true;
			//	btnDuplxOff.Visible = true;
			//	btnDuplxOn.Visible = true;
			//	if (_DocVersionConfig.Print_DisableDuplex)
			//		btnDuplxOff.PerformClick();
			//	else
			//		btnDuplxOn.PerformClick();
			//}
			//else
			//{
			//	lblAutoDuplexing.Visible = false;
			//	btnDuplxOff.Visible = false;
			//	btnDuplxOn.Visible = false;
			//}
			SetCompareVisibility();
			// default to using OriginalPageBreaks (16bit page breaks) if App.config is set
			// to true:
			//cbxOrPgBrk.Visible = VlnSettings.OriginalPageBreak && VlnSettings.DebugMode;
      cbxOrPgBrk.Visible = false; //per Harry
			cbxOrPgBrk.Checked = false;
		}
		private void SetCompareVisibility()
		{
			// default to print Debug info if App.config is set to debug mode
			// This checkbox is now labeled as "Compare PDF"
			// If the PDF location has a Compare folder or we are in Debug Mode
			// then make the checkbox visible
			string cmpfldr = txbPDFLocation.Text;
			if (!cmpfldr.EndsWith("\\")) cmpfldr += "\\";
			cmpfldr += "Compare";
			cbxDebug.Visible = Directory.Exists(cmpfldr) || VlnSettings.DebugMode;
			cbxDebug.Checked = VlnSettings.DebugMode;
		}
		private void DlgPrintProcedure_Load(object sender, EventArgs e)
		{
			SetupForProcedure();
			_MyTimer = new Timer();
			_MyTimer.Tick += new EventHandler(_MyTimer_Tick);
			_MyTimer.Interval = 100;
			_MyTimer.Enabled = true;
			btnCreatePDF.Select();
		}
		void _MyTimer_Tick(object sender, EventArgs e)
		{
			_MyTimer.Enabled = false;
			BringToFront();
			if (Automatic) RunAutomatic();
		}
		private Timer _MyTimer;
		public void SetupForProcedure() // RHM20150506 Multiline ItemID TextBox
		{
			if(_DocVersionInfo == null)this.Text = "Create PDF for " + ProcNum;
			// get list of previous pdf files
			// if no previous pdf file, then get path from frmVersionProperties
			// dlgSelectFile.InitialDirectory = pdf path from frmVersionProperties
			//cbxPDF.Text = string.Format(@"{0}\{1}.pdf", _PDFPath, _ProcNum);
			// General 2 settings
			//txbPDFLocation.Text = _PDFPath;
			BuildPDFFileName();
			ProcedureConfig pc = _MyProcedure.MyConfig as ProcedureConfig;
			if(SelectedSlave > 0) pc.SelectedSlave = SelectedSlave;
			if (pc != null)
			{
				RevNum = pc.Print_Rev;
				RevDate = pc.Print_RevDate; //== null || pc.Print_RevDate=="" ? DateTime.Today : Convert.ToDateTime(pc.Print_RevDate);
				ReviewDate = pc.Print_ReviewDate; // == null ? DateTime.Today : Convert.ToDateTime(pc.Print_ReviewDate);
				 //Now check the format flags to determine if/how the Rev string should be parsed.
				// This will covert the old way (16-bit) of setting a RevDate (appending it to the RevNumber)
				// to the new way saving the RevNumber and RevDate in there own config fields
				if ((_MyProcedure.ActiveFormat.PlantFormat.FormatData.PrintData.DoRevDate && RevNum.Contains("/"))
				    || (_MyProcedure.ActiveFormat.PlantFormat.FormatData.PrintData.RevDateWithForwardSlash && RevNum.Contains("\\")))
				{
				    int indx = RevNum.IndexOf(_MyProcedure.ActiveFormat.PlantFormat.FormatData.PrintData.RevDateWithForwardSlash ? '\\' : '/');
					pc.Print_RevDate = RevDate = RevNum.Substring(indx + 1);
					pc.Print_Rev = RevNum = RevNum.Substring(0, indx);
					// save the RevNumber and RevDate to the procedure's config.
					using (Item itm = Item.Get(MyProcedure.ItemID))
					{
						itm.MyContent.Config = MyProcedure.MyConfig.ToString();
						itm.Save();
					}
				}
			}
			else
			{
				RevNum = "0";
				RevDate = DateTime.Today.ToShortDateString();
				ReviewDate = null;
			}
			cbxWaterMark.DataSource = EnumDetail.Details();
			cbxWaterMark.DisplayMember = "Description";
			cbxWaterMark.ValueMember = "EValue";
			PrintWatermark pw = _DocVersionConfig.Print_Watermark; // MyProcedure.ProcedureConfig.Print_Watermark;
			cbxWaterMark.Text = pw.ToString();
			//ppCmbxChgBarPos.DataSource = EnumDetail.Details();
			//ppCmbxChgBarPos.DisplayMember = "Description";
			//ppCmbxChgBarPos.ValueMember = "EValue";
			//ppCmbxChgBarPos.SelectedIndex = (int)MyProcedure.MyDocVersion.DocVersionConfig.Print_ChangeBarLoc;
			ppCmbxChgBarTxtType.DataSource = EnumDetail.Details();
			ppCmbxChgBarTxtType.DisplayMember = "Description";
			ppCmbxChgBarTxtType.ValueMember = "EValue";
			ppCmbxChgBarTxtType.SelectedIndex = (int)_DocVersionConfig.Print_ChangeBarText;
			ppTxbxChangeBarUserMsgOne.Text = _DocVersionConfig.Print_UserCBMess1;
			ppTxbxChangeBarUserMsgTwo.Text = _DocVersionConfig.Print_UserCBMess2;
			ppGpbxUserSpecTxt.Enabled = ppCmbxChgBarTxtType.SelectedIndex == (int)PrintChangeBarText.UserDef;
			bool hasReviewDate = _MyProcedure.ActiveFormat.PlantFormat.HasPageListToken("{REVIEWDATE}");
			bool usesRevDate = _MyProcedure.ActiveFormat.PlantFormat.FormatData.PrintData.DoRevDate || _MyProcedure.ActiveFormat.PlantFormat.FormatData.PrintData.RevDateWithForwardSlash;
			if (_MyProcedure.Sections != null)
			{
				foreach (SectionInfo mysection in _MyProcedure.Sections)
					hasReviewDate |= mysection.ActiveFormat.PlantFormat.HasPageListToken("{REVIEWDATE}");
			}
			// Only the New HLP format and the MYA format use this
			// South Texas does not use their new HLP format and MYA (Main Yankee) has dropped us (they closed)
			// thus there is no supporting code to print a Review Date
			// thus setting "hasReviewDate" to false so the Review Date entry box does not appear on the print dialog
			// - jsj 4/3/2013
			hasReviewDate = false; // jsj 4/3/2013
			lblReviewDate.Visible = txbReviewDate.Visible = !_AllProcedures && hasReviewDate;
			lblRevDate.Visible = txbRevDate.Visible = !_AllProcedures && usesRevDate;
		}
		// C2018-033 add the Prefix and/or Suffix to PDF file name if defined and wanted by the user
		//           this piece of code was functionalized from SetupForProcedure()
		private void BuildPDFFileName()
		{
			if (MyProcedure == null) return;
			string PDFFilePrefix = _DocVersionConfig.Print_PDFFilePrefix;
			string PDFFileSuffix = _DocVersionConfig.Print_PDFFileSuffix;
			string PDFFileName = "";
			if (AllowDateTimePrefixSuffix && swtbtnPDFdtPrefixSuffix.Value)
			{
				PDFDTPrefix dtPre = _DocVersionConfig.Print_PDFdtFilePrefix;
				PDFDTSuffix dtSuf = _DocVersionConfig.Print_PDFdtFileSuffix;
				//DateTime dts = DateTime.Now;
				if (dtPre != PDFDTPrefix.None)
					PDFFilePrefix = (_PrefixSuffixDTS.ToString(dtPre.ToString())).Replace("__", " ").Replace("_", "-") + "_";
				if (dtSuf != PDFDTSuffix.None)
					PDFFileSuffix = "_" + (_PrefixSuffixDTS.ToString(dtSuf.ToString())).Replace("__", " ").Replace("_", "-");
			}
			if (ProcNum == string.Empty)
				//txbPDFName.Text = this.UnitNumber + ".pdf";
				PDFFileName = this.UnitNumber;
			else
				//txbPDFName.Text = string.Format("{0}.pdf", _MyProcedure.PDFNumber);
				PDFFileName = string.Format("{0}", _MyProcedure.PDFNumber);
			//if (txbPDFName.Text.StartsWith("*"))
			//    txbPDFName.Text = txbPDFName.Text.Replace("*", this.UnitNumber);
			if ((PDFFileName ?? "") == "") PDFFileName = "NoProcNumber";
			if (PDFFileName.StartsWith("*"))
				PDFFileName = PDFFileName.Replace("*", this.UnitNumber);
			if (PDFFileName.Contains("?")) PDFFileName = PDFFileName.Replace("?", "_");  // for wcn sys/BM-2xxA??, etc
			txbPDFName.Text = PDFFilePrefix + PDFFileName + PDFFileSuffix + ".pdf";
		}
		// C2018-033 Enable/disable the switch to control whether to add Prefix and/or Suffix to PDF file name
		private void SetupPrefixSuffixSwitch()
		{
			// note that MyProcedure must be set before calling this because BuildPDFFileName() will be called when the swbtnPDFPrefixSuffix is set
			string PDFFilePrefix = _DocVersionConfig.Print_PDFFilePrefix;
			string PDFFileSuffix = _DocVersionConfig.Print_PDFFileSuffix;
			PDFDTPrefix dtPre = _DocVersionConfig.Print_PDFdtFilePrefix;
			PDFDTSuffix dtSuf = _DocVersionConfig.Print_PDFdtFileSuffix;
			bool hasPrefixSuffix = _DateTimePrefixSuffixPrintingAllProcedures && (PDFFilePrefix.Length > 0 || PDFFileSuffix.Length > 0 || dtPre != PDFDTPrefix.None || dtSuf != PDFDTSuffix.None);
			swtbtnPDFdtPrefixSuffix.Value = hasPrefixSuffix; // this will call BuildPDFFileName() thus MyProcedure must be set
			swtbtnPDFdtPrefixSuffix.Enabled = hasPrefixSuffix;
		}
		private void btnCancel_Click(object sender, EventArgs e)
		{
			this.Close();
		}
		private void swtbtnChgBar_ValueChanged(object sender, EventArgs e)
		{
			if (swtbtnChgBar.Value)
			{
				ppGpbxUserSpecCB.Enabled = true;
				switch (_DocVersionConfig.Print_ChangeBar)
				{
					case PrintChangeBar.WithUserSpecified:
						cbxOvrrideDefChgBars.Checked = true;
						break;
					case PrintChangeBar.SelectBeforePrinting:
					case PrintChangeBar.WithDefault:
					default:
						cbxOvrrideDefChgBars.Checked = false;
						break;
				}
			}
			else
				ppGpbxUserSpecCB.Enabled = false;
		}
		private void swtbtnWaterMark_ValueChanged(object sender, EventArgs e)
		{
			cbxWaterMark.Visible = swtbtnWaterMark.Value;
		}
		private void txbPDFLocation_Leave(object sender, EventArgs e)
		{
			if (!Directory.Exists(PDFPath))
			{
				string msg = string.Format("'{0}' does not exist. \n\nCreate it?", PDFPath);
				DialogResult dr= MessageBox.Show(msg, "Folder Not Found", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
				if (dr == DialogResult.Yes)
				{
					try
					{
						Directory.CreateDirectory(PDFPath);
					}
					catch (Exception ex)
					{
						MessageBox.Show(ex.Message, "Error trying to create folder", MessageBoxButtons.OK, MessageBoxIcon.Error);
						PDFPath = _DocVersionConfig.Print_PDFLocation;
					}
				}
				else
				{
					PDFPath = _DocVersionConfig.Print_PDFLocation;
				}
			}
		}
		private void DlgPrintProcedure_FormClosed(object sender, FormClosedEventArgs e)
		{
			_DocVersionConfig.SaveChangesToDocVersionConfig = true;
			//_DocVersionConfig.ParentLookup = true;
			ProcedureConfig pc = _MyProcedure.MyConfig as ProcedureConfig;
			if (SelectedSlave > 0) pc.SelectedSlave = 0;
		}
		private ProcedureInfo _MyProcedure;
		public ProcedureInfo MyProcedure
		{
			get { return _MyProcedure; }
			set 
			{
				_MyProcedure = value;
				// if procedure has supplemental information, the automatially check the add blank pages for duplex printing
				if (_MyProcedure.ProcHasSupInfoData)
				{
					swtbtnBlankPgsForDuplex.Value = true;
					tbBlankPage.Enabled = true;
				}
				SetupPrefixSuffixSwitch();  // C2018-033 Enable the switch to control whether to add Prefix and/or Suffix to PDF file name
			}
		}
		private int _SelectedSlave = 0;
		public int SelectedSlave
		{
			get { return _SelectedSlave; }
			set
			{
				_SelectedSlave = value;
				lblMultiunitPdfLocation.Visible = cbxMultiunitPdfLocation.Visible = (value > -1);
				cbxMultiunitPdfLocation.SelectedIndex = 1;
			}
		}
		private string _MultiunitPdfLocation = string.Empty;
		private void CreatePDFs()
		{
			if (VlnSettings.GetCommandFlag("PROFILE")) ProfileTimer.TurnOnTracking("Profile.txt");
			VEPROMS.CSLA.Library.Database.TrackDBUsage = VlnSettings.GetCommandFlag("DBTrack");
			ProfileTimer.Reset();
			int profileDepth = ProfileTimer.Push(">>>> CreatePdf");
			StringBuilder sb = new StringBuilder();
			if (MySessionInfo != null)
			{
				foreach (ProcedureInfo myProc in _DocVersionInfo.Procedures)
				{
					string message = string.Empty;
					if (!MySessionInfo.CanCheckOutItem(myProc.ItemID, CheckOutType.Procedure, ref message))
					{
						sb.AppendLine(message);
					}
				}
				if (sb.Length > 0)
				{
					if (MessageBox.Show(sb.ToString() + Environment.NewLine + Environment.NewLine + "Do you want to continue to print all procedures?", "Procedures Already Checked Out", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
						return;
				}
			}
			CreateDebugFiles();
			// If file exists, determine if overwrite checkbox allows overwrite, if not prompt.
			Volian.Print.Library.Rtf2Pdf.PdfDebug = cbxDebug.Checked;
			PrintWatermark pw = (swtbtnWaterMark.Value) ? (PrintWatermark)cbxWaterMark.SelectedValue : PrintWatermark.None;
			// Determine change bar settings.  First get from config & then see if override from dialog. 
			// Also check that format allows override.
			ChangeBarDefinition cbd = DetermineChangeBarSettings();
			int n = _DocVersionInfo.Procedures.Count;
			int i = 0;
			pbPDFsStatus.Maximum = n;
			pbPDFsStatus.Visible = true;
			this.Text = string.Format("Processing {0}", _DocVersionInfo.MyFolder.Name);
			foreach (ProcedureInfo myProc in _DocVersionInfo.Procedures)
			{
				MyProcedure = myProc;
				if (myProc.Sections != null)
				{
					// This is master/slave & a slave has been selected for printing (SelectedSlave > 0)
					if (SelectedSlave > 0)
					{
						MyProcedure.MyDocVersion.DocVersionConfig.SelectedSlave = SelectedSlave;
						SetupForProcedure();
						pbPDFsStatus.TextVisible = true;
						pbPDFsStatus.Text = string.Format("Creating PDF for {0} ({1} of {2})", myProc.DisplayNumber, ++i, n);
						pbPDFsStatus.Value = i;
					//						this.Text = string.Format("Create PDF for {0} ({1} of {2})", myProc.DisplayNumber, ++i, n);
						MyProcedure = ProcedureInfo.GetItemAndChildrenByUnit(MyProcedure.ItemID, 0, MyProcedure.MyDocVersion.DocVersionConfig.SelectedSlave);
						// C2018-015 add the procedure tree path and the procedure number and title to the meta file
						if (BaselineMetaFile.IsOpen && i == 1) BaselineMetaFile.WriteLine("!! {0}", MyProcedure.SearchDVPath.Replace("\a", " | "));
						if (BaselineMetaFile.IsOpen) BaselineMetaFile.WriteLine("!! {0} | {1}", MyProcedure.DisplayNumber, MyProcedure.DisplayText);
						string myPDFPath = GetMultiunitPDFPath();
						// RHM 20120925 Overlay the bottom of the dialog so that cancel button is covered.
						frmPDFStatusForm frmStatus = new frmPDFStatusForm(MyProcedure, RevNumAndDate, pw.ToString(), cbxDebug.Checked, cbxOrPgBrk.Checked, 
							cbxOpenAfterCreate2.Checked, cbxOverwritePDF2.Checked, myPDFPath, cbd, txbPDFName.Text, new Point(Left, Bottom - 50),
							swtbtnBlankPgsForDuplex.Value, _AllProcedures || Automatic, Prefix, SaveLinks, RemoveTrailingHardReturnsAndManualPageBreaks, swtbtnPROMSVersion.Value, true, tbBlankPage.Text);//C2018-009 print PROMS version
						frmStatus.CloseWhenDone = true;
						Application.DoEvents();
						frmStatus.CancelStop = true;
						frmStatus.ShowDialog();
						if (frmStatus.CancelPrinting) break;
					}
					// This is a master/slave for printing of all slaves (SelectedSave == 0)
					else if (SelectedSlave == 0)
					{
						for (int k = 1; k <= MyProcedure.MyDocVersion.MultiUnitCount; k++)
						{
							MyProcedure.MyDocVersion.DocVersionConfig.SelectedSlave = k;
							SetupForProcedure();
							pbPDFsStatus.TextVisible = true;
							pbPDFsStatus.Text = string.Format("Creating PDF for {0} ({1} of {2})", myProc.DisplayNumber, ++i, n);
							pbPDFsStatus.Value = i;
							//							this.Text = string.Format("Create PDF for {0} ({1} of {2})", myProc.DisplayNumber, ++i, n);
							MyProcedure = ProcedureInfo.GetItemAndChildrenByUnit(MyProcedure.ItemID, 0, MyProcedure.MyDocVersion.DocVersionConfig.SelectedSlave);
							// C2018-015 add the procedure tree path and the procedure number and title to the meta file
							if (BaselineMetaFile.IsOpen && i == 1) BaselineMetaFile.WriteLine("!! {0}", MyProcedure.SearchDVPath.Replace("\a", " | "));
							if (BaselineMetaFile.IsOpen) BaselineMetaFile.WriteLine("!! {0} | {1}", MyProcedure.DisplayNumber, MyProcedure.DisplayText);
							// RHM 20120925 Overlay the bottom of the dialog so that cancel button is covered.
							// B2016-249 Output Procedure to folder associated with Parent Child
							frmPDFStatusForm frmStatus = new frmPDFStatusForm(MyProcedure, RevNumAndDate, pw.ToString(), cbxDebug.Checked, cbxOrPgBrk.Checked,
								cbxOpenAfterCreate2.Checked, cbxOverwritePDF2.Checked, GetMultiunitPDFPath(), cbd, txbPDFName.Text, new Point(Left, Bottom - 50),
								swtbtnBlankPgsForDuplex.Value, _AllProcedures || Automatic, Prefix, SaveLinks, RemoveTrailingHardReturnsAndManualPageBreaks, swtbtnPROMSVersion.Value, true, tbBlankPage.Text);//C2018-009 print PROMS version
							frmStatus.CloseWhenDone = true;
							Application.DoEvents();
							frmStatus.CancelStop = true;
							frmStatus.ShowDialog();
							if (frmStatus.CancelPrinting) break;
						}
					}
					// Not master/slave
					else
					{
						SetupForProcedure();
						pbPDFsStatus.TextVisible = true;
						pbPDFsStatus.Text = string.Format("Creating PDF for {0} ({1} of {2})", myProc.DisplayNumber, ++i, n);
						pbPDFsStatus.Value = i;
						//						this.Text = string.Format("Create PDF for {0} ({1} of {2})", myProc.DisplayNumber, ++i, n);
						// RHM 20120925 Overlay the bottom of the dialog so that cancel button is covered.
						int profileDepth1 = ProfileTimer.Push(">>>> GetItemAndChildren");
						if (MyProcedure.ActiveFormat.PlantFormat.FormatData.TransData.UseTransitionModifier || MyProcedure.ActiveFormat.PlantFormat.FormatData.TransData.UseSpecificTransitionModifier)
							MyProcedure = ProcedureInfo.GetItemAndChildrenByUnit(MyProcedure.ItemID, 0, MyProcedure.MyDocVersion.DocVersionConfig.SelectedSlave);
						else
							MyProcedure = ProcedureInfo.GetItemAndChildren(MyProcedure.ItemID);
						// C2018-015 add the procedure tree path and the procedure number and title to the meta file
						if (BaselineMetaFile.IsOpen && i == 1) BaselineMetaFile.WriteLine("!! {0}", MyProcedure.SearchDVPath.Replace("\a", " | "));
						if (BaselineMetaFile.IsOpen) BaselineMetaFile.WriteLine("!! {0} | {1}", MyProcedure.DisplayNumber, MyProcedure.DisplayText);
						ProfileTimer.Pop(profileDepth1);
						// B2016-249 Output Procedure to folder associated with Parent Child
						frmPDFStatusForm frmStatus = new frmPDFStatusForm(MyProcedure, RevNumAndDate, pw.ToString(), cbxDebug.Checked,
							cbxOrPgBrk.Checked, cbxOpenAfterCreate2.Checked, cbxOverwritePDF2.Checked, GetMultiunitPDFPath(), cbd, txbPDFName.Text,
							new Point(Left, Bottom - 50), swtbtnBlankPgsForDuplex.Value, _AllProcedures || Automatic, Prefix, SaveLinks, RemoveTrailingHardReturnsAndManualPageBreaks, swtbtnPROMSVersion.Value, true, tbBlankPage.Text);//C2018-009 print PROMS version
						frmStatus.CloseWhenDone = true;
						Application.DoEvents();
						frmStatus.CancelStop = true;
						frmStatus.ShowDialog();
						if (frmStatus.CancelPrinting) break;
					}
				}
			}
			pbPDFsStatus.Visible = false;
			if(!Automatic) 
				ShowDebugFiles();
			ProfileTimer.Pop(profileDepth);
			ProfileTimer.ShowTimerTable();
			if (VlnSettings.GetCommandFlag("DBTrack"))
			{
				VEPROMS.CSLA.Library.Database.TrackDBUsage = false;
				VEPROMS.CSLA.Library.Database.ShowDBTracking("DBTracking.txt");
			}
		}
		private string GetMultiunitPDFPath()
		{
			string newPDFPath = string.Empty;
			if (_MultiunitPdfLocation == "None")
				newPDFPath = PDFPath;
			if (_MultiunitPdfLocation == "Unit Name")
				newPDFPath = PDFPath + @"\" + MyProcedure.MyDocVersion.DocVersionConfig.Unit_Name;
			if (_MultiunitPdfLocation == "Unit Number")
				newPDFPath = PDFPath + @"\" + MyProcedure.MyDocVersion.DocVersionConfig.Unit_Number;
			if (_MultiunitPdfLocation == "Unit Text")
				newPDFPath = PDFPath + @"\" + MyProcedure.MyDocVersion.DocVersionConfig.Unit_Text;
			if (_MultiunitPdfLocation == "Unit ID")
				newPDFPath = PDFPath + @"\" + MyProcedure.MyDocVersion.DocVersionConfig.Unit_ID;
			if (newPDFPath == "") newPDFPath = Volian.Base.Library.VlnSettings.TemporaryFolder;
			// B2016-255 Non-P/C PC proceduress need to remove that \0 that the code above addds
			if (newPDFPath.EndsWith("\\0")) newPDFPath = newPDFPath.Substring(0, newPDFPath.Length - 2);
			if (!Directory.Exists(newPDFPath))
				Directory.CreateDirectory(newPDFPath);
			return newPDFPath;
		}
		private void CreateDebugFiles()
		{
			if (cbxDebugPagination.Checked)
				Volian.Base.Library.DebugPagination.Open(PDFPath + "\\DebugPagination.txt"); // RHM 20120925 Corrected spelling
			if (cbxDebugText.Checked)
				Volian.Base.Library.DebugText.Open(PDFPath + "\\DebugText.txt");
			if (cbxMetaFile.Checked) // C2018-004 create meta file for baseline compares
			{
				Volian.Base.Library.BaselineMetaFile.Open(PDFPath + "\\DebugMeta.txt");
				// C2018-015 add the PROMS Version, SQL Server, and Database to top of the meta file
				Volian.Base.Library.BaselineMetaFile.WriteLine("!! Ver {0}  {1} {2}", AboutVEPROMS.PROMSVersion, AboutVEPROMS.SQLServerName, AboutVEPROMS.DatabaseName);
				// C2018-023 set as to whether we are going to include the Word attment text in the baseline metafile
				Volian.Base.Library.BaselineMetaFile.IncludeWordSecText = _IncludeWordSecTextInMetafile;
			}
			Rtf2Pdf._lastPageNum = 0; // reset page number
		}
		private void ShowDebugFiles()
		{
			if (cbxDebugPagination.Checked)
				Volian.Base.Library.DebugPagination.Show();
			if (cbxDebugText.Checked)
				Volian.Base.Library.DebugText.Show();
			if (cbxMetaFile.Checked)// C2018-004 create meta file for baseline compares
        Volian.Base.Library.BaselineMetaFile.Show(); // baseline
		}
		public void CreatePDF()  // RHM20150506 Multiline ItemID TextBox
		{
			if (VlnSettings.GetCommandFlag("PROFILE")) ProfileTimer.TurnOnTracking("Profile.txt");
			VEPROMS.CSLA.Library.Database.TrackDBUsage = VlnSettings.GetCommandFlag("DBTrack");
			ProfileTimer.Reset();
			int profileDepth = ProfileTimer.Push(">>>> CreatePdf");
			string message = string.Empty;
			if (!MySessionInfo.CanCheckOutItem(MyProcedure.ItemID, CheckOutType.Procedure, ref message))
			{
				if (MessageBox.Show(this, message + Environment.NewLine + Environment.NewLine + "Do you want to continue to print the procedure?", "Procedure Is Checked Out", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
					return;
			}
			CreateDebugFiles();
			// If file exists, determine if overwrite checkbox allows overwrite, if not prompt.
			Volian.Print.Library.Rtf2Pdf.PdfDebug = cbxDebug.Checked;
			string waterMarkText = cbxWaterMark.Text; // B2018-124 use text of watermark form drop down list instead of enum value
			// Determine change bar settings.  First get from config & then see if override from dialog. 
			// Also check that format allows override.
			ChangeBarDefinition cbd = DetermineChangeBarSettings();
			int profileDepth2 = ProfileTimer.Push(">>>> CreatePdf.GetItemAndChildren");
			if (MyProcedure.MyDocVersion.DocVersionConfig.SelectedSlave > 0 || MyProcedure.ActiveFormat.PlantFormat.FormatData.TransData.UseTransitionModifier || MyProcedure.ActiveFormat.PlantFormat.FormatData.TransData.UseSpecificTransitionModifier)
				MyProcedure = ProcedureInfo.GetItemAndChildrenByUnit(MyProcedure.ItemID, 0, MyProcedure.MyDocVersion.DocVersionConfig.SelectedSlave);
			else
				MyProcedure = ProcedureInfo.GetItemAndChildren(MyProcedure.ItemID);
			// C2018-015 add the procedure tree path and the procedure number and title to the meta file
			if (BaselineMetaFile.IsOpen) BaselineMetaFile.WriteLine("!! {0}", MyProcedure.SearchDVPath.Replace("\a"," | "));
			if (BaselineMetaFile.IsOpen) BaselineMetaFile.WriteLine("!! {0} | {1}", MyProcedure.DisplayNumber, MyProcedure.DisplayText);
			// RHM 20120925 Overlay the bottom of the dialog so that cancel button is covered.
			ProfileTimer.Pop(profileDepth2);
			// B2016-249 Output Procedure to folder associated with Parent Child
			// B2018-124 use text of watermark form drop down list instead of enum value
			frmPDFStatusForm frmStatus = new frmPDFStatusForm(MyProcedure, RevNumAndDate, waterMarkText, cbxDebug.Checked, cbxOrPgBrk.Checked, 
				cbxOpenAfterCreate2.Checked, cbxOverwritePDF2.Checked, GetMultiunitPDFPath(), cbd, txbPDFName.Text, new Point(Left, Bottom - 50),
				swtbtnBlankPgsForDuplex.Value, _AllProcedures || Automatic, Prefix, SaveLinks, RemoveTrailingHardReturnsAndManualPageBreaks, swtbtnPROMSVersion.Value, false, tbBlankPage.Text); //C2018-009 print PROMS version
			frmStatus.MakePlaceKeeper = swtbtnGeneratePlacekeeper.Value;
			frmStatus.MakeContinuousActionSummary = cbxGenerateConActSum.Checked;
			if (Automatic && cbxGenerateConActSum.Checked)
				frmStatus.OnlyShowContinuousActionSummary = true;
			int profileDepth3 = ProfileTimer.Push(">>>> frmStatus");
			frmStatus.ShowDialog();
			ProfileTimer.Pop(profileDepth3);
			MyProcedure.MyDocVersion.DocVersionConfig.SelectedSlave = 0;
			this.Close();
			ShowDebugFiles();
			ProfileTimer.Pop(profileDepth);
			ProfileTimer.ShowTimerTable();
			if (VlnSettings.GetCommandFlag("DBTrack"))
			{
				VEPROMS.CSLA.Library.Database.TrackDBUsage = false;
				VEPROMS.CSLA.Library.Database.ShowDBTracking("DBTracking.txt");
			}
		}
		// Determine if any dialog selections for change bars have overridden the data
		// supplied in the DocVconfig data or format file.  Settings are location and text.
		private ChangeBarDefinition DetermineChangeBarSettings()
		{
			ChangeBarDefinition cbd = new ChangeBarDefinition();
			// if the dialog has 'without change bar' selected, then just set without and return
			if (!swtbtnChgBar.Value)
			{
				cbd.MyChangeBarType = PrintChangeBar.Without;
				return cbd;
			}
			// Get settings from dialog because these are used to set the initial dialog values and
			// any changes from user overrides the initial settings.
			ChangeBarData changeBarData = MyProcedure.ActiveFormat.PlantFormat.FormatData.ProcData.ChangeBarData;
			if (!cbxOvrrideDefChgBars.Checked || _DocVersionConfig == null || _DocVersionConfig.Print_ChangeBar == PrintChangeBar.WithDefault)
			{
				cbd.MyChangeBarType = PrintChangeBar.WithDefault;
				cbd.MyChangeBarText = changeBarData.ChangeBarMessage == "ChgID" ? PrintChangeBarText.ChgID :
					changeBarData.ChangeBarMessage == "DateAndChgID" ? PrintChangeBarText.DateChgID :
					changeBarData.ChangeBarMessage == "None" ? PrintChangeBarText.None :
					changeBarData.ChangeBarMessage == "RevNum" ? PrintChangeBarText.RevNum : PrintChangeBarText.UserDef;
			}
			else if (cbxOvrrideDefChgBars.Checked || _DocVersionConfig.Print_ChangeBar == PrintChangeBar.WithUserSpecified)
			{
				cbd.MyChangeBarLoc = _DocVersionConfig.Print_ChangeBarLoc; // (PrintChangeBarLoc)ppCmbxChgBarPos.SelectedIndex;
				cbd.MyChangeBarText = (PrintChangeBarText)ppCmbxChgBarTxtType.SelectedIndex;
			}
			else
			{
				cbd.MyChangeBarLoc = _DocVersionConfig.Print_ChangeBarLoc;
				cbd.MyChangeBarText = _DocVersionConfig.Print_ChangeBarText;
			}
			// now figure out the location.
			if (cbd.MyChangeBarType != PrintChangeBar.Without)
			{
				// if the format has the absolutefixedchangecolumn format flag, then always use the fixedchangecolumn from the
				// format, otherwise, use the default column based on the selected location, stored in the base format.
				cbd.MyChangeBarColumn = (changeBarData.AbsoluteFixedChangeColumn) ?
					(int)changeBarData.FixedChangeColumn :
					System.Convert.ToInt32(changeBarData.DefaultCBLoc.Split(" ,".ToCharArray())[System.Convert.ToInt32(cbd.MyChangeBarLoc)]);
				//cbd.MyChangeBarColumn = (int)changeBarData.FixedChangeColumn;
				if (cbd.MyChangeBarText == PrintChangeBarText.UserDef)
					cbd.MyChangeBarMessage = _DocVersionConfig.Print_UserCBMess1 + @"\n" + _DocVersionConfig.Print_UserCBMess2;
			}
			return cbd;
		}
		private void btnCreatePDF_Click(object sender, EventArgs e)
		{
			Rtf2iTextSharp.DoingComparison = cbxDebug.Checked;
			if (_AllProcedures)
			{
				this.Cursor = Cursors.WaitCursor;
				DateTime dtStart = DateTime.Now;
				_MultiunitPdfLocation = cbxMultiunitPdfLocation.SelectedItem.ToString();
				PromsPrinter.ClearTransPageNumProblems();
				CreatePDFs();
				PromsPrinter.ReportTransPageNumProblems();
				this.Cursor = Cursors.Default;
				if (VlnSettings.DebugMode)
				{
					MessageBox.Show(string.Format("{0} Minutes to Print All Procedures"
						, TimeSpan.FromTicks(DateTime.Now.Ticks - dtStart.Ticks).TotalMinutes),
						"Printing Duration", MessageBoxButtons.OK, MessageBoxIcon.Information);
				}
				else // Production or Demo mode
				{
					MessageBox.Show("Completed Successfully", "Print All Procedures", MessageBoxButtons.OK, MessageBoxIcon.Information);
				}
				this.Close();
			}
			else
			{
				// B2016-249 Output Procedure to folder associated with Parent Child
				// B2017-009 If the selected item is null don't add a folder
				if(cbxMultiunitPdfLocation.SelectedItem != null)
					_MultiunitPdfLocation = cbxMultiunitPdfLocation.SelectedItem.ToString();
				this.Cursor = Cursors.WaitCursor;
				CreatePDF();
				this.Cursor = Cursors.Default;
			}
		}
		private bool _Initializing = false;
		private void btnPdfLocation_Click(object sender, EventArgs e)
		{
			DlgBrowseFolder.SelectedPath = PDFPath;
			DialogResult drslt = DlgBrowseFolder.ShowDialog();
			if (drslt == DialogResult.OK)
			{
				txbPDFLocation.Text = DlgBrowseFolder.SelectedPath;
			}
		}
		private void rbFormatDefault_Click(object sender, EventArgs e)
		{
			SetCustomControls(false);
			// Make Custom controls invisible
			ppGpbxUserSpecCB.Visible = false;
		}
		private void SetCustomControls(bool enabled)
		{
			ppCmbxChgBarTxtType.Enabled = enabled;
			lblCbTxtType.Enabled = enabled;
			ppTxbxChangeBarUserMsgOne.Enabled = enabled;
			ppTxbxChangeBarUserMsgTwo.Enabled = enabled;
		}
		private void cbxOvrrideDefChgBars_CheckStateChanged(object sender, EventArgs e)
		{
			SetCustomControls(cbxOvrrideDefChgBars.Checked);
		}
		private void rbCustom_Click(object sender, EventArgs e)
		{
			SetCustomControls(true);
			// Make Custom controls visible
			ppGpbxUserSpecCB.Visible = true;
		}
		private void rbFormatDefault_CheckedChanged(object sender, EventArgs e)
		{
			SetCustomControls(false);
			// Make Custom controls invisible
			ppGpbxUserSpecCB.Visible = false;
		}
		private void ppCmbxChgBarTxtType_SelectedIndexChanged(object sender, EventArgs e)
		{
			if (_Initializing) return;
			ppGpbxUserSpecTxt.Enabled = ppCmbxChgBarTxtType.SelectedIndex == (int)PrintChangeBarText.UserDef;
		}
		private void txbRevDate_Enter(object sender, EventArgs e)
		{
			txbDate = txbRevDate;
			grpDateSelector.Text = "Select Revision Date";
			grpDateSelector.Visible = calDateSelector.Visible = true;
		}
		private void txbRevDate_Leave(object sender, EventArgs e)
		{
			if (_Initializing) return;
			if (this.ActiveControl == calDateSelector)
			{
				txbRevDate.Focus();  //B2018-059 keep the calendar open until a different field on the print dialog is selected
				return;
			}
			txbDate = null;
			grpDateSelector.Visible = calDateSelector.Visible = false;
			// save the RevDate to the procedure's config.
			ProcedureConfig pc = MyProcedure.MyConfig as ProcedureConfig;
			if (pc == null) return;
			pc.Print_RevDate = txbRevDate.Text;
			using (Item itm = Item.Get(MyProcedure.ItemID))
			{
				itm.MyContent.Config = MyProcedure.MyConfig.ToString();
				itm.Save();
			}
		}
		private void txbReviewDate_Leave(object sender, EventArgs e)
		{
			if (_Initializing) return;
			txbDate = null;
			grpDateSelector.Visible = calDateSelector.Visible = false;
			// save the ReviewDate to the procedure's config.
			ProcedureConfig pc = MyProcedure.MyConfig as ProcedureConfig;
			if (pc == null) return;
			pc.Print_ReviewDate = txbReviewDate.Text;
			using (Item itm = Item.Get(MyProcedure.ItemID))
			{
				itm.MyContent.Config = MyProcedure.MyConfig.ToString();
				itm.Save();
				// need to reset config to !dirty?
			}
		}
		private void txbReviewDate_Enter(object sender, EventArgs e)
		{
			txbDate = txbReviewDate;
			grpDateSelector.Text = "Select Review Date";
			grpDateSelector.Visible = calDateSelector.Visible = true;
		}
		private TextBox txbDate = null;
		private void calDateSelector_DateSelected(object sender, DateRangeEventArgs e)
		{
			if (txbDate != null)
				txbDate.Text = e.Start.ToShortDateString();
		}
		private void txbRevNum_Leave(object sender, EventArgs e)
		{
			if (_Initializing) return;
			// save the RevNum to the procedure's config.
			ProcedureConfig pc = MyProcedure.MyConfig as ProcedureConfig;
			if (pc == null) return;
			pc.Print_Rev = txbRevNum.Text;
			using (Item itm = Item.Get(MyProcedure.ItemID))
			{
				itm.MyContent.Config = MyProcedure.MyConfig.ToString();
				itm.Save();
			}
		}
		private void expPrnSetting_ExpandedChanged(object sender, DevComponents.DotNetBar.ExpandedChangeEventArgs e)
		{
			if (expPrnSetting.Expanded)
			{
				this.Size = new Size(this.Size.Width + (expPrnSetting.Size.Width - expPrnSetting.TitlePanel.Size.Height), this.Size.Height);
				// B2018-137 set the visability of Generate Placekeeper
				swtbtnGeneratePlacekeeper.Visible = lblGeneratePlacekeeper.Visible = ((MyProcedure.ActiveFormat.PlantFormat.FormatData.PurchaseOptions & E_PurchaseOptions.AutoPlacekeeper) == E_PurchaseOptions.AutoPlacekeeper);
			}
			//else
			//	this.Size = new Size(this.Size.Width-(expPrnSetting.Size.Width-expPrnSetting.TitlePanel.Size.Height), this.Size.Height);
			//Refresh();
		}
		private void expPrnSetting_ExpandedChanging(object sender, DevComponents.DotNetBar.ExpandedChangeEventArgs e)
	{
				if (expPrnSetting.Expanded)
				//this.Size = new Size(this.Size.Width+(expPrnSetting.Size.Width-expPrnSetting.TitlePanel.Size.Height), this.Size.Height);
			//else
				this.Size = new Size(this.Size.Width-(expPrnSetting.Size.Width-expPrnSetting.TitlePanel.Size.Height), this.Size.Height);
			//Refresh();
		}
		private void swtbtnPDFdtPrefixSuffix_ValueChanged(object sender, EventArgs e)
		{
			if (swtbtnPDFdtPrefixSuffix.Value)
				swtbtnPDFLinks.Value = false;
			if (_AllProcedures) _DateTimePrefixSuffixPrintingAllProcedures = swtbtnPDFdtPrefixSuffix.Value; // C2018-033 add switch to use Prefix and Suffix on PDF file name
			BuildPDFFileName();
		}
		private void swtbtnPDFLinks_ValueChanged(object sender, EventArgs e)
		{
			if (swtbtnPDFLinks.Value)
				swtbtnPDFdtPrefixSuffix.Value = false;
			BuildPDFFileName();
		}
		// C2019-004: Allow user to define duplex blank page text.  The text box for blank page text is always enabled for procedures with
		// supplemental information. For other types of procedures, the text box is enabled if duplex printing is turned on.
		private void swtbtnBlankPgsForDuplex_ValueChanged(object sender, EventArgs e)
		{
			tbBlankPage.Enabled = swtbtnBlankPgsForDuplex.Value;
		}
		//private void cbxDebug_CheckedChanged(object sender, EventArgs e)
		//{
		//  cbxCmpPRMSpfd.Visible = cbxDebug.Checked;
		//}
	}
}