//kt -- Modified with SourceScanner on 8/7/2007
unit uSignItems;

{.$define debug}

interface

uses
  SysUtils, Windows, Classes, Graphics, Controls, StdCtrls, CheckLst, ORClasses, ORCtrls,
  Dialogs, UBAConst, fODBase, UBACore, Forms;

type
  TSigItemType = (siServiceConnected, siAgentOrange, siIonizingRadiation,
                  siEnvironmentalContaminants, siMST, siHeadNeckCancer, siCombatVeteran);

  TSigItemTagInfo =  record
    SigType: TSigItemType;
    Index: integer;
  end;

  TSigItems = class(TComponent)
  private
    FBuilding: boolean;
    FStsCount: integer;
    FItems: TORStringList;
    FOldDrawItemEvent: TDrawItemEvent;
    Fcb: TList;
    Flb: TCustomListBox;
    FLastValidX: integer;
    FValidGap: integer;
    FDy: integer;
    FAllCheck: array[TSigItemType] of boolean;
    FAllCatCheck: boolean;
    FcbX: array[TSigItemType] of integer;
    function TagInfo(ASigType: TSigItemType; AIndex: integer): TSigItemTagInfo;
    //function ItemToTag(Info: TSigItemTagInfo): integer;
    //function TagToItem(ATag: integer): TSigItemTagInfo;
    procedure cbClicked(Sender: TObject);
    procedure cbEnter(Sender: TObject);
    procedure cbExit(Sender: TObject);
    procedure lbDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
    procedure CopyCBValues(FromIndex, ToIndex: integer);
    function  FindCBValues(ATag: integer): TORCheckBox;
    function  GetTempCkBxState(Index: integer; CBValue:TSigItemType): string;
    
  protected
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Add(ItemType: Integer; const ID: string; Index: integer);
    procedure Remove(ItemType: integer; const ID: string);
    procedure ResetOrders;
    procedure Clear;
    function  UpdateListBox(lb: TCustomListBox): boolean;
    procedure EnableSettings(Index: integer; Checked: boolean);
    function  OK2SaveSettings: boolean;
    procedure SaveSettings;
    procedure DisplayPlTreatmentFactors;
    procedure DisplayUnsignedStsFlags(sFlags:string);
    function GetSigItems : TORStringList; //BAPHII 1.3.1
    function FindCB(ATag: integer): TORCheckBox; //BAPHII 1.3.1
    procedure CopyCB(FromIndex, ToIndex: integer); //BAPHII 1.3.1
    procedure SetSigItems(Sender: TObject; sourceOrderID: string); //BAPHII 1.3.1
    //procedure SetSigItems(Sender: TObject; itemsList: TStringList; sourceOrderID: string); //BAPHII 1.3.1
    function ItemToTag(Info: TSigItemTagInfo): integer; //CQ5074
    function TagToItem(ATag: integer): TSigItemTagInfo; //CQ5074
  end;

function SigItems: TSigItems;
function SigItemHeight: integer;

const
//TC_Order_Error = 'All Service Connection and/or Rated Disabilities questions must be answered.';  <-- original line.  //kt 8/7/2007

//TX_Order_Error = 'All Service Connection and/or Rated Disabilities questions must be answered, '+#13+  <-- original line.  //kt 8/7/2007
//                 'and at least one diagnosis selected for each order that requires a diagnosis.';  <-- original line.  //kt 8/7/2007

//TC_Diagnosis_Error = ' Missing Diagnosis';  <-- original line.  //kt 8/7/2007
//TX_Diagnosis_Error = ' One or more Orders have not been assigned a Diagnosis';  <-- original line.  //kt 8/7/2007
  INIT_STR = '';

function TC_Order_Error : string; //kt
function TX_Order_Error : string; //kt
function TC_Diagnosis_Error : string; //kt
function TX_Diagnosis_Error : string; //kt

var
  uSigItems: TSigItems = nil; //BAPHII 1.3.1

implementation

uses
  ORFn, ORNet, uConst, TRPCB, rOrders, rPCE, fOrdersSign, fReview,UBAGlobals,
  DKLang,  //kt
  uCore ;

type
  ItemStatus = (isNA, isChecked, isUnchecked, isUnknown);
  SigDescType = (sdShort, sdLong);

const
  (* //kt  replaced with function
  SigItemDesc: array[TSigItemType, SigDescType] of string =
        { siServiceConnected          } (('SC',  'Service Connected Condition'),  <-- original line.  //kt 8/7/2007
        { siAgentOrange               }  ('AO',  'Agent Orange Exposure'),  <-- original line.  //kt 8/7/2007
        { siIonizingRadiation         }  ('IR',  'Ionizing Radiation Exposure'),  <-- original line.  //kt 8/7/2007
        { siEnvironmentalContaminants }  ('EC',  'Environmental Contaminants'),  <-- original line.  //kt 8/7/2007
        { siMST                       }  ('MST', 'MST'), //'Military Sexual Trauma'
        { siHeadNeckCancer            }  ('HNC', 'Head and/or Neck Cancer'),  <-- original line.  //kt 8/7/2007
        { siCombatVeteran             }  ('CV',  'Combat Veteran Related'));
  *)

  SigItemDisplayOrder: array[TSigItemType] of TSigItemType =
     (  siServiceConnected,
        siCombatVeteran,
        siAgentOrange,
        siIonizingRadiation,
        siEnvironmentalContaminants,
        siMST,
        siHeadNeckCancer );

  StsChar: array[ItemStatus] of char =
           { isNA        } ('N',
           { isChecked   }  'C',
           { isUnchecked }  'U',
           { isUnknown   }  '?');

  ColIdx = 30000;
  AllIdx = 31000;
  NA_FLAGS = 'NNNNNNN';

var
  uSingletonFlag: boolean = FALSE;
  FlagCount: integer;
  BaseFlags: string;
  tempCkBx: TORCheckBox;
  thisOrderID: string;
  thisChangeItem: TChangeItem;


function SigItemDesc(SigItem: TSigItemType; SigDesc : SigDescType) : string; //kt
//kt added function to replace constant array
begin
  case SigItem of
    siServiceConnected          :  begin
                                     if SigDesc = sdShort then begin
                                       Result := 'SC';
                                     end else if SigDesc = sdLong then begin
                                       Result := DKLangConstW('uSignItems_Service_Connected_Condition'); //kt added 8/7/2007
                                     end;
                                   end;
    siAgentOrange               :  begin
                                     if SigDesc = sdShort then begin
                                       Result := 'AO';
                                     end else if SigDesc = sdLong then begin
                                       Result := DKLangConstW('uSignItems_Agent_Orange_Exposure'); //kt added 8/7/2007
                                     end;
                                   end;
    siIonizingRadiation         :  begin
                                     if SigDesc = sdShort then begin
                                       Result := 'IR';
                                     end else if SigDesc = sdLong then begin
                                       Result := DKLangConstW('uSignItems_Ionizing_Radiation_Exposure'); //kt added 8/7/2007
                                     end;
                                   end;
    siEnvironmentalContaminants :  begin
                                     if SigDesc = sdShort then begin
                                       Result := 'EC';
                                     end else if SigDesc = sdLong then begin
                                       Result := DKLangConstW('uSignItems_Environmental_Contaminants'); //kt added 8/7/2007
                                     end;
                                   end;
    siMST                       :  begin
                                     if SigDesc = sdShort then begin
                                       Result := 'MST';
                                     end else if SigDesc = sdLong then begin
                                       Result := 'MST'; //'Military Sexual Trauma'
                                     end;
                                   end;
    siHeadNeckCancer            : begin
                                    if SigDesc = sdShort then begin
                                      Result := 'HNC';
                                    end else if SigDesc = sdLong then begin
                                      Result := DKLangConstW('uSignItems_Head_andxor_Neck_Cancer'); //kt added 8/7/2007
                                    end;
                                  end;
    siCombatVeteran             :  begin
                                     if SigDesc = sdShort then begin
                                       Result := 'CV';
                                     end else if SigDesc = sdLong then begin
                                       Result := DKLangConstW('uSignItems_Combat_Veteran_Related'); //kt added 8/7/2007
                                     end;
                                   end;
  end;  {case}
end;

function TC_Order_Error : string;
begin Result := DKLangConstW('uSignItems_All_Service_Connection_andxor_Rated_Disabilities_questions_must_be_answeredx');
end;

function TX_Order_Error : string;
begin Result := DKLangConstW('uSignItems_All_Service_Connection_andxor_Rated_Disabilities_questions_must_be_answeredx2')+#13+
                   DKLangConstW('uSignItems_and_at_least_one_diagnosis_selected_for_each_order_that_requires_a_diagnosisx');
end;

function TC_Diagnosis_Error : string;
begin Result := DKLangConstW('uSignItems_Missing_Diagnosis');
end;

function TX_Diagnosis_Error : string;
begin Result := DKLangConstW('uSignItems_One_or_more_Orders_have_not_been_assigned_a_Diagnosis');
end;


function TSigItems.GetSigItems : TORStringList;
begin
  Result := FItems;
end;

function TSigItems.FindCB(ATag: integer): TORCheckBox;
var
  i: integer;
  wc: TWinControl;
begin
  for i := 0 to Fcb.Count-1 do
  begin
    wc := TWinControl(Fcb[i]);
    if(wc is TORCheckBox) and (wc.Tag = ATag) then
    begin
      Result := TORCheckBox(wc);
      exit;
    end;
  end;
  Result := nil;
end;

procedure TSigItems.CopyCB(FromIndex, ToIndex: integer);
var
  si: TSigItemType;
  FromTag, ToTag: integer;
  FromCB, ToCB: TORCheckBox;

begin
  for si := low(TSigItemType) to high(TSigItemType) do
  begin
    FromTag := ItemToTag(TagInfo(si, FromIndex));
    ToTag := ItemToTag(TagInfo(si, ToIndex));
    FromCB := FindCB(FromTag);
    ToCB := FindCB(ToTag);
    if(Assigned(FromCB) and Assigned(ToCB)) then
      ToCB.State := FromCB.State;
  end;
end;

procedure TSigItems.SetSigItems(Sender: TObject; sourceOrderID: string);
{
 BAPHII 1.3.1
}
var
  i: integer;
begin
  if (Sender as TCaptionCheckListBox).Name = 'clstOrders' then
    for i := 0 to frmSignOrders.clstOrders.Count - 1 do
       begin
       if ((fOrdersSign.frmSignOrders.clstOrders.Selected[i]) and (fOrdersSign.targetOrderID <> fOrdersSign.srcOrderID)) then
          CopyCB(fOrdersSign.srcIndex, i);
       end
  else
    if (Sender as TCaptionCheckListBox).Name = 'lstReview' then
      for i := 1 to  frmReview.lstReview.Count -1 do
         begin
           if ((fReview.frmReview.lstReview.Selected[i]) and (fReview.targetOrderID <> fReview.srcOrderID)) then
              CopyCB(fReview.srcIndex, i);
         end;
end;

function SigItems: TSigItems;
begin
  if not assigned(uSigItems) then
  begin
    uSingletonFlag := TRUE;
    try
      uSigItems := TSigItems.Create(nil);
    finally
      uSingletonFlag := FALSE;
    end;
  end;
  Result := uSigItems;
end;

function SigItemHeight: integer;
begin
  Result := MainFontHeight + 2;
end;

{ TSigItems }
{
FItems Layout:
1         2               3                            4                      5
OrderID ^ ListBox Index ^ RPC Call was Made (0 or 1) ^ Settings by char pos ^ Disabled Flag
}

procedure TSigItems.Add(ItemType: Integer; const ID: string; Index: integer);
var
  idx: integer;
begin
  if ItemType = CH_ORD then
  begin
    idx := FItems.IndexOfPiece(ID);
    if idx < 0 then
      idx := FItems.Add(ID);
    FItems.SetStrPiece(idx, 2, IntToStr(Index));
    FItems.SetStrPiece(idx,5,INIT_STR);    // hds4807 value was being reatained when same order selected in FReview.

  end;
end;

procedure TSigItems.Clear;
begin
  FItems.Clear;
  Fcb.Clear;
end;

constructor TSigItems.Create(AOwner: TComponent);
begin
  if not uSingletonFlag then
//  raise Exception.Create('Only one instance of TSigItems allowed');  <-- original line.  //kt 8/7/2007
    raise Exception.Create(DKLangConstW('uSignItems_Only_one_instance_of_TSigItems_allowed')); //kt added 8/7/2007
  inherited Create(AOwner);
  FItems := TORStringList.Create;
  Fcb := TList.Create;
  tempCkBx := TORCheckBox.Create(Owner);

end;

destructor TSigItems.Destroy;
begin
  FreeAndNil(FItems);
  FreeAndNil(Fcb);
  inherited;
end;

procedure TSigItems.Remove(ItemType: integer; const ID: string);
var
  idx: integer;

begin
  if ItemType = CH_ORD then
  begin
    idx := FItems.IndexOfPiece(ID);
    if idx >= 0 then
      FItems.Delete(idx);
  end;
end;

procedure TSigItems.ResetOrders; // Resets ListBox positions, to avoid old data messing things up
var
  i: integer;

begin
  for i := 0 to FItems.Count-1 do
    FItems.SetStrPiece(i, 2, '-1');
end;

function TSigItems.ItemToTag(Info: TSigItemTagInfo): integer;
begin
  if Info.Index < 0 then
    Result := 0
  else
    Result := (Info.Index*FlagCount) + ord(Info.SigType) + 1;
end;


function TSigItems.TagInfo(ASigType: TSigItemType; AIndex: integer): TSigItemTagInfo;
begin
  Result.SigType := ASigType;
  Result.Index := AIndex;
end;

function TSigItems.TagToItem(ATag: integer): TSigItemTagInfo;
begin
  if ATag <= 0 then
  begin
    Result.Index := -1;
    Result.SigType := TSigItemType(0);
  end
  else
  begin
    dec(ATag);
    Result.SigType := TSigItemType(ATag mod FlagCount);
    Result.Index := ATag div FlagCount;
  end;
end;

type
  TExposedListBox = class(TCustomListBox)
  public
    property OnDrawItem;
  end;

function TSigItems.UpdateListBox(lb: TCustomListBox): boolean;
const
  cbWidth = 13;
  cbHeight = 13;
  btnGap = 2;
//AllTxt = 'All';  <-- original line.  //kt 8/7/2007

var
  cb: TORCheckBox;
  btn: TButton;
  lbl: TLabel;
  prnt: TWinControl;
  ownr: TComponent;
  FirstValidItem: TSigItemType;
  x, y, MaxX, i, btnW, btnH, j, dx, ht, idx, dgrp: integer;
  s, id, Code, cType, Flags: string;
  StsCode: char;
  sx, si: TSigItemType;
  sts, StsIdx: ItemStatus;
  StsUsed: array[TSigItemType] of boolean;
  AResponses : TResponses;
  UFlags: string;
  thisCB: TORCheckBox;
  cpFlags: string;
  AllTxt : string;  //kt

  itemText: string;
  thisTagInfo: TSigItemTagInfo;

  function CreateCB(AParent: TWinControl): TORCheckBox;
     begin
     Result := TORCheckBox.Create(ownr);
     Result.Parent := AParent;
     Result.Height := cbHeight;
     Result.Width := cbWidth;
     Result.GrayedStyle := gsBlueQuestionMark;
     Result.GrayedToChecked := FALSE;
     Result.OnClick := cbClicked;
     Result.OnEnter := cbEnter;
     Result.OnExit := cbExit;
     Fcb.Add(Result);
     end;

begin
  AllTxt := DKLangConstW('uSignItems_All'); //kt added 8/7/2007
  Result := FALSE;
  Fcb.Clear;
  FBuilding := TRUE;
try

  try
    idx := 0;
    RPCBrokerV.ClearParameters := True;

    for i := 0 to FItems.Count-1 do
    begin
       s := FItems[i];
       thisOrderID := Piece(s,U,1);
       if BILLING_AWARE then
         if NOT UBACore.IsOrderBillable(thisOrderID) then
             RemoveOrderFromDxList(thisOrderID);
       if (piece(s, U, 2) <> '-1') and (piece(s, U, 3) <> '1') then
       begin
          with RPCBrokerV do
              begin
              if idx = 0 then
                Param[1].PType := list;
              inc(idx);
              Param[1].Mult[IntToStr(idx)] := piece(s, U, 1);
              end;
          end;
       end; //for

       if idx > 0 then
          begin
         if  BILLING_AWARE then
              rpcGetSC4Orders // get SC/EIC information for all CIDC TYPE orders
          else
             GetCoPay4Orders;   // enforces existing NON CIDC CO-PAY rules
             for i := 0 to RPCBrokerV.Results.Count-1 do
               begin
                  s := RPCBrokerV.Results[i];
                {Begin BillingAware}
                if  BILLING_AWARE then
                begin
                  if (CharAt(piece(s,';',2),1) <> '1') then
                    s := piece(s,U,1);
                end;
                 id := piece(s,U,1);
                 idx := FItems.IndexOfPiece(id);

                 if idx >= 0 then
                    begin
                    FItems.SetStrPiece(idx, 3, '1'); // Mark as read from RPC
                    j := 2;
                    Flags := BaseFlags;

                       repeat
                         Code := piece(s,U,j);

                         if Code <> '' then
                            begin
                            cType := piece(Code, ';', 1);

                            for si := low(TSigItemType) to high(TSigItemType) do
                               begin
                                 //if cType = SigItemDesc[si, sdShort] then //kt
                                 if cType = SigItemDesc(si, sdShort) then
                                    begin
                                    cType := piece(Code, ';', 2);

                                    if cType = '0' then
                                      sts := isUnchecked
                                    else
                                       if cType = '1' then
                                         sts := isChecked
                                       else
                                         sts := isUnknown;

                                    Flags[ord(si)+1] := StsChar[sts];
                                    break;

                                    end; //if cType = SigItemDesc[si, sdShort]
                                 end; //for
                            end; //if Code <> ''

                           inc(j);
                       until(Code = '');

                     FItems.SetStrPiece(idx, 4, Flags);
                      // new code  if deleted order and ba on then
                      // reset appropriate tf flags to "?".


                     if BILLING_AWARE then
                        begin
                           if not UBACore.OrderRequiresSCEI(Piece(s,U,1)) then
                              FItems.SetStrPiece(idx,4, NA_FLAGS)
                           else
                              begin

                              if UBAGlobals.BAUnsignedOrders.Count > 0 then
                                 begin
                                 UFlags := UBACore.GetUnsignedOrderFlags(Piece(s,U,1),UBAGlobals.BAUnsignedOrders);
                                 if UFlags <> '' then FItems.SetStrPiece(idx,4, UFlags)
                                 end;
                              //********************************
                              if UBAGlobals.BACopiedOrderFlags.Count > 0 then  //BAPHII 1.3.2
                                 begin
                                 UFlags := UBACore.GetUnsignedOrderFlags(Piece(s,U,1),UBAGlobals.BACopiedOrderFlags); //BAPHII 1.3.2
                                 if UFlags <> '' then //BAPHII 1.3.2
                                    FItems.SetStrPiece(idx,4,UFlags); //BAPHII 1.3.2
                                 end;
                              //********************************
                              if UBAGlobals.BAConsultPLFlags.Count > 0 then
                                 begin
                                    UFlags :=  GetConsultFlags(Piece(s,U,1),UBAGlobals.BAConsultPLFlags,Flags);

                                 if UFlags <> '' then
                                    FItems.SetStrPiece(idx,4, UFlags);
                                 end;

                                 UBAGlobals.BAFlagsIN := Flags;
                              end; //else
                           end; //if BILLING_AWARE

                       end; //if idx >= 0

                  end; //for i := 0 to RPCBrokerV.Results.Count-1
             end; //if idx > 0

    FStsCount := 0;

    for si := low(TSigItemType) to high(TSigItemType) do
      StsUsed[si] := FALSE;
    //  loop thru orders selected to be signed fReview/fOrdersSign.
    for i := 0 to FItems.Count-1 do
       begin
         s := FItems[i];

         if (piece(s,u,2) <> '-1') and (piece(s,u,3) = '1') then
            begin
             s := piece(s, u, 4); // SC/EI
             // code added 01/17/2006 - check dc'd nurse orders, originals where requiring CIDC if assigned to patient.
             if (BILLING_AWARE) and (not UBACore.IsOrderBillable(Piece(s,U,1))) then
               s :=  NA_FLAGS;

            for si := low(TSigItemType) to high(TSigItemType) do
              if (not StsUsed[si]) and (s[ord(si)+1] <> StsChar[isNA]) then
                begin
                StsUsed[si] := TRUE;
                inc(FStsCount);
                if FStsCount >= FlagCount then break;
                end;
            end;

         if FStsCount >= FlagCount then
           Break;
       end; //for

   {Begin BillingAware}
     if  BILLING_AWARE then
         begin
            if FStsCount = 0 then //  Billing Awareness.  Force Grid to paint correctly
               FStsCount := 1;
         end;
   {End BillingAware}

    if FStsCount > 0 then
       begin
         Result := TRUE;
         FirstValidItem := TSigItemType(0);

         prnt := lb.Parent;
         ownr := lb.Owner;
         MaxX := lb.ClientWidth;
         lb.Canvas.Font := MainFont;
         btnW := 0;

         for si := low(TSigItemType) to high(TSigItemType) do
            begin
            //j := lb.Canvas.TextWidth(SigItemDesc[si, sdShort]);  //kt
            j := lb.Canvas.TextWidth(SigItemDesc(si, sdShort));  //kt
            if btnW < j then
             btnW := j;
            end;

         inc(btnW, 8);
         btnH := ResizeHeight( BaseFont, MainFont, 21);
         x := MaxX;
         dx := (btnW - cbWidth) div 2;

         for si := high(TSigItemType) downto low(TSigItemType) do
            begin
            FcbX[si] := x - btnW + dx;
            dec(x, btnW + btnGap);
            end;
         
         if FStsCount > 1 then
           begin
           FAllCatCheck := FALSE;
           btn := TButton.Create(ownr);
           btn.Parent := prnt;
           btn.Height := btnH;
           btn.Width := btnW;
           btn.Caption := AllTxt;
           btn.OnClick := cbClicked;
           btn.Left := FcbX[TSigItemType(0)] + lb.Left - dx + 2 - (FcbX[TSigItemType(1)] - FcbX[TSigItemType(0)]);
           btn.Top := lb.Top - btn.height - 2;
           btn.Tag := AllIdx;
           btn.ShowHint := TRUE;
//         btn.Hint := 'Set All Related Entries';  <-- original line.  //kt 8/7/2007
           btn.Hint := DKLangConstW('uSignItems_Set_All_Related_Entries'); //kt added 8/7/2007
           btn.TabOrder := lb.TabOrder;
           Fcb.Add(btn);
           end;

         for sx := low(TSigItemType) to high(TSigItemType) do
            begin
            si := SigItemDisplayOrder[sx];
            FAllCheck[si] := TRUE;
            btn := TButton.Create(ownr);
            btn.Parent := prnt;
            btn.Height := btnH;
            btn.Width := btnW;
            //btn.Caption := SigItemDesc[si, sdShort];  //kt
            btn.Caption := SigItemDesc(si, sdShort);  //kt
            btn.OnClick := cbClicked;
            btn.Left := FcbX[sx] + lb.Left - dx + 2;
            btn.Top := lb.Top - btn.height - 2;
            btn.Tag := ColIdx + ord(si);
            btn.ShowHint := TRUE;
//          btn.Hint := 'Set all ' + SigItemDesc[si, sdLong];  <-- original line.  //kt 8/7/2007
            btn.Hint := DKLangConstW('uSignItems_Set_all') + SigItemDesc(si, sdLong); //kt added 8/7/2007
            btn.Enabled := StsUsed[si];
            //tab order before listbox but after previous buttons.
            btn.TabOrder := lb.TabOrder;
            Fcb.Add(btn);
            end;

            FValidGap := ((FcbX[succ(TSigItemType(0))] - FcbX[TSigItemType(0)] - cbWidth) div 2) + 1;
            FLastValidX := FcbX[FirstValidItem] - FValidGap;
            lb.ControlStyle := lb.ControlStyle + [csAcceptsControls];
            
            try
              ht := SigItemHeight;
              FDy := ((ht - cbHeight) div 2);
              y := lb.TopIndex;
              FOldDrawItemEvent := TExposedListBox(lb).OnDrawItem;
              Flb := lb;
              TExposedListBox(lb).OnDrawItem := lbDrawItem;
              lb.FreeNotification(Self);

              for i := 0 to FItems.Count-1 do
                  begin
                  s := FItems[i];
                  
                  if piece(s,u,3) = '1' then
                     begin
                     idx := StrToIntDef(piece(s,U,2),-1);

                     if idx >= 0 then
                        begin
                        Flags := piece(s,u,4);
                                                 //loop thru treatment factors
                        for sx := low(TSigItemType) to high(TSigItemType) do
                           begin
                           si := SigItemDisplayOrder[sx];
                           StsCode := Flags[ord(si)+1];
                           StsIdx := isNA;

                           for sts := low(ItemStatus) to high(ItemStatus) do
                              if StsCode = StsChar[sts] then
                                 begin
                                 StsIdx := sts;
                                 Break;
                                 end;

                             if (StsIdx <> isNA) then
                               begin
                                 cb := CreateCB(lb);
                                 cb.Left := FcbX[sx];
                                 cb.Top := (ht * (idx - y)) + FDy;
                                 cb.Tag := ItemToTag(TagInfo(si, idx));
                                 cb.ShowHint := TRUE;
                                 //cb.Hint := SigItemDesc[si, sdLong]; //kt
                                 cb.Hint := SigItemDesc(si, sdLong);  //kt

                                 //CQ3301/3302
                                 thisTagInfo := TagToItem(cb.Tag);
                                 itemText := '';
                                 thisChangeItem := nil; //init

                                 thisChangeItem := TChangeItem(lb.Items.Objects[thisTagInfo.Index]);

                                 if (thisChangeItem <> nil) then
                                     begin
                                        itemText := (FilteredString(lb.Items[thisTagInfo.Index]));
                                        cb.Caption := itemText + cb.Hint;  //CQ3301/3302 - gives JAWS a caption to read
                                     end;
                                 //end CQ3301/3302

                                 //PATCH: Added OR_3_215v26_70 11/07/2007 jb
                                 // GWOT - CV Default to Yes.
	                               if ( (si = siCombatVeteran) and (StsIdx = isUnKnown) ) then
                                 begin
                                 		StsIdx := isChecked;
                                    Flags[7] := 'C';                  // HD200866 default as Combat Related - GWOT mandated Change
                                    FItems.SetStrPiece(i, 4, Flags);  // HD200866 default as Combat Related - GWOT mandated Change
                                 end;
                                 //End Patch

                                 case StsIdx of
                                   isChecked:   cb.State := cbChecked;
                                   isUnchecked: cb.State := cbUnchecked;
                                 else cb.State := cbGrayed;
                                 end; //case

                               end; //if (StsIdx <> isNA)

                        end; //for sx := low(TSigItemType) to high(TSigItemType)

                     end; // if idx >= 0

                     end; //if piece(s,u,3) = '1'

              end; //for i := 0 to FItems.Count-1

         finally
           lb.ControlStyle := lb.ControlStyle - [csAcceptsControls];
         end; //if FStsCount > 0
    end;

  finally
    FBuilding := FALSE;
  end;
  except
  on ERangeError do
  begin
//   ShowMessage('ERangeError in UpdateListBox' + s);  <-- original line.  //kt 8/7/2007
     ShowMessage(DKLangConstW('uSignItems_ERangeError_in_UpdateListBox') + s); //kt added 8/7/2007
  raise;
  end;
  end;
end;

procedure TSigItems.cbClicked(Sender: TObject);
var
  i,cnt,p: integer;
  cb: TORCheckBox;
  sType: TSigItemType;
  idx, Flags: string;
  Info: TSigItemTagInfo;
  wc, w: TWinControl;

begin
  if FBuilding then exit;
  wc := TWinControl(Sender);
  if wc.Tag = AllIdx then
  begin
    FAllCatCheck := not FAllCatCheck;
    for sType := low(TSigItemType) to high(TSigItemType) do
      FAllCheck[sType] := FAllCatCheck;
    cnt := 0;
    for i := 0 to Fcb.Count-1 do
    begin
      w := TWinControl(Fcb[i]);
      if (w <> wc) and (w.Tag >= ColIdx) and (w is TButton) then
      begin
        inc(cnt);
        if w.Enabled then
          TButton(w).Click;
        if cnt >= FlagCount then break;
      end;
    end;
  end
  else
  if wc.Tag >= ColIdx then
  begin
    sType := TSigItemType(wc.Tag - ColIdx);
    FAllCheck[sType] := not FAllCheck[sType];
    for i := 0 to Fcb.Count-1 do
    begin
      w := TWinControl(Fcb[i]);
      if (w.Tag < ColIdx) and (w is TORCheckBox) then
      begin
        if TagToItem(w.Tag).SigType = sType then
          TORCheckBox(w).Checked := FAllCheck[sType];
      end;
    end;
  end
  else
  begin
    cb := TORCheckBox(wc);
    info := TagToItem(cb.Tag);
    if info.Index >= 0 then
    begin
      idx := inttostr(info.Index);
      i := FItems.IndexOfPiece(idx,U,2);
      if i >= 0 then
      begin
        p := ord(Info.SigType)+1;
        Flags := piece(FItems[i],U,4);
        case cb.State of
          cbUnchecked: Flags[p] := StsChar[isUnchecked];
          cbChecked:   Flags[p] := StsChar[isChecked];
          else         Flags[p] := StsChar[isUnknown];
        end;
        FItems.SetStrPiece(i,4,Flags);
        if BILLING_AWARE then
          UBAGlobals.BAFlagsIN := Flags;
      end;
    end;
  end;
end;

procedure TSigItems.cbEnter(Sender: TObject);
var
  cb: TORCheckBox;
begin
  cb := TORCheckBox(Sender);
  cb.Color := clHighlight;
  cb.Font.Color := clHighlightText;

  // commented out causing check box states to be out of sync when
   //checked individually and/or when by column or all.
  //CQ5074
  if ( (cb.Focused) and (cb.State = cbGrayed) ) and (not IsAMouseButtonDown) then
     cb.Checked := false;
  //end CQ5074
end;

procedure TSigItems.cbExit(Sender: TObject);
var
  cb: TORCheckBox;
begin
  cb := TORCheckBox(Sender);
  cb.Color := clWindow;
  cb.Font.Color := clWindowText;
end;


procedure TSigItems.lbDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  OldRect: TRect;
  i: integer;
  cb: TORCheckBox;
  si: TSigItemType;
  DrawGrid: boolean;

begin
        DrawGrid := (Index < flb.Items.Count);
        if DrawGrid and (trim(Flb.Items[Index]) = '') and
                        (Index = (flb.Items.Count - 1)) then
          DrawGrid := FALSE;
        if DrawGrid then
          dec(Rect.Bottom);
        OldRect := Rect;

        Rect.Right := FlastValidX - 4;
      {Begin BillingAware}
        if  BILLING_AWARE then Rect.Right := FLastValidX - 55;
      {End BillingAware}

        if assigned(FOldDrawItemEvent) then
          FOldDrawItemEvent(Control, Index, Rect, State)
        else
           begin
           Flb.Canvas.FillRect(Rect);
           if Index < flb.Items.Count then
             Flb.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top, FilteredString(Flb.Items[Index]));
           end;

        if DrawGrid then
           begin
             Flb.Canvas.Pen.Color := clBtnFace;
             Flb.Canvas.MoveTo(Rect.Left, Rect.Bottom);
             Flb.Canvas.LineTo(OldRect.RIght, Rect.Bottom);
           end;

        if  BILLING_AWARE then OldRect.Left := Rect.Right + 90
        else OldRect.Left := Rect.Right;

       //// SC Column
        Flb.Canvas.FillRect(OldRect);
        for i := 0 to Fcb.Count-1 do
           begin
             cb := TORCheckBox(Fcb[i]);

             if TagToItem(cb.Tag).Index = Index then
                begin
                  cb.Invalidate;
                  cb.Top := Rect.Top + FDy;
                end;
           end;

        // EI Columns
        if DrawGrid then
        begin
          for si := low(TSigItemType) to high(TSigItemType) do
          begin
            if FcbX[si] > FLastValidX then
            begin
              Flb.Canvas.MoveTo(FcbX[si] - FValidGap, Rect.Top);
              Flb.Canvas.LineTo(FcbX[si] - FValidGap, Rect.Bottom);
            end;
          end;
        end; 

end;

procedure TSigItems.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited;
  if (AComponent = Flb) and (Operation = opRemove) then
  begin
    Fcb.Clear;
    TExposedListBox(Flb).OnDrawItem := FOldDrawItemEvent;
    FOldDrawItemEvent := nil;
    Flb := nil;
  end;
end;

procedure TSigItems.EnableSettings(Index: integer; Checked: boolean);
var
  cb: TORCheckBox;
  i: integer;
  Info: TSigItemTagInfo;

begin
  if Index < 0 then exit;
  for i := 0 to Fcb.Count-1 do
  begin
    if TObject(Fcb[i]) is TORCheckBox then
    begin
      cb := TORCheckBox(Fcb[i]);
      info := TagToItem(cb.Tag);
      if info.Index = Index then
        cb.enabled := Checked;
    end;
  end;
  i := FItems.IndexOfPiece(IntToStr(Index), U, 2);
  if i >= 0 then
    FItems.SetStrPiece(i, 5, BoolChar[not Checked]);
end;

function TSigItems.OK2SaveSettings: boolean;
var
  i, Index: integer;
  s: string;

begin
  {Begin BillingAware}
  if BILLING_AWARE then
     begin
     if Assigned(UBAGlobals.BAOrderList) then
        BAOrderList.Clear
     else
       begin
          BAOrderList := TStringList.Create;
          BAOrderList.Clear;
    end;
{End BillingAware}
  end;

  Result := TRUE;
  for i := 0 to FItems.Count-1 do
  begin
    s := FItems[i];
    Index := StrToIntDef(piece(s,U,2),-1);
    if(Index >= 0) and (piece(s,U,5) <> '1') then
    begin
      if pos(StsChar[isUnknown], piece(s, U, 4)) > 0 then
      begin
        Result := FALSE;
        break;
      end{end if}
      else
         if BILLING_AWARE then
            BAOrderList.Add(piece(s,U,1)+ piece(s,U,3) + piece(s,U,4)); //baph1
    end; {end if}
  end;{end for}
end;

procedure TSigItems.SaveSettings;
var
  s: string;
  i, Index: integer;
  TmpSL: TStringList;

begin
  TmpSL := TStringList.Create;

  try
    for i := 0 to FItems.Count-1 do
    begin
      s := FItems[i];
      Index := StrToIntDef(piece(s,U,2),-1);
      if(Index >= 0) and (piece(s,U,5) <> '1') then
      begin
        TmpSL.Add(Piece(s,U,1) + U + piece(s,U,4));
        FItems.SetStrPiece(i, 6, '1');
      end;
    end;

    SaveCoPayStatus(TmpSL);

  finally
    TmpSL.Free;
  end;
  i := 0;
  while i < FItems.Count do
  begin
    if Piece(FItems[i], U, 6) = '1' then
      FItems.Delete(i)
    else
      inc(i);
  end;
  Fcb.Clear;
end;

{ Begin Billing Aware }

procedure TSigItems.DisplayUnsignedStsFlags(sFlags:string);
var
   Index: integer;
   flags : string;
begin
   Index := 0;
   Flags := sFlags;
   CopyCBValues(Index,Index);

end;

procedure TSigItems.DisplayPlTreatmentFactors;
var
 FactorsOut:TStringList;
 y: integer;
 Index: integer;
begin
     FactorsOut :=  TStringList.Create;
     FactorsOut.Clear;
     FactorsOut := UBAGlobals.PLFactorsIndexes;
     for y := 0 to FactorsOut.Count-1 do
     begin
        Index := StrToInt(Piece(FactorsOut.Strings[y],U,1));
        CopyCBValues(Index,Index);
        end;
end;



procedure TSigItems.CopyCBValues(FromIndex, ToIndex: integer);
var
  si: TSigItemType;
  FromTag, ToTag: integer;
  FromCB, ToCB: TORCheckBox;
  x: string;
begin
  tempCkBx.GrayedStyle := gsBlueQuestionMark;
  
  for si := low(TSigItemType) to high(TSigItemType) do
     begin
       FromTag := ItemToTag(TagInfo(si, FromIndex));
       ToTag := ItemToTag(TagInfo(si, ToIndex));
       FromCB := FindCBValues(FromTag);
       ToCB := FindCBValues(ToTag);

       if assigned(FromCB) then // and assigned(ToCB)) then
          begin
             tempCkBx.State := cbGrayed;
             x:= GetTempCkBxState(FromIndex,si);
             if x = 'C' then tempCkBx.State := cbChecked
             else if x = 'U' then tempCkBx.State := cbUnChecked ;
             ToCB.State := tempCkBx.State;// FromCB.State;
          end;
       end; //for

end;

function TSigItems.FindCBValues(ATag: integer):TORCheckBox;
var
  i: integer;
  wc: TWinControl;
begin
  for i := 0 to Fcb.Count-1 do
  begin
    wc := TWinControl(Fcb[i]);
    if(wc is TORCheckBox) and (wc.Tag = ATag) then
    begin
      Result := TORCheckBox(wc);
      Exit;
     end;
  end;
  Result := nil;
end;

function  TSigItems.GetTempCkBxState(Index: integer; CBValue:TSIGItemType):string;
var
 locateIdx,thisIdx,i: integer;
 iFactor: integer;
 TmpCBStatus : string;
begin
  try
      locateIdx := Index;
      iFactor := Ord(CBValue) +1;
      for i := 0 to  UBAGlobals.BAFlagsOut.count-1 do
           begin
                thisIdx := StrToInt(Piece(UBAGlobals.BAFlagsOut.Strings[i],U,1));
                if thisIdx = locateIdx then
                begin
                   TmpCBStatus := Piece(UBAGlobals.BAFlagsOut.Strings[i],U,2);
                   TmpCBStatus := Copy(TmpCBStatus,iFactor,1);
                   Result :=TmpCBStatus;
                end;
           end;
  except
     on EAccessViolation do
        begin
        {$ifdef debug}ShowMessage('EAccessViolation in uSignItems.GetTempCkBxState()');{$endif}
        raise;
        end;
  end;
end;
 { End Billing Aware }


initialization
  FlagCount := ord(high(TSigItemType)) - ord(low(TSigItemType)) + 1;
  BaseFlags := StringOfChar(StsChar[isNA], FlagCount);
  thisChangeItem := TChangeItem.Create; //CQ3301/3302

finalization
  FreeAndNil(uSigItems);

end.

