unit fOrders;

{$OPTIMIZATION OFF}                              // REMOVE AFTER UNIT IS DEBUGGED

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, fHSplit, StdCtrls,
  ExtCtrls, Menus, ORCtrls, ComCtrls, ORFn, rOrders, fODBase, uConst, uCore, uOrders,UBACore,
  UBAGlobals, VA508AccessibilityManager, fBase508Form;

type
  TfrmOrders = class(TfrmHSplit)
    mnuOrders: TMainMenu;
    mnuAct: TMenuItem;
    mnuActChange: TMenuItem;
    mnuActDC: TMenuItem;
    mnuActHold: TMenuItem;
    mnuActUnhold: TMenuItem;
    mnuActRenew: TMenuItem;
    Z4: TMenuItem;
    mnuActFlag: TMenuItem;
    mnuActUnflag: TMenuItem;
    Z5: TMenuItem;
    mnuActVerify: TMenuItem;
    mnuActRelease: TMenuItem;
    mnuActSign: TMenuItem;
    mnuView: TMenuItem;
    mnuViewChart: TMenuItem;
    mnuChartReports: TMenuItem;
    mnuChartLabs: TMenuItem;
    mnuChartDCSumm: TMenuItem;
    mnuChartCslts: TMenuItem;
    mnuChartNotes: TMenuItem;
    mnuChartOrders: TMenuItem;
    mnuChartMeds: TMenuItem;
    mnuChartProbs: TMenuItem;
    mnuChartCover: TMenuItem;
    mnuViewActive: TMenuItem;
    mnuViewExpiring: TMenuItem;
    Z2: TMenuItem;
    mnuViewCustom: TMenuItem;
    Z3: TMenuItem;
    mnuViewDetail: TMenuItem;
    Z1: TMenuItem;
    OROffsetLabel1: TOROffsetLabel;
    hdrOrders: THeaderControl;
    lstOrders: TCaptionListBox;
    lblOrders: TOROffsetLabel;
    lstSheets: TORListBox;
    lstWrite: TORListBox;
    mnuViewUnsigned: TMenuItem;
    popOrder: TPopupMenu;
    popOrderChange: TMenuItem;
    popOrderDC: TMenuItem;
    popOrderRenew: TMenuItem;
    popOrderDetail: TMenuItem;
    N1: TMenuItem;
    mnuActCopy: TMenuItem;
    mnuActAlert: TMenuItem;
    mnuViewResult: TMenuItem;
    mnuActOnChart: TMenuItem;
    mnuActComplete: TMenuItem;
    sepOrderVerify: TMenuItem;
    popOrderVerify: TMenuItem;
    popOrderResult: TMenuItem;
    imgHide: TImage;
    mnuOpt: TMenuItem;
    mnuOptSaveQuick: TMenuItem;
    mnuOptEditCommon: TMenuItem;
    popOrderSign: TMenuItem;
    popOrderCopy: TMenuItem;
    mnuActChartRev: TMenuItem;
    popOrderChartRev: TMenuItem;
    Z6: TMenuItem;
    mnuViewDfltSave: TMenuItem;
    mnuViewDfltShow: TMenuItem;
    mnuViewCurrent: TMenuItem;
    mnuChartSurgery: TMenuItem;
    mnuViewResultsHistory: TMenuItem;
    popResultsHistory: TMenuItem;
    btnDelayedOrder: TORAlignButton;
    mnuActChgEvnt: TMenuItem;
    mnuChgEvnt: TMenuItem;
    mnuActRel: TMenuItem;
    popOrderRel: TMenuItem;
    EventRealeasedOrder1: TMenuItem;
    lblWrite: TLabel;
    sptVert: TSplitter;
    mnuViewExpired: TMenuItem;
    mnuViewInformation: TMenuItem;
    mnuViewDemo: TMenuItem;
    mnuViewVisits: TMenuItem;
    mnuViewPrimaryCare: TMenuItem;
    mnuViewMyHealtheVet: TMenuItem;
    mnuInsurance: TMenuItem;
    mnuViewFlags: TMenuItem;
    mnuViewReminders: TMenuItem;
    mnuViewRemoteData: TMenuItem;
    mnuViewPostings: TMenuItem;
    mnuOptimizeFields: TMenuItem;
    procedure mnuChartTabClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure lstOrdersDrawItem(Control: TWinControl; Index: Integer;
      TheRect: TRect; State: TOwnerDrawState);
    procedure lstOrdersMeasureItem(Control: TWinControl; Index: Integer;
      var AHeight: Integer);
    procedure mnuViewActiveClick(Sender: TObject);
    procedure hdrOrdersSectionResize(HeaderControl: THeaderControl;
      Section: THeaderSection);
    procedure mnuViewCustomClick(Sender: TObject);
    procedure mnuViewExpiringClick(Sender: TObject);
    procedure mnuViewExpiredClick(Sender: TObject);
    procedure mnuViewUnsignedClick(Sender: TObject);
    procedure mnuViewDetailClick(Sender: TObject);
    procedure lstOrdersDblClick(Sender: TObject);
    procedure lstWriteClick(Sender: TObject);
    procedure mnuActHoldClick(Sender: TObject);
    procedure mnuActUnholdClick(Sender: TObject);
    procedure mnuActDCClick(Sender: TObject);
    procedure mnuActAlertClick(Sender: TObject);
    procedure mnuActFlagClick(Sender: TObject);
    procedure mnuActUnflagClick(Sender: TObject);
    procedure mnuActSignClick(Sender: TObject);
    procedure mnuActReleaseClick(Sender: TObject);
    procedure mnuActOnChartClick(Sender: TObject);
    procedure mnuActCompleteClick(Sender: TObject);
    procedure mnuActVerifyClick(Sender: TObject);
    procedure mnuViewResultClick(Sender: TObject);
    procedure mnuActCommentClick(Sender: TObject);
    procedure mnuOptSaveQuickClick(Sender: TObject);
    procedure mnuOptEditCommonClick(Sender: TObject);
    procedure mnuActCopyClick(Sender: TObject);
    procedure mnuActChangeClick(Sender: TObject);
    procedure mnuActRenewClick(Sender: TObject);
    procedure pnlRightResize(Sender: TObject);
    procedure lstSheetsClick(Sender: TObject);
    procedure mnuActChartRevClick(Sender: TObject);
    procedure mnuViewDfltShowClick(Sender: TObject);
    procedure mnuViewDfltSaveClick(Sender: TObject);
    procedure mnuViewCurrentClick(Sender: TObject);
    procedure mnuViewResultsHistoryClick(Sender: TObject);
    procedure btnDelayedOrderClick(Sender: TObject);
    procedure mnuActChgEvntClick(Sender: TObject);
    procedure mnuActRelClick(Sender: TObject);
    procedure EventRealeasedOrder1Click(Sender: TObject);
    procedure lblWriteMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure popOrderPopup(Sender: TObject);
    procedure mnuViewClick(Sender: TObject);
    procedure mnuActClick(Sender: TObject);
    procedure mnuOptClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure hdrOrdersMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure hdrOrdersMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ViewInfo(Sender: TObject);
    procedure mnuViewInformationClick(Sender: TObject);
    procedure mnuOptimizeFieldsClick(Sender: TObject);
    procedure hdrOrdersSectionClick(HeaderControl: THeaderControl;
      Section: THeaderSection);
    procedure sptHorzMoved(Sender: TObject);
  private
    { Private declarations }
    OrderListClickProcessing : Boolean;
    FDfltSort: Integer;
    FCurrentView: TOrderView;
    FCompress: boolean;
    FFromDCRelease: boolean;
    FSendDelayOrders: boolean;
    FNewEvent: boolean;
    FAskForCancel: boolean;
    FNeedShowModal: boolean;
    FOrderViewForActiveOrders: TOrderView;
    FEventForCopyActiveOrders: TOrderDelayEvent;
    FEventDefaultOrder      : string;
    FIsDefaultDlg: boolean;
    FHighlightFromMedsTab: integer;
    FCalledFromWDO: boolean; //called from Write Delay Orders button
    FEvtOrderList: TStringlist;
    FEvtColWidth: integer;
    FRightAfterWriteOrderBox : boolean;
    FDontCheck: boolean;
    FParentComplexOrderID: string;
    FHighContrast2Mode: boolean;
    function CanChangeOrderView: Boolean;
    function GetEvtIFN(AnIndex: integer): string;
    function DisplayDefaultDlgList(ADest: TORListBox; ADlgList: TStringList): boolean;
    procedure AddToListBox(AnOrderList: TList);
    procedure ExpandEventSection;
    procedure CompressEventSection;
    procedure ClearOrderSheets;
    procedure InitOrderSheets;
    procedure DfltViewForEvtDelay;
    procedure MakeSelectedList(AList: TList);
    function  NoneSelected(const ErrMsg: string): Boolean;
    procedure ProcessNotifications;
    procedure PositionTopOrder(DGroup: Integer);
    procedure RedrawOrderList;
    procedure RefreshOrderList(FromServer: Boolean; APtEvtID: string = '');
    procedure RetrieveVisibleOrders(AnIndex: Integer);
    procedure RemoveSelectedFromChanges(AList: TList);
    procedure SetOrderView(AFilter, ADGroup: Integer; const AViewName: string; NotifSort: Boolean);
    //procedure SetEvtIFN(var AnEvtIFN: integer);
    procedure UseDefaultSort;
    procedure SynchListToOrders;
    procedure ActivateDeactiveRenew;
    procedure ValidateSelected(const AnAction, WarningMsg, WarningTitle: string);
    procedure ViewAlertedOrders(OrderIEN: string; Status: integer; DispGrp: string;
          BySvc, InvDate: boolean; Title: string);
    procedure UMDestroy(var Message: TMessage); message UM_DESTROY;
    function GetStartStopText(StartTime: string; StopTime: string): string;
    function GetOrderText(AnOrder: TOrder; Index: integer; Column: integer): string;
    function MeasureColumnHeight(AnOrder: TOrder; Index: Integer; Column: integer):integer;
    function GetPlainText(AnOrder: TOrder; index: integer):string;
    //function PatientStatusChanged: boolean;
    procedure UMEventOccur(var Message: TMessage); message UM_EVENTOCCUR;
    function CheckOrderStatus: boolean;
    procedure RightClickMessageHandler(var Msg: TMessage; var Handled: Boolean);
  public
    procedure setSectionWidths; //CQ6170
    function getTotalSectionsWidth : integer; //CQ6170
    function AllowContextChange(var WhyNot: string): Boolean; override;
    function PlaceOrderForDefaultDialog(ADlgInfo: string; IsDefaultDialog: boolean; AEvent: TOrderDelayEvent): boolean;
    function PtEvtCompleted(APtEvtID: integer; APtEvtName: string; FromMeds: boolean = False): boolean;
    procedure RefreshToFirstItem;
    procedure ChangesUpdate(APtEvtID: string);
    procedure GroupChangesUpdate(GrpName: string);
    procedure ClearPtData; override;
    procedure DisplayPage; override;
    procedure InitOrderSheetsForEvtDelay;
    procedure ResetOrderPage(AnEvent: TOrderDelayEvent; ADlgLst: TStringList; IsRealeaseNow: boolean);
    procedure NotifyOrder(OrderAction: Integer; AnOrder: TOrder); override;
    procedure SaveSignOrders;
    procedure ClickLstSheet;
    procedure RequestPrint; override;
    procedure InitOrderSheets2(AnItem: string = '');
    procedure SetFontSize( FontSize: integer); override;
    property IsDefaultDlg: boolean      read FIsDefaultDlg       write FIsDefaultDlg;
    property SendDelayOrders: Boolean   read FSendDelayOrders    write FSendDelayOrders;
    property NewEvent: Boolean          read FNewEvent           write FNewEvent;
    property NeedShowModal: Boolean     read FNeedShowModal      write FNeedShowModal;
    property AskForCancel: Boolean      read FAskForCancel       write FAskForCancel;
    property EventDefaultOrder: string  read FEventDefaultOrder  write FEventDefaultOrder;
    property TheCurrentView: TOrderView read FCurrentView;
    property HighlightFromMedsTab: integer read FHighlightFromMedsTab write FHighlightFromMedsTab;
    property CalledFromWDO: boolean     read FCalledFromWDO;
    property EvtOrderList: TStringlist  read FEvtOrderList       write FEvtOrderList;
    property FromDCRelease: boolean     read FFromDCRelease      write FFromDCRelease;
    property EvtColWidth: integer       read FEvtColWidth        write FEvtColWidth;
    property DontCheck: boolean         read FDontCheck          write FDontCheck;
    property ParentComplexOrderID: string       read FParentComplexOrderID        write FParentComplexOrderID;
  end;

type
  arOrigSecWidths = array[0..9] of integer; //CQ6170

var
  frmOrders: TfrmOrders;

  origWidths: arOrigSecWidths; //CQ6170

implementation

uses fFrame, fEncnt, fOrderVw, fRptBox, fLkUpLocation, fOrdersDC, fOrdersCV, fOrdersHold, fOrdersUnhold,
     fOrdersAlert, fOrderFlag, fOrderUnflag, fOrdersSign, fOrdersRelease, fOrdersOnChart, fOrdersEvntRelease,
     fOrdersComplete, fOrdersVerify, fOrderComment, fOrderSaveQuick, fOrdersRenew,fODReleaseEvent,
     fOMNavA, rCore, fOCSession, fOrdersPrint, fOrdersTS, fEffectDate, fODActive, fODChild,
     fOrdersCopy, fOMVerify, fODAuto, rODBase, uODBase, rMeds,fODValidateAction, fMeds, uInit, fBALocalDiagnoses,
     fODConsult, fClinicWardMeds, fActivateDeactivate, VA2006Utils, rodMeds,
     VA508AccessibilityRouter, VAUtils;

{$R *.DFM}

const
  FROM_SELF        = False;
  FROM_SERVER      = True;
  OVS_CATINV       = 0;
  OVS_CATFWD       = 1;
  OVS_INVERSE      = 2;
  OVS_FORWARD      = 3;
  STS_ACTIVE       = 2;
  STS_DISCONTINUED = 3;
  STS_COMPLETE     = 4;
  STS_EXPIRING     = 5;
  STS_RECENT       = 6;
  STS_UNVERIFIED   = 8;
  STS_UNVER_NURSE  = 9;
  STS_UNSIGNED     = 11;
  STS_FLAGGED      = 12;
  STS_HELD         = 18;
  STS_NEW          = 19;
  STS_CURRENT      = 23;
  STS_EXPIRED      = 27;
  FM_DATE_ONLY     = 7;
  CT_ORDERS        =  4;       // chart tab - doctor's orders

  TX_NO_HOLD    = CRLF + CRLF + '- cannot be placed on hold.' + CRLF + CRLF + 'Reason:  ';
  TC_NO_HOLD    = 'Unable to Hold';
  TX_NO_UNHOLD  = CRLF + CRLF + '- cannot be released from hold.' + CRLF + CRLF + 'Reason: ';
  TC_NO_UNHOLD  = 'Unable to Release from Hold';
  TX_NO_DC      = CRLF + CRLF + '- cannot be discontinued.' + CRLF + CRLF + 'Reason: ';
  TC_NO_DC      = 'Unable to Discontinue';
  TX_NO_CV      = CRLF + 'The release event cannot be changed.' + CRLF + CRLF + 'Reason: ';
  TC_NO_CV      = 'Unable to Change Release Event';
  TX_NO_ALERT   = CRLF + CRLF + '- cannot be set to send an alert.' + CRLF + CRLF + 'Reason: ';
  TC_NO_ALERT   = 'Unable to Set Alert';
  TX_NO_FLAG    = CRLF + CRLF + '- cannot be flagged.' + CRLF + CRLF + 'Reason: ';
  TC_NO_FLAG    = 'Unable to Flag Order';
  TX_NO_UNFLAG  = CRLF + CRLF + '- cannot be unflagged.' + CRLF + CRLF + 'Reason: ';
  TC_NO_UNFLAG  = 'Unable to Unflag Order';
  TX_NO_SIGN    = CRLF + CRLF + '- cannot be signed.' + CRLF + CRLF + 'Reason: ';
  TC_NO_SIGN    = 'Unable to Sign Order';
  TX_NO_REL     = CRLF + 'Cannot be released to the service(s).' + CRLF + CRLF + 'Reason: ';
  TC_NO_REL     = 'Unable to be Released to Service';
  TX_NO_CHART   = CRLF + CRLF + '- cannot be marked "Signed on Chart".' + CRLF + CRLF + 'Reason: ';
  TC_NO_CHART   = 'Unable to Release Orders';
  TX_NO_CPLT    = CRLF + CRLF + '- cannot be completed.' + CRLF + CRLF + 'Reason: ';
  TC_NO_CPLT    = 'Unable to Complete';
  TX_NO_VERIFY  = CRLF + CRLF + '- cannot be verified.' + CRLF + CRLF + 'Reason: ';
  TC_NO_VERIFY  = 'Unable to Verify';
  TX_NO_CMNT    = CRLF + CRLF + '- cannot have comments edited.' + CRLF + CRLF + 'Reason: ';
  TC_NO_CMNT    = 'Unable to Edit Comments';
  TX_NO_RENEW   = CRLF + CRLF + '- cannot be changed.' + CRLF + CRLF + 'Reason: ';
  TC_NO_RENEW   = 'Unable to Renew Order';
  TX_LOC_PRINT  = 'The selected location will be used to determine where orders are printed.';
  TX_PRINT_LOC  = 'A location must be selected to print orders.';
  TX_REL_LOC    = 'A location must be selected to release orders.';
  TX_CHART_LOC  = 'A location must be selected to mark orders "signed on chart".';
  TX_SIGN_LOC   = 'A location must be selected to sign orders.';
  TC_REQ_LOC    = 'Location Required';
  TX_NOSEL      = 'No orders are highlighted.  Highlight the orders' + CRLF +
                  'you wish to take action on.';
  TX_NOSEL_SIGN = 'No orders are highlighted. Highlight orders you want to sign or' + CRLF +
                  'use Review/Sign Changes (File menu) to sign all orders written' + CRLF +
                  'in this session.';
  TC_NOSEL      = 'No Orders Selected';
  TX_NOCHG_VIEW = 'The view of orders may not be changed while an ordering dialog is' + CRLF +
                  'active for an event-delayed order.';
  TC_NOCHG_VIEW = 'Order View Restriction';
  TX_DELAY1     = 'Now writing orders for ';
  TC_DELAY      = 'Ordering Information';
  TX_BAD_TYPE   = 'This item is a type that is not supported in the graphical interface.';
  TC_BAD_TYPE   = 'Unsupported Ordering Item';
  TC_VWSAVE     = 'Save Default Order View';
  TX_VWSAVE1    = 'The current order view is: ' + CRLF + CRLF;
  TX_VWSAVE2    = CRLF + CRLF + 'Do you wish to save this as your default view?';
  TX_NO_COPY    = CRLF + CRLF + '- cannot be copied.' + CRLF + CRLF + 'Reason: ';
  TC_NO_COPY    = 'Unable to Copy Order';
  TX_NO_CHANGE  = CRLF + CRLF + '- cannot be changed' + CRLF + CRLF + 'Reason: ';
  TC_NO_CHANGE  = 'Unable to Change Order';
  TX_COMPLEX    = 'You can not take this action on a complex medication.' + #13 + 'You must enter a new order.';
  TX_CMPTEVT = ' occurred since you started writing delayed orders. '
    + 'The orders that were entered and signed have now been released. '
    + 'Any unsigned orders will be released immediately upon signature. '
    + #13#13
    + 'To write new delayed orders for this event you need to click the write delayed orders button again and select the appropriate event. '
    + 'Orders delayed to this same event will remain delayed until the event occurs again.'
    + #13#13
    + 'The Orders tab will now be refreshed and switched to the Active Orders view. '
    + 'If you wish to continue to write active orders for this patient, '
    + 'close this message window and continue as usual.';
  TX_CMPTEVT_MEDSTAB = ' occurred since you started writing delayed orders. '
    + 'The orders that were entered and signed have now been released. '
    + 'Any unsigned orders will be released immediately upon signature. '
    + #13#13
    + 'To write new delayed orders for this event you need to click the write delayed orders button on the orders tab and select the appropriate event. '
    + 'Orders delayed to this same event will remain delayed until the event occurs again.';

var
  uOrderList: TList;
  uEvtDCList, uEvtRLList: TList;

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

function TfrmOrders.AllowContextChange(var WhyNot: string): Boolean;
begin
  Result := inherited AllowContextChange(WhyNot);  // sets result = true
  case BOOLCHAR[frmFrame.CCOWContextChanging] of
    '1': if ActiveOrdering then
           begin
             WhyNot := 'Orders in progress will be discarded.';
             Result := False;
           end;
    '0': Result := CloseOrdering;  // call in uOrders, should move to fFrame
  end;
end;

procedure TfrmOrders.ClearPtData;
begin
  inherited ClearPtData;
  lstOrders.Clear;
  ClearOrderSheets;
  ClearOrders(uOrderList);
  if uEvtDCList <> nil then
    uEvtDCList.Clear;
  if uEvtRLList <> nil then
    uEvtRLList.Clear;
  ClearFillerAppList;
end;

procedure TfrmOrders.DisplayPage;
var
  i: Integer;
begin
  inherited DisplayPage;
  frmFrame.ShowHideChartTabMenus(mnuViewChart);
  frmFrame.mnuFilePrint.Tag := CT_ORDERS;
  frmFrame.mnuFilePrint.Enabled := True;
  frmFrame.mnuFilePrintSetup.Enabled := True;
  if InitPage then
  begin
    // set visibility according to order role
    mnuActComplete.Visible   := (User.OrderRole = OR_NURSE) or (User.OrderRole = OR_CLERK) or
                                (User.OrderRole = OR_PHYSICIAN);
    mnuActVerify.Visible     := (User.OrderRole = OR_NURSE) or (User.OrderRole = OR_CLERK);
    popOrderVerify.Visible   := (User.OrderRole = OR_NURSE) or (User.OrderRole = OR_CLERK);
    sepOrderVerify.Visible   := (User.OrderRole = OR_NURSE) or (User.OrderRole = OR_CLERK);
    mnuActChartRev.Visible   := (User.OrderRole = OR_NURSE) or (User.OrderRole = OR_CLERK);
    popOrderChartRev.Visible := (User.OrderRole = OR_NURSE) or (User.OrderRole = OR_CLERK);
    mnuActRelease.Visible    :=  User.OrderRole = OR_NURSE;
    mnuActOnChart.Visible    := (User.OrderRole = OR_NURSE) or (User.OrderRole = OR_CLERK);
    mnuActSign.Visible       :=  User.OrderRole = OR_PHYSICIAN;
    popOrderSign.Visible     :=  User.OrderRole = OR_PHYSICIAN;
    mnuActRel.Visible        := False;
    popOrderRel.Visible      := False;
    // now set enabled/disabled according to parameters
    // popup items that apply to ordering have tag>0
    with mnuAct do
      for i := 0 to Pred(Count) do
        Items[i].Enabled := not User.NoOrdering;
    with popOrder.Items do
      for i := 0 to Pred(Count) do
        if Items[i].Tag > 0 then Items[i].Enabled := not User.NoOrdering;
    // set nurse verification actions (may be enabled when ordering disabled)
    mnuActVerify.Enabled     := User.EnableVerify;
    mnuActChartRev.Enabled   := User.EnableVerify;
    popOrderVerify.Enabled   := User.EnableVerify;
    popOrderChartRev.Enabled := User.EnableVerify;
    if User.DisableHold then
    begin
      mnuActHold.Visible := False;
      mnuActUnhold.Visible := False;
    end;
  end;
  AskForCancel := true;
  if InitPatient then                          // for both CC_INIT_PATIENT and CC_NOTIFICATION
  begin
    if not User.NoOrdering then LoadWriteOrders(lstWrite.Items) else lstWrite.Clear;
    InitOrderSheets;
  end;
  case CallingContext of
  CC_INIT_PATIENT: mnuViewDfltShowClick(Self); // when new patient but not doing notifications
  CC_NOTIFICATION: ProcessNotifications;       // when new patient and doing notifications
  end;
end;

procedure TfrmOrders.mnuChartTabClick(Sender: TObject);
begin
  inherited;
  frmFrame.mnuChartTabClick(Sender);
end;

procedure TfrmOrders.NotifyOrder(OrderAction: Integer; AnOrder: TOrder);
var
  OrderForList: TOrder;
  IndexOfOrder, ReturnedType, CanSign, i: Integer;
  j: integer;
  AChildList: TStringlist;
  CplxOrderID: string;
  DCNewOrder: boolean;
  DCChangeItem: TChangeItem;

  procedure RemoveFromOrderList(ChildOrderID: string);
  var
   ij: integer;
  begin
    for ij := uOrderList.Count - 1 downto 0 do
    begin
      if TOrder(uOrderList[ij]).ID = ChildOrderID then
        uOrderList.Remove(TOrder(uOrderList[ij]));
    end;
  end;

begin
//  if FCurrentView = nil then                                        {**REV**}
//    begin                                                           {**REV**}
//      FCurrentView := TOrderView.Create;                            {**REV**}
//      with FCurrentView do                                          {**REV**}
//       begin                                                        {**REV**}
//        InvChrono := True;                                          {**REV**}
//        ByService := True;                                          {**REV**}
//       end;                                                         {**REV**}
//    end;                                                            {**REV**}
  if FCurrentView = nil then Exit;
  case OrderAction of
  ORDER_NEW:  if AnOrder.ID <> '' then
              begin
                OrderForList := TOrder.Create;
                OrderForList.Assign(AnOrder);
                uOrderList.Add(OrderForList);
                FCompress := True;
                RefreshOrderList(FROM_SELF);
                //PositionTopOrder(AnOrder.DGroup);
                PositionTopOrder(0);  // puts new orders on top
                lstOrders.Invalidate;
              end;
  ORDER_DC:   begin
                IndexOfOrder := -1;
                with lstOrders do for i := 0 to Items.Count - 1 do
                  if TOrder(Items.Objects[i]).ID = AnOrder.ID then IndexOfOrder := i;
                if IndexOfOrder > -1
                  then OrderForList := TOrder(lstOrders.Items.Objects[IndexOfOrder])
                  else OrderForList := AnOrder;
                if (Encounter.Provider = User.DUZ) and User.CanSignOrders
                  then CanSign := CH_SIGN_YES
                  else CanSign := CH_SIGN_NA;
                DCNEwOrder := false;
                if Changes.Orders.Count > 0 then
                  begin
                    for j := 0 to Changes.Orders.Count - 1 do
                      begin
                        DCChangeItem := TChangeItem(Changes.Orders.Items[j]);
                        if DCChangeItem.ID = OrderForList.ID then
                          begin
                            if (Pos('DC', OrderForList.ActionOn) = 0) then
                            DCNewOrder := True;
                            //else DCNewOrder := False;
                          end;
                      end;
                  end;
                DCOrder(OrderForList, GetReqReason, DCNewOrder, ReturnedType);
                Changes.Add(CH_ORD, OrderForList.ID, OrderForList.Text, '', CanSign);
                FCompress := True;
                SynchListToOrders;
              end;
  ORDER_EDIT: with lstOrders do
              begin
                IndexOfOrder := -1;
                for i := 0 to Items.Count - 1 do
                  if TOrder(Items.Objects[i]).ID = AnOrder.EditOf then IndexOfOrder := i;
                if IndexOfOrder > -1 then
                begin
                  TOrder(Items.Objects[IndexOfOrder]).Assign(AnOrder);
                end; {if IndexOfOrder}
                //RedrawOrderList;  {redraw here appears to clear selected}
              end; {with lstOrders}
  ORDER_ACT:  begin
                if IsComplexOrder(AnOrder.ID) then
                begin
                  RefreshOrderList(FROM_SERVER);
                  exit;
                end;
                with lstOrders do
                begin
                  IndexOfOrder := -1;
                  for i := 0 to Items.Count - 1 do
                    if TOrder(Items.Objects[i]).ID = Piece(AnOrder.ActionOn, '=', 1) then IndexOfOrder := i;
                  if (IndexOfOrder > -1) and (AnOrder <> Items.Objects[IndexOfOrder]) then
                  begin
                    TOrder(Items.Objects[IndexOfOrder]).Assign(AnOrder);
                  end; {if IndexOfOrder}
                  FCompress := True;
                  RedrawOrderList;
                end; {with lstOrders}
              end; //PSI-COMPLEX
  ORDER_CPLXRN: begin
                  AChildList := TStringList.Create;
                  CplxOrderID := Piece(AnOrder.ActionOn,'=',1);
                  GetChildrenOfComplexOrder(CplxOrderID, Piece(CplxOrderID,';',2), AChildList);
                  with lstOrders do
                  begin
                    for i := Items.Count-1 downto 0 do
                    begin
                      for j := 0 to AChildList.Count - 1 do
                      begin
                        if TOrder(Items.Objects[i]).ID = AChildList[j] then
                        begin
                          RemoveFromOrderList(AChildList[j]);
                          Items.Objects[i].Free;
                          Items.Delete(i);
                          Break;
                        end;
                      end;
                    end;
                    Items.InsertObject(0,AnOrder.Text,AnOrder);
                    Items[0] := GetPlainText(AnOrder,0);
                    uOrderList.Insert(0,AnOrder);
                  end;
                  FCompress := True;
                  RedrawOrderList;
                  AChildList.Clear;
                  AChildList.Free;
                end;
  ORDER_SIGN: begin
                FCompress := True;
                SaveSignOrders;  // sent when orders signed, AnOrder=nil
              end;
  end; {case}
end;

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

procedure TfrmOrders.FormCreate(Sender: TObject);
begin
  inherited;
  OrderListClickProcessing := false;
  FixHeaderControlDelphi2006Bug(hdrOrders);
  PageID             := CT_ORDERS;
  uOrderList         := TList.Create;
  uEvtDCList         := TList.Create;
  uEvtRLList         := TList.Create;
  FDfltSort          := OVS_CATINV;
  FCompress     := False;
  FFromDCRelease     := False;
  FSendDelayOrders   := False;
  FNewEvent          := False;
  FNeedShowModal     := False;
  FAskForCancel      := True;
  FRightAfterWriteOrderBox := False;
  FEventForCopyActiveOrders.EventType := #0;
  FEventForCopyActiveOrders.EventIFN  := 0;
  FHighlightFromMedsTab := 0;
  FCalledFromWDO := False;
  FEvtOrderList := TStringList.Create;
  FEvtColWidth := 0;
  FDontCheck := False;
  FParentComplexOrderID := '';
  // 508 black color scheme that causes problems 
  FHighContrast2Mode := BlackColorScheme and (ColorToRGB(clInfoBk) <> ColorToRGB(clBlack));
  AddMessageHandler(lstOrders, RightClickMessageHandler);
end;

procedure TfrmOrders.FormDestroy(Sender: TObject);
begin
  inherited;
  RemoveMessageHandler(lstOrders, RightClickMessageHandler);
  ClearOrders(uOrderList);
  uEvtDCList.Clear;
  uEvtRLList.Clear;
  ClearOrderSheets;
  FEvtOrderList.Free;
  uEvtDCList.Free;
  uEvtRLList.Free;
  uOrderList.Free;
  if FOrderViewForActiveOrders <> nil then FOrderViewForActiveOrders := nil;
  FEventForCopyActiveOrders.EventType := #0;
  FEventForCopyActiveOrders.EventIFN  := 0;
  FEventForCopyActiveOrders.EventName := '';
end;

procedure TfrmOrders.UMDestroy(var Message: TMessage);
{ sent by ordering dialog when it is closing }
begin
  lstWrite.ItemIndex := -1;
  //UnlockIfAble;  // - already in uOrders
end;

{ View menu events ------------------------------------------------------------------------- }

procedure TfrmOrders.PositionTopOrder(DGroup: Integer);
const
  SORT_FWD     = 0;
  SORT_REV     = 1;
  SORT_GRP_FWD = 2;
  SORT_GRP_REV = 3;
var
  i, Seq: Integer;
  AnOrder: TOrder;
begin
  with lstOrders do
  begin
    case (Ord(FCurrentView.ByService) * 2) + Ord(FCurrentView.InvChrono) of
    SORT_FWD: TopIndex := Items.Count - 1;
    SORT_REV: TopIndex := 0;
    SORT_GRP_FWD: begin
                    Seq := SeqOfDGroup(DGroup);
                    for i := Items.Count - 1 downto 0 do
                    begin
                      AnOrder := TOrder(Items.Objects[i]);
                      if AnOrder.DGroupSeq <= Seq then break;
                    end;
                    TopIndex := i;
                  end;
    SORT_GRP_REV: begin
                    Seq := SeqOfDGroup(DGroup);
                    for i := 0 to Items.Count - 1 do
                    begin
                      AnOrder := TOrder(Items.Objects[i]);
                      if AnOrder.DGroupSeq >= Seq then break;
                    end;
                    TopIndex := i;
                  end;
    end; {case}
  end; {with}
end;

procedure TfrmOrders.RedrawOrderList;
{ redraws the Orders list, compensates for changes in item height by re-adding everything }
var
  i, SaveTop: Integer;
  AnOrder: TOrder;
begin
  with lstOrders do
  begin
    RedrawSuspend(Handle);
    SaveTop := TopIndex;
    Clear;
    repaint;
    for i := 0 to uOrderList.Count - 1 do
    begin
      AnOrder := TOrder(uOrderList.Items[i]);
      if (AnOrder.OrderTime <= 0) then
          Continue;
      Items.AddObject(AnOrder.ID, AnOrder);
      Items[i] := GetPlainText(AnOrder,i);
    end;
    TopIndex := SaveTop;
    RedrawActivate(Handle);
  end;
end;

procedure TfrmOrders.RefreshOrderList(FromServer: Boolean; APtEvtID: string);
var
  i: Integer;
begin
  with FCurrentView do
  begin
    if EventDelay.EventIFN > 0 then
      FCompress := False;
    RedrawSuspend(lstOrders.Handle);
    lstOrders.Clear;
    if FromServer then
    begin
      StatusText('Retrieving orders list...');
      if not FFromDCRelease then
        LoadOrdersAbbr(uOrderList, FCurrentView, APtEvtID)
      else
      begin
        ClearOrders(uOrderList);
        uEvtDCList.Clear;
        uEvtRLList.Clear;
        LoadOrdersAbbr(uEvtDCList,uEvtRLList,FCurrentView,APtEvtID);
      end;
    end;
    if ((Length(APtEvtID)>0) or (FCurrentView.Filter in [15,16,17,24]) or  (FCurrentView.EventDelay.PtEventIFN>0))
      and ((not FCompress) or (lstSheets.ItemIndex<0)) and (not FFromDCRelease) then ExpandEventSection
    else CompressEventSection;
    if not FFromDCRelease then
    begin
      if FRightAfterWriteOrderBox and (EventDelay.EventIFN>0) then
      begin
        SortOrders(uOrderList,False,True);
        FRightAfterWriteOrderBox := False;
      end else
        SortOrders(uOrderList, ByService, InvChrono);
      AddToListBox(uOrderList);
    end;
    if FFromDCRelease then
    begin
      if uEvtRLList.Count > 0 then
      begin
        SortOrders(uEvtRLList,True,True);
        for i := 0 to uEvtRLList.Count - 1 do
          uOrderList.Add(TOrder(uEvtRLList[i]));
      end;
      if uEvtDCList.Count > 0 then
      begin
        SortOrders(uEvtDCList,True,True);
        for i := 0 to uEvtDCList.Count - 1 do
          uOrderList.Add(TOrder(uEvtDCList[i]));   
      end;
      AddToListBox(uOrderList);
    end;
    RedrawActivate(lstOrders.Handle);
    lblOrders.Caption := ViewName;
    lstOrders.Caption := ViewName;
    imgHide.Visible := not ((Filter in [1, 2]) and (DGroup = DGroupAll));
    StatusText('');
  end;
end;

procedure TfrmOrders.UseDefaultSort;
begin
  with FCurrentView do
    case FDfltSort of
    OVS_CATINV:  begin
                   InvChrono := True;
                   ByService := True;
                 end;
    OVS_CATFWD:  begin
                   InvChrono := False;
                   ByService := True;
                 end;
    OVS_INVERSE: begin
                   InvChrono := True;
                   ByService := False;
                 end;
    OVS_FORWARD: begin
                   InvChrono := False;
                   ByService := False;
                 end;
    end;
end;

function TfrmOrders.CanChangeOrderView: Boolean;
{ Disallows changing view while doing delayed release orders. }
begin
  Result := True;
  if (lstSheets.ItemIndex > 0) and ActiveOrdering then
  begin
    InfoBox(TX_NOCHG_VIEW, TC_NOCHG_VIEW, MB_OK);
    Result := False;
  end;
end;

procedure TfrmOrders.SetOrderView(AFilter, ADGroup: Integer; const AViewName: string;
  NotifSort: Boolean);
{ sets up a 'canned' order view, assumes the date range is never restricted }
var
  tmpDate: TDateTime;
begin
  if not CanChangeOrderView then Exit;
  lstSheets.ItemIndex := 0;
  FCurrentView := TOrderView(lstSheets.Items.Objects[0]);
  if FCurrentView = nil then
    FCurrentView := TOrderView.Create;
  with FCurrentView do
  begin
    TimeFrom  := 0;
    TimeThru  := 0;
    if NotifSort then
    begin
      ByService := False;
      InvChrono := True;
      if AFilter = STS_RECENT then
        begin
          tmpDate  := Trunc(FMDateTimeToDateTime(StrToFMDateTime(Piece(Piece(Notifications.RecordID, U, 2), ';', 3))));
          TimeFrom := DateTimeToFMDateTime(tmpDate - 5);
          TimeThru := FMNow;
        end;
      if AFilter = STS_UNVERIFIED then
        begin
          if Patient.AdmitTime > 0 then
            tmpDate := Trunc(FMDateTimeToDateTime(Patient.AdmitTime))
          else
            tmpdate := Trunc(FMDateTimeToDateTime(FMNow)) - 30;
          TimeFrom := DateTimeToFMDateTime(tmpDate);
          TimeThru := FMNow;
        end;
    end
    else UseDefaultSort;
    if AFilter = STS_EXPIRED then
    begin
      TimeFrom := ExpiredOrdersStartDT;
      TimeThru := FMNow;
    end;
    Filter    := AFilter;
    DGroup    := ADGroup;
    CtxtTime  := 0;
    TextView  := 0;
    ViewName  := AViewName;
    lstSheets.Items[0] := 'C;0^' + ViewName;
    EventDelay.EventType := 'C';
    EventDelay.Specialty := 0;
    EventDelay.Effective := 0;
  end;
  RefreshOrderList(FROM_SERVER);
end;

procedure TfrmOrders.mnuViewActiveClick(Sender: TObject);
begin
  inherited;
  SetOrderView(STS_ACTIVE, DGroupAll, 'Active Orders (includes Pending & Recent Activity) - ALL SERVICES', False);
end;

procedure TfrmOrders.mnuViewCurrentClick(Sender: TObject);
begin
  inherited;
  SetOrderView(STS_CURRENT, DGroupAll, 'Current Orders (Active & Pending Status Only) - ALL SERVICES', False);
end;

procedure TfrmOrders.mnuViewExpiringClick(Sender: TObject);
begin
  inherited;
  SetOrderView(STS_EXPIRING, DGroupAll, 'Expiring Orders - ALL SERVICES', False);
end;

procedure TfrmOrders.mnuViewExpiredClick(Sender: TObject);
begin
  inherited;
  SetOrderView(STS_EXPIRED, DGroupAll, 'Recently Expired Orders - ALL SERVICES', False);
end;

procedure TfrmOrders.mnuViewUnsignedClick(Sender: TObject);
begin
  inherited;
  SetOrderView(STS_UNSIGNED, DGroupAll, 'Unsigned Orders - ALL SERVICES', False);
end;

procedure TfrmOrders.mnuViewCustomClick(Sender: TObject);
var
  AnOrderView: TOrderView;
begin
  inherited;
  if not CanChangeOrderView then Exit;
  AnOrderView := TOrderView.Create;              //       - this starts fresh instead, since CPRS v22
  try
    AnOrderView.Assign(FCurrentView);              // RV - v27.1 - preload form with current view params
  (*  AnOrderView.Filter    := STS_ACTIVE;                    - CQ #11261
    AnOrderView.DGroup    := DGroupAll;
    AnOrderView.ViewName  := 'All Services, Active';
    AnOrderView.InvChrono := True;
    AnOrderView.ByService := True;
    AnOrderView.CtxtTime  := 0;
    AnOrderView.TextView  := 0;
    AnOrderView.EventDelay.EventType := 'C';
    AnOrderView.EventDelay.Specialty := 0;
    AnOrderView.EventDelay.Effective := 0;
    AnOrderView.EventDelay.EventIFN  := 0;
    AnOrderView.EventDelay.EventName := 'All Services, Active';*)
    SelectOrderView(AnOrderView);
    with AnOrderView do if Changed then
    begin
      FCurrentView.Assign(AnOrderView);
      if FCurrentView.Filter in [15,16,17,24] then
      begin
        FCompress      := False;
        mnuActRel.Visible   := True;
        popOrderRel.Visible := True;
      end else
      begin
        mnuActRel.Visible   := False;
        popOrderRel.Visible := False;
      end;

      //lstSheets.ItemIndex := -1;
      lstSheets.Items[0] := 'C;0^' + FCurrentView.ViewName;   // v27.5 - RV

      lblWrite.Caption := 'Write Orders';
      lstWrite.Clear;
      lstWrite.Caption := lblWrite.Caption;
      LoadWriteOrders(lstWrite.Items);
      RefreshOrderList(FROM_SERVER);

      if ByService then
      begin
        if InvChrono then FDfltSort := OVS_CATINV  else FDfltSort := OVS_CATFWD;
      end else
      begin
        if InvChrono then FDfltSort := OVS_INVERSE else FDfltSort := OVS_FORWARD;
      end;
    end;
  finally
    AnOrderView.free;
  end;
end;

procedure TfrmOrders.mnuViewDfltShowClick(Sender: TObject);
begin
  inherited;
  if not CanChangeOrderView then Exit;
  if HighlightFromMedsTab > 0 then
    lstSheets.ItemIndex := lstSheets.SelectByIEN(HighlightFromMedsTab);
  if lstSheets.ItemIndex < 0 then
    lstSheets.ItemIndex := 0;
  FCurrentView := TOrderView(lstSheets.Items.Objects[lstSheets.ItemIndex]);
  LoadOrderViewDefault(TOrderView(lstSheets.Items.Objects[0]));
  lstSheets.Items[0] := 'C;0^' + TOrderView(lstSheets.Items.Objects[0]).ViewName;
  if lstSheets.ItemIndex > 0 then
    lstSheetsClick(Application)
  else
    RefreshOrderList(FROM_SERVER);
  if HighlightFromMedsTab > 0 then
    HighlightFromMedsTab := 0;
end;

procedure TfrmOrders.mnuViewDfltSaveClick(Sender: TObject);
var
  x: string;
begin
  inherited;
  with FCurrentView do
  begin
    x := Piece(Viewname, '(', 1) + CRLF;
    if TimeFrom > 0 then x := x + 'From: ' + MakeRelativeDateTime(TimeFrom);
    if TimeThru > 0 then x := x + '  Thru: ' + MakeRelativeDateTime(TimeThru);
    if InvChrono
      then x := x + CRLF + 'Sort order dates in reverse chronological order'
      else x := x + CRLF + 'Sort order dates in chronological order';
    if ByService
      then x := x + CRLF + 'Group orders by service'
      else x := x + CRLF + 'Don''t group orders by service';
  end;
  if InfoBox(TX_VWSAVE1 + x + TX_VWSAVE2, TC_VWSAVE, MB_YESNO) = IDYES
    then SaveOrderViewDefault(FCurrentView);
end;

procedure TfrmOrders.mnuViewDetailClick(Sender: TObject);
var
  i,j,idx: Integer;
  tmpList: TStringList;
  BigOrderID: string;
  AnOrderID: string;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  tmpList := TStringList.Create;
  idx := 0;
  try
    with lstOrders do for i := 0 to Items.Count - 1 do if Selected[i] then
    begin
      StatusText('Retrieving order details...');
      BigOrderID := TOrder(Items.Objects[i]).ID;
      AnOrderID := Piece(BigOrderID, ';', 1);
      if StrToIntDef(AnOrderID,0) = 0 then
        ShowMsg('Detail view is not available for selected order.')
      else
        begin
          FastAssign(DetailOrder(BigOrderID), tmpList);
          if ((TOrder(Items.Objects[i]).DGroupName = 'Inpt. Meds') or
              (TOrder(Items.Objects[i]).DGroupName = 'Out. Meds') or
              (TOrder(Items.Objects[i]).DGroupName = 'Clinic Orders') or
              (TOrder(Items.Objects[i]).DGroupName = 'Infusion')) then
            begin
              tmpList.Add('');
              tmpList.Add(StringOfChar('=', 74));
              tmpList.Add('');
              FastAddStrings(MedAdminHistory(AnOrderID), tmpList);
            end;

          if CheckOrderGroup(AnOrderID)=1 then  // if it's UD group
          begin
            for j := 0 to tmpList.Count - 1 do
            begin
              if Pos('PICK UP',UpperCase(tmpList[j]))>0 then
              begin
                idx := j;
                Break;
              end;
            end;
            if idx > 0 then
              tmpList.Delete(idx);
          end;
          ReportBox(tmpList, 'Order Details - ' + BigOrderID, True);
        end;
      StatusText('');
      if (frmFrame.TimedOut) or (frmFrame.CCOWDrivedChange) then Exit; //code added to correct access violation on timeout
      Selected[i] := False;
      end;
  finally
    tmpList.Free;
  end;
end;

procedure TfrmOrders.mnuViewResultClick(Sender: TObject);
var
  i: Integer;
  BigOrderID: string;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  with lstOrders do for i := 0 to Items.Count - 1 do if Selected[i] then
  begin
    StatusText('Retrieving order results...');
    BigOrderID := TOrder(Items.Objects[i]).ID;
    if Length(Piece(BigOrderID,';',1)) > 0 then
      ReportBox(ResultOrder(BigOrderID), 'Order Results - ' + BigOrderID, True);
    Selected[i] := False;
    StatusText('');
  end;
end;

procedure TfrmOrders.mnuViewResultsHistoryClick(Sender: TObject);
var
  i: Integer;
  BigOrderID: string;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  with lstOrders do for i := 0 to Items.Count - 1 do if Selected[i] then
  begin
    StatusText('Retrieving order results...');
    BigOrderID := TOrder(Items.Objects[i]).ID;
    if Length(Piece(BigOrderID,';',1)) > 0 then
      ReportBox(ResultOrderHistory(BigOrderID), 'Order Results History- ' + BigOrderID, True);
    Selected[i] := False;
    StatusText('');
  end;
end;

{ lstSheets events ------------------------------------------------------------------------- }

procedure TfrmOrders.ClearOrderSheets;
{ delete all order sheets & associated TOrderView objects, set current view to nil }
var
  i: Integer;
begin
  with lstSheets do for i := 0 to Items.Count - 1 do TOrderView(Items.Objects[i]).Free;
  lstSheets.Clear;
  FCurrentView := nil;
end;

procedure TfrmOrders.InitOrderSheets;
{ sets up list of order sheets based on what orders are on the server in delayed status for pt }
var
  i: Integer;
  AnEventInfo: String;
  AnOrderView: TOrderView;
begin
  ClearOrderSheets;
  LoadOrderSheetsED(lstSheets.Items);
  // the 1st item in lstSheets should always be the 'Current' view
  if CharAt(lstSheets.Items[0], 1) <> 'C' then Exit;
  AnOrderView := TOrderView.Create;
  AnOrderView.Filter    := STS_ACTIVE;
  AnOrderView.DGroup    := DGroupAll;
  AnOrderView.ViewName  := 'All Services, Active';
  AnOrderView.InvChrono := True;
  AnOrderView.ByService := True;
  AnOrderView.CtxtTime  := 0;
  AnOrderView.TextView  := 0;
  AnOrderView.EventDelay.EventType := 'C';
  AnOrderView.EventDelay.Specialty := 0;
  AnOrderView.EventDelay.Effective := 0;
  AnOrderView.EventDelay.EventIFN  := 0;
  AnOrderView.EventDelay.EventName := 'All Services, Active';
  lstSheets.Items.Objects[0] := AnOrderView;
  FCurrentView := AnOrderView;
  FOrderViewForActiveOrders := AnOrderView;
  // now setup the event-delayed views in lstSheets, each with its own TOrderView object
  with lstSheets do for i := 1 to Items.Count - 1 do
  begin
    AnOrderView := TOrderView.Create;
    AnOrderView.DGroup := DGroupAll;
    AnEventInfo := EventInfo(Piece(Items[i],'^',1));
    AnOrderView.EventDelay.EventType := CharAt(AnEventInfo, 1);
    AnOrderView.EventDelay.EventIFN  := StrToInt(Piece(AnEventInfo,'^',2));
    AnOrderView.EventDelay.EventName := Piece(AnEventInfo,'^',3);
    AnOrderView.EventDelay.Specialty := 0;
    AnOrderView.EventDelay.Effective := 0;
    case AnOrderView.EventDelay.EventType of
    'A': AnOrderView.Filter := 15;
    'D': AnOrderView.Filter := 16;
    'T': AnOrderView.Filter := 17;
    end;
    AnOrderView.ViewName  := DisplayText[i] + ' Orders';
    AnOrderView.InvChrono := FCurrentView.InvChrono;
    AnOrderView.ByService := FCurrentView.ByService;
    AnOrderView.CtxtTime  := 0;
    AnOrderView.TextView  := 0;
    Items.Objects[i] := AnOrderView;
  end; {for}
  lblWrite.Caption := 'Write Orders';
  lstWrite.Caption := lblWrite.Caption;
end;

procedure TfrmOrders.lstSheetsClick(Sender: TObject);
const
  TX_EVTDEL = 'There are no orders tied to this event, would you like to cancel it?';
var
  AnOrderView: TOrderView;
  APtEvtId: string;
begin
  inherited;
  if not CloseOrdering then Exit;
  FCompress  := True;
  if lstSheets.ItemIndex < 0 then Exit;
  with lstSheets do
  begin
   AnOrderView := TOrderView(Items.Objects[ItemIndex]);
   AnOrderView.EventDelay.PtEventIFN := StrToIntDef(Piece(Items[lstSheets.ItemIndex],'^',1),0);
   if AnOrderView.EventDelay.PtEventIFN > 0 then
    FCompress := False;
  end;

  if (FCurrentView <> nil) and (AnOrderView.EventDelay.EventIFN <> FCurrentView.EventDelay.EventIFN) and (FCurrentView.EventDelay.EventIFN > 0 ) then
  begin
    APtEvtID := IntToStr(FCurrentView.EventDelay.PtEventIFN);
    if frmMeds.ActionOnMedsTab then
      Exit;
    if (FCurrentView.EventDelay.PtEventIFN>0) and (PtEvtCompleted(FCurrentView.EventDelay.PtEventIFN, FCurrentView.EventDelay.EventName)) then
      Exit;
    if (not FDontCheck) and DeleteEmptyEvt(APtEvtID, FCurrentView.EventDelay.EventName) then
    begin
      ChangesUpdate(APtEvtID);
      FCompress := True;
      InitOrderSheetsForEvtDelay;
      lstSheets.ItemIndex := 0;
      lstSheetsClick(self);
      Exit;
    end;
  end;

  if (FCurrentView = nil) or (AnOrderView <> FCurrentView) or ((AnOrderView=FcurrentView) and (FCurrentView.EventDelay.EventIFN>0)) then
  begin
    FCurrentView := AnOrderView;
    if FCurrentView.EventDelay.EventIFN > 0 then
    begin
      FCompress := False;
      lstWrite.Items.Clear;
      lblWrite.Caption := 'Write ' + FCurrentView.ViewName;
      lstWrite.Caption := lblWrite.Caption;
      lstWrite.Items.Clear;
      LoadWriteOrdersED(lstWrite.Items, IntToStr(AnOrderView.EventDelay.EventIFN));
      if lstWrite.Items.Count < 1 then
        LoadWriteOrders(lstWrite.Items);
      RefreshOrderList(FROM_SERVER,Piece(lstSheets.Items[lstSheets.ItemIndex],'^',1));
      mnuActRel.Visible   := True;
      popOrderRel.Visible := True;
      if (lstOrders.Items.Count = 0) and (not NewEvent) then
      begin
        if frmMeds.ActionOnMedsTab then
           Exit;
        if (FCurrentView.EventDelay.PtEventIFN>0) and (PtEvtCompleted(FCurrentView.EventDelay.PtEventIFN, FCurrentView.EventDelay.EventName)) then
          Exit;
        if PtEvtEmpty(Piece(lstSheets.Items[lstSheets.ItemIndex],'^',1)) then
        begin
          if (FAskForCancel) and ( InfoBox(TX_EVTDEL, 'Confirmation', MB_YESNO or MB_ICONQUESTION) = IDYES ) then
          begin
            DeletePtEvent(Piece(lstSheets.Items[lstSheets.ItemIndex],'^',1));
            FCompress := True;
            lstSheets.Items.Objects[lstSheets.ItemIndex].Free;
            lstSheets.Items.Delete(lstSheets.ItemIndex);
            FCurrentView := TOrderView.Create;
            lstSheets.ItemIndex := 0;
            lstSheetsClick(self);
            Exit;
          end;
        end;
      end;
      if NewEvent then
        NewEvent := False;
    end
    else
    begin
      NewEvent := False;
      mnuActRel.Visible   := False;
      popOrderRel.Visible := False;
      lblWrite.Caption := 'Write Orders';
      lstWrite.Caption := lblWrite.Caption;
      LoadWriteOrders(lstWrite.Items);
      RefreshOrderList(FROM_SERVER);
    end;
  end else
  begin
    mnuActRel.Visible   := False;
    popOrderRel.Visible := False;
    lblWrite.Caption := 'Write Orders';
    lstWrite.Caption := lblWrite.Caption;
    LoadWriteOrders(lstWrite.Items);
    RefreshOrderList(FROM_SERVER);
  end;
  FCompress := True;
end;

{ lstOrders events ------------------------------------------------------------------------- }

procedure TfrmOrders.RetrieveVisibleOrders(AnIndex: Integer);
var
  i: Integer;
  tmplst: TList;
  AnOrder: TOrder;
begin
  tmplst := TList.Create;
  for i := AnIndex to AnIndex + 100 do
  begin
    if i >= uOrderList.Count then break;
    AnOrder := TOrder(uOrderList.Items[i]);
    if not AnOrder.Retrieved then tmplst.Add(AnOrder);
  end;
  RetrieveOrderFields(tmplst, FCurrentView.TextView, FCurrentView.CtxtTime);
  tmplst.Free;
end;

procedure TfrmOrders.RightClickMessageHandler(var Msg: TMessage;
  var Handled: Boolean);
begin
  if Msg.Msg = WM_RBUTTONUP then
    lstOrders.RightClickSelect := (lstOrders.SelCount < 1);
end;

function TfrmOrders.GetPlainText(AnOrder: TOrder; index: integer):string;
var
  i: integer;
  FirstColumnDisplayed: Integer;
  x: string;
begin
  result := '';
  if hdrOrders.Sections[0].Text = 'Event' then
    FirstColumnDisplayed := 0
  else
    FirstColumnDisplayed := 1;
  for i:= FirstColumnDisplayed to 9 do begin
    x := GetOrderText(AnOrder, index, i);
    if x <> '' then
      result := result + hdrOrders.Sections[i].Text + ': ' + x + CRLF;
  end;
end;

function TfrmOrders.MeasureColumnHeight(AnOrder: TOrder; Index: Integer; Column: integer):integer;
var
  ARect: TRect;
  x: string;
begin
  x := GetOrderText(AnOrder, Index, Column);
  ARect.Left := 0;
  ARect.Top := 0;
  ARect.Bottom := 0;
  ARect.Right := hdrOrders.Sections[Column].Width -6;
  Result := WrappedTextHeightByFont(lstOrders.Canvas,lstOrders.Font,x,ARect);
end;

procedure TfrmOrders.lstOrdersMeasureItem(Control: TWinControl; Index: Integer;
  var AHeight: Integer);
var
  AnOrder: TOrder;
  NewHeight: Integer;
begin
  NewHeight := AHeight;
  with lstOrders do if Index < Items.Count then
  begin
    AnOrder := TOrder(uOrderList.Items[Index]);
    if AnOrder <> nil then with AnOrder do
    begin
      if not AnOrder.Retrieved then RetrieveVisibleOrders(Index);
      Canvas.Font.Style := [];
      if Changes.Exist(CH_ORD, ID) then Canvas.Font.Style := [fsBold];
    end;
    {measure height of event delayed name}
    if hdrOrders.Sections[0].Text = 'Event' then
      NewHeight := HigherOf(AHeight, MeasureColumnHeight(AnOrder, Index, 0));
    {measure height of order text}
    NewHeight := HigherOf(NewHeight, MeasureColumnHeight(AnOrder, Index, 2));
    {measure height of start/stop times}
    NewHeight := HigherOf(NewHeight, MeasureColumnHeight(AnOrder, Index, 3));
    if NewHeight > 255 then NewHeight := 255;  // This is maximum allowed by a Windows
    if NewHeight <  13 then NewHeight := 13;
  end;
  AHeight := NewHeight;
end;

function TfrmOrders.GetStartStopText(StartTime: string; StopTime: string): string;
var
  y: string;
begin
  result := FormatFMDateTimeStr('mm/dd/yy hh:nn', StartTime);
  if IsFMDateTime(StartTime) and (Length(StartTime) = FM_DATE_ONLY) then result := Piece(result, ' ', 1);
  if Length(result) > 0 then result := 'Start: ' + result;
  y := FormatFMDateTimeStr('mm/dd/yy hh:nn', StopTime);
  if IsFMDateTime(StopTime)  and (Length(StopTime)  = FM_DATE_ONLY) then y := Piece(y, ' ', 1);
  if Length(y) > 0 then result := result + CRLF + 'Stop: ' + y;
end;

function TfrmOrders.GetOrderText(AnOrder: TOrder; Index: integer; Column: integer): string;
var
  AReason:  TStringlist;
  i: integer;
begin
  if AnOrder <> nil then with AnOrder do
  begin
    case Column of
      0:
      begin
        result := EventName;
        if (Index > 0) and (result = TOrder(lstOrders.Items.Objects[Index - 1]).EventName) then result := '';
      end;
      1:
      begin
        result := DGroupName;
        if (Index > 0) and (result = TOrder(lstOrders.Items.Objects[Index - 1]).DGroupName) then result := '';
      end;
      2:
      begin
        result := Text;
        if Flagged then
        begin
          if Notifications.Active then
          begin
            AReason := TStringList.Create;
            try
              result := result + crlf;
              LoadFlagReason(AReason, ID);
              for i := 0 to AReason.Count - 1 do
                result :=  result + AReason[i] + CRLF;
            finally
              AReason.Free;
            end;
          end
          else
            result := result + '  *Flagged*';
        end;
      end;
      3: result := GetStartStopText( StartTime, StopTime);
      4:
      begin
        result := MixedCase(ProviderName);
        result := Piece(result, ',', 1) + ',' + Copy(Piece(result, ',', 2), 1, 1);
      end;
      5: result := VerNurse;
      6: result := VerClerk;
      7: result := ChartRev;
      8: result := NameOfStatus(Status);
      9: result := MixedCase(Anorder.OrderLocName);
      //begin AGP change 26.52 display all location for orders.
        //result := MixedCase(Anorder.OrderLocName);
        //if (Index > 0) and (result = TOrder(lstOrders.Items.Objects[Index - 1]).OrderLocName) then result := '';
      //end;
    end;
  end;
end;

procedure TfrmOrders.lstOrdersDrawItem(Control: TWinControl; Index: Integer; TheRect: TRect;
  State: TOwnerDrawState);
var
  i, RightSide: Integer;
  FirstColumnDisplayed: Integer;
  x: string;
  ARect: TRect;
  AnOrder: TOrder;
  SaveColor: TColor;
begin
  inherited;
  with lstOrders do
  begin
    ARect := TheRect;
    if odSelected in State then
    begin
      Canvas.Brush.Color := clHighlight;
      Canvas.Font.Color := clHighlightText
    end;
    Canvas.FillRect(ARect);
    Canvas.Pen.Color := Get508CompliantColor(clSilver);
    Canvas.MoveTo(ARect.Left, ARect.Bottom - 1);
    Canvas.LineTo(ARect.Right, ARect.Bottom - 1);
    RightSide := -2;

    for i := 0 to 9 do
    begin
      RightSide := RightSide + hdrOrders.Sections[i].Width;
      Canvas.MoveTo(RightSide, ARect.Bottom - 1);
      Canvas.LineTo(RightSide, ARect.Top);
    end;

    if Index < Items.Count then
    begin
      AnOrder := TOrder(Items.Objects[Index]);
      if hdrOrders.Sections[0].Text = 'Event' then
        FirstColumnDisplayed := 0
      else
        FirstColumnDisplayed := 1;
      if AnOrder <> nil then with AnOrder do for i := FirstColumnDisplayed to 9 do
      begin
        if i > FirstColumnDisplayed then
          ARect.Left := ARect.Right + 2
        else
          ARect.Left := 2;
        ARect.Right := ARect.Left + hdrOrders.Sections[i].Width - 6;
        x := GetOrderText(AnOrder, Index, i);
        SaveColor := Canvas.Brush.Color;
        if i = FirstColumnDisplayed then
        begin
          if Flagged then
          begin
            Canvas.Brush.Color := Get508CompliantColor(clRed);
            Canvas.FillRect(ARect);
          end;
        end;
        if i = 2 then
        begin
          Canvas.Font.Style := [];
          if Changes.Exist(CH_ORD, AnOrder.ID) then Canvas.Font.Style := [fsBold];
          if not (odSelected in State) and (AnOrder.Signature = OSS_UNSIGNED) then
          begin
            if FHighContrast2Mode then
              Canvas.Font.Color := clBlue
            else
              Canvas.Font.Color := Get508CompliantColor(clBlue);
          end;
        end;
        if (i = 2) or (i = 3) or (i = 0) then
          DrawText(Canvas.Handle, PChar(x), Length(x), ARect, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK)
        else DrawText(Canvas.Handle, PChar(x), Length(x), ARect, DT_LEFT or DT_NOPREFIX );
        Canvas.Brush.Color := SaveColor;
        ARect.Right := ARect.Right + 4;
      end;
    end;
  end;
end;

procedure TfrmOrders.hdrOrdersSectionResize(HeaderControl: THeaderControl; Section: THeaderSection);
begin
  inherited;
  FEvtColWidth := hdrOrders.Sections[0].Width;
  RedrawOrderList;
  lstOrders.Invalidate;
  pnlRight.Refresh;
  pnlLeft.Refresh;
end;

procedure TfrmOrders.lstOrdersDblClick(Sender: TObject);
begin
  inherited;
  mnuViewDetailClick(Self);
end;

{ Writing Orders }

procedure TfrmOrders.lstWriteClick(Sender: TObject);
{ ItemID = DlgIEN;FormID;DGroup;DlgType }
var
  Activated: Boolean;
  NextIndex: Integer;
begin
  if OrderListClickProcessing then Exit;
  OrderListClickProcessing := true;   //Make sure this gets set to false prior to exiting.
  //if PatientStatusChanged then exit;
  if BILLING_AWARE then //CQ5114
     fODConsult.displayDXCode := ''; //CQ5114

  inherited;
  //frmFrame.UpdatePtInfoOnRefresh;
  if not ActiveOrdering then SetConfirmEventDelay;
  NextIndex := lstWrite.ItemIndex;
  if (FCurrentView.EventDelay.PtEventIFN>0) and (PtEvtCompleted(FCurrentView.EventDelay.PtEventIFN, FCurrentView.EventDelay.EventName)) then
  begin
    OrderListClickProcessing := false;
    Exit;
  end;
  if not ReadyForNewOrder(FCurrentView.EventDelay) then
  begin
    lstWrite.ItemIndex := RefNumFor(Self);
    OrderListClickProcessing := false;
    Exit;
  end;

  // don't write delayed orders for non-VA meds:
  if (FCurrentView.EventDelay.EventIFN>0) and (Piece(lstWrite.ItemID,';',2) = '145') then
    begin
      InfoBox('Delayed orders cannot be written for Non-VA Medications.', 'Meds, Non-VA', MB_OK);
      OrderListClickProcessing := false;
      Exit;
    end;

  if (FCurrentView <> nil) and (FCurrentView.EventDelay.EventIFN>0) then
    FRightAfterWriteOrderBox := True;
  lstWrite.ItemIndex := NextIndex;  // (ReadyForNewOrder may reset ItemIndex to -1)
  if FCurrentView <> nil then with FCurrentView.EventDelay do
    if (EventType = 'D') and (Effective = 0) then
      if not ObtainEffectiveDate(Effective) then
      begin
        lstWrite.ItemIndex := -1;
        OrderListClickProcessing := false;
        Exit;
      end;
  if frmFrame.CCOWDrivedChange then begin
    OrderListClickProcessing := false;
    Exit;
  end;
  PositionTopOrder(StrToIntDef(Piece(lstWrite.ItemID, ';', 3), 0));  // position Display Group
  case CharAt(Piece(lstWrite.ItemID, ';', 4), 1) of
  'A':      Activated := ActivateAction(     Piece(lstWrite.ItemID, ';', 1), Self,
                                             lstWrite.ItemIndex);
  'D', 'Q': Activated := ActivateOrderDialog(Piece(lstWrite.ItemID, ';', 1),
                                             FCurrentView.EventDelay, Self, lstWrite.ItemIndex);
  'H':      Activated := ActivateOrderHTML(  Piece(lstWrite.ItemID, ';', 1),
                                             FCurrentView.EventDelay, Self, lstWrite.ItemIndex);
  'M':      Activated := ActivateOrderMenu(  Piece(lstWrite.ItemID, ';', 1),
                                             FCurrentView.EventDelay, Self, lstWrite.ItemIndex);
  'O':      Activated := ActivateOrderSet(   Piece(lstWrite.ItemID, ';', 1),
                                             FCurrentView.EventDelay, Self, lstWrite.ItemIndex);
  else      Activated := not (InfoBox(TX_BAD_TYPE, TC_BAD_TYPE, MB_OK) = IDOK);
  end; {case}
  if not Activated then
  begin
    lstWrite.ItemIndex := -1;
    FRightAfterWriteOrderBox := False;
  end;
  if (lstSheets.ItemIndex > -1) and (Pos('EVT',Piece(lstSheets.Items[lstSheets.ItemIndex],'^',1))>0) then
  begin
    InitOrderSheetsForEvtDelay;
    lstSheets.ItemIndex := 0;
    lstSheetsClick(Self);
  end;
  OrderListClickProcessing := false;
  if (FCurrentView <> nil) and (FCurrentView.EventDelay.PtEventIFN>0) and
    (PtEvtCompleted(FCurrentView.EventDelay.PtEventIFN, FCurrentView.EventDelay.EventName)) then
    Exit;
end;

procedure TfrmOrders.SaveSignOrders;
var
  SaveOrderID: string;
  i: Integer;
begin
  // unlock if able??
  if not PatientViewed then Exit;
  if not frmFrame.ContextChanging then with lstOrders do
  begin
    if (TopIndex < Items.Count) and (TopIndex > -1)
      then SaveOrderID := TOrder(Items.Objects[TopIndex]).ID
      else SaveOrderID := '';
    if lstSheets.ItemIndex > 0 then
      RefreshOrderList(FROM_SERVER,Piece(lstSheets.Items[lstSheets.ItemIndex],'^',1))
    else
      RefreshOrderList(FROM_SERVER);
    if Length(SaveOrderID) > 0 then for i := 0 to Items.Count - 1 do
      if TOrder(Items.Objects[i]).ID = SaveOrderID then TopIndex := i;
  end;
end;

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

procedure TfrmOrders.ValidateSelected(const AnAction, WarningMsg, WarningTitle: string);
{ loop to validate action on each selected order, deselect if not valid }
var
  i: Integer;
  AnOrder: TOrder;
  ErrMsg, AParentID: string;
  GoodList,BadList, CheckedList: TStringList;
begin
  GoodList := TStringList.Create;
  BadList  := TStringList.Create;
  CheckedList := TStringList.Create;
  try
    with lstOrders do for i := 0 to Items.Count - 1 do if Selected[i] then
    begin
      AnOrder := TOrder(Items.Objects[i]);
      if (AnAction = 'RN') and (PassDrugTest(StrtoINT(Piece(AnOrder.ID, ';',1)), 'E', True, True)=True) then
        begin
          ShowMsg('Cannot renew Clozapine orders.');
          Selected[i] := false;
        end;
      if (AnAction = 'RN') and (AnOrder.Status=6) and (AnOrder.DGroupName = 'Inpt. Meds') and (Patient.inpatient) and (IsClinicLoc(Encounter.Location)) then
         begin
           Selected[i] := False;
           MessageDlg('You cannot renew inpatient medication order on a clinic location for selected inpatient.', mtWarning, [mbOK], 0);
         end;
      if ((AnAction = 'RN') or (AnAction = 'EV')) and (AnOrder.EnteredInError = 0) then  //AGP Changes PSI-04053
      begin
        if not IsValidSchedule(AnOrder.ID) then
        begin
          if (AnAction = 'RN') then
            ShowMsg('The order contains invalid schedule and can not be renewed.')
          else if (AnAction = 'EV') then
            ShowMsg('The order contains invalid schedule and can not be changed to event delayed order.');

          Selected[i] := False;
          Continue;
        end;
      end;
      //AGP CHANGE ORDER ENTERED IN ERROR TO ALLOW SIGNATURE AND VERIFY ACTIONS 26.23
      if ((AnOrder.EnteredInError = 1) and ((AnOrder.Status = 1) or (AnOrder.Status = 13)))  and ((AnAction <> 'ES') and (AnAction <> 'VR')) then
         begin
            InfoBox(AnOrder.Text + WarningMsg + 'This order has been mark as Entered in error.', WarningTitle, MB_OK);
            Selected[i] := False;
            Continue;
         end;
      if ((AnAction <> OA_RELEASE) and (AnOrder.EnteredInError = 0)) or (((AnOrder.EnteredInError = 1) and ((AnOrder.Status = 1) or (AnOrder.Status = 13))) and
            (AnAction = 'ES')) then
         ValidateOrderAction(AnOrder.ID, AnAction, ErrMsg)
      //AGP END Changes
        else ErrMsg := '';
      if (Length(ErrMsg)>0) and (Pos('COMPLEX-PSI',ErrMsg)<1) then
      begin
        InfoBox(AnOrder.Text + WarningMsg + ErrMsg, WarningTitle, MB_OK);
        Selected[i] := False;
        Continue;
      end;
      if (Length(ErrMsg)>0) and IsFirstDoseNowOrder(AnOrder.ID) and (AnAction <> 'RL') then
      begin
        InfoBox(AnOrder.Text + WarningMsg + ErrMsg, WarningTitle, MB_OK);
        Selected[i] := False;
        Continue;
      end;
      if (Length(ErrMsg)>0) and ( (AnAction = OA_CHGEVT) or (AnAction = OA_EDREL) ) then
      begin
        InfoBox(AnOrder.Text + WarningMsg + ErrMsg, WarningTitle, MB_OK);
        Selected[i] := False;
        Continue;
      end;
      AParentID := '';
      IsValidActionOnComplexOrder(AnOrder.ID, AnAction,TListBox(lstOrders),CheckedList,ErrMsg, AParentID);
      TOrder(Items.Objects[i]).ParentID := AParentID;
      if (Length(ErrMsg)=0) and (AnAction=OA_EDREL) then
         begin
           if (AnOrder.Signature = 2) and (not VerbTelPolicyOrder(AnOrder.ID)) then
              begin
                ErrMsg := 'Need to be signed first.';
                Selected[i] := False;
              end;
         end;

      if (AnAction = OA_CHGEVT) or (AnAction = OA_EDREL) then
         begin
           if Length(ErrMsg)>0 then
              begin
                Selected[i] := False;
                Badlist.Add(AnOrder.Text + '^' + ErrMsg);
              end
           else
             GoodList.Add(AnOrder.Text);
         end;

      if (Length(ErrMsg) > 0) and (AnAction <> OA_CHGEVT) and (AnAction <> OA_EDREL) then
         begin
           if Pos('COMPLEX-PSI',ErrMsg)>0 then ErrMsg := TX_COMPLEX;
           InfoBox(AnOrder.Text + WarningMsg + ErrMsg, WarningTitle, MB_OK);
           Selected[i] := False;
         end;

      if Selected[i] and (not OrderIsLocked(AnOrder.ID, AnAction)) then Selected[i] := False;

    end; //with

    if ((AnAction = OA_CHGEVT) or (AnAction = OA_EDREL)) then
       begin
        if (BadList.Count = 1) and (GoodList.Count < 1 ) then
          InfoBox(Piece(BadList[0],'^',1) + WarningMsg + Piece(BadList[0],'^',2), WarningTitle, MB_OK);
        if ((BadList.Count >= 1) and (GoodList.Count >= 1)) or ( BadList.Count > 1 )then
          DisplayOrdersForAction(BadList,GoodList,AnAction);
       end;
  finally
    GoodList.Free;
    BadList.Free;
    CheckedList.Free;
  end;
end;

procedure TfrmOrders.MakeSelectedList(AList: TList);
{ make a list of selected orders }
var
  i: Integer;
begin
  with lstOrders do for i := 0 to Items.Count - 1 do
    if Selected[i] then AList.Add(Items.Objects[i]);
end;

function TfrmOrders.NoneSelected(const ErrMsg: string): Boolean;
var
  i: Integer;
begin
  // use if selcount
  Result := True;
  with lstOrders do for i := 0 to Items.Count - 1 do
    if Selected[i] then
    begin
      Result := False;
      Break;
    end;
  if Result then InfoBox(ErrMsg, TC_NOSEL, MB_OK);
end;

procedure TfrmOrders.RemoveSelectedFromChanges(AList: TList);
{ remove from Changes orders that were signed or released }
var
  i: Integer;
begin
  with AList do for i := 0 to Count - 1 do
    with TOrder(Items[i]) do Changes.Remove(CH_ORD, ID);
end;

procedure TfrmOrders.SynchListToOrders;
{ make sure lstOrders now reflects the current state of orders }
var
  i: Integer;
begin
  with lstOrders do for i := 0 to Items.Count - 1 do
  begin
    Items[i] := GetPlainText(TOrder(Items.Objects[i]),i);
    if Selected[i] then Selected[i] := False;
  end;
  lstOrders.Invalidate;
end;

procedure TfrmOrders.mnuActDCClick(Sender: TObject);
{ discontinue/cancel/delete the selected orders (as appropriate for each order }
var
  DelEvt: boolean;
  SelectedList: TList;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  if not AuthorizedUser then Exit;
  if not (FCurrentView.EventDelay.EventIFN>0) then
    if not EncounterPresent then Exit;                    // make sure have provider & location
  if not LockedForOrdering then Exit;
  if (FCurrentView.EventDelay.PtEventIFN>0) and (PtEvtCompleted(FCurrentView.EventDelay.PtEventIFN, FCurrentView.EventDelay.EventName)) then
    Exit;
  SelectedList := TList.Create;
  try
    //if CheckOrderStatus = True then Exit;
    ValidateSelected(OA_DC, TX_NO_DC, TC_NO_DC); // validate DC action on each order
    ActivateDeactiveRenew;   //AGP 26.53 TURN OFF UNTIL FINAL DECISION CAN BE MADE
    MakeSelectedList(SelectedList);                     // build list of orders that remain
    // updating the Changes object happens in ExecuteDCOrders, based on individual order
    if ExecuteDCOrders(SelectedList,DelEvt) then SynchListToOrders;
    UpdateUnsignedOrderAlerts(Patient.DFN);
    with Notifications do
      if Active and (FollowUp = NF_ORDER_REQUIRES_ELEC_SIGNATURE) then
        UnsignedOrderAlertFollowup(Piece(RecordID, U, 2));
    UpdateExpiringMedAlerts(Patient.DFN);
    UpdateUnverifiedMedAlerts(Patient.DFN);
    UpdateUnverifiedOrderAlerts(Patient.DFN);
  finally
    SelectedList.Free;
    UnlockIfAble;
  end;
end;

procedure TfrmOrders.mnuActRelClick(Sender: TObject);
var
  SelectedList: TList;
  ALocation: Integer;
  AName: string;
begin
  inherited;
  if NoneSelected(TX_NOSEL_SIGN) then Exit;
  if not AuthorizedUser then Exit;
  if not CanManualRelease then
  begin
    ShowMsg('You are not authorized to manual release delayed orders.');
    Exit;
  end;
  if Encounter.Location = 0 then                         // location required for ORCSEND
  begin
    LookupLocation(ALocation, AName, LOC_ALL, TX_LOC_PRINT);
    if ALocation > 0 then Encounter.Location := ALocation;
    frmFrame.DisplayEncounterText;
  end;
  if Encounter.Location = 0 then
  begin
    InfoBox(TX_SIGN_LOC, TC_REQ_LOC, MB_OK or MB_ICONWARNING);
    Exit;
  end;
  if not LockedForOrdering then Exit;
  SelectedList := TList.Create;
  try
    ValidateSelected(OA_EDREL, TX_NO_REL, TC_NO_REL);  // validate realease action on each order
    MakeSelectedList(SelectedList);
    if SelectedList.Count=0 then
      Exit;
    //ExecuteReleaseOrderChecks(SelectedList);
    if not ExecuteReleaseEventOrders(SelectedList) then
      Exit;
    UpdateExpiringMedAlerts(Patient.DFN);
    UpdateUnverifiedMedAlerts(Patient.DFN);
    UpdateUnverifiedOrderAlerts(Patient.DFN);
    FCompress := True;
    SendMessage(Application.MainForm.Handle, UM_NEWORDER, ORDER_SIGN, 0);
  finally
    SelectedList.Free;
    UnlockIfAble;
  end;
end;

procedure TfrmOrders.mnuActChgEvntClick(Sender: TObject);
var
  SelectedList :TList;
  DoesDestEvtOccur: boolean;
  DestPtEvtID: integer;
  DestPtEvtName: string;
begin
  inherited;
  if not EncounterPresentEDO then Exit;
  if NoneSelected(TX_NOSEL) then Exit;
  if not AuthorizedUser then Exit;
  if not LockedForOrdering then Exit;
  //if (FCurrentView.EventDelay.PtEventIFN>0) and (PtEvtCompleted(FCurrentView.EventDelay.PtEventIFN, FCurrentView.EventDelay.EventName)) then
  //  Exit;
  DoesDestEvtOccur := False;
  DestPtEvtID := 0;
  DestPtEvtName := '';
  SelectedList := TList.Create;
  try
    if CheckOrderStatus = True then Exit;
    ValidateSelected(OA_CHGEVT, TX_NO_CV, TC_NO_CV);   // validate Change Event action on each order
    MakeSelectedList(SelectedList);                     // build list of orders that remain
    if ExecuteChangeEvt(SelectedList,DoesDestEvtOccur,DestPtEvtId,DestPtEvtName) then
      SynchListToOrders
    else
      Exit;
    UpdateUnsignedOrderAlerts(Patient.DFN);
    with Notifications do
      if Active and (FollowUp = NF_ORDER_REQUIRES_ELEC_SIGNATURE) then
        UnsignedOrderAlertFollowup(Piece(RecordID, U, 2));
    UpdateExpiringMedAlerts(Patient.DFN);
    UpdateUnverifiedMedAlerts(Patient.DFN);
    UpdateUnverifiedOrderAlerts(Patient.DFN);
  finally
    SelectedList.Free;
    UnlockIfAble;
    if DoesDestEvtOccur then
      PtEvtCompleted(DestPtEvtID,DestPtEvtName);
  end;
end;

procedure TfrmOrders.mnuActHoldClick(Sender: TObject);
{ place the selected orders on hold, creates new orders }
var
  SelectedList: TList;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  if not AuthorizedUser then Exit;
  if not EncounterPresent then Exit;                    // make sure have provider & location
  if not LockedForOrdering then Exit;
  if (FCurrentView.EventDelay.PtEventIFN>0) and (PtEvtCompleted(FCurrentView.EventDelay.PtEventIFN, FCurrentView.EventDelay.EventName)) then
    Exit;
  SelectedList := TList.Create;
  try
    if CheckOrderStatus = True then Exit;
    ValidateSelected(OA_HOLD, TX_NO_HOLD, TC_NO_HOLD);  // validate hold action on each order
    MakeSelectedList(SelectedList);                     // build list of orders that remain
    if ExecuteHoldOrders(SelectedList) then             // confirm & perform hold
    begin
      AddSelectedToChanges(SelectedList);               // send held orders to changes
      SynchListToOrders;                                // ensure ID's in lstOrders are correct
    end;
  finally
    SelectedList.Free;
    UnlockIfAble;
  end;
end;

procedure TfrmOrders.mnuActUnholdClick(Sender: TObject);
{ release orders from hold, no signature required - no new orders created }
var
  SelectedList: TList;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  if not AuthorizedUser then Exit;
  if not EncounterPresent then Exit;
  if not LockedForOrdering then Exit;
  SelectedList := TList.Create;
  try
    if CheckOrderStatus = True then Exit;
    ValidateSelected(OA_UNHOLD, TX_NO_UNHOLD, TC_NO_UNHOLD);  // validate release hold action
    MakeSelectedList(SelectedList);                           // build list of selected orders
    if ExecuteUnholdOrders(SelectedList) then
    begin
      AddSelectedToChanges(SelectedList);
      SynchListToOrders;
    end;
  finally
    SelectedList.Free;
    UnlockIfAble;
  end;
end;

procedure TfrmOrders.mnuActRenewClick(Sender: TObject);
{ renew the selected orders (as appropriate for each order }
var
  SelectedList: TList;
  ParntOrder: TOrder;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  if not AuthorizedUser then Exit;
  if not EncounterPresent then Exit;                       // make sure have provider & location
  if not LockedForOrdering then Exit;
  SelectedList := TList.Create;
  try
    if CheckOrderStatus = True then Exit;
    ValidateSelected(OA_RENEW, TX_NO_RENEW, TC_NO_RENEW);  // validate renew action for each
    MakeSelectedList(SelectedList);                       // build list of orders that remain
    if Length(FParentComplexOrderID)>0 then
    begin
      ParntOrder := GetOrderByIFN(FParentComplexOrderID);
      if CharAt(ParntOrder.Text,1)='+' then
        ParntOrder.Text := Copy(ParntOrder.Text,2,Length(ParntOrder.Text));
      if Pos('First Dose NOW',ParntOrder.Text)>1 then
        Delete(ParntOrder.text, Pos('First Dose NOW',ParntOrder.Text), Length('First Dose NOW'));
      SelectedList.Add(ParntOrder);
      FParentComplexOrderID := '';
    end;
    if ExecuteRenewOrders(SelectedList) then
    begin
      AddSelectedToChanges(SelectedList);  // should this happen in ExecuteRenewOrders?
      SynchListToOrders;
    end;
    UpdateExpiringMedAlerts(Patient.DFN);
  finally
    SelectedList.Free;
    UnlockIfAble;
  end;
end;

procedure TfrmOrders.mnuActAlertClick(Sender: TObject);
{ set selected orders to send alerts when results are available, - no new orders created }
var
  SelectedList: TList;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  if not AuthorizedUser then Exit;
  SelectedList := TList.Create;
  try
    ValidateSelected(OA_ALERT, TX_NO_ALERT, TC_NO_ALERT);     // validate release hold action
    MakeSelectedList(SelectedList);                           // build list of selected orders
    ExecuteAlertOrders(SelectedList);
  finally
    SelectedList.Free;
  end;
end;

procedure TfrmOrders.mnuActFlagClick(Sender: TObject);
var
  i: Integer;
  AnOrder: TOrder;
  ErrMsg: string;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  if not AuthorizedUser then Exit;
  if (FCurrentView.EventDelay.PtEventIFN>0) and (PtEvtCompleted(FCurrentView.EventDelay.PtEventIFN, FCurrentView.EventDelay.EventName)) then
    Exit;
  with lstOrders do for i := 0 to Items.Count - 1 do if Selected[i] then
  begin
    AnOrder := TOrder(Items.Objects[i]);
    ValidateOrderAction(AnOrder.ID, OA_FLAG, ErrMsg);
    if Length(ErrMsg) > 0
      then InfoBox(AnOrder.Text + TX_NO_FLAG + ErrMsg, TC_NO_FLAG, MB_OK)
      else ExecuteFlagOrder(AnOrder);
    Selected[i] := False;
  end;
  lstOrders.Invalidate;
end;

procedure TfrmOrders.mnuActUnflagClick(Sender: TObject);
var
  i: Integer;
  AnOrder: TOrder;
  ErrMsg: string;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  if not AuthorizedUser then Exit;
  with lstOrders do for i := 0 to Items.Count - 1 do if Selected[i] then
  begin
    AnOrder := TOrder(Items.Objects[i]);
    ValidateOrderAction(AnOrder.ID, OA_UNFLAG, ErrMsg);
    if Length(ErrMsg) > 0
      then InfoBox(AnOrder.Text + TX_NO_UNFLAG + ErrMsg, TC_NO_UNFLAG, MB_OK)
      else ExecuteUnflagOrder(AnOrder);
    Selected[i] := False;
  end;
  lstOrders.Invalidate;
  if Notifications.Active then AutoUnflagAlertedOrders(Patient.DFN, Piece(Notifications.RecordID, U, 2));
end;

procedure TfrmOrders.mnuActCompleteClick(Sender: TObject);
{ complete generic orders, no signature required - no new orders created }
var
  SelectedList: TList;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  if not AuthorizedUser then Exit;
  SelectedList := TList.Create;
  try
    ValidateSelected(OA_COMPLETE, TX_NO_CPLT, TC_NO_CPLT);    // validate completing of order
    MakeSelectedList(SelectedList);                           // build list of selected orders
    if ExecuteCompleteOrders(SelectedList) then SynchListToOrders;
  finally
    SelectedList.Free;
  end;
end;

procedure TfrmOrders.mnuActVerifyClick(Sender: TObject);
{ verify orders, signature required but no new orders created }
var
  SelectedList: TList;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  if not AuthorizedToVerify then Exit;
  SelectedList := TList.Create;
  try
    ValidateSelected(OA_VERIFY, TX_NO_VERIFY, TC_NO_VERIFY);  // make sure order can be verified
    MakeSelectedList(SelectedList);                           // build list of selected orders
    if ExecuteVerifyOrders(SelectedList, False) then SynchListToOrders;
  finally
    SelectedList.Free;
  end;
end;

procedure TfrmOrders.mnuActChartRevClick(Sender: TObject);
var
  SelectedList: TList;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  if not AuthorizedToVerify then Exit;
  SelectedList := TList.Create;
  try
    ValidateSelected(OA_CHART, TX_NO_VERIFY, TC_NO_VERIFY);   // make sure order can be verified
    MakeSelectedList(SelectedList);                           // build list of selected orders
    if ExecuteVerifyOrders(SelectedList, True) then SynchListToOrders;
  finally
    SelectedList.Free;
  end;
end;

procedure TfrmOrders.mnuActCommentClick(Sender: TObject);
{ loop thru selected orders, allowing ward comments to be edited for each }
var
  i: Integer;
  AnOrder: TOrder;
  ErrMsg: string;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  if not AuthorizedUser then Exit;
  if (FCurrentView.EventDelay.PtEventIFN>0) and (PtEvtCompleted(FCurrentView.EventDelay.PtEventIFN, FCurrentView.EventDelay.EventName)) then
    Exit;
  with lstOrders do for i := 0 to Items.Count - 1 do if Selected[i] then
  begin
    AnOrder := TOrder(Items.Objects[i]);
    ValidateOrderAction(AnOrder.ID, OA_COMMENT, ErrMsg);
    if Length(ErrMsg) > 0
      then InfoBox(AnOrder.Text + TX_NO_CMNT + ErrMsg, TC_NO_CMNT, MB_OK)
      else ExecuteWardComments(AnOrder);
    Selected[i] := False;
  end;
end;

procedure TfrmOrders.mnuActChangeClick(Sender: TObject);
{ loop thru selected orders, present ordering dialog for each with defaults to selected order }
var
  i: Integer;
  ChangeIFNList: TStringList;
  ASourceOrderID : string;
begin

  inherited;
  if not EncounterPresentEDO then exit;
  ChangeIFNList := TStringList.Create;
  try
    if NoneSelected(TX_NOSEL) then Exit;
    if CheckOrderStatus = True then Exit;
    ValidateSelected(OA_CHANGE, TX_NO_CHANGE, TC_NO_CHANGE);
    if (FCurrentView.EventDelay.PtEventIFN>0) and
      PtEvtCompleted(FCurrentView.EventDelay.PtEventIFN, FCurrentView.EventDelay.EventName) then
        Exit;
    with lstOrders do for i := 0 to Items.Count - 1 do
      if Selected[i] then
      begin
        ChangeIFNList.Add(TOrder(Items.Objects[i]).ID);
        ASourceOrderID := TOrder(lstOrders.Items.Objects[i]).ID;
      end;
    if ChangeIFNList.Count > 0 then
      ChangeOrders(ChangeIFNList, FCurrentView.EventDelay);
    // do we need to deselect the orders?
   finally
    ChangeIFNList.Free;
  end;
  if frmFrame.TimedOut then Exit;
  RedrawOrderList;
end;

procedure TfrmOrders.mnuActCopyClick(Sender: TObject);
{ loop thru selected orders, present ordering dialog for each with defaults to selected order }
var
  ThePtEvtID: string;
  i: Integer;
  IsNewEvent, needVerify, NewOrderCreated: boolean;
  CopyIFNList: TStringList;
  DestPtEvtID: integer;
  DestPtEvtName: string;
  DoesDestEvtOccur: boolean;
  TempEvent: TOrderDelayEvent;
begin
  inherited;
  if not EncounterPresentEDO then Exit;
  DestPtEvtID := 0;
  DestPtEvtName := '';
  DoesDestEvtOccur := False;
  needVerify := True;
  CopyIFNList := TStringList.Create;
  try
    if NoneSelected(TX_NOSEL) then Exit;
    NewOrderCreated := False;
    if CheckOrderStatus = True then Exit;
    ValidateSelected(OA_COPY, TX_NO_COPY, TC_NO_COPY);
    if (FCurrentView.EventDelay.PtEventIFN>0) and (PtEvtCompleted(FCurrentView.EventDelay.PtEventIFN, FCurrentView.EventDelay.EventName)) then
      Exit;
    with lstOrders do for i := 0 to Items.Count - 1 do
      if Selected[i] then
        CopyIFNList.Add(TOrder(Items.Objects[i]).ID);

    IsNewEvent := False;
    //if not ShowMsgOn(CopyIFNList.Count = 0, TX_NOSEL, TC_NOSEL) then
    if CopyIFNList.Count > 0 then
      if SetViewForCopy(IsNewEvent,DoesDestEvtOccur,DestPtEvtId,DestPtEvtName) then
      begin
        if DoesDestEvtOccur then
        begin
          TempEvent.TheParent := TParentEvent.Create;
          TempEvent.EventIFN := 0;
          TempEvent.PtEventIFN := 0;
          TempEvent.EventType := #0;
          CopyOrders(CopyIFNList, TempEvent, DoesDestEvtOccur, needVerify);
          if ImmdCopyAct then
            ImmdCopyAct := False;
          PtEvtCompleted(DestPtEvtID,DestPtEvtName);
          Exit;
        end;
        FCurrentView.EventDelay.EventName := DestPtEvtName;
        if (FCurrentView.EventDelay.EventIFN > 0) and (FCurrentView.EventDelay.EventType <> 'D') then
        begin
          needVerify := False;
          uAutoAC := True;
        end;
        TempEvent.EventName := DestPtEvtName;  //FCurrentView.EventDelay.EventName;
        TempEvent.PtEventIFN := DestPtEvtId; //FCurrentView.EventDelay.PtEventIFN;
        if (FCurrentView.EventDelay.EventType = 'D') or ((not Patient.InPatient) and (FCurrentView.EventDelay.EventType = 'T')) then
        begin
          if TransferOrders(CopyIFNList, FCurrentView.EventDelay, DoesDestEvtOccur, needVerify) then NewOrderCreated := True;
        end
        else if (not Patient.Inpatient) and (FCurrentView.EventDelay.EventType = 'A') then
        begin
          if TransferOrders(CopyIFNList, FCurrentView.EventDelay, DoesDestEvtOccur, needVerify) then NewOrderCreated := True;
        end
        else
           begin
             if CopyOrders(CopyIFNList, FCurrentView.EventDelay, DoesDestEvtOccur, needVerify) then
              NewOrderCreated := True;
           end;
        if (not NewOrderCreated) and Assigned(FCurrentView) and (FCurrentView.EventDelay.EventIFN>0) then
          if isExistedEvent(Patient.DFN,IntToStr(FCurrentView.EventDelay.EventIFN),ThePtEvtID) then
          begin
            if PtEvtEmpty(ThePtEvtID) then
            begin
              DeletePtEvent(ThePtEvtID);
              ChangesUpdate(ThePtEvtID);
              InitOrderSheetsForEvtDelay;
              lstSheets.ItemIndex := 0;
              lstSheetsClick(self);
            end;
          end;
        if ImmdCopyAct then
          ImmdCopyAct := False;
        if DoesDestEvtOccur then
          PtEvtCompleted(DestPtEvtId, DestPtEvtName);
      end;
   finally
    uAutoAC := False;
    CopyIFNList.Free;
  end;

end;

procedure TfrmOrders.mnuActReleaseClick(Sender: TObject);
{ release orders to services without a signature, do appropriate prints }
var
  SelectedList: TList;
  ALocation: Integer;
  AName: string;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  if not AuthorizedUser then Exit;
  if Encounter.Location = 0 then                         // location required for ORCSEND
  begin
    LookupLocation(ALocation, AName, LOC_ALL, TX_LOC_PRINT);
    if ALocation > 0 then Encounter.Location := ALocation;
    frmFrame.DisplayEncounterText;
  end;
  if Encounter.Location = 0 then
  begin
    InfoBox(TX_REL_LOC, TC_REQ_LOC, MB_OK or MB_ICONWARNING);
    Exit;
  end;
  if not LockedForOrdering then Exit;
  SelectedList := TList.Create;
  try
    ValidateSelected(OA_RELEASE, TX_NO_REL, TC_NO_REL);  // validate release action on each order
    MakeSelectedList(SelectedList);                      // build list of orders that remain
    ExecuteReleaseOrderChecks(SelectedList);             // call order checking
    if not uInit.TimedOut then
      if ExecuteReleaseOrders(SelectedList) then           // confirm, then perform release
        RemoveSelectedFromChanges(SelectedList);           // remove released orders from Changes
    //SaveSignOrders;
    UpdateUnsignedOrderAlerts(Patient.DFN);
    with Notifications do
      if Active and (FollowUp = NF_ORDER_REQUIRES_ELEC_SIGNATURE) then
        UnsignedOrderAlertFollowup(Piece(RecordID, U, 2));
    UpdateExpiringMedAlerts(Patient.DFN);
    UpdateUnverifiedMedAlerts(Patient.DFN);
    UpdateUnverifiedOrderAlerts(Patient.DFN);
    if not uInit.TimedOut then SendMessage(Application.MainForm.Handle, UM_NEWORDER, ORDER_SIGN, 0);
  finally
    SelectedList.Free;
    UnlockIfAble;
  end;
end;

procedure TfrmOrders.mnuActOnChartClick(Sender: TObject);
{ mark orders orders as signed on chart, release to services, do appropriate prints }
var
  SelectedList: TList;
  ALocation: Integer;
  AName: string;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  if not AuthorizedUser then Exit;
  if Encounter.Location = 0 then                         // location required for ORCSEND
  begin
    LookupLocation(ALocation, AName, LOC_ALL, TX_LOC_PRINT);
    if ALocation > 0 then Encounter.Location := ALocation;
    frmFrame.DisplayEncounterText;
  end;
  if Encounter.Location = 0 then
  begin
    InfoBox(TX_CHART_LOC, TC_REQ_LOC, MB_OK or MB_ICONWARNING);
    Exit;
  end;
  if not LockedForOrdering then Exit;
  SelectedList := TList.Create;
  try
    ValidateSelected(OA_ONCHART, TX_NO_CHART, TC_NO_CHART);  // validate sign on chart for each
    MakeSelectedList(SelectedList);                      // build list of orders that remain
    ExecuteReleaseOrderChecks(SelectedList);             // call order checking
    if not uInit.TimedOut then
      if ExecuteOnChartOrders(SelectedList) then           // confirm, then perform release
        RemoveSelectedFromChanges(SelectedList);           // remove released orders from Changes
    UpdateUnsignedOrderAlerts(Patient.DFN);
    with Notifications do
      if Active and (FollowUp = NF_ORDER_REQUIRES_ELEC_SIGNATURE) then
        UnsignedOrderAlertFollowup(Piece(RecordID, U, 2));
    UpdateExpiringMedAlerts(Patient.DFN);
    UpdateUnverifiedMedAlerts(Patient.DFN);
    UpdateUnverifiedOrderAlerts(Patient.DFN);
    if not uInit.TimedOut then SendMessage(Application.MainForm.Handle, UM_NEWORDER, ORDER_SIGN, 0);
  finally
    SelectedList.Free;
    UnlockIfAble;
  end;
end;

procedure TfrmOrders.mnuActSignClick(Sender: TObject);
{ obtain signature for orders, release them to services, do appropriate prints }
var
  SelectedList: TList;
  ALocation: Integer;
  AName: string;
begin
  inherited;
  if NoneSelected(TX_NOSEL_SIGN) then Exit;
  if not AuthorizedUser then Exit;
  if (User.OrderRole <> 2) and (User.OrderRole <> 3) then
  begin
    ShowMsg('Sorry, You don''t have the permission to release selected orders manually');
    Exit;
  end;
  if not (FCurrentView.EventDelay.EventIFN>0) then
  begin
    if Encounter.Location = 0 then                         // location required for ORCSEND
    begin
      LookupLocation(ALocation, AName, LOC_ALL, TX_LOC_PRINT);
      if ALocation > 0 then Encounter.Location := ALocation;
      frmFrame.DisplayEncounterText;
    end;
    if Encounter.Location = 0 then
    begin
      InfoBox(TX_SIGN_LOC, TC_REQ_LOC, MB_OK or MB_ICONWARNING);
      Exit;
    end;
  end;
  if not LockedForOrdering then Exit;

  if (FCurrentView.EventDelay.PtEventIFN>0) and (PtEvtCompleted(FCurrentView.EventDelay.PtEventIFN, FCurrentView.EventDelay.EventName)) then
    Exit;

  SelectedList := TList.Create;
  try
    ValidateSelected(OA_SIGN, TX_NO_SIGN, TC_NO_SIGN);  // validate sign action on each order
    MakeSelectedList(SelectedList);
    {billing Aware}
    if BILLING_AWARE then
    begin
       UBACore.rpcBuildSCIEList(SelectedList);   // build list of orders and Billable Status
       UBACore.CompleteUnsignedBillingInfo(rpcGetUnsignedOrdersBillingData(OrderListSCEI) );
    end;

   {billing Aware}
    ExecuteReleaseOrderChecks(SelectedList);            // call order checking
    if not uInit.TimedOut then
      if ExecuteSignOrders(SelectedList)                  // confirm, sign & release
        then RemoveSelectedFromChanges(SelectedList);     // remove signed orders from Changes
    UpdateUnsignedOrderAlerts(Patient.DFN);
    with Notifications do
      if Active and (FollowUp = NF_ORDER_REQUIRES_ELEC_SIGNATURE) then
        UnsignedOrderAlertFollowup(Piece(RecordID, U, 2));
      if Active then
      begin
        UpdateExpiringMedAlerts(Patient.DFN);
        UpdateUnverifiedMedAlerts(Patient.DFN);
        UpdateUnverifiedOrderAlerts(Patient.DFN);
      end;
    if not uInit.TimedOut then
      begin
        SendMessage(Application.MainForm.Handle, UM_NEWORDER, ORDER_SIGN, 0);
        if lstSheets.ItemIndex < 0 then
          lstSheets.ItemIndex := 0;
      end;
  finally
    SelectedList.Free;
    UnlockIfAble;
  end;
end;

procedure TfrmOrders.mnuOptSaveQuickClick(Sender: TObject);
begin
  inherited;
  QuickOrderSave;
end;

procedure TfrmOrders.mnuOptEditCommonClick(Sender: TObject);
begin
  inherited;
  QuickOrderListEdit;
end;

procedure TfrmOrders.ProcessNotifications;
var
  OrderIEN, ErrMsg: string;
  BigOrderID: string;
begin
    //if not User.NoOrdering then LoadWriteOrders(lstWrite.Items) else lstWrite.Clear; {**KCM**}
    OrderIEN := IntToStr(ExtractInteger(Notifications.AlertData));
    case Notifications.FollowUp of
      NF_FLAGGED_ORDERS                :
        begin
          ViewAlertedOrders('', STS_FLAGGED, '', False, True, 'All Services, Flagged');
          AutoUnflagAlertedOrders(Patient.DFN, Piece(Notifications.RecordID, U, 2));
        end;
      NF_ORDER_REQUIRES_ELEC_SIGNATURE :
        begin
          ViewAlertedOrders('', STS_UNSIGNED, '', False, True, 'All Services, Unsigned');
          UnsignedOrderAlertFollowup(Piece(Notifications.RecordID, U, 2));
        end;
      NF_IMAGING_REQUEST_CANCEL_HELD   :
        if Pos('HELD', UpperCase(Notifications.Text)) > 0 then
          begin
            ViewAlertedOrders(OrderIEN, STS_HELD, 'IMAGING', False, True, 'Imaging, On Hold');
            Notifications.Delete;
          end
        else
          begin
            ViewAlertedOrders(OrderIEN, STS_DISCONTINUED, 'IMAGING', False, True, 'Imaging, Cancelled');
            Notifications.Delete;
          end;
      NF_SITE_FLAGGED_RESULTS       :
        begin
          ViewAlertedOrders(OrderIEN, STS_COMPLETE, '', False, True, 'All Services, Site-Flagged');
          with lstOrders do if Selected[ItemIndex] then
          begin
            BigOrderID := TOrder(Items.Objects[ItemIndex]).ID;
            if Length(Piece(BigOrderID,';',1)) > 0 then
            begin
              ReportBox(ResultOrder(BigOrderID), 'Order Results - ' + BigOrderID, True);
              Notifications.Delete;
            end;
          end;
        end;
      NF_ORDERER_FLAGGED_RESULTS       :
        begin
          ViewAlertedOrders(OrderIEN, STS_COMPLETE, '', False, True, 'All Services, Orderer-Flagged');
          with lstOrders do if Selected[ItemIndex] then
          begin
            BigOrderID := TOrder(Items.Objects[ItemIndex]).ID;
            if Length(Piece(BigOrderID,';',1)) > 0 then
            begin
              ReportBox(ResultOrder(BigOrderID), 'Order Results - ' + BigOrderID, True);
              Notifications.Delete;
            end;
          end;
        end;
      NF_ORDER_REQUIRES_COSIGNATURE    :
        ViewAlertedOrders('', STS_UNSIGNED, '', False, True, 'All Services, Unsigned');
      NF_LAB_ORDER_CANCELED            :
        begin
          ViewAlertedOrders(OrderIEN, STS_DISCONTINUED, 'LABORATORY', False, True, 'Lab, Cancelled');
          Notifications.Delete;
        end;
      NF_DNR_EXPIRING                  :
        ViewAlertedOrders('', STS_EXPIRING, '', False, True, 'All Services, Expiring');
      NF_MEDICATIONS_EXPIRING_INPT          :
        begin
          ViewAlertedOrders('', STS_EXPIRING, 'PHARMACY', False, True, 'Medications, Expiring');
        end;
      NF_MEDICATIONS_EXPIRING_OUTPT          :
        begin
          ViewAlertedOrders('', STS_EXPIRING, 'PHARMACY', False, True, 'Medications, Expiring');
        end;
      NF_UNVERIFIED_MEDICATION_ORDER   :
        begin
          ViewAlertedOrders(OrderIEN, STS_UNVERIFIED, 'PHARMACY', False, True, 'Medications, Unverified');
          if StrToIntDef(OrderIEN, 0) > 0 then    {**REV**}
            begin       // Delete alert if user can't verify
              ValidateOrderAction(OrderIEN, OA_VERIFY, ErrMsg);
              if Pos('COMPLEX-PSI',ErrMsg)>0 then
                ErrMsg := TX_COMPLEX;
              if Length(ErrMsg) > 0 then Notifications.Delete;
            end;
          UpdateUnverifiedMedAlerts(Patient.DFN);
        end;
      NF_NEW_ORDER                     :
        begin
          ViewAlertedOrders(OrderIEN, STS_RECENT, '',  False, True, 'All Services, Recent Activity');
          Notifications.Delete;
        end;
      NF_UNVERIFIED_ORDER              :
        begin
          ViewAlertedOrders(OrderIEN, STS_UNVERIFIED, '',  False, True, 'All Services, Unverified');
          if StrToIntDef(OrderIEN, 0) > 0 then    {**REV**}
            begin       // Delete alert if user can't verify
              ValidateOrderAction(OrderIEN, OA_SIGN, ErrMsg);
              if Pos('COMPLEX-PSI',ErrMsg)>0 then
                ErrMsg := TX_COMPLEX;
              if Length(ErrMsg) > 0 then Notifications.Delete;
            end;
          UpdateUnverifiedOrderAlerts(Patient.DFN);
        end;
      NF_FLAGGED_OI_RESULTS       :
        begin
          ViewAlertedOrders(OrderIEN, STS_COMPLETE, '', False, True, 'All Services, Orderable Item Flagged');
          with lstOrders do if Selected[ItemIndex] then
          begin
            BigOrderID := TOrder(Items.Objects[ItemIndex]).ID;
            if Length(Piece(BigOrderID,';',1)) > 0 then
            begin
              ReportBox(ResultOrder(BigOrderID), 'Order Results - ' + BigOrderID, True);
              Notifications.Delete;
            end;
          end;
        end;
      NF_DC_ORDER                      :
        begin
          ViewAlertedOrders(OrderIEN, STS_RECENT, '',  False, True, 'All Services, Recent Activity');
          Notifications.Delete;
        end;
      NF_FLAGGED_OI_EXP_INPT           :
        begin
          ViewAlertedOrders('', STS_EXPIRING, '', False, True, 'All Services, Expiring');
          UpdateExpiringFlaggedOIAlerts(Patient.DFN, NF_FLAGGED_OI_EXP_INPT);
        end;
      NF_FLAGGED_OI_EXP_OUTPT          :
        begin
          ViewAlertedOrders('', STS_EXPIRING, '', False, True, 'All Services, Expiring');
          UpdateExpiringFlaggedOIAlerts(Patient.DFN, NF_FLAGGED_OI_EXP_OUTPT);
        end;
      NF_CONSULT_REQUEST_CANCEL_HOLD   :
        begin
          OrderIEN := GetConsultOrderNumber(Notifications.AlertData);
          ViewAlertedOrders(OrderIEN, STS_DISCONTINUED, 'CONSULTS',  False, True, 'Consults, Cancelled');
          with lstOrders do Selected[ItemIndex] := True;
        end;
    else mnuViewUnsignedClick(Self);
    end;
end;

procedure TfrmOrders.ViewAlertedOrders(OrderIEN: string; Status: integer; DispGrp: string;
          BySvc, InvDate: boolean; Title: string);  {**KCM**}
var
  i, ADGroup: integer;
  DGroups: TStrings;
begin
  DGroups := TStringList.Create;
  try
    ADGroup := DGroupAll;
    if Length(DispGrp) > 0 then
      begin
        ListDGroupAll(DGroups);
        for i := 0 to DGroups.Count-1 do
          if Piece(DGroups.Strings[i], U, 2) = DispGrp then
            ADGroup := StrToIntDef(Piece(DGroups.Strings[i], U, 1),0);
      end;
  finally
    DGroups.Free;
  end;
  SetOrderView(Status, ADGroup, Title, True);
  with lstOrders do
    begin
      if Length(OrderIEN) > 0 then
        begin
          for i := 0 to Items.Count-1 do
            if Piece(TOrder(Items.Objects[i]).ID, ';', 1) = OrderIEN then
              begin
                ItemIndex := i;
                Selected[i] := True;
                break;
              end;
        end
      else for i := 0 to Items.Count-1 do
        if Piece(TOrder(Items.Objects[i]).ID, ';', 1) <> '0' then Selected[i] := True;
      if SelCount = 0 then Notifications.Delete;
    end;
end;

procedure TfrmOrders.pnlRightResize(Sender: TObject);
begin
  inherited;
  imgHide.Left := pnlRight.Width - 19;
end;

procedure TfrmOrders.RequestPrint;
{ obtain print devices for selected orders, do appropriate prints }
const
  TX_NEW_LOC1   = 'The patient''s location has changed to ';
  TX_NEW_LOC2   = '.' + CRLF + 'Should the orders be printed using the new location?';
  TC_NEW_LOC    = 'New Patient Location';
var
  SelectedList: TStringList;
  ALocation, i: Integer;
  AName, ASvc, DeviceInfo: string;
  Nature: char;
  PrintIt: Boolean;
begin
  inherited;
  if NoneSelected(TX_NOSEL) then Exit;
  //if not AuthorizedUser then Exit;   removed in v17.1 (RV) SUX-0901-41044
  SelectedList := TStringList.Create;
  Nature := #0;
  try
    with lstOrders do for i := 0 to Items.Count - 1 do
      if Selected[i] then SelectedList.Add(Piece(TOrder(Items.Objects[i]).ID, U, 1));
    CurrentLocationForPatient(Patient.DFN, ALocation, AName, ASvc);
    if (ALocation > 0) and (ALocation <> Encounter.Location) then
    begin
    //gary
      Encounter.Location := frmClinicWardMeds.ClinicOrWardLocation(Alocation);
   //   if InfoBox(TX_NEW_LOC1 + AName + TX_NEW_LOC2, TC_NEW_LOC, MB_YESNO) = IDYES
   //     then Encounter.Location := ALocation;
    end;
    if Encounter.Location = 0
      then Encounter.Location := CommonLocationForOrders(SelectedList);
    if Encounter.Location = 0 then                      // location required for DEVINFO
    begin
      LookupLocation(ALocation, AName, LOC_ALL, TX_LOC_PRINT);
      if ALocation > 0 then Encounter.Location := ALocation;
    end;
    frmFrame.DisplayEncounterText;
    if Encounter.Location <> 0 then
      begin
        SetupOrdersPrint(SelectedList, DeviceInfo, Nature, False, PrintIt);
        if PrintIt then ExecutePrintOrders(SelectedList, DeviceInfo);
        SynchListToOrders;
      end
    else InfoBox(TX_PRINT_LOC, TC_REQ_LOC, MB_OK or MB_ICONWARNING);
  finally
    SelectedList.Free;
  end;
end;

procedure TfrmOrders.btnDelayedOrderClick(Sender: TObject);
const
  TX_DELAYCAP = '  Delay release of new order(s) until';
var
  AnEvent: TOrderDelayEvent;
  ADlgLst: TStringList;
  IsRealeaseNow:   boolean;
begin
  inherited;
  if not EncounterPresentEDO then Exit;
  AnEvent.EventType := #0;
  AnEvent.TheParent := TParentEvent.Create;
  AnEvent.EventIFN := 0;
  AnEvent.PtEventIFN := 0;
  AnEvent.EventName  := '';
  if not CloseOrdering then Exit;
  FCalledFromWDO := True;
  //frmFrame.UpdatePtInfoOnRefresh;
  IsRealeaseNow  := False;
  FCompress := True;    //treat as lstSheet click
  ADlgLst := TStringList.Create;
  //SetEvtIFN(AnEvent.EventIFN);
  if ShowDelayedEventsTreatingSepecialty(TX_DELAYCAP,AnEvent,ADlgLst,IsRealeaseNow) then
  begin
    FEventForCopyActiveOrders := AnEvent;
    FAskForCancel := False;
    ResetOrderPage(AnEvent,ADlgLst, IsRealeaseNow);
  end;
  FCompress := False;
  FCalledFromWDO := False;
  if (FCurrentView <> nil) and (FCurrentView.EventDelay.PtEventIFN>0) and
    (PtEvtCompleted(FCurrentView.EventDelay.PtEventIFN, FCurrentView.EventDelay.EventName)) then
    Exit;
end;

procedure TfrmOrders.CompressEventSection;
begin
   hdrOrders.Sections[0].MaxWidth := 0;
   hdrOrders.Sections[0].MinWidth := 0;
   hdrOrders.Sections[0].Width    := 0;
   hdrOrders.Sections[0].Text     := '';
end;

procedure TfrmOrders.ExpandEventSection;
begin
  hdrOrders.Sections[0].MaxWidth := 10000;
  hdrOrders.Sections[0].MinWidth := 50;
  if FEvtColWidth > 0 then
    hdrOrders.Sections[0].Width    := EvtColWidth
  else
    hdrOrders.Sections[0].Width    := 65;
  hdrOrders.Sections[0].Text     := 'Event';
end;

{procedure TfrmOrders.SetEvtIFN(var AnEvtIFN: integer);
var
  APtEvntID,AnEvtInfo: string;
begin
  if lstSheets.ItemIndex < 0 then
    APtEvntID := Piece(lstSheets.Items[0],'^',1)
  else
    APtEvntID := Piece(lstSheets.Items[lstSheets.ItemIndex],'^',1);
  if CharAt(APtEvntID,1) <> 'C' then
  begin
    if Pos('EVT',APtEvntID)>0 then
      AnEvtIFN  := StrToIntDef(Piece(APtEvntID,';',1),0)
    else
    begin
      AnEvtInfo := EventInfo(APtEvntID);
      AnEvtIFN  := StrToIntDef(Piece(AnEvtInfo,'^',2),0);
    end;
  end else
    AnEvtIFN := 0;
end;}

procedure TfrmOrders.InitOrderSheetsForEvtDelay;
begin
  InitOrderSheets;
  DfltViewForEvtDelay;
end;

procedure TfrmOrders.DfltViewForEvtDelay;
begin
  inherited;
  if not CanChangeOrderView then Exit;
  lstSheets.ItemIndex := 0;
  FCurrentView := TOrderView(lstSheets.Items.Objects[0]);
  LoadOrderViewDefault(FCurrentView);
  lstSheets.Items[0] := 'C;0^' + FCurrentView.ViewName;
end;

procedure TfrmOrders.EventRealeasedOrder1Click(Sender: TObject);
var
  AnOrderView: TOrderView;
begin
  inherited;
  if not CanChangeOrderView then Exit;
  AnOrderView := TOrderView.Create;
  AnOrderView.Filter    := STS_ACTIVE;
  AnOrderView.DGroup    := DGroupAll;
  AnOrderView.ViewName  := 'All Services, Active';
  AnOrderView.InvChrono := True;
  AnOrderView.ByService := True;
  AnOrderView.CtxtTime  := 0;
  AnOrderView.TextView  := 0;
  AnOrderView.EventDelay.EventType := 'C';
  AnOrderView.EventDelay.Specialty := 0;
  AnOrderView.EventDelay.Effective := 0;
  AnOrderView.EventDelay.EventIFN  := 0;
  AnOrderView.EventDelay.EventName := 'All Services, Active';
  SelectEvtReleasedOrders(AnOrderView);
  with AnOrderView do if Changed then
  begin
    mnuActRel.Visible   := False;
    popOrderRel.Visible := False;
    FCompress      := True;
    lstSheets.ItemIndex := -1;
    lblWrite.Caption := 'Write Orders';
    lstWrite.Clear;
    LoadWriteOrders(lstWrite.Items);
    if AnOrderView.EventDelay.PtEventIFN > 0 then
      RefreshOrderList(FROM_SERVER,IntToStr(AnOrderView.EventDelay.PtEventIFN));
    lblOrders.Caption := AnOrderView.ViewName;
    if ByService then
    begin
      if InvChrono then FDfltSort := OVS_CATINV  else FDfltSort := OVS_CATFWD;
    end else
    begin
      if InvChrono then FDfltSort := OVS_INVERSE else FDfltSort := OVS_FORWARD;
    end;
  end;
  if FFromDCRelease then
    FFromDCRelease := False;
end;

procedure TfrmOrders.ResetOrderPage(AnEvent: TOrderDelayEvent; ADlgLst: TStringList; IsRealeaseNow: boolean);
var
  i,AnIndex,EFilter: integer;
  APtEvtID: string;    // ptr to #100.2
  theEvtID: string;    // ptr to #100.5
  tmptPtEvtID: string;
  AnOrderView: TOrderView;
  AnDlgStr: string;
begin
  EFilter   := 0;
  theEvtID := '';
  AnDlgStr  := '';
  IsDefaultDlg := False;
  AnOrderView := TOrderView.Create;
  if FCurrentView = nil then
  begin
    FCurrentView := TOrderView.Create;
    with FCurrentView do
    begin
      InvChrono := True;
      ByService := True;
    end;
  end;
  if IsRealeaseNow then
    lstSheets.ItemIndex := 0;
  if AnEvent.EventIFN > 0 then with lstSheets do
  begin
    AnIndex := -1;
    for i := 0 to Items.Count - 1 do
    begin
      theEvtID := GetEvtIFN(i);
      if theEvtID = IntToStr(AnEvent.EventIFN) then
      begin
       AnIndex := i;
       theEvtID := '';
       Break;
      end;
      theEvtID := '';
    end;
    if AnIndex > -1 then
    begin
      NewEvent := False;
      ItemIndex := AnIndex;
      lstSheetsClick(Self);
    end else
    begin
      NewEvent := True;
      if TypeOfExistedEvent(Patient.DFN,AnEvent.EventIFN) = 2 then
      begin
        SaveEvtForOrder(Patient.DFN, AnEvent.EventIFN, '');
        AnEvent.IsNewEvent := False;
        if (ADlgLst.Count > 0) and (Piece(ADlgLst[0],'^',2) <> 'SET') then
          ADlgLst.Delete(0);
      end;
      if (TypeOfExistedEvent(Patient.DFN,AnEvent.EventIFN) = 0) and (AnEvent.TheParent.ParentIFN > 0) then
      begin
        if ((ADlgLst.Count > 0) and (Piece(ADlgLst[0],'^',2) = 'SET')) or (ADlgLst.Count = 0 )then
        begin
          SaveEvtForOrder(Patient.DFN, AnEvent.TheParent.ParentIFN, '');
          SaveEvtForOrder(Patient.DFN, AnEvent.EventIFN, '');
          AnEvent.IsNewEvent := False;
        end;
      end;
      if (TypeOfExistedEvent(Patient.DFN,AnEvent.EventIFN) = 0) and (AnEvent.TheParent.ParentIFN = 0) then
      begin
        if ((ADlgLst.Count > 0) and (Piece(ADlgLst[0],'^',2) = 'SET')) or (ADlgLst.Count = 0 )then
        begin
          SaveEvtForOrder(Patient.DFN, AnEvent.EventIFN, '');
          AnEvent.IsNewEvent := False;
        end;
      end;
      if isExistedEvent(Patient.DFN,IntToStr(AnEvent.EventIFN), APtEvtID) then
      begin
        case AnEvent.EventType of
          'A': EFilter := 15;
          'D': EFilter := 16;
          'T': EFilter := 17;
        end;
        AnOrderView.DGroup     := DGroupAll;
        AnOrderView.Filter     := EFilter;
        AnOrderView.EventDelay := AnEvent;
        AnOrderView.CtxtTime  := -1;
        AnOrderView.TextView  := 0;
        AnOrderView.ViewName  := 'Delayed ' + AnEvent.EventName + ' Orders';
        AnOrderView.InvChrono := FCurrentView.InvChrono;
        AnOrderView.ByService := FCurrentView.ByService;
        if ItemIndex >= 0 then
          Items.InsertObject(ItemIndex+1, APtEvtID + U + AnOrderView.ViewName, AnOrderView)
        else
          Items.InsertObject(lstSheets.Items.Count, APtEvtID + U + AnOrderView.ViewName, AnOrderView);
        ItemIndex := lstSheets.Items.IndexOfObject(AnOrderView);
        FCurrentView := AnOrderView;
        lblWrite.Caption := 'Write ' + FCurrentView.ViewName;
        lstWrite.Caption := lblWrite.Caption;
        ClickLstSheet;
        NewEvent := True;
        if ADlgLst.Count > 0 then
          DisplayDefaultDlgList(lstWrite,ADlgLst)
        else
        begin
          if DispOrdersForEvent(IntToStr(FEventForCopyActiveOrders.EventIFN)) then
          begin
            if IsExistedEvent(Patient.DFN,IntToStr(FEventForCopyActiveOrders.EventIFN),tmptPtEvtID) then
            begin
              FEventForCopyActiveOrders.PtEventIFN := StrToIntDef(tmptPtEvtID,0);
              FEventForCopyActiveOrders.IsNewEvent := False
            end;
            CopyActiveOrdersToEvent(FOrderViewForActiveOrders, FEventForCopyActiveOrders);
          end;
          FEventForCopyActiveOrders.EventIFN := 0;
        end;
      end
      else
      begin
        case AnEvent.EventType of
          'A': EFilter := 15;
          'D': EFilter := 16;
          'T': EFilter := 17;
        end;
        if ItemIndex < 0 then
          ItemIndex := 0;
        IsDefaultDlg        := True;
        AnOrderView.DGroup     := DGroupAll;
        AnOrderView.Filter     := EFilter;
        AnOrderView.EventDelay := AnEvent;
        AnOrderView.CtxtTime  := -1;
        AnOrderView.TextView  := 0;
        AnOrderView.ViewName  := 'Delayed ' + AnEvent.EventName + ' Orders';
        if FCurrentView <> nil then
        begin
          AnOrderView.InvChrono := FCurrentView.InvChrono;
          AnOrderView.ByService := FCurrentView.ByService;
        end;
        Items.InsertObject(ItemIndex+1, IntToStr(AnEvent.EventIFN)+ ';EVT' + U + AnOrderView.ViewName, AnOrderView);
        lstSheets.ItemIndex := lstSheets.Items.IndexOfObject(AnOrderView);
        FCurrentView := AnOrderView;
        lblWrite.Caption := 'Write ' + FCurrentView.ViewName;
        lstWrite.Caption := lblWrite.Caption;
        ClickLstSheet;
        NewEvent := True;
        if (NewEvent) and (ADlgLst.Count>0) then
           DisplayDefaultDlgList(lstWrite,ADlgLst);
      end;
    end;
  end else
  begin
   lblWrite.Caption := 'Write Orders';
   lstWrite.Caption := lblWrite.Caption;
   RefreshOrderList(FROM_SERVER);
  end;
end;

function TfrmOrders.GetEvtIFN(AnIndex: integer): string;
begin
  if AnIndex >= lstSheets.Items.Count then
  begin
    Result := '';
    exit;
  end;
  with lstSheets do
  begin
    if Piece(Piece(Items[AnIndex],';',2),'^',1)='EVT' then
      Result := Piece(Items[AnIndex],';',1)
    else
      Result := GetEventIFN(Piece(Items[AnIndex], U, 1));
  end;
end;

function TfrmOrders.PlaceOrderForDefaultDialog(ADlgInfo: string; IsDefaultDialog: boolean; AEvent: TOrderDelayEvent): boolean;
{ ADlgInfo = DlgIEN;FormID;DGroup;DlgType }
var
  Activated: Boolean;
  NextIndex,ix: Integer;
  APtEvtIdA:   string;
  TheEvent: TOrderDelayEvent;
begin
  inherited;
  Result := False;

  if FCurrentView = nil then
  begin                                                  
    FCurrentView := TOrderView.Create;                   
    with FCurrentView do                                 
    begin                                                
      InvChrono := True;                                 
      ByService := True;                                 
    end;
  end;

  if AEvent.EventType = #0 then
    TheEvent := FCurrentView.EventDelay
  else
    TheEvent := AEvent;
  if not ActiveOrdering then SetConfirmEventDelay;
  NextIndex := lstWrite.ItemIndex;
  if not ReadyForNewOrder1(TheEvent) then
  begin
    lstWrite.ItemIndex := RefNumFor(Self);
    Exit;
  end;
  if AEvent.EventType <> #0 then
    lstWrite.ItemIndex := -1
  else
    lstWrite.ItemIndex := NextIndex;  // (ReadyForNewOrder may reset ItemIndex to -1)

  with TheEvent do
    if (EventType = 'D') and (Effective = 0) then
      if not ObtainEffectiveDate(Effective) then
      begin
        lstWrite.ItemIndex := -1;
        Exit;
      end;
  PositionTopOrder(StrToIntDef(Piece(ADlgInfo, ';', 3), 0));
  case CharAt(Piece(ADlgInfo, ';', 4), 1) of
  'A':      Activated := ActivateAction(     Piece(ADlgInfo, ';', 1), Self,
                                             lstWrite.ItemIndex);
  'D', 'Q': Activated := ActivateOrderDialog(Piece(ADlgInfo, ';', 1),
                                             TheEvent, Self, lstWrite.ItemIndex);
  'H':      Activated := ActivateOrderHTML(  Piece(ADlgInfo, ';', 1),
                                             TheEvent, Self, lstWrite.ItemIndex);
  'M':      Activated := ActivateOrderMenu(  Piece(ADlgInfo, ';', 1),
                                             TheEvent, Self, lstWrite.ItemIndex);
  'O':      Activated := ActivateOrderSet(   Piece(ADlgInfo, ';', 1),
                                             TheEvent, Self, lstWrite.ItemIndex);
  else      Activated := not (InfoBox(TX_BAD_TYPE, TC_BAD_TYPE, MB_OK) = IDOK);
  end;
  if (not Activated) and (IsDefaultDialog) then
  begin
    lstWrite.ItemIndex := -1;
    ix := lstSheets.ItemIndex;
    if lstSheets.ItemIndex < 0 then
      Exit;
    APtEvtIdA := Piece(lstSheets.Items[ix],'^',1);
    if CharAt(APtEvtIdA,1) <> 'C' then
    begin
      if Pos('EVT',APtEvtIdA)>0 then
      begin
        lstSheets.Items.Objects[ix].Free;
        lstSheets.Items.Delete(ix);
        lstSheets.ItemIndex := 0;
        lstSheetsClick(Self);
        lblWrite.Caption := 'Write Orders';
        lstWrite.Caption := lblWrite.Caption;
        lblOrders.Caption := Piece(lstSheets.Items[0],U,2);
        lstOrders.Caption := Piece(lstSheets.Items[0],U,2);
        lstWrite.Clear;
        LoadWriteOrders(lstWrite.Items);
      end;
    end;
  end;
  Result := Activated;
end;

function TfrmOrders.DisplayDefaultDlgList(ADest: TORListBox; ADlgList: TStringList): boolean;
var
  i,j: integer;
  AnDlgStr: string;
  AFillEvent: TOrderDelayEvent;
  APtEvtID,tmpPtEvtID: string;
begin
  AFillEvent.EventType := #0;
  AFillEvent.EventIFN  := 0;
  AFillEvent.PtEventIFN := 0;
  AFillEvent.TheParent := TParentEvent.Create;

  Result := False;
  for i := 0 to ADlgList.Count - 1 do
  begin
    if i = 0 then
    begin
      if AnsiCompareText('Set', Piece(ADlgList[i],'^',2)) = 0 then
        IsDefaultDlg := False;
    end;
    if i > 0 then
      IsDefaultDlg := False;

    ADest.ItemIndex := -1;
    for j := 0 to ADest.Items.Count - 1 do
    begin
      if Piece(ADest.Items[j],';',1)=Piece(ADlgList[i],'^',1) then
      begin
        ADest.ItemIndex := j;
        break;
      end;
    end;

    if ADest.ItemIndex < 0 then
      AnDlgStr := GetDlgData(Piece(ADlgList[i],'^',1))
    else
      AnDlgStr := ADest.Items[ADest.ItemIndex];

    if IsDefaultDlg then NeedShowModal := True else FNeedShowModal := False;
    if not IsDefaultDlg then
    begin
      if FEventForCopyActiveOrders.EventIFN > 0 then
      begin
        if IsExistedEvent(Patient.DFN,IntToStr(FEventForCopyActiveOrders.EventIFN),tmpPtEvtID) then
        begin
          FEventForCopyActiveOrders.PtEventIFN := StrToIntDef(tmpPtEvtID,0);
          FEventForCopyActiveOrders.IsNewEvent := False
        end;
        if DispOrdersForEvent(IntToStr(FEventForCopyActiveOrders.EventIFN)) then
          CopyActiveOrdersToEvent(FOrderViewForActiveOrders, FEventForCopyActiveOrders);
      end;
      FEventForCopyActiveOrders.EventIFN := 0;
    end;

    if PlaceOrderForDefaultDialog(AnDlgStr,IsDefaultDlg, AFillEvent) then
    begin
      if isExistedEvent(Patient.DFN,IntToStr(FEventForCopyActiveOrders.EventIFN), APtEvtID) then
      begin
        FCurrentView.EventDelay.PtEventIFN := StrToIntDef(APtEvtID,0);
        FCurrentView.EventDelay.IsNewEvent := False;
      end;
      if FEventForCopyActiveOrders.EventIFN > 0 then
      begin
        if IsExistedEvent(Patient.DFN,IntToStr(FEventForCopyActiveOrders.EventIFN),tmpPtEvtID) then
        begin
          FEventForCopyActiveOrders.PtEventIFN := StrToIntDef(tmpPtEvtID,0);
          FEventForCopyActiveOrders.IsNewEvent := False
        end;
        if DispOrdersForEvent(IntToStr(FEventForCopyActiveOrders.EventIFN)) then
          CopyActiveOrdersToEvent(FOrderViewForActiveOrders, FEventForCopyActiveOrders);
      end;
      {if isExistedEvent(Patient.DFN,IntToStr(FEventForCopyActiveOrders.EventIFN), APtEvtID) then
      begin
        FCurrentView.EventDelay.PtEventIFN := StrToIntDef(APtEvtID,0);
        FCurrentView.EventDelay.IsNewEvent := False;
      end;}
      EventDefaultOrder := '';
      FEventForCopyActiveOrders.EventIFN := 0;
      Result := IsDefaultDlg
    end
    else break;
  end;
end;

procedure TfrmOrders.ClickLstSheet;
begin
  FAskForCancel := False;
  lstSheetsClick(Self);
  FAskForCancel := True;
end;

procedure TfrmOrders.lblWriteMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  inherited;
  lblWrite.Hint := lblWrite.Caption;
end;

procedure TfrmOrders.InitOrderSheets2(AnItem: string);
var
  i: Integer;
begin
  InitOrderSheets;
  LoadOrderViewDefault(TOrderView(lstSheets.Items.Objects[0]));
  lstSheets.Items[0] := 'C;0^' + TOrderView(lstSheets.Items.Objects[0]).ViewName;
  if Length(AnItem)>0 then
  begin
      with lstSheets do for i := 0 to Items.Count - 1 do
      begin
        if AnsiCompareText(TOrderView(Items.Objects[i]).ViewName, AnItem)=0 then
         begin
           ItemIndex := i;
           FCurrentView := TOrderView(lstSheets.Items.Objects[i]);
           break;
         end;
      end;
  end;
  if lstSheets.ItemIndex < -1 then
    lstSheets.ItemIndex := 0;
  lstSheetsClick(Self);
end;

procedure TfrmOrders.SetFontSize( FontSize: integer);
begin
  inherited SetFontSize( FontSize );
  RedrawOrderList;
  mnuOptimizeFieldsClick(self);
  lstSheets.Repaint;
  lstWrite.Repaint;
  btnDelayedOrder.Repaint;
end;

procedure TfrmOrders.popOrderPopup(Sender: TObject);
begin
  inherited;
  //if PatientStatusChanged then exit;
  //frmFrame.UpdatePtInfoOnRefresh;
end;

procedure TfrmOrders.mnuViewClick(Sender: TObject);
begin
  inherited;
  //if PatientStatusChanged then exit;
  //frmFrame.UpdatePtInfoOnRefresh;
end;

procedure TfrmOrders.mnuActClick(Sender: TObject);
begin
  inherited;
  //if PatientStatusChanged then exit;
  //frmFrame.UpdatePtInfoOnRefresh;
end;

procedure TfrmOrders.mnuOptClick(Sender: TObject);
begin
  inherited;
  //if PatientStatusChanged then exit;  
  //frmFrame.UpdatePtInfoOnRefresh;
end;

procedure TfrmOrders.AddToListBox(AnOrderList: TList);
var
  idx: integer;
  AnOrder: TOrder;
  i: integer;
begin
   with AnOrderList do for idx := 0 to Count - 1 do
   begin
     AnOrder := TOrder(Items[idx]);
     if (AnOrder.OrderTime <= 0) then
         Continue;
     i := lstOrders.Items.AddObject(AnOrder.ID, AnOrder);
     lstOrders.Items[i] := GetPlainText(AnOrder,i);
   end;
end;

procedure TfrmOrders.ChangesUpdate(APtEvtID: string);
var
  jdx: integer;
  APrtEvtId, tempEvtId,EvtOrderID: string;
begin
  APrtEvtId := TheParentPtEvt(APtEvtID);
  if Length(APrtEvtId)>0 then
    tempEvtId := APrtEvtId
  else
    tempEvtId := APtEvtID;
  for jdx := EvtOrderList.Count - 1 downto 0 do
    if AnsiCompareStr(Piece(EvtOrderList[jdx],'^',1),tempEvtID) = 0 then
    begin
      EvtOrderID := Piece(EvtOrderList[jdx],'^',2);
      Changes.Remove(CH_ORD,EvtOrderID);
      EvtOrderList.Delete(jdx);
    end;
end;

function TfrmOrders.PtEvtCompleted(APtEvtID: integer; APtEvtName: string; FromMeds: boolean): boolean;
begin
  Result := False;
  if IsCompletedPtEvt(APtEvtID) then
  begin
    if FromMeds then
      InfoBox('The event "Delayed ' + APtEvtName + '" ' + TX_CMPTEVT_MEDSTAB, 'Warning', MB_OK or MB_ICONWARNING)
    else
      InfoBox('The event "Delayed ' + APtEvtName + '" ' + TX_CMPTEVT, 'Warning', MB_OK or MB_ICONWARNING);
    GroupChangesUpdate('Delayed ' + APtEvtName);
    InitOrderSheetsForEvtDelay;
    lstSheets.ItemIndex := 0;
    lstSheetsClick(self);
    RefreshOrderList(True);
    Result := True;
  end;
end;

procedure TfrmOrders.RefreshToFirstItem;
begin
  InitOrderSheetsForEvtDelay;
  lstSheets.ItemIndex := 0;
  RefreshOrderList(True);
end;

procedure TfrmOrders.GroupChangesUpdate(GrpName: string);
var
  ji: integer;
  theChangeItem: TChangeItem;
begin
  Changes.ChangeOrderGrp(GrpName,'');
  for ji := 0 to Changes.Orders.Count - 1 do
  begin
    theChangeItem := TChangeItem(Changes.Orders.Items[ji]);
    if AnsiCompareText(theChangeItem.GroupName,GrpName)=0 then
      Changes.ReplaceODGrpName(theChangeItem.ID,'');
  end;
end;

procedure TfrmOrders.UMEventOccur(var Message: TMessage);
begin
  InfoBox('The event "Delayed ' + FCurrentView.EventDelay.EventName + '" ' + TX_CMPTEVT, 'Warning', MB_OK or MB_ICONWARNING);
  GroupChangesUpdate('Delayed '+ frmOrders.TheCurrentView.EventDelay.EventName);
  InitOrderSheetsForEvtDelay;
  lstSheets.ItemIndex := 0;
  lstSheetsClick(self);
  RefreshOrderList(True);
end;

procedure TfrmOrders.setSectionWidths;
var
  i: integer;
begin
  //CQ6170
  for i := 0 to 9 do
     origWidths[i] := hdrOrders.Sections[i].Width;
  //end CQ6170
end;

function TfrmOrders.getTotalSectionsWidth : integer;
var
  i: integer;
begin
  //CQ6170
  Result := 0;
  for i := 0 to hdrOrders.Sections.Count - 1 do
     Result := Result + hdrOrders.Sections[i].Width;
  //end CQ6170
end;

procedure TfrmOrders.FormShow(Sender: TObject);
begin
  inherited;
  //force horizontal scrollbar
  //lstOrders.ScrollWidth := lstOrders.ClientWidth+1000; //CQ6170
end;

procedure TfrmOrders.hdrOrdersMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  i: integer;
  totalSectionsWidth, originalwidth: integer;
begin
  inherited;
  //CQ6170
  totalSectionsWidth := getTotalSectionsWidth;
  if totalSectionsWidth > lstOrders.Width - 5 then
  begin
    originalwidth := 0;
    for i := 0 to hdrOrders.Sections.Count - 1 do
      originalwidth := originalwidth + origWidths[i];
    if originalwidth < totalSectionsWidth then
    begin
      for i := 0 to hdrOrders.Sections.Count - 1 do
        hdrOrders.Sections[i].Width := origWidths[i];
      lstOrders.Invalidate;
    end;
  end;
  //end CQ6170
end;

procedure TfrmOrders.hdrOrdersMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  setSectionWidths; //CQ6170
end;

{function TfrmOrders.PatientStatusChanged: boolean;
const

  msgTxt1 = 'Patient status was changed from ';
  msgTxt2 = 'CPRS needs to refresh patient information to display patient latest record.';
   //GE CQ9537  - Change message text
  msgTxt3 = 'Patient has been admitted. ';
  msgTxt4 = CRLF + 'You will be prompted to sign your orders.  Any new orders subsequently' +
            CRLF +'entered and signed will be directed to the inpatient staff.';
var
  PtSelect: TPtSelect;
  IsInpatientNow: boolean;
  ptSts: string;
begin
  result := False;
  SelectPatient(Patient.DFN, PtSelect);
  IsInpatientNow := Length(PtSelect.Location) > 0;
  if Patient.Inpatient <> IsInpatientNow then
  begin
    if (not Patient.Inpatient) then   //GE CQ9537  - Change message text
       MessageDlg(msgTxt3 + msgTxt4, mtWarning, [mbOK], 0)
    else
       begin
          if Patient.Inpatient then ptSts := 'Inpatient to Outpatient.';
          MessageDlg(msgTxt1 + ptSts + #13#10#13 + msgTxt2, mtWarning, [mbOK], 0);
       end;
    frmFrame.mnuFileRefreshClick(Application);
    Result := True;
  end;
end;}

function TfrmOrders.CheckOrderStatus: boolean;
var
i: integer;
AnOrder: TOrder;
OrderArray: TStringList;
begin
    Result := False;
    OrderArray := TStringList.Create;
    with lstOrders do for i := 0 to Items.Count - 1 do if Selected[i] then
    begin
      AnOrder := TOrder(Items.Objects[i]);
      OrderArray.Add(AnOrder.ID + U + InttoStr(AnOrder.Status));
    end;
    if (OrderArray <> nil) and (not DoesOrderStatusMatch(OrderArray)) then
      begin
        MessageDlg('The Order status has changed.' + #13#10#13 + 'CPRS needs to refresh patient information to display the correct order status', mtWarning, [mbOK], 0);
        frmFrame.mnuFileRefreshClick(Application);
        Result := True;
      end;
    ORderArray.Free;
end;

procedure TfrmOrders.ActivateDeactiveRenew;
var
  i: Integer;
  AnOrder: TOrder;
  tmpArr: TStringList;
begin
    tmpArr := TStringList.Create;
    with lstOrders do for i := 0 to Items.Count - 1 do if Selected[i] then
    begin
      AnOrder := TOrder(Items.Objects[i]);
      if AnOrder.Status = 5 then tmpArr.Add(AnOrder.ID);
    end;
    if tmpArr <> nil then frmActivateDeactive.fActivateDeactive(tmpArr);
end;

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

procedure TfrmOrders.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;

procedure TfrmOrders.mnuOptimizeFieldsClick(Sender: TObject);
var
  totalSectionsWidth, unitvalue: integer;
begin
  totalSectionsWidth := pnlRight.Width - 3;
  if totalSectionsWidth < 16 then exit;
  unitvalue := round(totalSectionsWidth / 16);
  with hdrOrders do
  begin
    Sections[1].Width := unitvalue;
    Sections[2].Width := pnlRight.Width - (unitvalue * 10) - 5;
    Sections[3].Width := unitvalue * 2;
    Sections[4].Width := unitvalue * 2;
    Sections[5].Width := unitvalue;
    Sections[6].Width := unitvalue;
    Sections[7].Width := unitvalue;
    Sections[8].Width := unitvalue;
    Sections[9].Width := unitvalue;
  end;
  hdrOrdersSectionResize(hdrOrders, hdrOrders.Sections[0]);
  hdrOrders.Repaint;
end;

procedure TfrmOrders.hdrOrdersSectionClick(HeaderControl: THeaderControl;
  Section: THeaderSection);
begin
  inherited;
  //if Section = hdrOrders.Sections[1] then
    mnuOptimizeFieldsClick(self);
end;

procedure TfrmOrders.sptHorzMoved(Sender: TObject);
begin
  inherited;
  mnuOptimizeFieldsClick(self);
end;

initialization
  SpecifyFormIsNotADialog(TfrmOrders);

end.

