{$IFDEF WIN32}
{$I DEFINES.INC}
{$ENDIF}

{$A+,B-,D+,E-,F+,I-,L+,N-,O+,R-,S+,V-}

UNIT Mail4;

INTERFACE

USES
  Common;

PROCEDURE MessageAreaList(VAR MArea,NumMAreas: Integer; AdjPageLen: Byte; ShowScan: Boolean);
PROCEDURE MessageAreaChange(VAR Done: Boolean; CONST MenuOption: Str50);
PROCEDURE ToggleMsgAreaScanFlags;

IMPLEMENTATION

USES
  Crt,
  Common5,
  Mail0;

PROCEDURE MessageAreaList(VAR MArea,NumMAreas: Integer; AdjPageLen: Byte; ShowScan: Boolean);
VAR
  ScanChar: Str1;
  TempStr: AStr;
  NumOnline,
  NumDone: Byte;
  SaveMsgArea: Integer;
BEGIN
  SaveMsgArea := MsgArea;
  Abort := FALSE;
  Next := FALSE;
  NumOnline := 0;
  TempStr := '';

  FillChar(LightBarArray,SizeOf(LightBarArray),0);
  LightBarCounter := 0;

  {
  $New_Scan_Char_Message
  þ
  $
  }
  IF (ShowScan) THEN
    ScanChar := lRGLngStr(66,TRUE);
  {
  $Message_Area_Select_Header
  %CL7ÚÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
  7³8 Num 7³9 Name                           7³8 Num 7³9 Name                           7³
  7ÀÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
  $
  }
  lRGLngStr(58,FALSE);
  Reset(MsgAreaFile);
  NumDone := 0;
  WHILE (NumDone < (PageLength - AdjPageLen)) AND (MArea >= 1) AND (MArea <= NumMsgAreas) AND (NOT Abort) AND (NOT HangUp) DO
  BEGIN
    LoadMsgArea(MArea);
    IF (ShowScan) THEN
      LoadLastReadRecord(LastReadRecord);
    IF (AACS(MemMsgArea.ACS)) OR (MAUnHidden IN MemMsgArea.MAFlags) THEN
    BEGIN

      IF (General.UseMsgAreaLightBar) AND (MsgAreaLightBar IN ThisUser.SFlags) THEN
      BEGIN
        Inc(LightBarCounter);
        LightBarArray[LightBarCounter].CmdToExec := CompMsgArea(MArea,0);
        LightBarArray[LightBarCounter].CmdToShow := MemMsgArea.Name;
        IF (NumOnline = 0) THEN
        BEGIN
          LightBarArray[LightBarCounter].Xpos := 8;
          LightBarArray[LightBarCounter].YPos := WhereY;
        END
        ELSE
        BEGIN
          LightBarArray[LightBarCounter].Xpos := 47;
          LightBarArray[LightBarCounter].YPos := WhereY;
        END;
      END;

      TempStr := TempStr + AOnOff(ShowScan AND LastReadRecord.NewScan,':'+ScanChar[1],' ')+
                           PadLeftStr(PadRightStr(';'+IntToStr(CompMsgArea(MArea,0)),5)+
                           +'< '+MemMsgArea.Name,37)+' ';
      Inc(NumOnline);
      IF (NumOnline = 2) THEN
      BEGIN
        PrintaCR(TempStr);
        NumOnline := 0;
        Inc(NumDone);
        TempStr := '';
      END;
      Inc(NumMAreas);
    END;
    WKey;
    Inc(MArea);
  END;
  Close(MsgAreaFile);
  LastError := IOResult;
  IF (NumOnline = 1) AND (NOT Abort) AND (NOT HangUp) THEN
    PrintACR(TempStr)
  ELSE IF (NumMAreas = 0) AND (NOT Abort) AND (NOT HangUp) THEN
    LRGLngStr(68,FALSE);
  {
  %LF^7No message areas!^1'
  }
  MsgArea := SaveMsgArea;
  LoadMsgArea(MsgArea);
END;

PROCEDURE MessageAreaChange(VAR Done: Boolean; CONST MenuOption: Str50);
VAR
  InputStr: Str5;
  Cmd: Char;
  MArea,
  NumMAreas,
  SaveMArea: Integer;
  SaveTempPause: Boolean;
BEGIN
  IF (MenuOption <> '') THEN
    CASE UpCase(MenuOption[1]) OF
      '+' : BEGIN
              MArea := MsgArea;
              IF (MsgArea >= NumMsgAreas) THEN
                MArea := 0
              ELSE
              REPEAT
                Inc(MArea);
                ChangeMsgArea(MArea);
              UNTIL (MsgArea = MArea) OR (MArea >= NumMsgAreas);
              IF (MsgArea <> MArea) THEN
              BEGIN
                {
                %LFHighest accessible message area.
                %PA
                }
                LRGLngStr(85,FALSE);
              END
              ELSE
                LastCommandOvr := TRUE;
            END;
      '-' : BEGIN
              MArea := MsgArea;
              IF (MsgArea <= 0) THEN
                MArea := 0
              ELSE
              REPEAT
                Dec(MArea);
                ChangeMsgArea(MArea);
              UNTIL (MsgArea = MArea) OR (MArea <= 0);
              IF (MsgArea <> MArea) THEN
              BEGIN
                {
                %LFLowest accessible message area.
                %PA
                }
                LRGLngStr(84,FALSE);
              END
              ELSE
                LastCommandOvr := TRUE;
            END;
      'L' : BEGIN
              SaveTempPause := TempPause;
              TempPause := FALSE;
              MArea := 1;
              NumMAreas := 0;
              Cmd := '?';
              REPEAT
                SaveMArea := MArea;
                IF (Cmd = '?') THEN
                  MessageAreaList(MArea,NumMAreas,5,FALSE);
                {
                %LFMessage area list? [^5?^4=^5Help^4,^5Q^4=^5Quit^4]: @
                }
                LOneK(LRGLngStr(69,TRUE),Cmd,'Q?[]',TRUE,TRUE);
                TempPause := FALSE;
                IF (Cmd <> 'Q') THEN
                BEGIN
                  IF (Cmd = '[') THEN
                  BEGIN
                    MArea := (SaveMArea - ((PageLength - 5) * 2));
                    IF (MArea < 1) THEN
                      MArea := 1;
                    Cmd := '?';
                  END
                  ELSE IF (Cmd = ']') THEN
                  BEGIN
                    IF (MArea > NumMsgAreas) THEN
                      MArea := SaveMArea;
                    Cmd := '?';
                  END
                END
                ELSE IF (Cmd = '?') THEN
                BEGIN
                  {
                  $File_Message_Area_List_Help
                  %LF^1(^3###^1)Manual entry selection  ^1(^3<CR>^1)Select current entry
                  ^1(^3<Home>^1)First entry on page  ^1(^3<End>^1)Last entry on page
                  ^1(^3Left Arrow^1)Previous entry   ^1(^3Right Arrow^1)Next entry
                  ^1(^3Up Arrow^1)Move up            ^1(^3Down Arrow^1)Move down
                  ^1(^3[^1)Previous page             ^1(^3]^1)Next page
                  %PA
                  }
                  LRGLngStr(71,FALSE);
                  MArea := SaveMArea;
                END
              UNTIL (Cmd = 'Q') OR (HangUp);
              TempPause := SaveTempPause;
              LastCommandOvr := TRUE;
            END;
    ELSE
    BEGIN
      IF (StrToInt(MenuOption) > 0) THEN
      BEGIN
        MArea := StrToInt(MenuOption);
        IF (MArea <> MsgArea) THEN
          ChangeMsgArea(MArea);
        IF (Pos(';',MenuOption) > 0) THEN
        BEGIN
          CurMenu := StrToInt(Copy(MenuOption,(Pos(';',MenuOption) + 1),Length(MenuOption)));
          NewMenuToLoad := TRUE;
          Done := TRUE;
        END;
        LastCommandOvr := TRUE;
      END;
    END;
  END
  ELSE
  BEGIN
    SaveTempPause := TempPause;
    TempPause := FALSE;
    MArea := 1;
    NumMAreas := 0;
    LightBarCmd := 1;
    LightBarFirstCmd := TRUE;
    InputStr := '?';
    REPEAT
      SaveMArea := MArea;
      IF (InputStr = '?') THEN
        MessageAreaList(MArea,NumMAreas,5,FALSE);
      {
      %LFChange message area? [^5#^4,^5?^4=^5Help^4,^5Q^4=^5Quit^4]: @
      }
      MsgAreaScanInput(LRGLngStr(73,TRUE),Length(IntToStr(HighMsgArea)),InputStr,'Q[]?',LowMsgarea,HighMsgArea);
      IF (InputStr <> 'Q') THEN
      BEGIN
        IF (InputStr = '[') THEN
        BEGIN
          MArea := (SaveMArea - ((PageLength - 5) * 2));
          IF (MArea < 1) THEN
            MArea := 1;
          InputStr := '?';
        END
        ELSE IF (InputStr = ']') THEN
        BEGIN
          IF (MArea > NumMsgAreas) THEN
            MArea := SaveMArea;
          InputStr := '?';
        END
        ELSE IF (InputStr = '?') THEN
        BEGIN
          {
          $File_Message_Area_List_Help
          %LF^1(^3###^1)Manual entry selection  ^1(^3<CR>^1)Select current entry
          ^1(^3<Home>^1)First entry on page  ^1(^3<End>^1)Last entry on page
          ^1(^3Left Arrow^1)Previous entry   ^1(^3Right Arrow^1)Next entry
          ^1(^3Up Arrow^1)Move up            ^1(^3Down Arrow^1)Move down
          ^1(^3[^1)Previous page             ^1(^3]^1)Next page
          %PA
          }
          LRGLngStr(71,FALSE);
          MArea := SaveMArea;
        END
        ELSE IF (StrToInt(InputStr) < LowMsgArea) OR (StrToInt(InputStr) > HighMsgArea) THEN
        BEGIN
          {
          %LF^7The range must be from %A3 to %A4!^1
          }
          LRGLngStr(79,FALSE);
          MArea := SaveMArea;
          InputStr := '?';
        END
        ELSE
        BEGIN
          MArea := CompMsgArea(StrToInt(InputStr),1);
          IF (MArea <> MsgArea) THEN
            ChangeMsgArea(MArea);
          IF (MArea = MsgArea) THEN
            InputStr := 'Q'
          ELSE
          BEGIN
            {
            %LF^7You do not have access to this message area!^1
            }
            LRGLngStr(81,FALSE);
            MArea := SaveMArea;
            InputStr := '?';
          END;
        END;
      END;
    UNTIL (InputStr = 'Q') OR (HangUp);
    TempPause := SaveTempPause;
    LastCommandOvr := TRUE;
  END;
END;

PROCEDURE ToggleMsgAreaScanFlags;
VAR
  InputStr: Str11;
  FirstMArea,
  LastMArea,
  MArea,
  NumMAreas,
  SaveMArea,
  SaveMsgArea: Integer;
  SaveConfSystem,
  SaveTempPause: Boolean;

  PROCEDURE ToggleScanFlags(MArea1: Integer; ScanType: Byte);
  BEGIN
    IF (MsgArea <> MArea1) THEN
      ChangeMsgArea(MArea1);
    IF (MsgArea = MArea1) THEN
    BEGIN
      LoadLastReadRecord(LastReadRecord);
      IF (ScanType = 1) THEN
        LastReadRecord.NewScan := TRUE
      ELSE IF (ScanType = 2) THEN
      BEGIN
        IF (NOT (MAForceRead IN MemMsgArea.MAFlags)) THEN
          LastReadRecord.NewScan := FALSE
        ELSE
          LastReadRecord.NewScan := TRUE;
      END
      ELSE IF (ScanType = 3) THEN
      BEGIN
        IF (NOT (MAForceRead IN MemMsgArea.MAFlags)) THEN
          LastReadRecord.NewScan := (NOT LastReadRecord.NewScan)
        ELSE
          LastReadRecord.NewScan := TRUE;
      END;
      SaveLastReadRecord(LastReadRecord);
    END;
  END;

BEGIN
  SaveMsgArea := MsgArea;
  SaveConfSystem := ConfSystem;
  ConfSystem := FALSE;
  IF (SaveConfSystem) THEN
    NewCompTables;
  SaveTempPause := TempPause;
  TempPause := FALSE;
  MArea := 1;
  NumMAreas := 0;
  LightBarCmd := 1;
  LightBarFirstCmd := TRUE;
  InputStr := '?';
  REPEAT
    SaveMArea := MArea;
    IF (InputStr = '?') THEN
      MessageAreaList(MArea,NumMAreas,5,TRUE);
    {
    %LFToggle new scan? [^5#^4,^5#^4-^5#^4,^5F^4=^5Flag ^4or ^5U^4=^5Unflag All^4,^5?^4=^5Help^4,^5Q^4=^5Quit^4]: @
    }
    MsgAreaScanInput(LRGLngStr(75,TRUE),((Length(IntToStr(HighMsgArea)) *  2) + 1),InputStr,'QFU[]?',LowMsgArea,HighMsgArea);
    IF (InputStr <> 'Q') THEN
    BEGIN
      IF (InputStr = '[') THEN
      BEGIN
        MArea := (SaveMArea - ((PageLength - 5) * 2));
        IF (MArea < 1) THEN
          MArea := 1;
        InputStr := '?';
      END
      ELSE IF (InputStr = ']') THEN
      BEGIN
        IF (MArea > NumMsgAreas) THEN
          MArea := SaveMArea;
        InputStr := '?';
      END
      ELSE IF (InputStr = '?') THEN
      BEGIN
        {
        $File_Message_Area_List_Help
        %LF^1(^3###^1)Manual entry selection  ^1(^3<CR>^1)Select current entry
        ^1(^3<Home>^1)First entry on page  ^1(^3<End>^1)Last entry on page
        ^1(^3Left Arrow^1)Previous entry   ^1(^3Right Arrow^1)Next entry
        ^1(^3Up Arrow^1)Move up            ^1(^3Down Arrow^1)Move down
        ^1(^3[^1)Previous page             ^1(^3]^1)Next page
        %PA
        }
        LRGLngStr(71,FALSE);
        MArea := SaveMArea;
      END
      ELSE
      BEGIN
        MsgArea := 0;
        IF (InputStr = 'F') THEN
        BEGIN
          FOR MArea := 1 TO NumMsgAreas DO
            ToggleScanFlags(MArea,1);
          {
          %LFYou are now reading all message areas.
          }
          LRGLngStr(87,FALSE);
          MArea := 1;
          InputStr := '?';
        END
        ELSE IF (InputStr = 'U') THEN
        BEGIN
          FOR MArea := 1 TO NumMsgAreas DO
            ToggleScanFlags(MArea,2);
          {
          %LFYou are now not reading any message areas.
          }
          LRGLngStr(89,FALSE);
          MArea := 1;
          InputStr := '?';
        END
        ELSE IF (StrToInt(InputStr) > 0) THEN
        BEGIN
          FirstMArea := StrToInt(InputStr);
          IF (Pos('-',InputStr) = 0) THEN
            LastMArea := FirstMArea
          ELSE
          BEGIN
            LastMArea := StrToInt(Copy(InputStr,(Pos('-',InputStr) + 1),(Length(InputStr) - Pos('-',InputStr))));
            IF (FirstMArea > LastMArea) THEN
            BEGIN
              MArea := FirstMArea;
              FirstMArea := LastMArea;
              LastMArea := MArea;
            END;
          END;
          IF (FirstMArea < LowMsgArea) OR (LastMArea > HighMsgArea) THEN
          BEGIN
            {
            %LF^7The range must be from %A3 to %A4!^1
            }
            LRGLngStr(91,FALSE);
            MArea := SaveMArea;
            InputStr := '?';
          END
          ELSE
          BEGIN
            FirstMArea := CompMsgArea(FirstMArea,1);
            LastMArea := CompMsgArea(LastMArea,1);
            FOR MArea := FirstMArea TO LastMArea DO
              ToggleScanFlags(MArea,3);
            IF (FirstMArea = LastMArea) THEN
              IF (NOT (MAForceRead IN MemMsgArea.MAFlags)) THEN
              BEGIN
                {
                %LF^5%MB^3 will %MSbe scanned.
                }
                LRGLngStr(93,FALSE);
              END
              ELSE
              BEGIN
                {
                %LF^5%MB^3 cannot be removed from your newscan.
                }
                LRGLngStr(94,FALSE);
              END;
              MArea := SaveMArea;
              InputStr := '?';
          END;
        END;
        MsgArea := SaveMsgArea;
      END;
    END;
  UNTIL (InputStr = 'Q') OR (HangUp);
  ConfSystem := SaveConfSystem;
  IF (SaveConfSystem) THEN
    NewCompTables;
  TempPause := SaveTempPause;
  MsgArea := SaveMsgArea;
  LoadMsgArea(MsgArea);
  LastCommandOvr := TRUE;
END;

END.
