//kt -- Modified with SourceScanner on 8/7/2007
unit fSurgery;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  fHSplit, StdCtrls, ExtCtrls, Menus, ComCtrls, ORCtrls, ORFn, uConst, ORDtTm,
  uPCE, ORClasses, fDrawers, ImgList, fSurgeryView, rSurgery, uSurgery,
  uCaseTree, uTIU, DKLang;

type
  TfrmSurgery = class(TfrmHSplit)
    mnuNotes: TMainMenu;
    mnuView: TMenuItem;
    mnuViewChart: TMenuItem;
    mnuChartReports: TMenuItem;
    mnuChartLabs: TMenuItem;
    mnuChartDCSumm: TMenuItem;
    mnuChartCslts: TMenuItem;
    mnuChartNotes: TMenuItem;
    mnuChartOrders: TMenuItem;
    mnuChartMeds: TMenuItem;
    mnuChartProbs: TMenuItem;
    mnuChartCover: TMenuItem;
    Z1: TMenuItem;
    mnuViewDetail: TMenuItem;
    mnuAct: TMenuItem;
    mnuActNew: TMenuItem;
    Z2: TMenuItem;
    mnuActSave: TMenuItem;
    mnuActDelete: TMenuItem;
    mnuActEdit: TMenuItem;
    mnuActSign: TMenuItem;
    mnuActAddend: TMenuItem;
    lblCases: TOROffsetLabel;
    pnlRead: TPanel;
    lblTitle: TOROffsetLabel;
    memSurgery: TRichEdit;
    pnlWrite: TPanel;
    memNewNote: TRichEdit;
    Z3: TMenuItem;
    mnuViewAll: TMenuItem;
    mnuViewBySurgeon: TMenuItem;
    mnuViewByDate: TMenuItem;
    mnuViewUncosigned: TMenuItem;
    mnuViewUnsigned: TMenuItem;
    mnuActSignList: TMenuItem;
    cmdNewNote: TORAlignButton;
    lblSpace1: TLabel;
    popNoteMemo: TPopupMenu;
    popNoteMemoCut: TMenuItem;
    popNoteMemoCopy: TMenuItem;
    popNoteMemoPaste: TMenuItem;
    Z10: TMenuItem;
    popNoteMemoSignList: TMenuItem;
    popNoteMemoDelete: TMenuItem;
    popNoteMemoEdit: TMenuItem;
    popNoteMemoSave: TMenuItem;
    popNoteMemoSign: TMenuItem;
    popNoteList: TPopupMenu;
    popNoteListAll: TMenuItem;
    popNoteListByDate: TMenuItem;
    mnuActIdentifyAddlSigners: TMenuItem;
    popNoteMemoAddlSign: TMenuItem;
    Z11: TMenuItem;
    popNoteMemoSpell: TMenuItem;
    popNoteMemoGrammar: TMenuItem;
    mnuViewCustom: TMenuItem;
    N1: TMenuItem;
    mnuViewSaveAsDefault: TMenuItem;
    ReturntoDefault1: TMenuItem;
    pnlDrawers: TPanel;
    splDrawers: TSplitter;
    popNoteMemoTemplate: TMenuItem;
    Z12: TMenuItem;
    mnuOptions: TMenuItem;
    mnuEditTemplates: TMenuItem;
    mnuNewTemplate: TMenuItem;
    N2: TMenuItem;
    mnuEditSharedTemplates: TMenuItem;
    mnuNewSharedTemplate: TMenuItem;
    popNoteMemoAddend: TMenuItem;
    pnlFields: TPanel;
    lblNewTitle: TLabel;
    lblRefDate: TLabel;
    lblAuthor: TLabel;
    lblVisit: TLabel;
    lblCosigner: TLabel;
    cmdChange: TButton;
    lblSubject: TLabel;
    txtSubject: TCaptionEdit;
    timAutoSave: TTimer;
    popNoteMemoPaste2: TMenuItem;
    popNoteMemoReformat: TMenuItem;
    Z4: TMenuItem;
    mnuActChange: TMenuItem;
    mnuActLoadBoiler: TMenuItem;
    bvlNewTitle: TBevel;
    popNoteMemoSaveContinue: TMenuItem;
    N3: TMenuItem;
    mnuEditDialgFields: TMenuItem;
    N4: TMenuItem;
    popNoteListExpandSelected: TMenuItem;
    popNoteListExpandAll: TMenuItem;
    popNoteListCollapseSelected: TMenuItem;
    popNoteListCollapseAll: TMenuItem;
    popNoteListCustom: TMenuItem;
    mnuActDetachFromIDParent: TMenuItem;
    N5: TMenuItem;
    popNoteListDetachFromIDParent: TMenuItem;
    popNoteListAddIDEntry: TMenuItem;
    mnuActAddIDEntry: TMenuItem;
    mnuIconLegend: TMenuItem;
    N6: TMenuItem;
    popNoteMemoFind: TMenuItem;
    dlgFindText: TFindDialog;
    dlgReplaceText: TReplaceDialog;
    popNoteMemoReplace: TMenuItem;
    N7: TMenuItem;
    tvSurgery: TORTreeView;
    mnuChartSurgery: TMenuItem;
    lstNotes: TORListBox;
    sptVert: TSplitter;
    memPCEShow: TRichEdit;
    cmdPCE: TORAlignButton;
    popNoteListBySurgeon: TMenuItem;
    popNoteListUnsigned: TMenuItem;
    popNoteListUncosigned: TMenuItem;
    N8: TMenuItem;
    popNoteMemoPreview: TMenuItem;
    popNoteMemoInsTemplate: TMenuItem;
    popNoteMemoEncounter: TMenuItem;
    mnuViewInformation: TMenuItem;
    mnuViewDemo: TMenuItem;
    mnuViewVisits: TMenuItem;
    mnuViewPrimaryCare: TMenuItem;
    mnuViewMyHealtheVet: TMenuItem;
    mnuInsurance: TMenuItem;
    mnuViewFlags: TMenuItem;
    mnuViewReminders: TMenuItem;
    mnuViewRemoteData: TMenuItem;
    mnuViewPostings: TMenuItem;
    procedure mnuChartTabClick(Sender: TObject);
    procedure pnlRightResize(Sender: TObject);
    procedure cmdNewNoteClick(Sender: TObject);
    procedure mnuActNewClick(Sender: TObject);
    procedure mnuActSaveClick(Sender: TObject);
    procedure mnuViewClick(Sender: TObject);
    procedure mnuActAddendClick(Sender: TObject);
    procedure mnuActSignListClick(Sender: TObject);
    procedure mnuActDeleteClick(Sender: TObject);
    procedure mnuActEditClick(Sender: TObject);
    procedure mnuActSignClick(Sender: TObject);
    procedure cmdPCEClick(Sender: TObject);
    procedure popNoteMemoCutClick(Sender: TObject);
    procedure popNoteMemoCopyClick(Sender: TObject);
    procedure popNoteMemoPasteClick(Sender: TObject);
    procedure popNoteMemoPopup(Sender: TObject);
    procedure pnlWriteResize(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure mnuViewDetailClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure mnuActIdentifyAddlSignersClick(Sender: TObject);
    procedure popNoteMemoAddlSignClick(Sender: TObject);
    procedure popNoteMemoSpellClick(Sender: TObject);
    procedure popNoteMemoGrammarClick(Sender: TObject);
    procedure mnuViewSaveAsDefaultClick(Sender: TObject);
    procedure mnuViewReturntoDefaultClick(Sender: TObject);
    procedure popNoteMemoTemplateClick(Sender: TObject);
    procedure mnuEditTemplatesClick(Sender: TObject);
    procedure mnuNewTemplateClick(Sender: TObject);
    procedure mnuEditSharedTemplatesClick(Sender: TObject);
    procedure mnuNewSharedTemplateClick(Sender: TObject);
    procedure mnuOptionsClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure cmdChangeClick(Sender: TObject);
    procedure pnlFieldsResize(Sender: TObject);
    procedure timAutoSaveTimer(Sender: TObject);
    procedure memNewNoteChange(Sender: TObject);
    procedure popNoteMemoReformatClick(Sender: TObject);
    procedure mnuActChangeClick(Sender: TObject);
    procedure mnuActLoadBoilerClick(Sender: TObject);
    procedure popNoteMemoSaveContinueClick(Sender: TObject);
    procedure mnuEditDialgFieldsClick(Sender: TObject);
    procedure popNoteListExpandAllClick(Sender: TObject);
    procedure popNoteListCollapseAllClick(Sender: TObject);
    procedure popNoteListExpandSelectedClick(Sender: TObject);
    procedure popNoteListCollapseSelectedClick(Sender: TObject);
    procedure popNoteListPopup(Sender: TObject);
    procedure mnuIconLegendClick(Sender: TObject);
    procedure popNoteMemoFindClick(Sender: TObject);
    procedure dlgFindTextFind(Sender: TObject);
    procedure popNoteMemoReplaceClick(Sender: TObject);
    procedure dlgReplaceTextReplace(Sender: TObject);
    procedure dlgReplaceTextFind(Sender: TObject);
    procedure tvSurgeryClick(Sender: TObject);
    procedure tvSurgeryChange(Sender: TObject; Node: TTreeNode);
    procedure tvSurgeryExpanded(Sender: TObject; Node: TTreeNode);
    procedure tvSurgeryCollapsed(Sender: TObject; Node: TTreeNode);
    procedure lstNotesClick(Sender: TObject);
    procedure memNewNoteKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure sptHorzCanResize(Sender: TObject; var NewSize: Integer; var Accept: Boolean);
    procedure popNoteMemoPreviewClick(Sender: TObject);
    procedure popNoteMemoInsTemplateClick(Sender: TObject);
    procedure tvSurgeryAddition(Sender: TObject; Node: TTreeNode);
    procedure tvSurgeryDeletion(Sender: TObject; Node: TTreeNode);
    procedure ViewInfo(Sender: TObject);
    procedure mnuViewInformationClick(Sender: TObject);
  private
    FEditingIndex: Integer;                      // index of note being currently edited
    FCurrentContext: TSurgCaseContext;
    FDefaultContext: TSurgCaseContext;
    FImageFlag: TBitmap;
    FCaseList: TStringList;
    FChanged: Boolean;                           // true if any text has changed in the note
    FEditCtrl: TCustomEdit;
    FSilent: Boolean;
    FEditNote: TEditNoteRec;
    FVerifyNoteTitle: Integer;
    FConfirmed: boolean;
    FLastNoteID: string;
    FEditingNotePCEObj: boolean;
    FDeleted: boolean;
    procedure ClearEditControls;
    procedure DoAutoSave(Suppress: integer = 1);
    function GetTitleText(AnIndex: Integer): string;
    procedure InsertAddendum;
    procedure InsertNewNote(IsIDChild: boolean; AnIDParent: integer);
    function LacksRequiredForCreate: Boolean;
    procedure LoadForEdit;
    procedure  LoadSurgeryCases;
    procedure  UpdateTreeView(DocList: TStringList; Tree: TORTreeView);
    procedure SetViewContext(AContext: TSurgCaseContext);
    function GetDrawers: TFrmDrawers;
    procedure SetEditingIndex(const Value: Integer);
    property EditingIndex: Integer read FEditingIndex write SetEditingIndex;
    procedure ProcessNotifications;
    function SetSurgTreeLabel(AContext: TSurgCaseContext): string;
    procedure RemovePCEFromChanges(IEN: Int64; AVisitStr: string = '');
    procedure SaveEditedNote(var Saved: Boolean);
    procedure SaveCurrentNote(var Saved: Boolean);
    procedure SetSubjectVisible(ShouldShow: Boolean);
    procedure ShowPCEControls(ShouldShow: Boolean);
    function StartNewEdit(NewNoteType: integer): Boolean;
    //function CanFinishReminder: boolean;
    procedure DisplayPCE;
    function VerifyNoteTitle: Boolean;
    procedure ShowPCEButtons(Editing: boolean);
    procedure EnableDisableMenus(IsTIUDocument: boolean);
  public
    function AllowContextChange(var WhyNot: string): Boolean; override;
    procedure ClearPtData; override;
    procedure DisplayPage; override;
    procedure RequestPrint; override;
    procedure SetFontSize(NewFontSize: Integer); override;
    procedure SaveSignItem(const ItemID, ESCode: string);
    procedure AssignRemForm;
  published
    property Drawers: TFrmDrawers read GetDrawers; // Keep Drawers published
  end;

var
  frmSurgery: TfrmSurgery;
  uSurgeryContext: TSurgCaseContext;

implementation

{$R *.DFM}

uses fFrame, fVisit, fEncnt, rCore, uCore, fNoteBA, fNoteBD, fSignItem, fEncounterFrame,
     rPCE, Clipbrd, fNoteCslt, fNotePrt, rVitals, fAddlSigners, fNoteDR, fConsults, uSpell,
     fTIUView, fTemplateEditor, uReminders, fReminderDialog, uOrders, rConsults, fReminderTree,
     fNoteProps, fNotesBP, fTemplateFieldEditor, uTemplates, dShared, rTemplates,
     FIconLegend, fPCEEdit, rTIU, fRptBox, uAccessibleTreeView,
     uAccessibleTreeNode, fTemplateDialog;

const
  CT_SURGERY  = 11;                             // chart tab - surgery

  NT_NEW_NOTE = -10;                             // Holder IEN for a new note
  NT_ADDENDUM = -20;                             // Holder IEN for a new addendum

  NT_ACT_NEW_NOTE  = 2;
  NT_ACT_ADDENDUM  = 3;
  NT_ACT_EDIT_NOTE = 4;
  NT_ACT_ID_ENTRY  = 5;

//TX_NEED_VISIT = 'A visit is required before creating a new surgery report.';  <-- original line.  //kt 8/7/2007
//TX_CREATE_ERR = 'Error Creating Report';  <-- original line.  //kt 8/7/2007
//TX_UPDATE_ERR = 'Error Updating Report';  <-- original line.  //kt 8/7/2007
//TX_NO_NOTE    = 'No surgery report is currently being edited';  <-- original line.  //kt 8/7/2007
//TX_SAVE_NOTE  = 'Save Surgery Report';  <-- original line.  //kt 8/7/2007
//TX_ADDEND_NO  = 'Cannot make an addendum to a report that is being edited';  <-- original line.  //kt 8/7/2007
//TX_DEL_OK     = CRLF + CRLF + 'Delete this surgery report?';  <-- original line.  //kt 8/7/2007
//TX_DEL_ERR    = 'Unable to Delete Report';  <-- original line.  //kt 8/7/2007
//TX_SIGN       = 'Sign Report';  <-- original line.  //kt 8/7/2007
//TX_COSIGN     = 'Cosign Report';  <-- original line.  //kt 8/7/2007
//TX_SIGN_ERR   = 'Unable to Sign Report';  <-- original line.  //kt 8/7/2007
//  TX_SCREQD     = 'This progress note title requires the service connected questions to be '+
//                  'answered.  The Encounter form will now be opened.  Please answer all '+
//                 'service connected questions.';
//  TX_SCREQD_T   = 'Response required for SC questions.';
//TX_NONOTE     = 'No surgery report is currently selected.';  <-- original line.  //kt 8/7/2007
//TX_NONOTE_CAP = 'No Report Selected';  <-- original line.  //kt 8/7/2007
//TX_NOPRT_NEW  = 'This surgery report may not be printed until it is saved';  <-- original line.  //kt 8/7/2007
//TX_NOPRT_NEW_CAP = 'Save Surgery Report';  <-- original line.  //kt 8/7/2007
//TX_NO_ALERT   = 'There is insufficient information to process this alert.' + CRLF +  <-- original line.  //kt 8/7/2007
//                'Either the alert has already been deleted, or it contained invalid data.' + CRLF + CRLF +  <-- original line.  //kt 8/7/2007
//                'Click the NEXT button if you wish to continue processing more alerts.';  <-- original line.  //kt 8/7/2007
//TX_CAP_NO_ALERT = 'Unable to Process Alert';  <-- original line.  //kt 8/7/2007
  //TX_ORDER_LOCKED = 'This record is locked by an action underway on the Consults tab';
  //TC_ORDER_LOCKED = 'Unable to access record';
  //TX_NO_ORD_CHG   = 'The note is still associated with the previously selected request.' + CRLF +
  //                  'Finish the pending action on the consults tab, then try again.';
  //TC_NO_ORD_CHG   = 'Locked Consult Request';
//TX_NEW_SAVE1    = 'You are currently editing:' + CRLF + CRLF;  <-- original line.  //kt 8/7/2007
//TX_NEW_SAVE2    = CRLF + CRLF + 'Do you wish to save this report and begin a new one?';  <-- original line.  //kt 8/7/2007
//TX_NEW_SAVE3    = CRLF + CRLF + 'Do you wish to save this report and begin a new addendum?';  <-- original line.  //kt 8/7/2007
//TX_NEW_SAVE4    = CRLF + CRLF + 'Do you wish to save this report and edit the one selected?';  <-- original line.  //kt 8/7/2007
  //TX_NEW_SAVE5    = CRLF + CRLF + 'Do you wish to save this report and begin a new Interdisciplinary entry?';
//TC_NEW_SAVE2    = 'Create New Report';  <-- original line.  //kt 8/7/2007
//TC_NEW_SAVE3    = 'Create New Addendum';  <-- original line.  //kt 8/7/2007
//TC_NEW_SAVE4    = 'Edit Different Report';  <-- original line.  //kt 8/7/2007
  //TC_NEW_SAVE5    = 'Create New Interdisciplinary Entry';
//TX_EMPTY_NOTE   = CRLF + CRLF + 'This report contains no text and will not be saved.' + CRLF +  <-- original line.  //kt 8/7/2007
//                  'Do you wish to delete this report?';  <-- original line.  //kt 8/7/2007
//TC_EMPTY_NOTE   = 'Empty Report';  <-- original line.  //kt 8/7/2007
//TX_EMPTY_NOTE1   = 'This report contains no text and can not be signed.';  <-- original line.  //kt 8/7/2007
//TC_NO_LOCK      = 'Unable to Lock Report';  <-- original line.  //kt 8/7/2007
//TX_ABSAVE       = 'It appears the session terminated abnormally when this' + CRLF +  <-- original line.  //kt 8/7/2007
//                  'report was last edited. Some text may not have been saved.' + CRLF + CRLF +  <-- original line.  //kt 8/7/2007
//                  'Do you wish to continue and sign the report?';  <-- original line.  //kt 8/7/2007
//TC_ABSAVE       = 'Possible Missing Text';  <-- original line.  //kt 8/7/2007
//TX_NO_BOIL      = 'There is no boilerplate text associated with this title.';  <-- original line.  //kt 8/7/2007
//TC_NO_BOIL      = 'Load Boilerplate Text';  <-- original line.  //kt 8/7/2007
//TX_BLR_CLEAR    = 'Do you want to clear the previously loaded boilerplate text?';  <-- original line.  //kt 8/7/2007
//TC_BLR_CLEAR    = 'Clear Previous Boilerplate Text';  <-- original line.  //kt 8/7/2007
//TX_DETACH_CNF     = 'Confirm Detachment';  <-- original line.  //kt 8/7/2007
//TX_DETACH_FAILURE = 'Detach failed';  <-- original line.  //kt 8/7/2007
//TX_RETRACT_CAP    = 'Retraction Notice';  <-- original line.  //kt 8/7/2007
//TX_RETRACT        = 'This document will now be RETRACTED.  As Such, it has been removed' +CRLF +  <-- original line.  //kt 8/7/2007
//                    ' from public view, and from typical Releases of Information,' +CRLF +  <-- original line.  //kt 8/7/2007
//                    ' but will remain indefinitely discoverable to HIMS.' +CRLF +CRLF;  <-- original line.  //kt 8/7/2007

var
  TX_NEED_VISIT      : string;  //kt
  TX_CREATE_ERR      : string;  //kt
  TX_UPDATE_ERR      : string;  //kt
  TX_NO_NOTE         : string;  //kt
  TX_SAVE_NOTE       : string;  //kt
  TX_ADDEND_NO       : string;  //kt
  TX_DEL_OK          : string;  //kt
  TX_DEL_ERR         : string;  //kt
  TX_SIGN            : string;  //kt
  TX_COSIGN          : string;  //kt
  TX_SIGN_ERR        : string;  //kt
  TX_NONOTE          : string;  //kt
  TX_NONOTE_CAP      : string;  //kt
  TX_NOPRT_NEW       : string;  //kt
  TX_NOPRT_NEW_CAP   : string;  //kt
  TX_NO_ALERT        : string;  //kt
  TX_CAP_NO_ALERT    : string;  //kt
  TX_NEW_SAVE1       : string;  //kt
  TX_NEW_SAVE2       : string;  //kt
  TX_NEW_SAVE3       : string;  //kt
  TX_NEW_SAVE4       : string;  //kt
  TC_NEW_SAVE2       : string;  //kt
  TC_NEW_SAVE3       : string;  //kt
  TC_NEW_SAVE4       : string;  //kt
  TX_EMPTY_NOTE      : string;  //kt
  TC_EMPTY_NOTE      : string;  //kt
  TX_EMPTY_NOTE1     : string;  //kt
  TC_NO_LOCK         : string;  //kt
  TX_ABSAVE          : string;  //kt
  TC_ABSAVE          : string;  //kt
  TX_NO_BOIL         : string;  //kt
  TC_NO_BOIL         : string;  //kt
  TX_BLR_CLEAR       : string;  //kt
  TC_BLR_CLEAR       : string;  //kt
  TX_DETACH_CNF      : string;  //kt
  TX_DETACH_FAILURE  : string;  //kt
  TX_RETRACT_CAP     : string;  //kt
  TX_RETRACT         : string;  //kt

procedure SetupVars;
//kt Added entire function to replace constant declarations 8/7/2007
begin
  TX_NEED_VISIT := DKLangConstW('fSurgery_A_visit_is_required_before_creating_a_new_surgery_reportx');
  TX_CREATE_ERR := DKLangConstW('fSurgery_Error_Creating_Report');
  TX_UPDATE_ERR := DKLangConstW('fSurgery_Error_Updating_Report');
  TX_NO_NOTE    := DKLangConstW('fSurgery_No_surgery_report_is_currently_being_edited');
  TX_SAVE_NOTE  := DKLangConstW('fSurgery_Save_Surgery_Report');
  TX_ADDEND_NO  := DKLangConstW('fSurgery_Cannot_make_an_addendum_to_a_report_that_is_being_edited');
  TX_DEL_OK     := CRLF + CRLF + DKLangConstW('fSurgery_Delete_this_surgery_reportx');
  TX_DEL_ERR    := DKLangConstW('fSurgery_Unable_to_Delete_Report');
  TX_SIGN       := DKLangConstW('fSurgery_Sign_Report');
  TX_COSIGN     := DKLangConstW('fSurgery_Cosign_Report');
  TX_SIGN_ERR   := DKLangConstW('fSurgery_Unable_to_Sign_Report');
  TX_NONOTE     := DKLangConstW('fSurgery_No_surgery_report_is_currently_selectedx');
  TX_NONOTE_CAP := DKLangConstW('fSurgery_No_Report_Selected');
  TX_NOPRT_NEW  := DKLangConstW('fSurgery_This_surgery_report_may_not_be_printed_until_it_is_saved');
  TX_NOPRT_NEW_CAP := DKLangConstW('fSurgery_Save_Surgery_Report');
  TX_NO_ALERT   := DKLangConstW('fSurgery_There_is_insufficient_information_to_process_this_alertx') + CRLF +
                  DKLangConstW('fSurgery_Either_the_alert_has_already_been_deletedx_or_it_contained_invalid_datax') + CRLF + CRLF +
                  DKLangConstW('fSurgery_Click_the_NEXT_button_if_you_wish_to_continue_processing_more_alertsx');
  TX_CAP_NO_ALERT := DKLangConstW('fSurgery_Unable_to_Process_Alert');
  TX_NEW_SAVE1    := DKLangConstW('fSurgery_You_are_currently_editingx') + CRLF + CRLF;
  TX_NEW_SAVE2    := CRLF + CRLF + DKLangConstW('fSurgery_Do_you_wish_to_save_this_report_and_begin_a_new_onex');
  TX_NEW_SAVE3    := CRLF + CRLF + DKLangConstW('fSurgery_Do_you_wish_to_save_this_report_and_begin_a_new_addendumx');
  TX_NEW_SAVE4    := CRLF + CRLF + DKLangConstW('fSurgery_Do_you_wish_to_save_this_report_and_edit_the_one_selectedx');
  TC_NEW_SAVE2    := DKLangConstW('fSurgery_Create_New_Report');
  TC_NEW_SAVE3    := DKLangConstW('fSurgery_Create_New_Addendum');
  TC_NEW_SAVE4    := DKLangConstW('fSurgery_Edit_Different_Report');
  TX_EMPTY_NOTE   := CRLF + CRLF + DKLangConstW('fSurgery_This_report_contains_no_text_and_will_not_be_savedx') + CRLF +
                    DKLangConstW('fSurgery_Do_you_wish_to_delete_this_reportx');
  TC_EMPTY_NOTE   := DKLangConstW('fSurgery_Empty_Report');
  TX_EMPTY_NOTE1   := DKLangConstW('fSurgery_This_report_contains_no_text_and_can_not_be_signedx');
  TC_NO_LOCK      := DKLangConstW('fSurgery_Unable_to_Lock_Report');
  TX_ABSAVE       := DKLangConstW('fSurgery_It_appears_the_session_terminated_abnormally_when_this') + CRLF +
                    DKLangConstW('fSurgery_report_was_last_editedx_Some_text_may_not_have_been_savedx') + CRLF + CRLF +
                    DKLangConstW('fSurgery_Do_you_wish_to_continue_and_sign_the_reportx');
  TC_ABSAVE       := DKLangConstW('fSurgery_Possible_Missing_Text');
  TX_NO_BOIL      := DKLangConstW('fSurgery_There_is_no_boilerplate_text_associated_with_this_titlex');
  TC_NO_BOIL      := DKLangConstW('fSurgery_Load_Boilerplate_Text');
  TX_BLR_CLEAR    := DKLangConstW('fSurgery_Do_you_want_to_clear_the_previously_loaded_boilerplate_textx');
  TC_BLR_CLEAR    := DKLangConstW('fSurgery_Clear_Previous_Boilerplate_Text');
  TX_DETACH_CNF     := DKLangConstW('fSurgery_Confirm_Detachment');
  TX_DETACH_FAILURE := DKLangConstW('fSurgery_Detach_failed');
  TX_RETRACT_CAP    := DKLangConstW('fSurgery_Retraction_Notice');
  TX_RETRACT        := DKLangConstW('fSurgery_This_document_will_now_be_RETRACTEDx__As_Suchx_it_has_been_removed') +CRLF +
                      DKLangConstW('fSurgery_from_public_viewx_and_from_typical_Releases_of_Informationx') +CRLF +
                      DKLangConstW('fSurgery_but_will_remain_indefinitely_discoverable_to_HIMSx') +CRLF +CRLF;
end;
 
var
  uPCEShow, uPCEEdit:  TPCEData;
  ViewContext: Integer;
  frmDrawers: TfrmDrawers;
  uChanging: Boolean;

{ TPage common methods --------------------------------------------------------------------- }

function TfrmSurgery.AllowContextChange(var WhyNot: string): Boolean;
begin
  dlgFindText.CloseDialog;
  Result := inherited AllowContextChange(WhyNot);  // sets result = true
  if Assigned(frmTemplateDialog) then
    if Screen.ActiveForm = frmTemplateDialog then
    //if (fsModal in frmTemplateDialog.FormState) then
    case BOOLCHAR[frmFrame.CCOWContextChanging] of
      '1': begin
//           WhyNot := 'A template in progress will be aborted.  ';  <-- original line.  //kt 8/7/2007
             WhyNot := DKLangConstW('fSurgery_A_template_in_progress_will_be_abortedx'); //kt added 8/7/2007
             Result := False;
           end;
      '0': begin
             if WhyNot = 'COMMIT' then
               begin
                 FSilent := True;
                 frmTemplateDialog.Silent := True;
                 frmTemplateDialog.ModalResult := mrCancel;
               end;
           end;
    end;
  if EditingIndex <> -1 then
    case BOOLCHAR[frmFrame.CCOWContextChanging] of
      '1': begin
             if memNewNote.GetTextLen > 0 then
//             WhyNot := 'A report in progress will be saved as unsigned.  '  <-- original line.  //kt 8/7/2007
               WhyNot := DKLangConstW('fSurgery_A_report_in_progress_will_be_saved_as_unsignedx') //kt added 8/7/2007
             else
//             WhyNot := 'An empty report in progress will be deleted.  ';  <-- original line.  //kt 8/7/2007
               WhyNot := DKLangConstW('fSurgery_An_empty_report_in_progress_will_be_deletedx'); //kt added 8/7/2007
             Result := False;
           end;
      '0': begin
             if WhyNot = 'COMMIT' then FSilent := True;
             SaveCurrentNote(Result)
           end;
    end;
  if Assigned(frmEncounterFrame) then
    if Screen.ActiveForm = frmEncounterFrame then
    //if (fsModal in frmEncounterFrame.FormState) then
    case BOOLCHAR[frmFrame.CCOWContextChanging] of
      '1': begin
//           WhyNot := WhyNot + 'Encounter information being edited will not be saved';  <-- original line.  //kt 8/7/2007
             WhyNot := WhyNot + DKLangConstW('fSurgery_Encounter_information_being_edited_will_not_be_saved'); //kt added 8/7/2007
             Result := False;
           end;
      '0': begin
             if WhyNot = 'COMMIT' then
               begin
                 FSilent := True;
                 frmEncounterFrame.Abort := False;
                 frmEncounterFrame.Cancel := True;
               end;
           end;
    end;
end;

procedure TfrmSurgery.ClearPtData;
{ clear all controls that contain patient specific information }
begin
  inherited ClearPtData;
  ClearEditControls;
  uChanging := True;
  tvSurgery.Items.BeginUpdate;
  KillCaseTreeObjects(tvSurgery);
  tvSurgery.Items.Clear;
  tvSurgery.Items.EndUpdate;
  lstNotes.Clear;
  uChanging := False;
  memSurgery.Clear;
  uPCEShow.Clear;
  uPCEEdit.Clear;
  frmDrawers.ResetTemplates;
end;

procedure TfrmSurgery.DisplayPage;
{ causes page to be visible and conditionally executes initialization code }
begin
  inherited DisplayPage;
  frmFrame.ShowHideChartTabMenus(mnuViewChart);
  frmFrame.mnuFilePrint.Tag := CT_SURGERY;
  frmFrame.mnuFilePrint.Enabled := True;
  frmFrame.mnuFilePrintSetup.Enabled := True;
  if InitPage then
  begin
    FDefaultContext := GetCurrentSurgCaseContext;
    FCurrentContext := FDefaultContext;
    popNoteMemoSpell.Visible   := SpellCheckAvailable;
    popNoteMemoGrammar.Visible := popNoteMemoSpell.Visible;
    Z11.Visible                := popNoteMemoSpell.Visible;
    timAutoSave.Interval := User.AutoSave * 1000;  // convert seconds to milliseconds
    SetEqualTabStops(memNewNote);
  end;
  // to indent the right margin need to set Paragraph.RightIndent for each paragraph?
  if InitPatient and not (CallingContext = CC_NOTIFICATION) then
    begin
      SetViewContext(FDefaultContext);
    end;
  case CallingContext of
    CC_INIT_PATIENT: if not InitPatient then
                       begin
                         SetViewContext(FDefaultContext);
                       end;
    CC_NOTIFICATION:  ProcessNotifications;
  end;
end;

{ Form events ------------------------------------------------------------------------------ }

procedure TfrmSurgery.FormCreate(Sender: TObject);
begin
  inherited;
  PageID := CT_SURGERY;
  memSurgery.Color := ReadOnlyColor;
  memPCEShow.Color := ReadOnlyColor;
  lblNewTitle.Color := ReadOnlyColor;
  EditingIndex := -1;
  FEditNote.LastCosigner := 0;
  FEditNote.LastCosignerName := '';
  FLastNoteID := '';
  frmDrawers := TfrmDrawers.CreateDrawers(Self, pnlDrawers, [],[]);
  frmDrawers.Align := alBottom;
  frmDrawers.RichEditControl := memNewNote;
  frmDrawers.NewNoteButton := cmdNewNote;
  frmDrawers.Splitter := splDrawers;
  frmDrawers.DefTempPiece := 1;
  tvSurgery.Images := dmodShared.imgSurgery;
  tvSurgery.StateImages := dmodShared.imgImages;
  FImageFlag := TBitmap.Create;
  FCaseList := TStringList.Create;
  TAccessibleTreeView.WrapControl(tvSurgery);
end;

procedure TfrmSurgery.pnlRightResize(Sender: TObject);
{ memSurgery (TRichEdit) doesn't repaint appropriately unless it's parent panel is refreshed }
begin
  inherited;
  pnlRight.Refresh;
  memSurgery.Repaint;
end;

procedure TfrmSurgery.pnlWriteResize(Sender: TObject);
const
  LEFT_MARGIN = 4;
begin
  inherited;
  LimitEditWidth(memNewNote, MAX_ENTRY_WIDTH - 1);
  memNewNote.Constraints.MinWidth := TextWidthByFont(memNewNote.Font.Handle, StringOfChar('X', MAX_ENTRY_WIDTH)) + (LEFT_MARGIN * 2) + ScrollBarWidth;
  pnlLeft.Width := self.ClientWidth - pnlWrite.Width - sptHorz.Width;
end;

procedure TfrmSurgery.SetViewContext(AContext: TSurgCaseContext);
var
  Saved: boolean;
begin
  inherited;
  if EditingIndex <> -1 then
  begin
    SaveCurrentNote(Saved);
    if not Saved then Exit;
  end;
  FCurrentContext := AContext;
  EditingIndex := -1;
  tvSurgery.Enabled := True ;
  pnlRead.BringToFront ;
  with uSurgeryContext do
    begin
      Changed        := True;
      OpProc         := FCurrentContext.OpProc;
      BeginDate      := FCurrentContext.BeginDate;
      EndDate        := FCurrentContext.EndDate;
      FMBeginDate    := FCurrentContext.FMBeginDate;
      FMEndDate      := FCurrentContext.FMEndDate;
      MaxDocs        := FCurrentContext.MaxDocs;
      Status         := FCurrentContext.Status;
      GroupBy        := FCurrentContext.GroupBy;
      TreeAscending  := FCurrentContext.TreeAscending;
      mnuViewClick(Self);
    end;
end;

procedure TfrmSurgery.FormDestroy(Sender: TObject);
begin
  TAccessibleTreeView.UnwrapControl(tvSurgery);
  FCaseList.Free;
  FImageFlag.Free;
  KillCaseTreeObjects(tvSurgery);
  inherited;
end;

function TfrmSurgery.GetDrawers: TFrmDrawers;
begin
  Result := frmDrawers ;
end;

procedure TfrmSurgery.UpdateTreeView(DocList: TStringList; Tree: TORTreeView);
var
  i: integer;
begin
  with Tree do
    begin
      uChanging := True;
      Items.BeginUpdate;
      for i := 0 to DocList.Count - 1 do
        begin
          if Piece(DocList[i], U, 10) <> '' then
            lstNotes.Items.Add(DocList[i]);
        end;
      BuildCaseTree(DocList, '0', Tree, nil, uSurgeryContext);
      Items.EndUpdate;
      uChanging := False;
    end;
end;

procedure TfrmSurgery.RequestPrint;
var
  Saved: Boolean;
begin
  SetupVars;  //kt added 8/7/2007 to replace constants with vars.
  with lstNotes do
  begin
    if ItemIndex = EditingIndex then
    begin
      SaveCurrentNote(Saved);
      if not Saved then Exit;
    end;
    if ItemIEN > 0 then PrintNote(ItemIEN, MakeNoteDisplayText(Items[ItemIndex])) else
    begin
      if ItemIEN = 0 then InfoBox(TX_NONOTE, TX_NONOTE_CAP, MB_OK);
      if ItemIEN < 0 then InfoBox(TX_NOPRT_NEW, TX_NOPRT_NEW_CAP, MB_OK);
    end;
  end;
end;

procedure TfrmSurgery.mnuChartTabClick(Sender: TObject);
{ reroute to Chart Tab menu of the parent form: frmFrame }
begin
  inherited;
  frmFrame.mnuChartTabClick(Sender);
end;

procedure TfrmSurgery.SetFontSize(NewFontSize: Integer);
{ adjusts the font size of any controls that don't have ParentFont = True }
begin
  inherited SetFontSize(NewFontSize);
  pnlLeft.Width := pnlLeft.Constraints.MinWidth;
  sptHorz.Left := pnlLeft.Width;
  memSurgery.Font.Size     := NewFontSize;
  memNewNote.Font.Size  := NewFontSize;
  lblTitle.Font.Size    := NewFontSize;
  frmDrawers.Font.Size  := NewFontSize;
  SetEqualTabStops(memNewNote);
  // adjust heights of pnlAction, pnlFields, and lstEncntShow
end;

procedure TfrmSurgery.mnuViewClick(Sender: TObject);
{ changes the list of notes available for viewing }
var
  //AuthCtxt: TAuthorContext;
  //DateRange: TNoteDateRange;
  AContext: TSurgCaseContext;
  Saved: Boolean;
begin
  inherited;
  // save note at EditingIndex?
  if EditingIndex <> -1 then
  begin
    SaveCurrentNote(Saved);
    if not Saved then Exit;
  end;
  FLastNoteID := lstNotes.ItemID;
  mnuViewDetail.Checked := False;
  uChanging := True;
  AContext := GetCurrentSurgCaseContext;
//StatusText('Retrieving surgery case list...');  <-- original line.  //kt 8/7/2007
  StatusText(DKLangConstW('fSurgery_Retrieving_surgery_case_listxxx')); //kt added 8/7/2007
  if Sender is TMenuItem then ViewContext := TMenuItem(Sender).Tag
  else with AContext do
    begin
      if ((BeginDate + EndDate + Status + GroupBy + IntToStr(MaxDocs)) <> '0') then
        ViewContext := SR_CUSTOM
      else
        ViewContext := SR_ALL;
    end;
  with tvSurgery do if (Selected <> nil) and (Piece(TORTreeNode(Selected).StringData, U, 10) <> '') then
    FLastNoteID := Piece(TORTreeNode(Selected).StringData, U, 1);
  case ViewContext of
  SR_RECENT, SR_ALL:  begin
                        FillChar(FCurrentContext, SizeOf(FCurrentContext), 0);
                        FillChar(uSurgeryContext, SizeOf(uSurgeryContext), 0);
                        //FCurrentContext.MaxDocs := uSurgeryContext.MaxDocs;
                        FCurrentContext.Status := IntToStr(ViewContext);
                        LoadSurgeryCases;
                      end;
  SR_CUSTOM:     begin
                   if Sender is TMenuItem then
                     begin
                       SelectSurgeryView(Font.Size, True, FCurrentContext, uSurgeryContext);
                     end;
                   with uSurgeryContext do (*if Changed then*)
                   begin
                       FCurrentContext.OpProc := OpProc;
                       FCurrentContext.BeginDate := BeginDate;
                       FCurrentContext.EndDate := EndDate;
                       FCurrentContext.FMBeginDate := FMBeginDate;
                       FCurrentContext.FMEndDate := FMEndDate;
                       if (FMBeginDate > 0) and (FMEndDate > 0) then
                         FCurrentContext.Status := IntToStr(SR_BY_DATE)
                       else
                         FCurrentContext.Status := Status;
                       FCurrentContext.MaxDocs := MaxDocs;
                       FCurrentContext.GroupBy := GroupBy;
                       FCurrentContext.TreeAscending := TreeAscending;
                       LoadSurgeryCases;
                   end;
                 end;
  end; {case}
  lblCases.Caption := SetSurgTreeLabel(FCurrentContext);
  tvSurgery.Caption := lblCases.Caption;
  StatusText('');
end;

procedure TfrmSurgery.popNoteMemoFindClick(Sender: TObject);
begin
  inherited;
  SendMessage(TRichEdit(popNoteMemo.PopupComponent).Handle, WM_VSCROLL, SB_TOP, 0);
  with dlgFindText do
    begin
      Position := Point(Application.MainForm.Left + pnlLeft.Width, Application.MainForm.Top);
      FindText := '';
      Options := [frDown, frHideUpDown];
      Execute;
    end;
end;

procedure TfrmSurgery.dlgFindTextFind(Sender: TObject);
begin
  dmodShared.FindRichEditText(dlgFindText, TRichEdit(popNoteMemo.PopupComponent));
end;

{ General procedures ----------------------------------------------------------------------- }

procedure TfrmSurgery.ClearEditControls;
{ resets controls used for entering a new progress note }
begin
  // clear FEditNote (should FEditNote be an object with a clear method?)
  with FEditNote do
  begin
    DocType      := 0;
    Title        := 0;
    TitleName    := '';
    DateTime     := 0;
    Author       := 0;
    AuthorName   := '';
    Cosigner     := 0;
    CosignerName := '';
    Subject      := '';
    Location     := 0;
    LocationName := '';
    PkgRef       := '';
    PkgIEN       := 0;
    PkgPtr       := '';
    NeedCPT      := False;
    Addend       := 0;
    {LastCosigner & LastCosignerName aren't cleared because they're used as default for next note.}
    Lines        := nil;
  end;
  // clear the editing controls (also clear the new labels?)
  txtSubject.Text := '';
  memNewNote.Clear;
  timAutoSave.Enabled := False;
  // clear the PCE object for editing
  uPCEEdit.Clear;
  // set the tracking variables to initial state
  EditingIndex := -1;
  FChanged := False;
end;

procedure TfrmSurgery.ShowPCEControls(ShouldShow: Boolean);
begin
  sptVert.Visible    := ShouldShow;
  memPCEShow.Visible := ShouldShow;
  if(ShouldShow) then
    sptVert.Top := memPCEShow.Top - sptVert.Height;
  memSurgery.Invalidate;
end;

procedure TfrmSurgery.DisplayPCE;
{ displays PCE information if appropriate & enables/disabled editing of PCE data }
var
  EnableList, ShowList: TDrawers;
  VitalStr:   TStringlist;
  NoPCE:      boolean;
  ActionSts: TActionRec;
  AnIEN: integer;

begin
  memPCEShow.Clear;
  with lstNotes do if ItemIndex = -1 then
  begin
    ShowPCEControls(FALSE);
    frmDrawers.DisplayDrawers(FALSE);
  end
  else if ItemIndex = EditingIndex then
  begin
    with uPCEEdit do
    begin
      AddStrData(memPCEShow.Lines);
      NoPCE := (memPCEShow.Lines.Count = 0);
      VitalStr  := TStringList.create;
      try
        GetVitalsFromDate(VitalStr, uPCEEdit);
        AddVitalData(VitalStr, memPCEShow.Lines);
      finally
        VitalStr.free;
      end;
      ShowPCEButtons(TRUE);
      ShowPCEControls(cmdPCE.Enabled or (memPCEShow.Lines.Count > 0));
      if(NoPCE and memPCEShow.Visible) then
        memPCEShow.Lines.Insert(0, TX_NOPCE);

      if(InteractiveRemindersActive) then
      begin
        if(GetReminderStatus = rsNone) then
          EnableList := [odTemplates]
        else
          EnableList := [odTemplates, odReminders];
        ShowList := [odTemplates, odReminders];
      end
      else
      begin
        EnableList := [odTemplates];
        ShowList := [odTemplates];
      end;
      frmDrawers.DisplayDrawers(TRUE, EnableList, ShowList);
    end;
  end else
  begin
    ShowPCEButtons(FALSE);
    frmDrawers.DisplayDrawers(TRUE, [odTemplates], [odTemplates]);
    AnIEN := lstNotes.ItemIEN;
    ActOnDocument(ActionSts, AnIEN, 'VIEW');
    if ActionSts.Success then
    begin
//    StatusText('Retrieving encounter information...');  <-- original line.  //kt 8/7/2007
      StatusText(DKLangConstW('fSurgery_Retrieving_encounter_informationxxx')); //kt added 8/7/2007
      with uPCEShow do
      begin
        NoteDateTime := MakeFMDateTime(Piece(lstNotes.Items[lstNotes.ItemIndex], U, 3));
        PCEForNote(AnIEN, uPCEEdit);
        AddStrData(memPCEShow.Lines);
        NoPCE := (memPCEShow.Lines.Count = 0);
        VitalStr  := TStringList.create;
        try
          GetVitalsFromNote(VitalStr, uPCEShow, AnIEN);
          AddVitalData(VitalStr, memPCEShow.Lines);
        finally
          VitalStr.free;
        end;
        ShowPCEControls(memPCEShow.Lines.Count > 0);
        if(NoPCE and memPCEShow.Visible) then
          memPCEShow.Lines.Insert(0, TX_NOPCE);
      end;
      StatusText('');
    end
    else
      ShowPCEControls(FALSE);
  end; {if ItemIndex}
end;

{ supporting calls for writing notes }

function TfrmSurgery.GetTitleText(AnIndex: Integer): string;
{ returns non-tabbed text for the title of a note given the ItemIndex in lstNotes }
begin
  with lstNotes do if ItemIndex > -1 then
    Result := FormatFMDateTime('mmm dd,yy', MakeFMDateTime(Piece(Items[AnIndex], U, 3))) +
              '  ' + Piece(Items[AnIndex], U, 2) + ', ' + Piece(Items[AnIndex], U, 6) + ', ' +
              Piece(Piece(Items[AnIndex], U, 5), ';', 2)
end;

function TfrmSurgery.LacksRequiredForCreate: Boolean;
{ determines if the fields required to create the note are present }
var
  CurTitle: Integer;
begin
  Result := False;
  with FEditNote do
  begin
    if Title <= 0    then Result := True;
    if Author <= 0   then Result := True;
    if DateTime <= 0 then Result := True;
    if (DocType = TYP_ADDENDUM) then
    begin
      if AskCosignerForDocument(Addend, Author) and (Cosigner <= 0) then Result := True;
    end else
    begin
      if Title > 0 then CurTitle := Title else CurTitle := DocType;
      if AskCosignerForTitle(CurTitle, Author, DateTime) and (Cosigner <= 0) then Result := True;
    end;
  end;
end;

function TfrmSurgery.VerifyNoteTitle: Boolean;
const
  VNT_UNKNOWN = 0;
  VNT_NO      = 1;
  VNT_YES     = 2;
var
  AParam: string;
begin
  if FVerifyNoteTitle = VNT_UNKNOWN then
  begin
    AParam := GetUserParam('ORWOR VERIFY NOTE TITLE');
    if AParam = '1' then FVerifyNoteTitle := VNT_YES else FVerifyNoteTitle := VNT_NO;
  end;
  Result := FVerifyNoteTitle = VNT_YES;
end;

procedure TfrmSurgery.SetSubjectVisible(ShouldShow: Boolean);
{ hide/show subject & resize panel accordingly - leave 6 pixel margin above memNewNote }
begin
  if ShouldShow then
  begin
    lblSubject.Visible := True;
    txtSubject.Visible := True;
    pnlFields.Height   := txtSubject.Top + txtSubject.Height + 6;
  end else
  begin
    lblSubject.Visible := False;
    txtSubject.Visible := False;
    pnlFields.Height   := lblVisit.Top + lblVisit.Height + 6;
  end;
end;


{ create, edit & save notes }

procedure TfrmSurgery.InsertNewNote(IsIDChild: boolean; AnIDParent: integer);
{ creates the editing context for a new progress note & inserts stub into top of view list }
const
  IS_ID_CHILD = False;
var
  EnableAutosave, HaveRequired: Boolean;
  CreatedNote: TCreatedDoc;
  TmpBoilerPlate: TStringList;
  tmpNode: TTreeNode;
  x, AClassName: string;
  DocInfo: string;
begin
  SetupVars;  //kt added 8/7/2007 to replace constants with vars.
  if tvSurgery.Selected = nil then exit;
  if PCaseTreeObject(tvSurgery.Selected.Data)^.OperativeProc = '' then
    begin
//    InfoBox('You must first select the case to which this document will apply', 'Select a case', 0);  <-- original line.  //kt 8/7/2007
      InfoBox(DKLangConstW('fSurgery_You_must_first_select_the_case_to_which_this_document_will_apply'), DKLangConstW('fSurgery_Select_a_case'), 0); //kt added 8/7/2007
      exit;
    end;
  EnableAutosave := FALSE;
  TmpBoilerPlate := nil;
  try
    ClearEditControls;
    FillChar(FEditNote, SizeOf(FEditNote), 0);  //v15.7
    with FEditNote do
    begin
      DocType      := TYP_PROGRESS_NOTE;
      Title        := DfltNoteTitle;
      TitleName    := DfltNoteTitleName;
      DateTime     := FMNow;
      Author       := User.DUZ;
      AuthorName   := User.Name;
      Location     := Encounter.Location;
      LocationName := Encounter.LocationName;
      VisitDate    := Encounter.DateTime;
      if IsIDChild then
        IDParent   := AnIDParent
      else
        IDParent   := 0;
      // Cosigner & PkgRef, if needed, will be set by fNoteProps
    end;
    // check to see if interaction necessary to get required fields
    if PCaseTreeObject(tvSurgery.Selected.Data)^.IsNonORProc then AClassName := DCL_SURG_NON_OR else AClassName := DCL_SURG_OR;
    if LacksRequiredForCreate or VerifyNoteTitle
      then HaveRequired := ExecuteNoteProperties(FEditNote, CT_SURGERY, IS_ID_CHILD, IS_ID_CHILD, AClassName, 0)
      else HaveRequired := True;
    if HaveRequired then
    begin
      // set up uPCEEdit for entry of new note
      uPCEEdit.UseEncounter := True;
      uPCEEdit.NoteDateTime := FEditNote.DateTime;
      uPCEEdit.PCEForNote(USE_CURRENT_VISITSTR, uPCEShow);
      FEditNote.NeedCPT  := uPCEEdit.CPTRequired;
       // create the note
      PutNewNote(CreatedNote, FEditNote);
      uPCEEdit.NoteIEN := CreatedNote.IEN;
      if CreatedNote.IEN > 0 then LockDocument(CreatedNote.IEN, CreatedNote.ErrorText);
      if CreatedNote.ErrorText = '' then
      begin
        //x := $$RESOLVE^TIUSRVLO formatted string
        //7348^Note Title^3000913^NERD, YOURA  (N0165)^1329;Rich Vertigan;VERTIGAN,RICH^8E REHAB MED^complete^Adm: 11/05/98;2981105.095547^        ;^^0^^^2
        with FEditNote do
          begin
            x := IntToStr(CreatedNote.IEN) + U + TitleName + U + FloatToStr(FEditNote.DateTime) + U +
                 Patient.Name + U + IntToStr(Author) + ';' + AuthorName + U + LocationName + U + 'new' + U +
                 U + U + U + U + U + U + U;
          end;

        lstNotes.Items.Insert(0, x);
        uChanging := True;
        tvSurgery.Items.BeginUpdate;
(*        if IsIDChild then
          begin
            tmpNode := tvSurgery.FindPieceNode(IntToStr(AnIDParent), 1, U, tvSurgery.Items.GetFirstNode);
            tmpNode.ImageIndex := IMG_IDNOTE_OPEN;
            tmpNode.SelectedIndex := IMG_IDNOTE_OPEN;
            tmpNode := tvSurgery.Items.AddChildObjectFirst(tmpNode, MakeNoteDisplayText(x), MakeCaseTreeObject(x));
            tmpNode.ImageIndex := IMG_ID_CHILD;
            tmpNode.SelectedIndex := IMG_ID_CHILD;
          end
        else*)
          begin
//          tmpNode := tvSurgery.Items.AddObjectFirst(tvSurgery.Items.GetFirstNode, 'New Note in Progress',  <-- original line.  //kt 8/7/2007
            tmpNode := tvSurgery.Items.AddObjectFirst(tvSurgery.Items.GetFirstNode, DKLangConstW('fSurgery_New_Note_in_Progress'), //kt added 8/7/2007
                                                    MakeCaseTreeObject('NEW^New Note in Progress^^^^^^^^^^^%^0'));
            TORTreeNode(tmpNode).StringData := 'NEW^New Note in Progress^^^^^^^^^^^%^0';
            tmpNode.ImageIndex := IMG_SURG_TOP_LEVEL;
            tmpNode := tvSurgery.Items.AddChildObjectFirst(tmpNode, MakeNoteDisplayText(x), MakeCaseTreeObject(x));
            tmpNode.ImageIndex := IMG_SURG_RPT_SINGLE;
            tmpNode.SelectedIndex := IMG_SURG_RPT_SINGLE;
          end;
        tmpNode.StateIndex := IMG_NO_IMAGES;
        TORTreeNode(tmpNode).StringData := x;
        tvSurgery.Selected := tmpNode;
        tvSurgery.Items.EndUpdate;
        uChanging := False;
        Changes.Add(CH_SUR, IntToStr(CreatedNote.IEN), GetTitleText(0), '', CH_SIGN_YES);
        lstNotes.ItemIndex := 0;
        EditingIndex := 0;
        SetSubjectVisible(AskSubjectForNotes);
        if not assigned(TmpBoilerPlate) then
          TmpBoilerPlate := TStringList.Create;
        LoadBoilerPlate(TmpBoilerPlate, FEditNote.Title);
        FChanged := False;
        cmdChangeClick(Self); // will set captions, sign state for Changes
        lstNotesClick(Self);  // will make pnlWrite visible
        if timAutoSave.Interval <> 0 then EnableAutosave := TRUE;
        if txtSubject.Visible then txtSubject.SetFocus else memNewNote.SetFocus;
      end else
      begin
        // if note creation failed or failed to get note lock (both unlikely), unlock consult
        InfoBox(CreatedNote.ErrorText, TX_CREATE_ERR, MB_OK);
        HaveRequired := False;
      end; {if CreatedNote.IEN}
    end; {if HaveRequired}
    if not HaveRequired then ClearEditControls;
  finally
    if assigned(TmpBoilerPlate) then
    begin
      DocInfo := MakeXMLParamTIU(IntToStr(CreatedNote.IEN), FEditNote);
      ExecuteTemplateOrBoilerPlate(TmpBoilerPlate, FEditNote.Title, ltTitle, Self, 'Title: ' + FEditNote.TitleName, DocInfo);
      memNewNote.Lines.Assign(TmpBoilerPlate);
      TmpBoilerPlate.Free;
    end;
    if EnableAutosave then // Don't enable autosave until after dialog fields have been resolved
      timAutoSave.Enabled := True;
  end;
end;

procedure TfrmSurgery.InsertAddendum;
{ sets up fields of pnlWrite to write an addendum for the selected note }
const
  AS_ADDENDUM = True;
  IS_ID_CHILD = False;
var
  HaveRequired: Boolean;
  CreatedNote: TCreatedDoc;
  tmpNode: TTreeNode;
  x: string;
begin
  SetupVars;  //kt added 8/7/2007 to replace constants with vars.
  ClearEditControls;
  with FEditNote do
  begin
    DocType      := TYP_ADDENDUM;
    Title        := TitleForNote(lstNotes.ItemIEN);
    TitleName    := Piece(lstNotes.Items[lstNotes.ItemIndex], U, 2);
    if Copy(TitleName,1,1) = '+' then TitleName := Copy(TitleName, 3, 199);
    DateTime     := FMNow;
    Author       := User.DUZ;
    AuthorName   := User.Name;
    Addend       := lstNotes.ItemIEN;
    x            := GetPackageRefForNote(lstNotes.ItemIEN);
    if Piece(x, U, 1) <> '-1' then
      begin
        PkgRef       := GetPackageRefForNote(lstNotes.ItemIEN);
        PkgIEN       := StrToIntDef(Piece(PkgRef, ';', 1), 0);
        PkgPtr       := Piece(PkgRef, ';', 2);
      end;
    //Lines        := memNewNote.Lines;
    // Cosigner, if needed, will be set by fNoteProps
    // Location info will be set after the encounter is loaded
  end;
  // check to see if interaction necessary to get required fields
  if LacksRequiredForCreate
    then HaveRequired := ExecuteNoteProperties(FEditNote, CT_SURGERY, IS_ID_CHILD, False, '', 0)
    else HaveRequired := True;
  if HaveRequired then
  begin
    uPCEEdit.NoteDateTime := FEditNote.DateTime;
    uPCEEdit.PCEForNote(FEditNote.Addend, uPCEShow);
    FEditNote.Location     := uPCEEdit.Location;
    FEditNote.LocationName := ExternalName(uPCEEdit.Location, 44);
    FEditNote.VisitDate    := uPCEEdit.DateTime;
    PutAddendum(CreatedNote, FEditNote, FEditNote.Addend);
    uPCEEdit.NoteIEN := CreatedNote.IEN;
    if CreatedNote.IEN > 0 then LockDocument(CreatedNote.IEN, CreatedNote.ErrorText);
    if CreatedNote.ErrorText = '' then
    begin
      with FEditNote do
        begin
          x := IntToStr(CreatedNote.IEN) + U + 'Addendum to ' + TitleName + U + FloatToStr(DateTime) + U +
               Patient.Name + U + IntToStr(Author) + ';' + AuthorName + U + LocationName + U + 'new' + U +
               U + U + PkgRef + U + U + U + U + U;
        end;


      lstNotes.Items.Insert(0, x);
      uChanging := True;
      tvSurgery.Items.BeginUpdate;
//    tmpNode := tvSurgery.Items.AddObjectFirst(tvSurgery.Items.GetFirstNode, 'New Addendum in Progress',  <-- original line.  //kt 8/7/2007
      tmpNode := tvSurgery.Items.AddObjectFirst(tvSurgery.Items.GetFirstNode, DKLangConstW('fSurgery_New_Addendum_in_Progress'), //kt added 8/7/2007
                                              MakeCaseTreeObject('ADDENDUM^New Addendum in Progress^^^^^^^^^^^%^0'));
      TORTreeNode(tmpNode).StringData := 'ADDENDUM^New Addendum in Progress^^^^^^^^^^^%^0';
      tmpNode.ImageIndex := IMG_SURG_TOP_LEVEL;
      tmpNode := tvSurgery.Items.AddChildObjectFirst(tmpNode, MakeNoteDisplayText(x), MakeCaseTreeObject(x));
      TORTreeNode(tmpNode).StringData := x;

      tmpNode.ImageIndex := IMG_SURG_ADDENDUM;
      tmpNode.SelectedIndex := IMG_SURG_ADDENDUM;
      tvSurgery.Selected := tmpNode;
      tvSurgery.Items.EndUpdate;
      uChanging := False;
      Changes.Add(CH_SUR, IntToStr(CreatedNote.IEN), GetTitleText(0), '', CH_SIGN_YES);
      lstNotes.ItemIndex := 0;
      EditingIndex := 0;
      SetSubjectVisible(AskSubjectForNotes);
      cmdChangeClick(Self); // will set captions, sign state for Changes
      lstNotesClick(Self);  // will make pnlWrite visible
      if timAutoSave.Interval <> 0 then timAutoSave.Enabled := True;
      memNewNote.SetFocus;
    end else
    begin
      // if note creation failed or failed to get note lock (both unlikely), unlock consult
      InfoBox(CreatedNote.ErrorText, TX_CREATE_ERR, MB_OK);
      HaveRequired := False;
    end; {if CreatedNote.IEN}
  end; {if HaveRequired}
  if not HaveRequired then ClearEditControls;
end;

procedure TfrmSurgery.LoadForEdit;
{ retrieves an existing note and places the data in the fields of pnlWrite }
var
  tmpNode: TTreeNode;
  x: string;
begin
  ClearEditControls;
  EditingIndex := lstNotes.ItemIndex;
  Changes.Add(CH_SUR, lstNotes.ItemID, GetTitleText(EditingIndex), '', CH_SIGN_YES);
  GetNoteForEdit(FEditNote, lstNotes.ItemIEN);
  memNewNote.Lines.Assign(FEditNote.Lines);
  FChanged := False;
  if FEditNote.Title = TYP_ADDENDUM then
  begin
    FEditNote.DocType := TYP_ADDENDUM;
    FEditNote.TitleName := Piece(lstNotes.Items[lstNotes.ItemIndex], U, 2);
    if Copy(FEditNote.TitleName,1,1) = '+' then FEditNote.TitleName := Copy(FEditNote.TitleName, 3, 199);
    if CompareText(Copy(FEditNote.TitleName, 1, 8), 'Addendum') <> 0
//    then FEditNote.TitleName := FEditNote.TitleName + 'Addendum to ';  <-- original line.  //kt 8/7/2007
      then FEditNote.TitleName := FEditNote.TitleName + DKLangConstW('fSurgery_Addendum_to'); //kt added 8/7/2007
  end;

  uChanging := True;
  tvSurgery.Items.BeginUpdate;

  tmpNode := tvSurgery.FindPieceNode('EDIT', 1, U, nil);
  if tmpNode = nil then
    begin
//    tmpNode := tvSurgery.Items.AddObjectFirst(tvSurgery.Items.GetFirstNode, 'Note being edited',  <-- original line.  //kt 8/7/2007
      tmpNode := tvSurgery.Items.AddObjectFirst(tvSurgery.Items.GetFirstNode, DKLangConstW('fSurgery_Note_being_edited'), //kt added 8/7/2007
                                              MakeCaseTreeObject('EDIT^Note being edited^^^^^^^^^^^%^0'));
      TORTreeNode(tmpNode).StringData := 'EDIT^Note being edited^^^^^^^^^^^%^0';
    end
  else
    tmpNode.DeleteChildren;
  x := lstNotes.Items[lstNotes.ItemIndex];
  tmpNode.ImageIndex := IMG_SURG_TOP_LEVEL;
  tmpNode := tvSurgery.Items.AddChildObjectFirst(tmpNode, MakeNoteDisplayText(x), MakeCaseTreeObject(x));
  TORTreeNode(tmpNode).StringData := x;
//if CompareText(Copy(FEditNote.TitleName, 1, 8), 'Addendum') <> 0 then  <-- original line.  //kt 8/7/2007
  if CompareText(Copy(FEditNote.TitleName, 1, 8), DKLangConstW('fSurgery_Addendum')) <> 0 then //kt added 8/7/2007
    tmpNode.ImageIndex := IMG_SURG_RPT_SINGLE
  else
    tmpNode.ImageIndex := IMG_SURG_ADDENDUM;
  tmpNode.SelectedIndex := tmpNode.ImageIndex;
  tvSurgery.Selected := tmpNode;
  tvSurgery.Items.EndUpdate;
  uChanging := False;

  uPCEEdit.NoteDateTime := MakeFMDateTime(Piece(lstNotes.Items[lstNotes.ItemIndex], U, 3));
  uPCEEdit.PCEForNote(lstNotes.ItemIEN, uPCEShow);
  FEditNote.NeedCPT := uPCEEdit.CPTRequired;
  txtSubject.Text := FEditNote.Subject;
  SetSubjectVisible(AskSubjectForNotes);
  cmdChangeClick(Self); // will set captions, sign state for Changes
  lstNotesClick(Self);  // will make pnlWrite visible
  if timAutoSave.Interval <> 0 then timAutoSave.Enabled := True;
  memNewNote.SetFocus;
end;

procedure TfrmSurgery.SaveEditedNote(var Saved: Boolean);
{ validates fields and sends the updated note to the server }
var
  UpdatedNote: TCreatedDoc;
  x: string;
begin
  SetupVars;  //kt added 8/7/2007 to replace constants with vars.
  Saved := False;
  if (memNewNote.GetTextLen = 0) or (not ContainsVisibleChar(memNewNote.Text)) then
  begin
    lstNotes.ItemIndex := EditingIndex;
    x := lstNotes.ItemID;
    uChanging := True;
    with tvSurgery do Selected := FindPieceNode(x, 1, U, Items.GetFirstNode);
    uChanging := False;
    tvSurgeryChange(Self, tvSurgery.Selected);
    if FSilent or
       ((not FSilent) and
      (InfoBox(GetTitleText(EditingIndex) + TX_EMPTY_NOTE, TC_EMPTY_NOTE, MB_YESNO) = IDYES))
    then
      begin
        FConfirmed := True;
        mnuActDeleteClick(Self);
        Saved := True;
        FDeleted := True;
      end
    else
      FConfirmed := False;
    Exit;
  end;
  //ExpandTabsFilter(memNewNote.Lines, TAB_STOP_CHARS);
  FEditNote.Lines    := memNewNote.Lines;
  FEditNote.Subject  := txtSubject.Text;
  FEditNote.NeedCPT  := uPCEEdit.CPTRequired;
  timAutoSave.Enabled := False;
  try
    PutEditedNote(UpdatedNote, FEditNote, lstNotes.GetIEN(EditingIndex));
  finally
    timAutoSave.Enabled := True;
  end;
  // there's no unlocking here since the note is still in Changes after a save
  if UpdatedNote.IEN > 0 then
  begin
    if lstNotes.ItemIndex = EditingIndex then
    begin
      EditingIndex := -1;
      lstNotesClick(Self);
    end;
    EditingIndex := -1; // make sure EditingIndex reset even if not viewing edited note
    Saved := True;
    FChanged := False;
  end else
  begin
    if not FSilent then
      InfoBox(TX_SAVE_ERROR1 + UpdatedNote.ErrorText + TX_SAVE_ERROR2, TC_SAVE_ERROR, MB_OK or MB_ICONWARNING);
  end;
end;

procedure TfrmSurgery.SaveCurrentNote(var Saved: Boolean);
{ called whenever a note should be saved - uses IEN to call appropriate save logic }
begin
  if EditingIndex < 0 then Exit;
  SaveEditedNote(Saved);
end;

{ Left panel (selector) events ------------------------------------------------------------- }

procedure TfrmSurgery.cmdNewNoteClick(Sender: TObject);
{ maps 'New Note' button to the New Progress Note menu item }
begin
  inherited;
  mnuActNewClick(Self);
end;

procedure TfrmSurgery.cmdPCEClick(Sender: TObject);
var
  Refresh: boolean;
  ActionSts: TActionRec;
  AnIEN: integer;
  PCEObj: TPCEData;

begin
  inherited;
  cmdPCE.Enabled := False;
  if not FEditingNotePCEObj then
  begin
    PCEObj := nil;
    AnIEN := lstNotes.ItemIEN;
    if (AnIEN <> 0) and (memSurgery.Lines.Count > 0) then
    begin
      ActOnDocument(ActionSts, AnIEN, 'VIEW');
      if ActionSts.Success then
      begin
        uPCEShow.CopyPCEData(uPCEEdit);
        PCEObj := uPCEEdit;
      end;
    end;
    Refresh := EditPCEData(PCEObj);
  end
  else
  begin
    UpdatePCE(uPCEEdit);
    Refresh := TRUE;
  end;
  cmdPCE.Enabled := True;
  if Refresh and (not frmFrame.Closing) then
    DisplayPCE;
end;

{ Right panel (editor) events -------------------------------------------------------------- }

procedure TfrmSurgery.mnuActChangeClick(Sender: TObject);
begin
  inherited;
  if (FEditingIndex < 0) or (lstNotes.ItemIndex <> FEditingIndex) then Exit;
  cmdChangeClick(Sender);
end;

procedure TfrmSurgery.mnuActLoadBoilerClick(Sender: TObject);
var
  NoteEmpty: Boolean;
  BoilerText: TStringList;
  DocInfo: string;

  procedure AssignBoilerText;
  begin
    ExecuteTemplateOrBoilerPlate(BoilerText, FEditNote.Title, ltTitle, Self, 'Title: ' + FEditNote.TitleName, DocInfo);
    memNewNote.Lines.Assign(BoilerText);
    FChanged := False;
  end;

begin
  SetupVars;  //kt added 8/7/2007 to replace constants with vars.
  inherited;
  if (FEditingIndex < 0) or (lstNotes.ItemIndex <> FEditingIndex) then Exit;
  BoilerText := TStringList.Create;
  try
    NoteEmpty := memNewNote.Text = '';
    LoadBoilerPlate(BoilerText, FEditNote.Title);
    if (BoilerText.Text <> '') or
       assigned(GetLinkedTemplate(IntToStr(FEditNote.Title), ltTitle)) then
    begin
      if NoteEmpty then AssignBoilerText else
      begin
        DocInfo := MakeXMLParamTIU(IntToStr(lstNotes.ItemIEN), FEditNote);
        case QueryBoilerPlate(BoilerText) of
        0:  { do nothing } ;                         // ignore
        1: begin
             ExecuteTemplateOrBoilerPlate(BoilerText, FEditNote.Title, ltTitle, Self, 'Title: ' + FEditNote.TitleName, DocInfo);
             memNewNote.Lines.AddStrings(BoilerText);  // append
           end;
        2: AssignBoilerText;                         // replace
        end;
      end;
    end else
    begin
      if Sender = mnuActLoadBoiler
        then InfoBox(TX_NO_BOIL, TC_NO_BOIL, MB_OK)
        else
        begin
          if not NoteEmpty then
            if not FChanged and (InfoBox(TX_BLR_CLEAR, TC_BLR_CLEAR, MB_YESNO) = ID_YES)
              then memNewNote.Lines.Clear;
        end;
    end; {if BoilerText.Text <> ''}
  finally
    BoilerText.Free;
  end;
end;

procedure TfrmSurgery.cmdChangeClick(Sender: TObject);
const
  IS_ID_CHILD = False;
var
  LastTitle: Integer;
  OKPressed: boolean;
  x, AClassName: string;
begin
  inherited;
  LastTitle   := FEditNote.Title;
  if IsNonORProcedure(FEditNote.PkgIEN) then AClassName := DCL_SURG_NON_OR else AClassName := DCL_SURG_OR;
  if Sender <> Self then OKPressed := ExecuteNoteProperties(FEditNote, CT_SURGERY, IS_ID_CHILD, IS_ID_CHILD, AClassName, 0)
    else OKPressed := True;
  if not OKPressed then Exit;
  // update display fields & uPCEEdit
  lblNewTitle.Caption := ' ' + FEditNote.TitleName + ' ';
//if (FEditNote.Addend > 0) and (CompareText(Copy(lblNewTitle.Caption, 2, 8), 'Addendum') <> 0)  <-- original line.  //kt 8/7/2007
  if (FEditNote.Addend > 0) and (CompareText(Copy(lblNewTitle.Caption, 2, 8), DKLangConstW('fSurgery_Addendum')) <> 0) //kt added 8/7/2007
//  then lblNewTitle.Caption := ' Addendum to:' + lblNewTitle.Caption;  <-- original line.  //kt 8/7/2007
    then lblNewTitle.Caption := DKLangConstW('fSurgery_Addendum_tox') + lblNewTitle.Caption; //kt added 8/7/2007
  with lblNewTitle do bvlNewTitle.SetBounds(Left - 1, Top - 1, Width + 2, Height + 2);
  lblRefDate.Caption := FormatFMDateTime('mmm dd,yyyy@hh:nn', FEditNote.DateTime);
  lblAuthor.Caption  := FEditNote.AuthorName;
  if uPCEEdit.Inpatient then x := 'Adm: ' else x := 'Vst: ';
  x := x + FormatFMDateTime('mm/dd/yy', FEditNote.VisitDate) + '  ' + FEditNote.LocationName;
  lblVisit.Caption   := x;
  if Length(FEditNote.CosignerName) > 0
//  then lblCosigner.Caption := 'Expected Cosigner: ' + FEditNote.CosignerName  <-- original line.  //kt 8/7/2007
    then lblCosigner.Caption := DKLangConstW('fSurgery_Expected_Cosignerx') + FEditNote.CosignerName //kt added 8/7/2007
    else lblCosigner.Caption := '';
  uPCEEdit.NoteTitle  := FEditNote.Title;
  // modify signature requirements if author or cosigner changed
  if (User.DUZ <> FEditNote.Author) and (User.DUZ <> FEditNote.Cosigner)
    then Changes.ReplaceSignState(CH_SUR, lstNotes.ItemID, CH_SIGN_NA)
    else Changes.ReplaceSignState(CH_SUR, lstNotes.ItemID, CH_SIGN_YES);
  x := lstNotes.Items[EditingIndex];
  SetPiece(x, U, 2, lblNewTitle.Caption);
  SetPiece(x, U, 3, FloatToStr(FEditNote.DateTime));
  tvSurgery.Selected.Text := MakeNoteDisplayText(x);
  TORTreeNode(tvSurgery.Selected).StringData := x;
  lstNotes.Items[EditingIndex] := x;
  Changes.ReplaceText(CH_SUR, lstNotes.ItemID, GetTitleText(EditingIndex));
  if LastTitle <> FEditNote.Title then mnuActLoadBoilerClick(Self);
end;

procedure TfrmSurgery.memNewNoteChange(Sender: TObject);
begin
  inherited;
  FChanged := True;
end;

procedure TfrmSurgery.pnlFieldsResize(Sender: TObject);
{ center the reference date on the panel }
begin
  inherited;
  lblRefDate.Left := (pnlFields.Width - lblRefDate.Width) div 2;
  if lblRefDate.Left < (lblNewTitle.Left + lblNewTitle.Width + 6)
    then lblRefDate.Left := (lblNewTitle.Left + lblNewTitle.Width);
end;

procedure TfrmSurgery.DoAutoSave(Suppress: integer = 1);
var
  ErrMsg: string;
begin
  if (EditingIndex > -1) and FChanged then
  begin
//  StatusText('Autosaving note...');  <-- original line.  //kt 8/7/2007
    StatusText(DKLangConstW('fSurgery_Autosaving_notexxx')); //kt added 8/7/2007
    //PutTextOnly(ErrMsg, memNewNote.Lines, lstNotes.GetIEN(EditingIndex));
    timAutoSave.Enabled := False;
    try
      SetText(ErrMsg, memNewNote.Lines, lstNotes.GetIEN(EditingIndex), Suppress);
    finally
      timAutoSave.Enabled := True;
    end;
    FChanged := False;
    StatusText('');
  end;
  if ErrMsg <> '' then
    InfoBox(TX_SAVE_ERROR1 + ErrMsg + TX_SAVE_ERROR2, TC_SAVE_ERROR, MB_OK or MB_ICONWARNING);
  //Assert(ErrMsg = '', 'AutoSave: ' + ErrMsg);
end;

procedure TfrmSurgery.timAutoSaveTimer(Sender: TObject);
begin
  inherited;
  DoAutoSave;
end;

{ Action menu events ----------------------------------------------------------------------- }

function TfrmSurgery.StartNewEdit(NewNoteType: integer): Boolean;
{ if currently editing a note, returns TRUE if the user wants to start a new one }
var
  Saved: Boolean;
  Msg, CapMsg: string;
begin
  SetupVars;  //kt added 8/7/2007 to replace constants with vars.
  Result := True;
  if EditingIndex > -1 then
  begin
    case NewNoteType of
      NT_ACT_ADDENDUM:  begin
                          Msg := TX_NEW_SAVE1 + MakeNoteDisplayText(lstNotes.Items[EditingIndex]) + TX_NEW_SAVE3;
                          CapMsg := TC_NEW_SAVE3;
                        end;
      NT_ACT_EDIT_NOTE: begin
                          Msg := TX_NEW_SAVE1 + MakeNoteDisplayText(lstNotes.Items[EditingIndex]) + TX_NEW_SAVE4;
                          CapMsg := TC_NEW_SAVE4;
                        end;
    else
      begin
        Msg := TX_NEW_SAVE1 + MakeNoteDisplayText(lstNotes.Items[EditingIndex]) + TX_NEW_SAVE2;
        CapMsg := TC_NEW_SAVE2;
      end;
    end;
    if InfoBox(Msg, CapMsg, MB_YESNO) = IDNO then Result := False
    else
      begin
        SaveCurrentNote(Saved);
        if not Saved then Result := False else LoadSurgeryCases;
      end;
  end;
end;

procedure TfrmSurgery.mnuActNewClick(Sender: TObject);
const
  IS_ID_CHILD = False;
{ switches to current new note or creates a new note if none is being edited already }
begin
  SetupVars;  //kt added 8/7/2007 to replace constants with vars.
  inherited;
  if not StartNewEdit(NT_ACT_NEW_NOTE) then Exit;
  //LoadNotes;
  // make sure a visit (time & location) is available before creating the note
  if Encounter.NeedVisit then
  begin
    UpdateVisit(Font.Size, DfltTIULocation);
    frmFrame.DisplayEncounterText;
  end;
  if Encounter.NeedVisit then
  begin
    InfoBox(TX_NEED_VISIT, TX_NO_VISIT, MB_OK or MB_ICONWARNING);
    Exit;
  end;
  InsertNewNote(IS_ID_CHILD, 0);
end;


procedure TfrmSurgery.mnuActAddendClick(Sender: TObject);
{ make an addendum to an existing note }
var
  ActionSts: TActionRec;
  ANoteID: string;
begin
  SetupVars;  //kt added 8/7/2007 to replace constants with vars.
  inherited;
  if lstNotes.ItemIEN <= 0 then Exit;
  ANoteID := lstNotes.ItemID;
  if not StartNewEdit(NT_ACT_ADDENDUM) then Exit;
  //LoadNotes;
  with tvSurgery do Selected := FindPieceNode(ANoteID, 1, U, Items.GetFirstNode);
  if lstNotes.ItemIndex = EditingIndex then
  begin
    InfoBox(TX_ADDEND_NO, TX_ADDEND_MK, MB_OK);
    Exit;
  end;
  ActOnDocument(ActionSts, lstNotes.ItemIEN, 'MAKE ADDENDUM');
  if not ActionSts.Success then
  begin
    InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK);
    Exit;
  end;
  with lstNotes do if TitleForNote(lstNotes.ItemIEN) = TYP_ADDENDUM then
  begin
    InfoBox(TX_ADDEND_AD, TX_ADDEND_MK, MB_OK);
    Exit;
  end;
  InsertAddendum;
end;


procedure TfrmSurgery.mnuActSignListClick(Sender: TObject);
{ add the note to the Encounter object, see mnuActSignClick - copied}
const
  SIG_COSIGN = 'COSIGNATURE';
  SIG_SIGN   = 'SIGNATURE';
var
  ActionType, SignTitle: string;
  ActionSts: TActionRec;
begin
  SetupVars;  //kt added 8/7/2007 to replace constants with vars.
  inherited;
  if lstNotes.ItemIEN = 0 then Exit;
  if lstNotes.ItemIndex = EditingIndex then Exit;  // already in signature list
  if not NoteHasText(lstNotes.ItemIEN) then
    begin
      InfoBox(TX_EMPTY_NOTE1, TC_EMPTY_NOTE, MB_OK or MB_ICONERROR);
      Exit;
    end;
  if not LastSaveClean(lstNotes.ItemIEN) and
    (InfoBox(TX_ABSAVE, TC_ABSAVE, MB_YESNO or MB_DEFBUTTON2 or MB_ICONWARNING) <> IDYES) then Exit;
  if CosignDocument(lstNotes.ItemIEN) then
  begin
    SignTitle := TX_COSIGN;
    ActionType := SIG_COSIGN;
  end else
  begin
    SignTitle := TX_SIGN;
    ActionType := SIG_SIGN;
  end;
  ActOnDocument(ActionSts, lstNotes.ItemIEN, ActionType);
  if not ActionSts.Success then
  begin
    InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK);
    Exit;
  end;
  with lstNotes do Changes.Add(CH_SUR, ItemID, GetTitleText(ItemIndex), '', CH_SIGN_YES);
end;

procedure TfrmSurgery.RemovePCEFromChanges(IEN: Int64; AVisitStr: string = '');
begin
  if IEN = NT_ADDENDUM then Exit;  // no PCE information entered for an addendum
  // do we need to call DeletePCE(AVisitStr), as was done with NT_NEW_NOTE (ien=-10)???
  if AVisitStr = '' then AVisitStr := VisitStrForNote(IEN);
  Changes.Remove(CH_PCE, 'V' + AVisitStr);
  Changes.Remove(CH_PCE, 'P' + AVisitStr);
  Changes.Remove(CH_PCE, 'D' + AVisitStr);
  Changes.Remove(CH_PCE, 'I' + AVisitStr);
  Changes.Remove(CH_PCE, 'S' + AVisitStr);
  Changes.Remove(CH_PCE, 'A' + AVisitStr);
  Changes.Remove(CH_PCE, 'H' + AVisitStr);
  Changes.Remove(CH_PCE, 'E' + AVisitStr);
  Changes.Remove(CH_PCE, 'T' + AVisitStr);
end;

procedure TfrmSurgery.mnuActDeleteClick(Sender: TObject);
{ delete the selected progress note & remove from the Encounter object if necessary }
var
  DeleteSts, ActionSts: TActionRec;
  SavedDocIEN: Integer;
  ReasonForDelete, AVisitStr, SavedDocID, ErrMsg: string;
  Saved: boolean;
begin
  SetupVars;  //kt added 8/7/2007 to replace constants with vars.
  inherited;
  if lstNotes.ItemIEN = 0 then Exit;
  ActOnDocument(ActionSts, lstNotes.ItemIEN, 'DELETE RECORD');
  if ShowMsgOn(not ActionSts.Success, ActionSts.Reason, TX_IN_AUTH) then Exit;
  ReasonForDelete := SelectDeleteReason(lstNotes.ItemIEN);
  if ReasonForDelete = DR_CANCEL then Exit;
  // suppress prompt for deletion when called from SaveEditedNote (Sender = Self)
  if (Sender <> Self) and (InfoBox(MakeNoteDisplayText(lstNotes.Items[lstNotes.ItemIndex]) + TX_DEL_OK,
    TX_DEL_CNF, MB_YESNO or MB_DEFBUTTON2 or MB_ICONQUESTION) <> IDYES) then Exit;
  // do the appropriate locking
  ErrMsg := '';
  LockDocument(lstNotes.ItemIEN, ErrMsg);
  if ErrMsg <> '' then
    begin
      InfoBox(ErrMsg, TC_NO_LOCK, MB_OK);
      Exit;
    end;
  // retraction notification message
  if JustifyDocumentDelete(lstNotes.ItemIEN) then
     InfoBox(TX_RETRACT, TX_RETRACT_CAP, MB_OK);
  SavedDocID := lstNotes.ItemID;
  SavedDocIEN := lstNotes.ItemIEN;
  if (EditingIndex > -1) and (not FConfirmed) and (lstNotes.ItemIndex <> EditingIndex) and (memNewNote.GetTextLen > 0) then
    begin
      SaveCurrentNote(Saved);
      if not Saved then Exit;
    end;
  EditingIndex := -1;
  FConfirmed := False;
  // remove the note
  DeleteSts.Success := True;
  AVisitStr := VisitStrForNote(SavedDocIEN);
  RemovePCEFromChanges(SavedDocIEN, AVisitStr);
  if (SavedDocIEN > 0) and (lstNotes.ItemIEN = SavedDocIEN) then DeleteDocument(DeleteSts, SavedDocIEN, ReasonForDelete);
  if not Changes.Exist(CH_SUR, SavedDocID) then UnlockDocument(SavedDocIEN);
  Changes.Remove(CH_SUR, SavedDocID);  // this will unlock the document if in Changes
  // reset the display now that the note is gone
  if DeleteSts.Success then
  begin
    DeletePCE(AVisitStr);  // removes PCE data if this was the only note pointing to it
    ClearEditControls;
    LoadSurgeryCases;
      pnlWrite.Visible := False;
      pnlRead.Visible := True;
      UpdateReminderFinish;
      ShowPCEControls(False);
      frmDrawers.DisplayDrawers(TRUE, [odTemplates], [odTemplates]); //FALSE);
      ShowPCEButtons(FALSE);
    //end; {if ItemIndex}
  end {if DeleteSts}
  else InfoBox(DeleteSts.Reason, TX_DEL_ERR, MB_OK or MB_ICONWARNING);
end;

procedure TfrmSurgery.mnuActEditClick(Sender: TObject);
{ load the selected progress note for editing }
var
  ActionSts: TActionRec;
  ANoteID: string;
begin
  inherited;
  if lstNotes.ItemIndex = EditingIndex then Exit;
  ANoteID := lstNotes.ItemID;
  if not StartNewEdit(NT_ACT_EDIT_NOTE) then Exit;
  //LoadNotes;
  with tvSurgery do Selected := FindPieceNode(ANoteID, 1, U, Items.GetFirstNode);
  ActOnDocument(ActionSts, lstNotes.ItemIEN, 'EDIT RECORD');
  if not ActionSts.Success then
  begin
    InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK);
    Exit;
  end;
  LoadForEdit;
end;

procedure TfrmSurgery.mnuActSaveClick(Sender: TObject);
{ saves the note that is currently being edited }
var
  Saved: Boolean;
  SavedDocID: string;
begin
  SetupVars;  //kt added 8/7/2007 to replace constants with vars.
  inherited;
  if EditingIndex > -1 then
    begin
      SavedDocID := Piece(lstNotes.Items[EditingIndex], U, 1);
      FLastNoteID := SavedDocID;
      SaveCurrentNote(Saved);
      if Saved and (EditingIndex < 0) and (not FDeleted) then
      //if Saved then
        begin
          LoadSurgeryCases;
          with tvSurgery do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode);
       end;
    end
  else InfoBox(TX_NO_NOTE, TX_SAVE_NOTE, MB_OK or MB_ICONWARNING);
end;

procedure TfrmSurgery.mnuActSignClick(Sender: TObject);
{ sign the currently selected note, save first if necessary }
const
  SIG_COSIGN = 'COSIGNATURE';
  SIG_SIGN   = 'SIGNATURE';
var
  Saved, NoteUnlocked: Boolean;
  ActionType, ESCode, SignTitle: string;
  ActionSts, SignSts: TActionRec;
  OK: boolean;
  SavedDocID, tmpItem: string;
  EditingID: string;                                         //v22.12 - RV
  tmpNode: TTreeNode;
begin
  SetupVars;  //kt added 8/7/2007 to replace constants with vars.
  inherited;
(*  if lstNotes.ItemIndex = EditingIndex then                //v22.12 - RV
  begin                                                      //v22.12 - RV
    SaveCurrentNote(Saved);                                  //v22.12 - RV
    if (not Saved) or FDeleted then Exit;                    //v22.12 - RV
  end                                                        //v22.12 - RV
  else if EditingIndex > -1 then                             //v22.12 - RV
    tmpItem := lstNotes.Items[EditingIndex];                 //v22.12 - RV
  SavedDocID := lstNotes.ItemID;*)                           //v22.12 - RV
  SavedDocID := lstNotes.ItemID;                             //v22.12 - RV
  FLastNoteID := SavedDocID;                                 //v22.12 - RV
  if lstNotes.ItemIndex = EditingIndex then                  //v22.12 - RV
  begin                                                      //v22.12 - RV
    SaveCurrentNote(Saved);                                  //v22.12 - RV
    if (not Saved) or FDeleted then Exit;                    //v22.12 - RV
  end                                                        //v22.12 - RV
  else if EditingIndex > -1 then                             //v22.12 - RV
  begin                                                      //v22.12 - RV
    tmpItem := lstNotes.Items[EditingIndex];                 //v22.12 - RV
    EditingID := Piece(tmpItem, U, 1);                       //v22.12 - RV
  end;                                                       //v22.12 - RV
  if not NoteHasText(lstNotes.ItemIEN) then
    begin
      InfoBox(TX_EMPTY_NOTE1, TC_EMPTY_NOTE, MB_OK or MB_ICONERROR);
      Exit;
    end;
  if not LastSaveClean(lstNotes.ItemIEN) and
    (InfoBox(TX_ABSAVE, TC_ABSAVE, MB_YESNO or MB_DEFBUTTON2 or MB_ICONWARNING) <> IDYES) then Exit;
  if CosignDocument(lstNotes.ItemIEN) then
  begin
    SignTitle := TX_COSIGN;
    ActionType := SIG_COSIGN;
  end else
  begin
    SignTitle := TX_SIGN;
    ActionType := SIG_SIGN;
  end;
  // no exits after things are locked
  NoteUnlocked := False;
  ActOnDocument(ActionSts, lstNotes.ItemIEN, ActionType);
  if ActionSts.Success then
  begin
    OK := IsOK2Sign(uPCEShow, lstNotes.ItemIEN);
    if frmFrame.Closing then exit;
    if(uPCEShow.Updated) then
    begin
      uPCEShow.CopyPCEData(uPCEEdit);
      uPCEShow.Updated := FALSE;
      lstNotesClick(Self);
    end;
    if(OK) then
    begin
      //DisplayOpTop(lstNotes.ItemIEN);        v24.2 - RV
      with lstNotes do SignatureForItem(Font.Size, MakeNoteDisplayText(Items[ItemIndex]), SignTitle, ESCode);
      if Length(ESCode) > 0 then
      begin
        SignDocument(SignSts, lstNotes.ItemIEN, ESCode);
        RemovePCEFromChanges(lstNotes.ItemIEN);
        NoteUnlocked := Changes.Exist(CH_SUR, lstNotes.ItemID);
        Changes.Remove(CH_SUR, lstNotes.ItemID);  // this will unlock if in Changes
        if SignSts.Success then
        begin
          SendMessage(frmConsults.Handle, UM_NEWORDER, ORDER_SIGN, 0);      {*REV*}
          lstNotesClick(Self);
        end
        else InfoBox(SignSts.Reason, TX_SIGN_ERR, MB_OK);
      end; {if Length(ESCode)}
    end;
  end
  else InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK);
  if not NoteUnlocked then UnlockDocument(lstNotes.ItemIEN);
  LoadSurgeryCases;
  //if EditingIndex > -1 then         //v22.12 - RV
  if (EditingID <> '') then           //v22.12 - RV
    begin
      lstNotes.Items.Insert(0, tmpItem);
//    tmpNode := tvSurgery.Items.AddObjectFirst(tvSurgery.Items.GetFirstNode, 'Note being edited',  <-- original line.  //kt 8/7/2007
      tmpNode := tvSurgery.Items.AddObjectFirst(tvSurgery.Items.GetFirstNode, DKLangConstW('fSurgery_Note_being_edited'), //kt added 8/7/2007
                 MakeCaseTreeObject('EDIT^Note being edited^^^^^^^^^^^%^0'));
      TORTreeNode(tmpNode).StringData := 'EDIT^Note being edited^^^^^^^^^^^%^0';
      tmpNode.ImageIndex := IMG_SURG_TOP_LEVEL;
      tmpNode := tvSurgery.Items.AddChildObjectFirst(tmpNode, MakeNoteDisplayText(tmpItem), MakeCaseTreeObject(tmpItem));
      TORTreeNode(tmpNode).StringData := tmpItem;
      SetCaseTreeNodeImagesAndFormatting(TORTreeNode(tmpNode), FCurrentContext);
      EditingIndex := lstNotes.SelectByID(EditingID);                 //v22.12 - RV
    end;
  //with tvSurgery do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode);  //v22.12 - RV
  with tvSurgery do                                                                  //v22.12 - RV
  begin                                                                              //v22.12 - RV
    Selected := FindPieceNode(FLastNoteID, U, Items.GetFirstNode);                   //v22.12 - RV
    if Selected <> nil then tvSurgeryChange(Self, Selected);                         //v22.12 - RV
  end;                                                                               //v22.12 - RV
end;

procedure TfrmSurgery.SaveSignItem(const ItemID, ESCode: string);
{ saves and optionally signs a progress note or addendum }
const
  SIG_COSIGN = 'COSIGNATURE';
  SIG_SIGN   = 'SIGNATURE';
var
  AnIndex, IEN, i: Integer;
  Saved, ContinueSign: Boolean;  {*RAB* 8/26/99}
  ActionSts, SignSts: TActionRec;
  APCEObject: TPCEData;
  OK: boolean;
  ActionType, SignTitle: string;
begin
  SetupVars;  //kt added 8/7/2007 to replace constants with vars.
  AnIndex := -1;
  IEN := StrToIntDef(ItemID, 0);
  if IEN = 0 then Exit;
  if frmFrame.TimedOut and (EditingIndex <> -1) then FSilent := True;
  with lstNotes do for i := 0 to Items.Count - 1 do if lstNotes.GetIEN(i) = IEN then
  begin
    AnIndex := i;
    break;
  end;
  if (AnIndex > -1) and (AnIndex = EditingIndex) then
  begin
    SaveCurrentNote(Saved);
    if not Saved then Exit;
    if FDeleted then
      begin
        FDeleted := False;
        Exit;
      end;
    AnIndex := lstNotes.SelectByIEN(IEN);
    //IEN := lstNotes.GetIEN(AnIndex);                    // saving will change IEN
  end;
  if Length(ESCode) > 0 then
  begin
    if CosignDocument(IEN) then
    begin
      SignTitle := TX_COSIGN;
      ActionType := SIG_COSIGN;
    end else
    begin
      SignTitle := TX_SIGN;
      ActionType := SIG_SIGN;
    end;
    ActOnDocument(ActionSts, IEN, ActionType);
    if not ActionSts.Success then
      begin
        InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK);
        ContinueSign := False;
      end
    else if not NoteHasText(IEN) then
      begin
        InfoBox(TX_EMPTY_NOTE1, TC_EMPTY_NOTE, MB_OK or MB_ICONERROR);
        ContinueSign := False;
      end
    else if not LastSaveClean(IEN) and
      (InfoBox(TX_ABSAVE, TC_ABSAVE, MB_YESNO or MB_DEFBUTTON2 or MB_ICONWARNING) <> IDYES)
       then ContinueSign := False
    else ContinueSign := True;
    if ContinueSign then
    begin
      if (AnIndex >= 0) and (AnIndex = lstNotes.ItemIndex) then
        APCEObject := uPCEShow
      else
        APCEObject := nil;
      OK := IsOK2Sign(APCEObject, IEN);
      if frmFrame.Closing then exit;
      if(assigned(APCEObject)) and (uPCEShow.Updated) then
      begin
        uPCEShow.CopyPCEData(uPCEEdit);
        uPCEShow.Updated := FALSE;
        lstNotesClick(Self);
      end
      else
        uPCEEdit.Clear;
      if(OK) then
      begin
        //if not FSilent then DisplayOpTop(IEN);
        SignDocument(SignSts, IEN, ESCode);
        if not SignSts.Success then InfoBox(SignSts.Reason, TX_SIGN_ERR, MB_OK);
      end; {if OK}
    end; {if ContinueSign}
  end; {if Length(ESCode)}

  if (AnIndex = lstNotes.ItemIndex) and (not frmFrame.ContextChanging) then
    begin
      LoadSurgeryCases;                    //????????????????
      with tvSurgery do Selected := FindPieceNode(IntToStr(IEN), U, Items.GetFirstNode);
    end;
end;

procedure TfrmSurgery.popNoteMemoPopup(Sender: TObject);
begin
  inherited;
  if PopupComponent(Sender, popNoteMemo) is TCustomEdit
    then FEditCtrl := TCustomEdit(PopupComponent(Sender, popNoteMemo))
    else FEditCtrl := nil;
  if FEditCtrl <> nil then
  begin
    popNoteMemoCut.Enabled      := FEditCtrl.SelLength > 0;
    popNoteMemoCopy.Enabled     := popNoteMemoCut.Enabled;
    popNoteMemoPaste.Enabled    := (not TORExposedCustomEdit(FEditCtrl).ReadOnly) and
                                   Clipboard.HasFormat(CF_TEXT);
    popNoteMemoTemplate.Enabled := frmDrawers.CanEditTemplates and popNoteMemoCut.Enabled;
    popNoteMemoFind.Enabled := FEditCtrl.GetTextLen > 0;
  end else
  begin
    popNoteMemoCut.Enabled      := False;
    popNoteMemoCopy.Enabled     := False;
    popNoteMemoPaste.Enabled    := False;
    popNoteMemoTemplate.Enabled := False;
  end;
  if pnlWrite.Visible then
  begin
    popNoteMemoSpell.Enabled    := True;
    popNoteMemoGrammar.Enabled  := True;
    popNoteMemoReformat.Enabled := True;
    popNoteMemoReplace.Enabled  := (FEditCtrl.GetTextLen > 0);
    popNoteMemoPreview.Enabled  := (frmDrawers.TheOpenDrawer = odTemplates) and Assigned(frmDrawers.tvTemplates.Selected);
    popNoteMemoInsTemplate.Enabled  := (frmDrawers.TheOpenDrawer = odTemplates) and Assigned(frmDrawers.tvTemplates.Selected);
  end else
  begin
    popNoteMemoSpell.Enabled    := False;
    popNoteMemoGrammar.Enabled  := False;
    popNoteMemoReformat.Enabled := False;
    popNoteMemoReplace.Enabled  := False;
    popNoteMemoPreview.Enabled  := False;
    popNoteMemoInsTemplate.Enabled  := False;
  end;
end;

procedure TfrmSurgery.popNoteMemoCutClick(Sender: TObject);
begin
  inherited;
  FEditCtrl.CutToClipboard;
end;

procedure TfrmSurgery.popNoteMemoCopyClick(Sender: TObject);
begin
  inherited;
  FEditCtrl.CopyToClipboard;
end;

procedure TfrmSurgery.popNoteMemoPasteClick(Sender: TObject);
begin
  inherited;
  FEditCtrl.SelText := Clipboard.AsText; {*KCM*}
  //FEditCtrl.PasteFromClipboard;        // use AsText to prevent formatting
end;

procedure TfrmSurgery.popNoteMemoReformatClick(Sender: TObject);
begin
  inherited;
  if Screen.ActiveControl <> memNewNote then Exit;
  ReformatMemoParagraph(memNewNote);
end;

procedure TfrmSurgery.popNoteMemoSaveContinueClick(Sender: TObject);
begin
  inherited;
  FChanged := True;
  DoAutoSave;
end;

procedure TfrmSurgery.popNoteMemoReplaceClick(Sender: TObject);
begin
  inherited;
  SendMessage(TRichEdit(popNoteMemo.PopupComponent).Handle, WM_VSCROLL, SB_TOP, 0);
  with dlgReplaceText do
    begin
      Position := Point(Application.MainForm.Left + pnlLeft.Width, Application.MainForm.Top);
      FindText := '';
      ReplaceText := '';
      Options := [frDown, frHideUpDown];
      Execute;
    end;
end;

procedure TfrmSurgery.dlgReplaceTextFind(Sender: TObject);
begin
  inherited;
  dmodShared.FindRichEditText(dlgFindText, TRichEdit(popNoteMemo.PopupComponent));
end;

procedure TfrmSurgery.dlgReplaceTextReplace(Sender: TObject);
begin
  inherited;
  dmodShared.ReplaceRichEditText(dlgReplaceText, TRichEdit(popNoteMemo.PopupComponent));
end;

procedure TfrmSurgery.popNoteMemoSpellClick(Sender: TObject);
begin
  inherited;
  DoAutoSave(0);
  timAutoSave.Enabled := False;
  try
    SpellCheckForControl(memNewNote);
  finally
    FChanged := True;
    DoAutoSave(0);
    timAutoSave.Enabled := True;
  end;
end;

procedure TfrmSurgery.popNoteMemoGrammarClick(Sender: TObject);
begin
  inherited;
  DoAutoSave(0);
  timAutoSave.Enabled := False;
  try
    GrammarCheckForControl(memNewNote);
  finally
    FChanged := True;
    DoAutoSave(0);
    timAutoSave.Enabled := True;
  end;
end;

procedure TfrmSurgery.mnuViewDetailClick(Sender: TObject);
var
  x: string;
begin
  inherited;
  with tvSurgery do
    begin
      if Selected = nil then exit;
      if not (Selected.ImageIndex in [IMG_SURG_TOP_LEVEL, IMG_SURG_GROUP_SHUT, IMG_SURG_GROUP_OPEN,
                                      IMG_SURG_NON_OR_CASE_EMPTY, IMG_SURG_NON_OR_CASE_SHUT, IMG_SURG_NON_OR_CASE_OPEN,
                                      IMG_SURG_CASE_EMPTY, IMG_SURG_CASE_SHUT, IMG_SURG_CASE_OPEN]) then
        begin
          mnuViewDetail.Checked := not mnuViewDetail.Checked;
          if mnuViewDetail.Checked then
            begin
              x := TORTreeNode(Selected).StringData;
//            StatusText('Retrieving selected surgery report details...');  <-- original line.  //kt 8/7/2007
              StatusText(DKLangConstW('fSurgery_Retrieving_selected_surgery_report_detailsxxx')); //kt added 8/7/2007
              pnlRead.Visible := True;
              pnlWrite.Visible := False;
              Screen.Cursor := crHourGlass;
              LoadSurgReportDetail(memSurgery.Lines, StrToIntDef(Piece(x, U, 1), 0));
              Screen.Cursor := crDefault;
              StatusText('');
              memSurgery.SelStart := 0;
              memSurgery.Repaint;
            end
          else
            tvSurgeryChange(Self, Selected);
        end;
    end;
  SendMessage(memSurgery.Handle, WM_VSCROLL, SB_TOP, 0);
end;

procedure TfrmSurgery.FormClose(Sender: TObject; var Action: TCloseAction);
var
  Saved: Boolean;
  IEN: Int64;
  ErrMsg: string;
  DeleteSts: TActionRec;
begin
  inherited;
  if frmFrame.TimedOut and (EditingIndex <> -1) then
  begin
    FSilent := True;
    if memNewNote.GetTextLen > 0 then SaveCurrentNote(Saved)
    else
    begin
      IEN := lstNotes.GetIEN(EditingIndex);
      if not LastSaveClean(IEN) then             // means note hasn't been committed yet
      begin
        LockDocument(IEN, ErrMsg);
        if ErrMsg = '' then
        begin
          DeleteDocument(DeleteSts, IEN, '');
          UnlockDocument(IEN);
        end; {if ErrMsg}
      end; {if not LastSaveClean}
    end; {else}
  end; {if frmFrame}
end;

procedure TfrmSurgery.mnuActIdentifyAddlSignersClick(Sender: TObject);
var
  Exclusions: TStrings;
  Saved, x, y: boolean;
  SignerList: TSignerList;
  ActionSts: TActionRec;
  SigAction: integer;
  SavedDocID: string;
  ARefDate: TFMDateTime;
begin
  inherited;
  if lstNotes.ItemIEN = 0 then exit;
  SavedDocID := lstNotes.ItemID;
  if lstNotes.ItemIndex = EditingIndex then
    begin
      SaveCurrentNote(Saved);
      if not Saved then Exit;
      LoadSurgeryCases;
      with tvSurgery do Selected := FindPieceNode(SavedDocID, U, Items.GetFirstNode);
    end;
  x := CanChangeCosigner(lstNotes.ItemIEN);
  ActOnDocument(ActionSts, lstNotes.ItemIEN, 'IDENTIFY SIGNERS');
  y := ActionSts.Success;
  if x and not y then
    begin
      if InfoBox(ActionSts.Reason + CRLF + CRLF +
//               'Would you like to change the cosigner?',  <-- original line.  //kt 8/7/2007
                 DKLangConstW('fSurgery_Would_you_like_to_change_the_cosignerx'), //kt added 8/7/2007
                 TX_IN_AUTH, MB_YESNO or MB_DEFBUTTON2 or MB_ICONQUESTION) = ID_YES then
    	SigAction := SG_COSIGNER
      else
	Exit;
    end
  else if y and not x then SigAction := SG_ADDITIONAL
  else if x and y then SigAction := SG_BOTH
  else
    begin
      InfoBox(ActionSts.Reason, TX_IN_AUTH, MB_OK);
      Exit;
    end;

  Exclusions := GetCurrentSigners(lstNotes.ItemIEN);
  ARefDate := StrToFloat(Piece(lstNotes.Items[lstNotes.ItemIndex], U, 3));
  SelectAdditionalSigners(Font.Size, lstNotes.ItemIEN, SigAction, Exclusions, SignerList, CT_NOTES, ARefDate);
  with SignerList do
    begin
      case SigAction of
        SG_ADDITIONAL:  if Changed and (Signers <> nil) and (Signers.Count > 0) then
                          UpdateAdditionalSigners(lstNotes.ItemIEN, Signers);
        SG_COSIGNER:    if Changed then ChangeCosigner(lstNotes.ItemIEN, Cosigner);
        SG_BOTH:        if Changed then
                          begin
                            if (Signers <> nil) and (Signers.Count > 0) then
                              UpdateAdditionalSigners(lstNotes.ItemIEN, Signers);
                            ChangeCosigner(lstNotes.ItemIEN, Cosigner);
                          end;
      end;
      lstNotesClick(Self);
    end;
  UnlockDocument(lstNotes.ItemIEN);
end;

procedure TfrmSurgery.popNoteMemoAddlSignClick(Sender: TObject);
begin
  inherited;
  mnuActIdentifyAddlSignersClick(Self);
end;

procedure TfrmSurgery.ProcessNotifications;
var
  x: string;
  Saved: boolean;
  //tmpNode: TTreeNode;
  //AnObject: PCaseTreeObject;
  tmpList: TStringList;
begin
  SetupVars;  //kt added 8/7/2007 to replace constants with vars.
  if EditingIndex <> -1 then
  begin
    SaveCurrentNote(Saved);
    if not Saved then Exit;
  end;
  lblCases.Caption := Notifications.Text;
  tvSurgery.Caption := lblCases.Caption;
  EditingIndex := -1;
  lstNotes.Enabled := True ;
  pnlRead.BringToFront ;
  //  show ALL unsigned/uncosigned for a patient, not just the alerted one
  //  what about cosignature?  How to get correct list?  ORB FOLLOWUP TYPE = OR alerts only
  x := Notifications.AlertData;
  if StrToIntDef(Piece(x, U, 1), 0) = 0 then
    begin
      InfoBox(TX_NO_ALERT, TX_CAP_NO_ALERT, MB_OK);
      Exit;
    end;
  tmpList := TStringList.Create;
  try
    FCaseList.Clear;
    uChanging := True;
    tvSurgery.Items.BeginUpdate;
    lstNotes.Clear;
    KillCaseTreeObjects(tvSurgery);
    tvSurgery.Items.Clear;
    GetSingleCaseListItemWithDocs(tmpList, StrToIntDef(Piece(x, U, 1), 0));
    with FCurrentContext do CreateListItemsForCaseTree(FCaseList, tmpList, SR_ALL, GroupBy, TreeAscending);
    UpdateTreeView(FCaseList, tvSurgery);
    with tvSurgery do Selected := FindPieceNode(Piece(x, U, 1), 1, U, Items.GetFirstNode);
    (*  lstNotes.Items.Add(x);
    AnObject := MakeCaseTreeObject('ALERT^Alerted Note^^^^^^^^^^^%^0');
    tmpNode := tvSurgery.Items.AddObjectFirst(tvSurgery.Items.GetFirstNode, AnObject.NodeText, AnObject);
    TORTreeNode(tmpNode).StringData := 'ALERT^Alerted Note^^^^^^^^^^^%^0';
    tmpNode.ImageIndex := IMG_SURG_TOP_LEVEL;
    AnObject := MakeCaseTreeObject(x);
    tmpNode := tvSurgery.Items.AddChildObjectFirst(tmpNode, AnObject.NodeText, AnObject);
    TORTreeNode(tmpNode).StringData := x;
    SetCaseTreeNodeImagesAndFormatting(TORTreeNode(tmpNode), FCurrentContext);
    tvSurgery.Selected := tmpNode;*)
    tvSurgery.Items.EndUpdate;
    uChanging := False;
    tvSurgeryChange(Self, tvSurgery.Selected);
    case Notifications.Followup of
      NF_SURGERY_UNSIGNED_NOTE:   ;  //Automatically deleted by sig action!!!
    end;
    if Copy(Piece(Notifications.RecordID, U, 2), 1, 6) = 'TIUADD' then Notifications.Delete;
    if Copy(Piece(Notifications.RecordID, U, 2), 1, 5) = 'TIUID' then Notifications.Delete;
  finally
    tmpList.Free;
  end;
end;

procedure TfrmSurgery.mnuViewSaveAsDefaultClick(Sender: TObject);
begin
  inherited;
//if InfoBox('Replace current defaults?', 'Confirmation', MB_YESNO or MB_ICONQUESTION) = IDYES then  <-- original line.  //kt 8/7/2007
  if InfoBox(DKLangConstW('fSurgery_Replace_current_defaultsx'), DKLangConstW('fSurgery_Confirmation'), MB_YESNO or MB_ICONQUESTION) = IDYES then //kt added 8/7/2007
    begin
      SaveCurrentSurgCaseContext(FCurrentContext);
      FDefaultContext := FCurrentContext;
//    lblCases.Caption := 'Default List';  <-- original line.  //kt 8/7/2007
      lblCases.Caption := DKLangConstW('fSurgery_Default_List'); //kt added 8/7/2007
      tvSurgery.Caption := lblCases.Caption;
    end;
end;

procedure TfrmSurgery.mnuViewReturntoDefaultClick(Sender: TObject);
begin
  inherited;
  SetViewContext(FDefaultContext);
end;

procedure TfrmSurgery.popNoteMemoTemplateClick(Sender: TObject);
begin
  inherited;
  EditTemplates(Self, TRUE, FEditCtrl.SelText);
end;

procedure TfrmSurgery.popNoteListPopup(Sender: TObject);
begin
  inherited;
  N4.Visible                          := (popNoteList.PopupComponent is TORTreeView);
  popNoteListExpandAll.Visible        := N4.Visible;
  popNoteListExpandSelected.Visible   := N4.Visible;
  popNoteListCollapseAll.Visible      := N4.Visible;
  popNoteListCollapseSelected.Visible := N4.Visible;
end;

procedure TfrmSurgery.popNoteListExpandAllClick(Sender: TObject);
begin
  inherited;
  tvSurgery.FullExpand;
end;

procedure TfrmSurgery.popNoteListCollapseAllClick(Sender: TObject);
begin
  inherited;
  tvSurgery.Selected := nil;
  memSurgery.Clear;
  tvSurgery.FullCollapse;
  tvSurgery.Selected := tvSurgery.TopItem;
end;

procedure TfrmSurgery.popNoteListExpandSelectedClick(Sender: TObject);
begin
  inherited;
  if tvSurgery.Selected = nil then exit;
  with tvSurgery.Selected do if HasChildren then Expand(True);
end;

procedure TfrmSurgery.popNoteListCollapseSelectedClick(Sender: TObject);
begin
  inherited;
  if tvSurgery.Selected = nil then exit;
  with tvSurgery.Selected do if HasChildren then Collapse(True);
end;

procedure TfrmSurgery.mnuEditTemplatesClick(Sender: TObject);
begin
  inherited;
  EditTemplates(Self);
end;

procedure TfrmSurgery.mnuNewTemplateClick(Sender: TObject);
begin
  inherited;
  EditTemplates(Self, TRUE);
end;

procedure TfrmSurgery.mnuEditSharedTemplatesClick(Sender: TObject);
begin
  inherited;
  EditTemplates(Self, FALSE, '', TRUE);
end;

procedure TfrmSurgery.mnuNewSharedTemplateClick(Sender: TObject);
begin
  inherited;
  EditTemplates(Self, TRUE, '', TRUE);
end;

procedure TfrmSurgery.mnuOptionsClick(Sender: TObject);
begin
  inherited;
  mnuEditTemplates.Enabled := frmDrawers.CanEditTemplates;
  mnuNewTemplate.Enabled := frmDrawers.CanEditTemplates;
  mnuEditSharedTemplates.Enabled := frmDrawers.CanEditShared;
  mnuNewSharedTemplate.Enabled := frmDrawers.CanEditShared;
  mnuEditDialgFields.Enabled := CanEditTemplateFields;
end;

procedure TfrmSurgery.SetEditingIndex(const Value: Integer);
begin
  FEditingIndex := Value;
  if(FEditingIndex < 0) then
    KillReminderDialog(Self);
  if(assigned(frmReminderTree)) then
    frmReminderTree.EnableActions;
end;

(*function TfrmSurgery.CanFinishReminder: boolean;
begin
  Result := False;
  if(EditingIndex < 0) then
    Result := FALSE
  else
    Result := (lstNotes.ItemIndex = EditingIndex);
end;*)

procedure TfrmSurgery.AssignRemForm;
begin
(*  with RemForm do
  begin
    Form := Self;
    PCEObj := uPCEEdit;
    RightPanel := pnlRight;
    CanFinishProc := CanFinishReminder;
    DisplayPCEProc := DisplayPCE;
    Drawers := frmDrawers;
    NewNoteRE := memNewNote;
    NoteList := lstNotes;
  end;*)
end;

procedure TfrmSurgery.mnuEditDialgFieldsClick(Sender: TObject);
begin
  inherited;
  EditDialogFields;
end;


procedure TfrmSurgery.tvSurgeryClick(Sender: TObject);
begin
  if tvSurgery.Selected = nil then exit;
  if (tvSurgery.Selected.ImageIndex in [IMG_SURG_TOP_LEVEL, IMG_SURG_GROUP_OPEN, IMG_SURG_GROUP_SHUT]) then
    memSurgery.Clear;
end;

procedure TfrmSurgery.ShowPCEButtons(Editing: boolean);
begin
  FEditingNotePCEObj := Editing;
  if Editing or AnytimeEncounters then
  begin
    cmdPCE.Visible := TRUE;
    if Editing then
    begin
      cmdPCE.Enabled := CanEditPCE(uPCEEdit);
{ TODO -oRich V. -cSurgery/TIU : Uncomment if allow new notes from Surgery tab }
      //cmdNewNote.Visible := AnytimeEncounters;
      //cmdNewNote.Enabled := FALSE;
    end
    else
    begin
      cmdPCE.Enabled     := (GetAskPCE(0) <> apDisable);
{ TODO -oRich V. -cSurgery/TIU : Uncomment if allow new notes from Surgery tab }
      //cmdNewNote.Visible := TRUE;
      //cmdNewNote.Enabled := TRUE;
    end;
    if cmdNewNote.Visible then
      cmdPCE.Top := cmdNewNote.Top-cmdPCE.Height;
  end
  else
  begin
    cmdPCE.Enabled := FALSE;
    cmdPCE.Visible := FALSE;
{ TODO -oRich V. -cSurgery/TIU : Uncomment if allow new notes from Surgery tab }
    //cmdNewNote.Visible := TRUE;
    //cmdNewNote.Enabled := TRUE;
  end;
  if cmdPCE.Visible then
    lblSpace1.Top := cmdPCE.Top - lblSpace1.Height
  else
    lblSpace1.Top := cmdNewNote.Top - lblSpace1.Height;
  popNoteMemoEncounter.Enabled := cmdPCE.Enabled;
  popNoteMemoEncounter.Visible := cmdPCE.Visible;
end;

procedure TfrmSurgery.mnuIconLegendClick(Sender: TObject);
begin
  inherited;
  ShowIconLegend(ilSurgery);
end;

procedure TfrmSurgery.tvSurgeryChange(Sender: TObject;
  Node: TTreeNode);
var
  x: string;
  IsTIUDocument: boolean;
  //ShowReport: boolean;
begin
  if uChanging then Exit;
  //This gives the change a chance to occur when keyboarding, so that WindowEyes
  //doesn't use the old value.
  Application.ProcessMessages;
  //ShowReport := True;
  with tvSurgery do
    begin
      if Selected = nil then Exit;
      popNoteListExpandSelected.Enabled := Selected.HasChildren;
      popNoteListCollapseSelected.Enabled := Selected.HasChildren;
      RedrawSuspend(memSurgery.Handle);
      memSurgery.Clear;
      if not (Selected.ImageIndex in [IMG_SURG_TOP_LEVEL, IMG_SURG_GROUP_OPEN, IMG_SURG_GROUP_SHUT]) then
        begin
          x := TORTreeNode(Selected).StringData;
          memSurgery.Clear;
//        StatusText('Retrieving selected surgery report...');  <-- original line.  //kt 8/7/2007
          StatusText(DKLangConstW('fSurgery_Retrieving_selected_surgery_reportxxx')); //kt added 8/7/2007
          Screen.Cursor := crHourGlass;
          pnlRead.Visible := True;
          pnlWrite.Visible := False;
          //UpdateReminderFinish;
          IsTIUDocument := PCaseTreeObject(Selected.Data)^.PkgRef <> '';
          EnableDisableMenus(IsTIUDocument);
          if not IsTIUDocument then
            begin
              lblTitle.Caption := MakeSurgeryCaseDisplayText(x);
              lblTitle.Hint := lblTitle.Caption;
              //LoadOpTop(memSurgery.Lines, StrToIntDef(Piece(x, U, 1), 0), PCaseTreeObject(Selected.Data)^.IsNonORProc, ShowReport);
              NotifyOtherApps(NAE_REPORT, 'SUR^' + Piece(x, U, 1));
              lstNotes.ItemIndex := -1;
            end
          else
            begin
              lstNotes.SelectByID(Piece(x, U, 1));
              lstNotesClick(Self);
            end;
          Screen.Cursor := crDefault;
          StatusText('');
          SendMessage(memSurgery.Handle, WM_VSCROLL, SB_TOP, 0);
        end
      else
        begin
          lblTitle.Caption := '';
          lblTitle.Hint := lblTitle.Caption;
          pnlWrite.Visible := False;
          pnlRead.Visible := True;
          //UpdateReminderFinish;
          ShowPCEControls(False);
          frmDrawers.DisplayDrawers(TRUE, [odTemplates], [odTemplates]); //FALSE);
          ShowPCEButtons(FALSE);
          memSurgery.Clear;
        end;
      if(assigned(frmReminderTree)) then
        frmReminderTree.EnableActions;
      DisplayPCE;
      pnlRight.Refresh;
      memNewNote.Repaint;
      memSurgery.Repaint;
      SendMessage(tvSurgery.Handle, WM_HSCROLL, SB_THUMBTRACK, 0);
      RedrawActivate(memSurgery.Handle);
    end;
end;

procedure TfrmSurgery.tvSurgeryExpanded(Sender: TObject;
  Node: TTreeNode);
begin
  with Node do
    begin
      if (ImageIndex in [IMG_SURG_GROUP_SHUT, IMG_SURG_CASE_SHUT, IMG_SURG_NON_OR_CASE_SHUT]) then
        ImageIndex := ImageIndex + 1;
      if (SelectedIndex in [IMG_SURG_GROUP_SHUT, IMG_SURG_CASE_SHUT, IMG_SURG_NON_OR_CASE_SHUT]) then
        SelectedIndex := SelectedIndex + 1;
    end;
  SendMessage(tvSurgery.Handle, WM_HSCROLL, SB_THUMBTRACK, 0);
end;

procedure TfrmSurgery.tvSurgeryCollapsed(Sender: TObject;
  Node: TTreeNode);
begin
  with Node do
    begin
      if (ImageIndex in [IMG_SURG_GROUP_OPEN, IMG_SURG_CASE_OPEN, IMG_SURG_NON_OR_CASE_OPEN]) then
        ImageIndex := ImageIndex - 1;
      if (SelectedIndex in [IMG_SURG_GROUP_OPEN, IMG_SURG_CASE_OPEN, IMG_SURG_NON_OR_CASE_OPEN]) then
        SelectedIndex := SelectedIndex - 1;
    end;
end;

procedure TfrmSurgery.LoadSurgeryCases;
var
  tmpList: TStringList;
  ANode: TORTreeNode;
begin
  tmpList := TStringList.Create;
  try
    FCaseList.Clear;
    uChanging := True;
    RedrawSuspend(memSurgery.Handle);
    tvSurgery.Items.BeginUpdate;
    KillCaseTreeObjects(tvSurgery);
    tvSurgery.Items.Clear;
    tvSurgery.Items.EndUpdate;
    lstNotes.Items.Clear;
    memSurgery.Clear;
    memSurgery.Invalidate;
    lblTitle.Caption := '';
    lblTitle.Hint := lblTitle.Caption;
    ShowPCEControls(FALSE);
    with FCurrentContext do
      begin
        GetSurgCaseList(tmpList, FMBeginDate, FMEndDate, SR_ALL, MaxDocs);
        CreateListItemsForCaseTree(FCaseList, tmpList, SR_ALL, GroupBy, TreeAscending);
        UpdateTreeView(FCaseList, tvSurgery);
      end;
    tmpList.Clear;
    FCaseList.Clear;
    with tvSurgery do
      begin
        uChanging := True;
        tvSurgery.Items.BeginUpdate;
        if FLastNoteID <> '' then
          Selected := FindPieceNode(FLastNoteID, 1, U, nil);
        if Selected = nil then
          begin
            if (uSurgeryContext.GroupBy <> '') then
              begin
                ANode := TORTreeNode(Items.GetFirstNode);
                while ANode <> nil do
                  begin
                    ANode.Expand(False);
                    Selected := ANode;
                    ANode := TORTreeNode(ANode.GetNextSibling);
                  end;
              end
            else
              begin
                ANode := tvSurgery.FindPieceNode(IntToStr(SR_ALL), 1, U, nil);
                if ANode <> nil then Selected := ANode.getFirstChild;
              end;
          end;
        memSurgery.Clear;
        RemoveParentsWithNoChildren(tvSurgery, uSurgeryContext);
        tvSurgery.Items.EndUpdate;
        uChanging := False;
        lblCases.Caption := SetSurgTreeLabel(FCurrentContext);
        tvSurgery.Caption := lblCases.Caption;
        SendMessage(tvSurgery.Handle, WM_VSCROLL, SB_TOP, 0);
        if Selected <> nil then tvSurgeryChange(Self, Selected);
      end;
  finally
    RedrawActivate(memSurgery.Handle);
    tmpList.Free;
  end;
end;

function TfrmSurgery.SetSurgTreeLabel(AContext: TSurgCaseContext): string;
var
  x: string;

  function SetDateRangeText(AContext: TSurgCaseContext): string;
  var
    x1: string;
  begin
    with AContext do
      if BeginDate <> '' then
        begin
//        x1 := 'from ' + UpperCase(BeginDate);  <-- original line.  //kt 8/7/2007
          x1 := DKLangConstW('fSurgery_from') + UpperCase(BeginDate); //kt added 8/7/2007
          if EndDate <> '' then x1 := x1 + ' to ' + UpperCase(EndDate)
//        else x1 := x1 + ' to TODAY';  <-- original line.  //kt 8/7/2007
          else x1 := x1 + DKLangConstW('fSurgery_to_TODAY'); //kt added 8/7/2007
        end;
    Result := x1;
  end;

begin
  with AContext do
    begin
      if MaxDocs > 0 then x := 'Last ' + IntToStr(MaxDocs) + ' ' else x := 'All ';
      case StrToIntDef(Status, 0) of
//      SR_RECENT      : x := x + 'Surgery Cases';  <-- original line.  //kt 8/7/2007
        SR_RECENT      : x := x + DKLangConstW('fSurgery_Surgery_Cases'); //kt added 8/7/2007
//      SR_ALL         : x := x + 'Surgery Cases';  <-- original line.  //kt 8/7/2007
        SR_ALL         : x := x + DKLangConstW('fSurgery_Surgery_Cases'); //kt added 8/7/2007
        //SG_BY_SURGEON  : x := x + 'Surgery Cases for ' + ExternalName(Surgeon, 200) + SetDateRangeText(AContext);
//      SR_BY_DATE     : x := x + 'Surgery Cases ' + SetDateRangeText(AContext);  <-- original line.  //kt 8/7/2007
        SR_BY_DATE     : x := x + DKLangConstW('fSurgery_Surgery_Cases') + SetDateRangeText(AContext); //kt added 8/7/2007
      else
//      x := 'Custom List';  <-- original line.  //kt 8/7/2007
        x := DKLangConstW('fSurgery_Custom_List'); //kt added 8/7/2007
      end;
    end;
  Result := x;
end;

procedure TfrmSurgery.lstNotesClick(Sender: TObject);
{ loads the text for the selected note or displays the editing panel for the selected note }
begin
  inherited;
  with lstNotes do if ItemIndex = -1 then Exit
  else if ItemIndex = EditingIndex then
  begin
    pnlWrite.Visible := True;
    pnlRead.Visible := False;
    mnuViewDetail.Enabled    := False;
    mnuActChange.Enabled     := True;
    mnuActLoadBoiler.Enabled := True;
    //UpdateReminderFinish;
  end else
  begin
//  StatusText('Retrieving selected surgery report...');  <-- original line.  //kt 8/7/2007
    StatusText(DKLangConstW('fSurgery_Retrieving_selected_surgery_reportxxx')); //kt added 8/7/2007
    Screen.Cursor := crHourGlass;
    pnlRead.Visible := True;
    pnlWrite.Visible := False;
    //UpdateReminderFinish;
    lblTitle.Caption := MakeSurgeryReportDisplayText(Items[ItemIndex]);
    lblTitle.Hint := lblTitle.Caption;
    LoadSurgReportText(memSurgery.Lines, ItemIEN);
    mnuViewDetail.Enabled    := True;
    mnuViewDetail.Checked    := False;
    mnuActChange.Enabled     := False;
    mnuActLoadBoiler.Enabled := False;
    Screen.Cursor := crDefault;
    StatusText('');
  end;
  if(assigned(frmReminderTree)) then
    frmReminderTree.EnableActions;
  DisplayPCE;
  pnlRight.Refresh;
  memNewNote.Repaint;
  memSurgery.Repaint;
  NotifyOtherApps(NAE_REPORT, 'TIU^' + lstNotes.ItemID);
end;

procedure TfrmSurgery.EnableDisableMenus(IsTIUDocument: boolean);
begin
{ TODO -oRich V. -cSurgery/TIU : Reset NewNoteMenu enabled if allow new notes from Surgery tab }
  mnuActNew.Enabled                 :=  False;
  mnuActAddend.Enabled              :=  IsTIUDocument;
  mnuActAddIDEntry.Enabled          :=  False;
  mnuActDetachFromIDParent.Enabled  :=  False;
  mnuActEdit.Enabled                :=  IsTIUDocument;
  mnuActDelete.Enabled              :=  IsTIUDocument;
  mnuActSign.Enabled                :=  IsTIUDocument;
  mnuActSignList.Enabled            :=  IsTIUDocument;
  mnuActSave.Enabled                :=  IsTIUDocument;
  mnuActIdentifyAddlSigners.Enabled := IsTIUDocument;
  mnuActChange.Enabled              := IsTIUDocument;
  mnuActLoadBoiler.Enabled          := IsTIUDocument;
  popNoteMemoSignList.Enabled       := IsTIUDocument;
  popNoteMemoSign.Enabled           := IsTIUDocument;
  popNoteMemoSave.Enabled           := IsTIUDocument;
  popNoteMemoEdit.Enabled           := IsTIUDocument;
  popNoteMemoDelete.Enabled         := IsTIUDocument;
  popNoteMemoAddlSign.Enabled       := IsTIUDocument;
  popNoteMemoAddend.Enabled         := IsTIUDocument;
  mnuViewDetail.Enabled             := IsTIUDocument;
  popNoteMemoPreview.Enabled        := IsTIUDocument and Assigned(frmDrawers.tvTemplates.Selected);
  popNoteMemoInsTemplate.Enabled    := IsTIUDocument and Assigned(frmDrawers.tvTemplates.Selected);
  if not IsTIUDocument then mnuViewDetail.Checked := False;
  frmFrame.mnuFilePrint.Enabled := IsTIUDocument;
end;

procedure TfrmSurgery.memNewNoteKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  inherited;
  if (Key = VK_TAB) then
  begin
    if ssShift in Shift then
    begin
      FindNextControl(Sender as TWinControl, False, True, False).SetFocus; //previous control
      Key := 0;
    end
    else if ssCtrl	in Shift then
    begin
      FindNextControl(Sender as TWinControl, True, True, False).SetFocus; //next control
      Key := 0;
    end;
  end;
  if (key = VK_ESCAPE) then begin
    FindNextControl(Sender as TWinControl, False, True, False).SetFocus; //previous control
    key := 0;
  end;
end;

procedure TfrmSurgery.sptHorzCanResize(Sender: TObject; var NewSize: Integer;
  var Accept: Boolean);
begin
  inherited;
  if pnlWrite.Visible then
     if NewSize > frmSurgery.ClientWidth - memNewNote.Constraints.MinWidth - sptHorz.Width then
        NewSize := frmSurgery.ClientWidth - memNewNote.Constraints.MinWidth - sptHorz.Width;
end;

procedure TfrmSurgery.popNoteMemoPreviewClick(Sender: TObject);
begin
  frmDrawers.mnuPreviewTemplateClick(Sender);
end;

procedure TfrmSurgery.popNoteMemoInsTemplateClick(Sender: TObject);
begin
  frmDrawers.mnuInsertTemplateClick(Sender);
end;

procedure TfrmSurgery.tvSurgeryAddition(Sender: TObject; Node: TTreeNode);
begin
  inherited;
  TAccessibleTreeNode.WrapControl(Node as TORTreeNode);
end;

procedure TfrmSurgery.tvSurgeryDeletion(Sender: TObject; Node: TTreeNode);
begin
  TAccessibleTreeNode.UnwrapControl(Node as TORTreeNode);
  inherited;
end;

procedure TfrmSurgery.ViewInfo(Sender: TObject);
begin
  inherited;
  frmFrame.ViewInfo(Sender);
end;

procedure TfrmSurgery.mnuViewInformationClick(Sender: TObject);
begin
  inherited;
  mnuViewDemo.Enabled := frmFrame.pnlPatient.Enabled;
  mnuViewVisits.Enabled := frmFrame.pnlVisit.Enabled;
  mnuViewPrimaryCare.Enabled := frmFrame.pnlPrimaryCare.Enabled;
  mnuViewMyHealtheVet.Enabled := not (Copy(frmFrame.laMHV.Hint, 1, 2) = 'No');
  mnuInsurance.Enabled := not (Copy(frmFrame.laVAA2.Hint, 1, 2) = 'No');
  mnuViewFlags.Enabled := frmFrame.lblFlag.Enabled;
  mnuViewRemoteData.Enabled := frmFrame.lblCirn.Enabled;
  mnuViewReminders.Enabled := frmFrame.pnlReminders.Enabled;
  mnuViewPostings.Enabled := frmFrame.pnlPostings.Enabled;
end;

initialization
  uPCEEdit := TPCEData.Create;
  uPCEShow := TPCEData.Create;

finalization
  uPCEEdit.Free;
  uPCEShow.Free;

end.

