unit fGraphData;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ORFn, fBase508Form, VA508AccessibilityManager;

type
  TfrmGraphData = class(TfrmBase508Form)
    lblCurrent: TLabel;
    lblInfo: TLabel;
    lblInfoCurrent: TLabel;
    lblInfoPersonal: TLabel;
    lblInfoPublic: TLabel;
    lblPersonal: TLabel;
    lblPublic: TLabel;
    pnlData: TPanel;
    pnlInfo: TPanel;
    btnData: TButton;
    btnRefresh: TButton;
    btnTesting: TButton;
    memTesting: TMemo;

    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);

    procedure btnDataClick(Sender: TObject);
    procedure btnRefreshClick(Sender: TObject);
    procedure btnTestingClick(Sender: TObject);
  private
    procedure ClearMemos;
    procedure FillMemos;
    procedure MakeMemos(aName: string; aList: TStrings; aTag, left, top, width, height: integer);
  public
    procedure ClearGtsl;
    procedure ClearPtData;
    procedure FreeGtsl;
    procedure MakeGtsl;
    procedure MakeUserSettings;
    procedure MakeGraphActivity;

    function AllowContextChange(var WhyNot: string): Boolean;
  end;

var
  frmGraphData: TfrmGraphData;
  GtslData: TStringList;
  GtslItems: TStringList;
  GtslTypes: TStringList;
  GtslAllTypes: TStringList;
  GtslAllViews: TStringList;
  GtslTestSpec: TStringList;
  GtslDrugClass: TStringList;
  GtslViews: TStringList;
  GtslCheck: TStringList;
  GtslNonNum: TStringList;
  GtslNonNumDates: TStringList;
  GtslScratchSwap: TStringList;
  GtslScratchTemp: TStringList;
  GtslScratchLab: TStringList;
  GtslSpec1: TStringList;
  GtslSpec2: TStringList;
  GtslSpec3: TStringList;
  GtslSpec4: TStringList;
  GtslMultiSpec: TStringList;
  GtslTempCheck: TStringList;
  GtslTemp: TStringList;
  GtslSelCopyTop: TStringList;
  GtslSelCopyBottom: TStringList;
  GtslZoomHistoryFloat: TStringList;
  GtslZoomHistoryReport: TStringList;
  GtslSelPrevTopFloat: TStringList;
  GtslSelPrevTopReport: TStringList;
  GtslSelPrevBottomFloat: TStringList;
  GtslSelPrevBottomReport: TStringList;
  GtslViewPersonal: TStringList;
  GtslViewPublic: TStringList;
  GtslLabGroup: TStringList;

  //procedure GraphDataForm;      // perhaps use this to create only when displayed??

  procedure GraphDataOnUser;
  procedure GraphDataOnPatient(var allitems, alldata: boolean);

  function GetATestGroup(testgroup: Integer; userx: int64): TStrings;
  function GetCurrentSetting: string;
  function GetDefaultInpatientDate: string;
  function GetDefaultOutpatientDate: string;
  function GetGraphProfiles(profiles, permission: string; ext: integer; userx: int64): TStrings;
  function GetGraphStatus: string;
  function GetOldDFN: string;
  function GetPersonalSetting: string;
  function GetPublicSetting: string;
  function GraphPublicEditor: boolean;
  function GraphTurboOn: boolean;
  procedure SetCurrentSetting(aString: string);
  procedure SetDefaultInpatientDate(aString: string);
  procedure SetDefaultOutpatientDate(aString: string);
  procedure SetGraphStatus(aString: string);
  procedure SetOldDFN(aString: string);
  procedure SetPersonalSetting(aString: string);
  procedure SetPublicSetting(aString: string);

implementation

{$R *.dfm}

uses
  uCore, rGraphs, uGraphs;

var
  FGraphActivity: TGraphActivity;

{procedure GraphDataForm;            // not used - perhaps with separate object for data
var
  frmGraphData: TfrmGraphData;
begin
  frmGraphData := TfrmGraphData.Create(Application);
  try
    with frmGraphData do
    begin
      ResizeAnchoredFormToFont(frmGraphData);
      ShowModal;
    end;
  finally
    frmGraphData.Release;
  end;
end;}

procedure TfrmGraphData.FormCreate(Sender: TObject);
begin                                      // called from fFrame after user signon
  if GtslData <> nil then
    exit;                                  // only create one time
  MakeGraphActivity;
  MakeUserSettings;
  MakeGtsl;
end;

procedure TfrmGraphData.MakeGraphActivity;
begin
  FGraphActivity := TGraphActivity.Create;
  with FGraphActivity do
  begin
    CurrentSetting := '';
    DefaultInpatientDate := '';
    DefaultOutpatientDate := '';
    OldDFN := '';
    PublicSetting := '';
    PersonalSetting := '';
    PublicEditor := false;
    Status := '';
    TurboOn := true;
    Cache := true;
  end;
end;

procedure TfrmGraphData.MakeUserSettings;
var
  setting, turbo: string;
  aList: TStrings;
begin
  aList := TStringList.Create;
  FastAssign(rpcGetGraphSettings, aList);
  if aList.Count > 0 then
  begin
    setting := aList[0];
    FGraphActivity.PublicSetting := aList[1];
    FGraphActivity.Cache := not (Piece(aList[2], '^', 1) = '-1');
    if length(setting) > 0 then
    begin                                  // maxselectmax - system max selection limit
      SetPiece(setting, '|', 8, Piece(FGraphActivity.PublicSetting, '|', 8));
      turbo := Piece(FGraphActivity.PublicSetting, '|', 6);
      if (turbo = '0') or (not FGraphActivity.Cache) then // deactivate users if public turbo (6th piece) is off
      begin
        SetPiece(setting, '|', 6, '0');
        FGraphActivity.TurboOn := false;
      end
      else
        FGraphActivity.TurboOn := true;
      FGraphActivity.PersonalSetting := setting;
    end
    else
      FGraphActivity.PersonalSetting := FGraphActivity.PublicSetting;
    FGraphActivity.CurrentSetting := FGraphActivity.PersonalSetting;
    FGraphActivity.DefaultInpatientDate := Piece(FGraphActivity.PersonalSetting, '|', 10);
    FGraphActivity.DefaultOutpatientDate := Piece(FGraphActivity.PersonalSetting, '|', 9);
    FGraphActivity.PublicEditor := rpcPublicEdit;    // use this as PublicEdit permission for user
  end;
  FreeAndNil(aList);
end;

procedure GraphDataOnUser;
var                                        // called from fFrame after this form is created
  i: integer;                              // gets static info
  dfntype, listline: string;
begin
  if GtslData = nil then
    exit;                                  // do not setup if graphing is off
  FastAssign(rpcGetTypes('0', false), GtslAllTypes);
  for i := 0 to GtslAllTypes.Count - 1 do  // uppercase all filetypes
  begin
    listline := GtslAllTypes[i];
    dfntype := UpperCase(Piece(listline, '^', 1));
    SetPiece(listline, '^', 1, dfntype);
    GtslAllTypes[i] := listline;
  end;
  FastAssign(rpcGetTestSpec, GtslTestSpec);
  FastAssign(rpcGetViews(VIEW_PUBLIC, 0), GtslAllViews);
  FastAddStrings(rpcGetViews(VIEW_PERSONAL, User.DUZ), GtslAllViews);
  FastAddStrings(rpcGetViews(VIEW_LABS, User.DUZ), GtslAllViews);
end;

procedure TfrmGraphData.ClearPtData;
var                                        // called when patient is selected
  oldDFN, faststatus: string;
begin
  inherited;
  if FGraphActivity.CurrentSetting = '' then
    exit;                                  // if graphing is turned off, don't process
  ClearMemos;
  ClearGtsl;
  oldDFN := FGraphActivity.OldDFN;         // cleanup any previous patient cache
  FastAssign(rpcGetTypes(Patient.DFN, false), GtslTypes);
  faststatus := rpcFastTask(Patient.DFN, oldDFN);
  FGraphActivity.Cache := (faststatus = '1');
  FGraphActivity.OldDFN := Patient.DFN;
end;

procedure GraphDataOnPatient(var allitems, alldata: boolean);
begin
                                           // need to call this when patient is selected
end;

function TfrmGraphData.AllowContextChange(var WhyNot: string): Boolean;
begin
  Result := true;                          // perhaps add logic in the future
end;

//----------------------------- Gtsl* are tstringlists used to hold data - global in scope

procedure TfrmGraphData.MakeGtsl;
begin
  GtslData := TStringList.Create;
  GtslItems := TStringList.Create;
  GtslTypes := TStringList.Create;
  GtslAllTypes := TStringList.Create;
  GtslAllViews := TStringList.Create;
  GtslTestSpec := TStringList.Create;
  GtslDrugClass := TStringList.Create;
  GtslViews := TStringList.Create;
  GtslCheck := TStringList.Create;
  GtslNonNum := TStringList.Create;
  GtslNonNumDates := TStringList.Create;
  GtslScratchSwap := TStringList.Create;
  GtslScratchTemp := TStringList.Create;
  GtslScratchLab := TStringList.Create;
  GtslSpec1 := TStringList.Create;
  GtslSpec2 := TStringList.Create;
  GtslSpec3 := TStringList.Create;
  GtslSpec4 := TStringList.Create;
  GtslMultiSpec := TStringList.Create;
  GtslTempCheck := TStringList.Create;
  GtslTemp := TStringList.Create;
  GtslSelCopyTop := TStringList.Create;
  GtslSelCopyBottom := TStringList.Create;
  GtslZoomHistoryFloat := TStringList.Create;
  GtslZoomHistoryReport := TStringList.Create;
  GtslSelPrevTopFloat := TStringList.Create;
  GtslSelPrevTopReport := TStringList.Create;
  GtslSelPrevBottomFloat := TStringList.Create;
  GtslSelPrevBottomReport := TStringList.Create;
  GtslViewPersonal := TStringList.Create;
  GtslViewPublic := TStringList.Create;
  GtslLabGroup := TStringList.Create;
end;

procedure TfrmGraphData.ClearGtsl;
begin
  if GtslData = nil then exit;
  //GtslAllTypes.Clear;            // these types are not patient specific
  //GtslTestSpec.Clear;
  //GtslAllViews.Clear;
  GtslData.Clear;
  GtslItems.Clear;
  GtslTypes.Clear;
  GtslDrugClass.Clear;
  GtslViews.Clear;
  GtslCheck.Clear;
  GtslNonNum.Clear;
  GtslNonNumDates.Clear;
  GtslScratchSwap.Clear;
  GtslScratchTemp.Clear;
  GtslScratchLab.Clear;
  GtslSpec1.Clear;
  GtslSpec2.Clear;
  GtslSpec3.Clear;
  GtslSpec4.Clear;
  GtslMultiSpec.Clear;
  GtslTempCheck.Clear;
  GtslTemp.Clear;
  GtslSelCopyTop.Clear;
  GtslSelCopyBottom.Clear;
  GtslZoomHistoryFloat.Clear;
  GtslZoomHistoryReport.Clear;
  GtslSelPrevTopFloat.Clear;
  GtslSelPrevTopReport.Clear;
  GtslSelPrevBottomFloat.Clear;
  GtslSelPrevBottomReport.Clear;
  GtslViewPersonal.Clear;
  GtslViewPublic.Clear;
  GtslLabGroup.Clear;
end;

procedure TfrmGraphData.FreeGtsl;
begin
  FreeAndNil(GtslData);
  FreeAndNil(GtslItems);
  FreeAndNil(GtslTypes);
  FreeAndNil(GtslAllTypes);
  FreeAndNil(GtslAllViews);
  FreeAndNil(GtslTestSpec);
  FreeAndNil(GtslDrugClass);
  FreeAndNil(GtslNonNum);
  FreeAndNil(GtslNonNumDates);
  FreeAndNil(GtslScratchSwap);
  FreeAndNil(GtslScratchTemp);
  FreeAndNil(GtslScratchLab);
  FreeAndNil(GtslSpec1);
  FreeAndNil(GtslSpec2);
  FreeAndNil(GtslSpec3);
  FreeAndNil(GtslSpec4);
  FreeAndNil(GtslMultiSpec);
  FreeAndNil(GtslTempCheck);
  FreeAndNil(GtslSelCopyTop);
  FreeAndNil(GtslSelCopyBottom);
  FreeAndNil(GtslZoomHistoryFloat);
  FreeAndNil(GtslZoomHistoryReport);
  FreeAndNil(GtslSelPrevTopFloat);
  FreeAndNil(GtslSelPrevTopReport);
  FreeAndNil(GtslSelPrevBottomFloat);
  FreeAndNil(GtslSelPrevBottomReport);
  FreeAndNil(GtslViewPersonal);
  FreeAndNil(GtslViewPublic);
  FreeAndNil(GtslLabGroup);
end;

//----------------------------- displays when testing

procedure TfrmGraphData.btnDataClick(Sender: TObject);
var
  left, top, width, height: integer;
begin
  height := pnlData.Height div 8;
  height := height - lblInfo.Height;
  top := lblInfo.Height;
  left := 1;
  width := pnlData.Width - 2;
  MakeMemos('GtslData', GtslData, 1, left, top, width, height);
  top := top + height + lblInfo.Height;
  MakeMemos('GtslItems', GtslItems, 2, left, top, width, height);
  top := top + height + lblInfo.Height;
  MakeMemos('GtslTypes', GtslTypes, 3, left, top, width, height);
  width := width div 6;
  top := top + height + lblInfo.Height;
  left := 1;
  MakeMemos('GtslAllTypes', GtslAllTypes, 4, left, top, width, height);
  left := left + width;
  MakeMemos('GtslTestSpec', GtslTestSpec, 5, left, top, width, height);
  left := left + width;
  MakeMemos('GtslDrugClass', GtslDrugClass, 6, left, top, width, height);
  left := left + width;
  MakeMemos('GtslViews', GtslViews, 7, left, top, width, height);
  left := left + width;
  MakeMemos('GtslCheck', GtslCheck, 8, left, top, width, height);
  left := left + width;
  MakeMemos('GtslNonNum', GtslNonNum, 9, left, top, width, height);
  top := top + height + lblInfo.Height;
  left := 1;
  MakeMemos('GtslNonNumDates', GtslNonNumDates, 10, left, top, width, height);
  left := left + width;
  MakeMemos('GtslScratchSwap', GtslScratchSwap, 11, left, top, width, height);
  left := left + width;
  MakeMemos('GtslScratchTemp', GtslScratchTemp, 12, left, top, width, height);
  left := left + width;
  MakeMemos('GtslScratchLab', GtslScratchLab, 13, left, top, width, height);
  left := left + width;
  MakeMemos('GtslSpec1', GtslSpec1, 14, left, top, width, height);
  left := left + width;
  MakeMemos('GtslSpec2', GtslSpec2, 15, left, top, width, height);
  top := top + height + lblInfo.Height;
  left := 1;
  MakeMemos('GtslSpec3', GtslSpec3, 16, left, top, width, height);
  left := left + width;
  MakeMemos('GtslSpec4', GtslSpec4, 17, left, top, width, height);
  left := left + width;
  MakeMemos('GtslMultiSpec', GtslMultiSpec, 18, left, top, width, height);
  left := left + width;
  MakeMemos('GtslTempCheck', GtslTempCheck, 19, left, top, width, height);
  left := left + width;
  MakeMemos('GtslTemp', GtslTemp, 20, left, top, width, height);
  left := left + width;
  MakeMemos('GtslSelCopyTop', GtslSelCopyTop, 21, left, top, width, height);
  top := top + height + lblInfo.Height;
  left := 1;
  MakeMemos('GtslSelCopyBottom', GtslSelCopyBottom, 22, left, top, width, height);
  left := left + width;
  MakeMemos('GtslZoomHistoryFloat', GtslZoomHistoryFloat, 23, left, top, width, height);
  left := left + width;
  MakeMemos('GtslZoomHistoryReport', GtslZoomHistoryReport, 24, left, top, width, height);
  left := left + width;
  MakeMemos('GtslSelPrevTopFloat', GtslSelPrevTopFloat, 25, left, top, width, height);
  left := left + width;
  MakeMemos('GtslSelPrevTopReport', GtslSelPrevTopReport, 26, left, top, width, height);
  left := left + width;
  MakeMemos('GtslSelPrevBottomFloat', GtslSelPrevBottomFloat, 27, left, top, width, height);
  top := top + height + lblInfo.Height;
  left := 1;
  MakeMemos('GtslSelPrevBottomReport', GtslSelPrevBottomReport, 28, left, top, width, height);
  left := left + width;
  MakeMemos('GtslViewPersonal', GtslViewPersonal, 29, left, top, width, height);
  left := left + width;
  MakeMemos('GtslViewPublic', GtslViewPublic, 30, left, top, width, height);
  left := left + width;
  MakeMemos('GtslLabGroup', GtslLabGroup, 31, left, top, width, height);
  left := left + width;
  MakeMemos('GtslAllViews', GtslAllViews, 32, left, top, width, height);
  btnData.Enabled := false;
  btnRefresh.Enabled := true;
  lblCurrent.Caption := FGraphActivity.CurrentSetting;
  lblPersonal.Caption := FGraphActivity.PersonalSetting;
  lblPublic.Caption := FGraphActivity.PublicSetting;
end;

procedure TfrmGraphData.btnRefreshClick(Sender: TObject);
begin
  ClearMemos;
  FillMemos;
end;

procedure TfrmGraphData.btnTestingClick(Sender: TObject);
begin
  FastAssign(rpcTesting, memTesting.Lines);
end;

procedure TfrmGraphData.MakeMemos(aName: string; aList: TStrings; aTag, left, top, width, height: integer);
var
  aMemo: TMemo;
  aLabel: TLabel;
begin
  aMemo := TMemo.Create(self);
  aMemo.Parent := pnlData;
  aMemo.Name := 'mem' + aName;
  aMemo.Tag := aTag;
  aMemo.Left := left; aMemo.Top := top; aMemo.Width := width; aMemo.Height := height;
  aMemo.ScrollBars := ssVertical;
  aMemo.WordWrap := false;
  FastAssign(aList, aMemo.Lines);
  aLabel := TLabel.Create(self);
  aLabel.Parent := pnlData;
  aLabel.Caption := aName + ' (' + inttostr(aList.Count) + ')';
  aLabel.Left := left; aLabel.Top := top - lblInfo.Height; aLabel.Width := width; aLabel.Height := lblInfo.height;
end;

procedure TfrmGraphData.ClearMemos;
var
  i: integer;
  ChildControl: TControl;
begin
  for i := 0 to pnlData.ControlCount - 1 do
  begin
    ChildControl := pnlData.Controls[i];
    if ChildControl is TMemo then
      (ChildControl as TMemo).Clear;
  end;
end;

procedure TfrmGraphData.FillMemos;
var
  i: integer;
  aMemo: TMemo;
  ChildControl: TControl;
begin
  for i := 0 to pnlData.ControlCount - 1 do
  begin
    ChildControl := pnlData.Controls[i];
    if ChildControl is TMemo then
    begin
      aMemo := (ChildControl as TMemo);
      case aMemo.Tag of
       1: FastAssign(GtslData, aMemo.Lines);
       2: FastAssign(GtslItems, aMemo.Lines);
       3: FastAssign(GtslTypes, aMemo.Lines);
       4: FastAssign(GtslAllTypes, aMemo.Lines);
       5: FastAssign(GtslTestSpec, aMemo.Lines);
       6: FastAssign(GtslDrugClass, aMemo.Lines);
       7: FastAssign(GtslViews, aMemo.Lines);
       8: FastAssign(GtslCheck, aMemo.Lines);
       9: FastAssign(GtslNonNum, aMemo.Lines);
      10: FastAssign(GtslNonNumDates, aMemo.Lines);
      11: FastAssign(GtslScratchSwap, aMemo.Lines);
      12: FastAssign(GtslScratchTemp, aMemo.Lines);
      13: FastAssign(GtslScratchLab, aMemo.Lines);
      14: FastAssign(GtslSpec1, aMemo.Lines);
      15: FastAssign(GtslSpec2, aMemo.Lines);
      16: FastAssign(GtslSpec3, aMemo.Lines);
      17: FastAssign(GtslSpec4, aMemo.Lines);
      18: FastAssign(GtslMultiSpec, aMemo.Lines);
      19: FastAssign(GtslTempCheck, aMemo.Lines);
      20: FastAssign(GtslTemp, aMemo.Lines);
      21: FastAssign(GtslSelCopyTop, aMemo.Lines);
      22: FastAssign(GtslSelCopyBottom, aMemo.Lines);
      23: FastAssign(GtslZoomHistoryFloat, aMemo.Lines);
      24: FastAssign(GtslZoomHistoryReport, aMemo.Lines);
      25: FastAssign(GtslSelPrevTopFloat, aMemo.Lines);
      26: FastAssign(GtslSelPrevTopReport, aMemo.Lines);
      27: FastAssign(GtslSelPrevBottomFloat, aMemo.Lines);
      28: FastAssign(GtslSelPrevBottomReport, aMemo.Lines);
      29: FastAssign(GtslViewPersonal, aMemo.Lines);
      30: FastAssign(GtslViewPublic, aMemo.Lines);
      31: FastAssign(GtslLabGroup, aMemo.Lines);
      32: FastAssign(GtslAllViews, aMemo.Lines);
      end;
    end;
  end;
end;

//---------------------------------------------------

function GetCurrentSetting: string;
begin
  Result := FGraphActivity.CurrentSetting;
end;

function GetDefaultInpatientDate: string;
begin
  Result := FGraphActivity.DefaultInpatientDate;
end;

function GetDefaultOutpatientDate: string;
begin
  Result := FGraphActivity.DefaultOutpatientDate;
end;

function GetGraphProfiles(profiles, permission: string; ext: integer; userx: int64): TStrings;
var      // temporary fix - converting definitions in GtslAllViews to rpc format
  allviews, fulltext: boolean;
  i: integer;
  vtype, aline, avtype, avc, avnum, aname, atype, aitem, partsnum, bigline: string;
  //auser: string;
begin
  if (userx > 0) and (userx <> User.DUZ) then
    Result := rpcGetGraphProfiles(profiles, permission, ext, userx)
  else
  begin
    profiles := UpperCase(profiles);
    if permission = '1' then vtype := '-2'
    else vtype := '-1';
    allviews := (profiles = '1');
    fulltext := (ext = 1);
    partsnum := '0';
    bigline := '';
    GtslScratchTemp.Clear;
    for i := 0 to GtslAllViews.Count - 1 do
    begin
      aline  := GtslAllViews[i];
      avtype := Piece(aline, '^', 1);
      avc    := Piece(aline, '^', 2);
      avnum  := Piece(aline, '^', 3);
      aname  := UpperCase(Piece(aline, '^', 4));
      atype  := UpperCase(Piece(aline, '^', 5));
      aitem  := Piece(aline, '^', 6);
      //auser  := Piece(aline, '^', 7);
      if partsnum <> '0' then
      begin                                                 //AddLine(ext, aname, atype, aitem);
        if (avc = 'C') and (partsnum = avnum) then
        begin
          if ext <> 1 then
          begin
             if aitem = '0' then bigline := bigline + '0~' + atype + '~|'
             else bigline := bigline + atype + '~' + aitem  + '~|'
          end
          else
          begin
             if aitem = '0' then
               GtslScratchTemp.Add('0^' + atype + '^' + aname)
             else
               GtslScratchTemp.Add(atype + '^' + aitem  + '^' + aname)
          end;
        end
        else
        begin
          break;
        end;
      end
      else
      if avtype = vtype then
      begin
        if allviews and (avc = 'V') then
        begin
          GtslScratchTemp.Add(aname);
        end
        else if (avc = 'V') and (aname = profiles) then
          partsnum := avnum;
      end;
    end;
    if length(bigline) > 0 then
      GtslScratchTemp.Add(bigline);      
    if allviews or fulltext then
      MixedCaseList(GtslScratchTemp);
    Result := GtslScratchTemp;
  end;
end;

function GetATestGroup(testgroup: Integer; userx: int64): TStrings;
var      // temporary fix - converting definitions in GtslAllViews to rpc format
  i: integer;
  aline, avtype, avc, avnum, aname, aitem, partsnum: string;
  //atype, auser: string;
begin
  if (userx > 0) and (userx <> User.DUZ) then
    Result := rpcATestGroup(testgroup, userx)
  else
  begin
    partsnum := '0';
    GtslScratchTemp.Clear;
    for i := 0 to GtslAllViews.Count - 1 do
    begin
      aline  := GtslAllViews[i];
      avtype := Piece(aline, '^', 1);
      avc    := Piece(aline, '^', 2);
      avnum  := Piece(aline, '^', 3);
      aname  := Piece(aline, '^', 4);
      //atype  := UpperCase(Piece(aline, '^', 5));
      aitem  := Piece(aline, '^', 6);
      //auser  := Piece(aline, '^', 7);
      if avtype = VIEW_LABS then
      begin
        if (avc = 'V') and (partsnum <> '0') then
          break;
        if (avc = 'C') and (partsnum = avnum) then
          GtslScratchTemp.Add(aitem  + '^' + aname)
        else if (avc = 'V')
            and (testgroup = strtointdef(Piece(aname, ')', 1), BIG_NUMBER)) then
              partsnum := avnum;
      end;
    end;
    //MixedCaseList(GtslScratchTemp);
    Result := GtslScratchTemp;
  end;
end;

function GetGraphStatus: string;
begin
  Result := FGraphActivity.Status;
end;

function GetOldDFN: string;
begin
  Result := FGraphActivity.OldDFN;
end;

function GetPersonalSetting: string;
begin
  Result := FGraphActivity.PersonalSetting;
end;

function GetPublicSetting: string;
begin
  Result := FGraphActivity.PublicSetting;
end;

function GraphPublicEditor: boolean;
begin
  Result := FGraphActivity.PublicEditor;
end;

function GraphTurboOn: boolean;
begin
  Result := (FGraphActivity.TurboOn and FGraphActivity.Cache);
end;

procedure SetCurrentSetting(aString: string);
begin
  FGraphActivity.CurrentSetting := aString;
end;

procedure SetDefaultInpatientDate(aString: string);
begin
  FGraphActivity.DefaultInpatientDate := aString;
end;

procedure SetDefaultOutpatientDate(aString: string);
begin
  FGraphActivity.DefaultOutpatientDate := aString;
end;

procedure SetGraphStatus(aString: string);
begin
  FGraphActivity.Status := aString;
end;

procedure SetOldDFN(aString: string);
begin
  FGraphActivity.OldDFN := aString;
end;

procedure SetPersonalSetting(aString: string);
begin
  FGraphActivity.PersonalSetting := aString;
end;

procedure SetPublicSetting(aString: string);
begin
  FGraphActivity.PublicSetting := aString;
end;
//---------------------------------------------------

procedure TfrmGraphData.FormClose(Sender: TObject; var Action: TCloseAction);
var
  faststatus: string;
begin
  if FGraphActivity.Cache then
  begin
    faststatus := rpcFastTask('0', Patient.DFN);           // cleanup patient cache
    if faststatus = '-1' then
      FGraphActivity.Cache := false;
  end;
end;

procedure TfrmGraphData.FormDestroy(Sender: TObject);
begin
  FreeGtsl;
end;

end.
