home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 December / simtel1292_SIMTEL_1292_Walnut_Creek.iso / msdos / pibterm / pibt41s2.arc / PIBDIALB.MOD < prev    next >
Text File  |  1988-02-07  |  48KB  |  1,435 lines

  1. (*----------------------------------------------------------------------*)
  2. (*            Revise_Dialing_Prefix --- Revise dialing prefix           *)
  3. (*----------------------------------------------------------------------*)
  4.  
  5. PROCEDURE Revise_Dialing_Prefix;
  6.  
  7. (*----------------------------------------------------------------------*)
  8. (*                                                                      *)
  9. (*     Procedure:  Revise_Dialing_Prefix                                *)
  10. (*                                                                      *)
  11. (*     Purpose:    Handles revision of dialing prefix or setting of     *)
  12. (*                 default prefix.                                      *)
  13. (*                                                                      *)
  14. (*     Calling Sequence:                                                *)
  15. (*                                                                      *)
  16. (*        Revise_Dialing_Prefix;                                        *)
  17. (*                                                                      *)
  18. (*     Calls:   Save_Screen                                             *)
  19. (*              Draw_Menu_Frame                                         *)
  20. (*              Restore_Screen                                          *)
  21. (*              Get_New_Dialing_Prefix                                  *)
  22. (*              Get_New_Default_Prefix                                  *)
  23. (*                                                                      *)
  24. (*----------------------------------------------------------------------*)
  25.  
  26. VAR
  27.    Prefix_Menu       : Menu_Type;
  28.    Default           : INTEGER;
  29.    Choice            : INTEGER;
  30.    Full_Name         : AnyStr;
  31.    Phone_Prefix_File : Text_File;
  32.  
  33. (*----------------------------------------------------------------------*)
  34.  
  35. PROCEDURE Get_New_Dialing_Prefix;
  36.  
  37. VAR
  38.    I:       INTEGER;
  39.    Done:    BOOLEAN;
  40.    Pchar:   CHAR;
  41.    Changed: BOOLEAN;
  42.  
  43. BEGIN (* Get_New_Dialing_Prefix *)
  44.  
  45.                                    (* Bring up revision window *)
  46.  
  47.    Draw_Titled_Box( Local_Save_2, 10, 2, 75, 10, 'Revise Dialing Prefix');
  48.  
  49.    PibTerm_Window( 11, 3, 74, 9 );
  50.  
  51.    Done    := FALSE;
  52.    Changed := FALSE;
  53.  
  54.    REPEAT
  55.  
  56.       TextColor( Menu_Text_Color_2 );
  57.  
  58.       GoToXY( 1 , 2 );
  59.  
  60.       FOR I := 1 TO Max_Phone_Prefixes DO
  61.          BEGIN
  62.             ClrEol;
  63.             TextColor( Menu_Text_Color_2 );
  64.             WRITE  ( ' ', Phone_Prefix_Chars[I], ' = ');
  65.             TextColor( Menu_Text_Color );
  66.             WRITELN( Phone_Prefix_Nos[I] );
  67.          END;
  68.  
  69.       WRITELN(' ');
  70.  
  71.       TextColor( Menu_Text_Color_2 );
  72.  
  73.       REPEAT
  74.          GoToXY( 2 , WhereY );
  75.          WRITE('Enter character to revise: ');
  76.          ClrEol;
  77.          Read_Kbd( Pchar );
  78.          IF NOT ( Pchar IN ['+','-','!','@','#',CHR(CR),^[] ) THEN
  79.             Menu_Beep;
  80.       UNTIL( Pchar IN ['+','-','!','@','#',CHR(CR),^[] );
  81.  
  82.       IF ( ( Pchar <> CHR(CR) ) AND ( Pchar <> CHR( ESC ) ) ) THEN
  83.          BEGIN
  84.             GoToXY( 2 , WhereY );
  85.             WRITE('Enter new definition for ');
  86.             TextColor( Menu_Text_Color );
  87.             WRITE(Pchar);
  88.             TextColor( Menu_Text_Color_2 );
  89.             WRITE(':');
  90.             ClrEol;
  91.  
  92.             I       := POS( Pchar , '+-!@#' );
  93.             SNumber := Phone_Prefix_Nos[I];
  94.  
  95.             TextColor( Menu_Text_Color );
  96.             Read_Edited_String( SNumber );
  97.             WRITELN;
  98.  
  99.             Phone_Prefix_Nos[ I ] := Trim( Read_Ctrls( SNumber ) );
  100.  
  101.             Changed := TRUE;
  102.  
  103.          END
  104.       ELSE
  105.          Done := TRUE;
  106.  
  107.    UNTIL( Done );
  108.                                    (* Rewrite prefix file if changed *)
  109.    TextColor( Menu_Text_Color );
  110.  
  111.    IF Changed THEN
  112.       BEGIN
  113.  
  114.          Add_Path( Prefix_File_Name, Home_Dir, Full_Name );
  115.  
  116.          ASSIGN( Phone_Prefix_File , Full_Name );
  117.                    (*!I-*)
  118.          REWRITE( Phone_Prefix_File );
  119.                    (*!I+*)
  120.  
  121.          Clear_Window;
  122.  
  123.          IF Int24Result <> 0 THEN
  124.             WRITELN(' Can''t create revised ',Full_Name)
  125.          ELSE
  126.             BEGIN
  127.  
  128.                WRITELN(' Writing revised dialing prefix file ',Full_Name,'.');
  129.  
  130.                FOR I := 1 TO Max_Phone_Prefixes DO
  131.                   WRITELN( Phone_Prefix_File ,
  132.                            Write_Ctrls( Phone_Prefix_Nos[ I ] ) );
  133.  
  134.                CLOSE( Phone_Prefix_File );
  135.  
  136.             END;
  137.  
  138.          Window_Delay;
  139.  
  140.       END;
  141.  
  142.    Restore_Screen( Local_Save_2 );
  143.  
  144. END   (* Get_New_Dialing_Prefix *);
  145.  
  146. (*----------------------------------------------------------------------*)
  147.  
  148. PROCEDURE Get_New_Default_Prefix;
  149.  
  150. VAR
  151.    Done:  BOOLEAN;
  152.    Pchar: CHAR;
  153.  
  154. BEGIN (* Get_New_Default_Prefix *)
  155.                                    (* Bring up revision window *)
  156.  
  157.    Draw_Titled_Box( Local_Save_2, 10, 10, 75, 15, 'Set Default Dialing Prefix');
  158.  
  159.    PibTerm_Window( 11, 11, 74, 14 );
  160.  
  161.    Done := FALSE;
  162.  
  163.    REPEAT
  164.       TextColor( Menu_Text_Color_2 );
  165.       GoToXY( 1 , WhereY );
  166.       WRITE('Enter default prefix character: ');
  167.       ClrEol;
  168.       Read_Kbd( Pchar );
  169.       TextColor( Menu_Text_Color );
  170.       WRITE( Pchar );
  171.       IF NOT ( Pchar IN ['+','-','!','@','#',CHR(CR),^[] ) THEN
  172.          Menu_Beep;
  173.    UNTIL( Pchar IN ['+','-','!','@','#',CHR(CR),^[] );
  174.  
  175.    IF ( ( Pchar <> CHR(CR) ) AND ( Pchar <> CHR( ESC ) ) ) THEN
  176.       BEGIN
  177.          Default_Prefix := Pchar;
  178.          WRITELN;
  179.          WRITELN('New default prefix is ',Default_Prefix);
  180.       END
  181.    ELSE
  182.       BEGIN
  183.          Default_Prefix := ' ';
  184.          WRITELN;
  185.          WRITELN('No default prefix');
  186.       END;
  187.  
  188.    Window_Delay;
  189.  
  190.    Restore_Screen( Local_Save_2 );
  191.  
  192. END   (* Get_New_Default_Prefix *);
  193.  
  194. (*----------------------------------------------------------------------*)
  195.  
  196. PROCEDURE Get_New_Default_Postfix;
  197.  
  198. VAR
  199.    Done:  BOOLEAN;
  200.    Pchar: CHAR;
  201.  
  202. BEGIN (* Get_New_Default_Postfix *)
  203.                                    (* Bring up revision window *)
  204.  
  205.    Draw_Titled_Box( Local_Save_2, 10, 10, 75, 15, 'Set Default Dialing Postfix');
  206.  
  207.    PibTerm_Window( 11, 11, 74, 14 );
  208.  
  209.    Done := FALSE;
  210.  
  211.    REPEAT
  212.       TextColor( Menu_Text_Color_2 );
  213.       GoToXY( 1 , WhereY );
  214.       WRITE('Enter default postfix character: ');
  215.       ClrEol;
  216.       Read_Kbd( Pchar );
  217.       TextColor( Menu_Text_Color );
  218.       WRITE( Pchar );
  219.       IF NOT ( Pchar IN ['+','-','!','@','#',CHR(CR),^[] ) THEN
  220.          Menu_Beep;
  221.    UNTIL( Pchar IN ['+','-','!','@','#',CHR(CR),^[] );
  222.  
  223.    IF ( ( Pchar <> CHR(CR) ) AND ( Pchar <> CHR( ESC ) ) ) THEN
  224.       BEGIN
  225.          Default_PostFix := Pchar;
  226.          WRITELN;
  227.          WRITELN('New default postfix is ',Default_PostFix);
  228.       END
  229.    ELSE
  230.       BEGIN
  231.          Default_PostFix := ' ';
  232.          WRITELN;
  233.          WRITELN('No default postfix');
  234.       END;
  235.  
  236.    Window_Delay;
  237.  
  238.    Restore_Screen( Local_Save_2 );
  239.  
  240. END   (* Get_New_Default_Postfix *);
  241.  
  242. (*----------------------------------------------------------------------*)
  243.  
  244. BEGIN (* Revise_Dialing_Prefix *)
  245.  
  246.    Default := 1;
  247.                                    (* Display menu and get choice *)
  248.  
  249.    Make_And_Display_Menu( Prefix_Menu, 3, 11, 30, 0, 0, Default,
  250.                           'Choose revision function: ',
  251.                           'Revise definition string;Set default prefix;' +
  252.                           'Set default postfix;',
  253.                           TRUE, TRUE, Choice );
  254.  
  255.    CASE Choice OF
  256.       1: Get_New_Dialing_Prefix;
  257.       2: Get_New_Default_Prefix;
  258.       3: Get_New_Default_Postfix;
  259.       ELSE ;
  260.    END (* Case *);
  261.  
  262. END   (* Revise_Dialing_Prefix *);
  263.  
  264. (*----------------------------------------------------------------------*)
  265. (*            Clear_Dialing_Entry --- Clear dialing entry               *)
  266. (*----------------------------------------------------------------------*)
  267.  
  268. PROCEDURE Clear_Dialing_Entry;
  269.  
  270. (*----------------------------------------------------------------------*)
  271. (*                                                                      *)
  272. (*     Procedure:  Clear_Dialing_Entry                                  *)
  273. (*                                                                      *)
  274. (*     Purpose:    Clear out entry in dialing directory                 *)
  275. (*                                                                      *)
  276. (*     Calling Sequence:                                                *)
  277. (*                                                                      *)
  278. (*        Clear_Dialing_Entry;                                          *)
  279. (*                                                                      *)
  280. (*     Calls:   CopySToA                                                *)
  281. (*              Menu_Beep                                               *)
  282. (*                                                                      *)
  283. (*----------------------------------------------------------------------*)
  284.  
  285. VAR
  286.    I       : INTEGER;
  287.    J       : INTEGER;
  288.    SNumber : STRING[10];
  289.    Qerr    : BOOLEAN;
  290.  
  291. BEGIN (* Clear_Dialing_Entry *)
  292.  
  293.                                    (* Bring up clear entry window *)
  294.  
  295.    Draw_Titled_Box( Local_Save_2, 10, 2, 65, 5, 'Clear Entry');
  296.  
  297.    PibTerm_Window( 11, 3, 64, 4 );
  298.  
  299.    GoToXY( 1 , 1 );
  300.                                    (* Get entry to clear out *)
  301.  
  302.    TextColor( Menu_Text_Color_2 );
  303.    WRITE('Enter # of entry to clear: ');
  304.  
  305.    TextColor( Menu_Text_Color );
  306.    SNumber := '';
  307.    Read_Edited_String( SNumber );
  308.  
  309.    I    := 0;
  310.    Qerr := FALSE;
  311.  
  312.    FOR J := 1 TO LENGTH( SNumber ) DO
  313.       IF SNumber[J] IN ['0'..'9'] THEN
  314.          I := I * 10 + ORD(SNumber[J]) - ORD('0')
  315.       ELSE
  316.          Qerr := TRUE;
  317.  
  318.                                    (* Check if legitimate *)
  319.    IF ( NOT Qerr ) AND
  320.       ( I > 0 ) AND ( I <= Dialing_Dir_Size ) THEN
  321.       BEGIN
  322.                                    (* If so, clear it     *)
  323.          WITH Phone_Entry_Data DO
  324.             BEGIN
  325.  
  326.                CopyStoA( Dupl( '-' , 25 ) , Phone_Name ,   25 );
  327.                CopyStoA( ' # ### ###-####' , Phone_Number , 15 );
  328.  
  329.                Phone_Parity     := ' ';
  330.                Phone_Baud       := '     ';
  331.                Phone_DataBits   := ' ';
  332.                Phone_StopBits   := ' ';
  333.                Phone_Echo       := ' ';
  334.                Phone_BackSpace  := ' ';
  335.                Phone_LineFeed   := ' ';
  336.                Phone_Term_Type  := ' ';
  337.                Phone_Trans_Type := '  ';
  338.                Phone_Script     := '         ';
  339.                Phone_Last_Date  := '        ';
  340.                Phone_Last_Time  := '        ';
  341.  
  342.             END;
  343.  
  344.          Update_Phone_File( Phone_Entry_Data , I );
  345.  
  346.       END
  347.    ELSE
  348.       Menu_Beep;
  349.  
  350.    Restore_Screen( Local_Save_2 );
  351.  
  352. END   (* Clear_Dialing_Entry *);
  353.  
  354. (*----------------------------------------------------------------------*)
  355. (*            Extract_Dialing_Entry --- Get number to dial              *)
  356. (*----------------------------------------------------------------------*)
  357.  
  358. PROCEDURE Extract_Dialing_Entry(     I            : INTEGER;
  359.                                  VAR Entry_String : AnyStr   );
  360.  
  361. (*----------------------------------------------------------------------*)
  362. (*                                                                      *)
  363. (*     Procedure:  Extract_Dialing_Entry                                *)
  364. (*                                                                      *)
  365. (*     Purpose:    Read entry from dialing directory file               *)
  366. (*                                                                      *)
  367. (*     Calling Sequence:                                                *)
  368. (*                                                                      *)
  369. (*        Extract_Dialing_Entry(     I            : INTEGER;            *)
  370. (*                               VAR Entry_String : AnyStr   );         *)
  371. (*                                                                      *)
  372. (*           I --- If  > 0, then entry to dial;                         *)
  373. (*                 If <= 0, then get entry from input.                  *)
  374. (*           Entry_String --- Full text of dialing entry                *)
  375. (*                                                                      *)
  376. (*     Calls:   Reset_Comm_Params                                       *)
  377. (*                                                                      *)
  378. (*     Remarks:                                                         *)
  379. (*                                                                      *)
  380. (*        The current communications parameters are reset to match      *)
  381. (*        present in the selected dialing directory entry.              *)
  382. (*                                                                      *)
  383. (*----------------------------------------------------------------------*)
  384.  
  385. VAR
  386.    OK_Number: BOOLEAN;
  387.    Ch       : CHAR;
  388.    IX       : INTEGER;
  389.    IY       : INTEGER;
  390.    Quit     : BOOLEAN;
  391.    Use_DP   : BOOLEAN;
  392.    J        : INTEGER;
  393.    Ext_Num  : BOOLEAN;
  394.  
  395. BEGIN (* Extract_Dialing_Entry *)
  396.                                    (* Initialize dialing entry *)
  397.    SNumber      := '';
  398.    Prefix_Str   := '';
  399.    Postfix_Str  := '';
  400.    Entry_String := '';
  401.  
  402.    Quit       := FALSE;
  403.    Use_DP     := FALSE;
  404.    Ext_Num    := ( I <= 0 );
  405.                                    (* We entered with first character *)
  406.                                    (* in Dial_Func if I <= 0.         *)
  407.  
  408.    IF Ext_Num THEN
  409.       Read_Number_Or_ESC( Dial_Func, Xpos, 5, SNumber, Prefix_Str, Postfix_Str,
  410.                           Quit, I, Entry_String )
  411.    ELSE
  412.       BEGIN
  413.          Use_DP := Default_Prefix <> ' ';
  414.          STR( I , Entry_String );
  415.       END;
  416.                                    (* No number entered -- quit *)
  417.  
  418.    IF ( Quit OR ( I <= 0 ) OR ( I > Dialing_Dir_Size ) ) THEN
  419.       BEGIN
  420.          Entry_String := '';
  421.          EXIT;
  422.       END;
  423.                                    (* Also quit if empty dialing entry    *)
  424.  
  425.    IF ( Dialing_Directory^[I].Phone_Name = Empty_Name ) THEN
  426.       BEGIN
  427.          Entry_String := '';
  428.          EXIT;
  429.       END;
  430.                                    (* Extract phone number from directory *)
  431.  
  432.    Phone_Entry_Data   := Dialing_Directory^[I];
  433.    Phone_Number       := Phone_Entry_Data.Phone_Number;
  434.    Phone_Entry_Number := I;
  435.  
  436.                                    (* Use default dialing prefix if       *)
  437.                                    (* number is > 7 digits.               *)
  438.    IF Use_DP THEN
  439.       BEGIN
  440.  
  441.          IX := 0;
  442.  
  443.          FOR J := 1 TO LENGTH( Phone_Number ) DO
  444.             IF ( Phone_Number[J] IN ['0'..'9'] ) THEN
  445.                IX := IX + 1;
  446.  
  447.          IF ( IX > 7 ) THEN
  448.             BEGIN
  449.  
  450.                IF ( Default_Prefix <> ' ' ) THEN
  451.                   BEGIN
  452.                      Prefix_Str   := Phone_Prefix_Nos[ POS( Default_Prefix,
  453.                                                        '+-!@#' ) ];
  454.                      Entry_String := Default_Prefix + Entry_String;
  455.                   END;
  456.                                    (* Add in default postfix if any *)
  457.  
  458.                IF ( Default_Postfix <> ' ' ) THEN
  459.                   BEGIN
  460.                      Postfix_Str  := Phone_Prefix_Nos[ POS( Default_Postfix,
  461.                                                        '+-!@#' ) ];
  462.                      Entry_String := Entry_String + Default_Postfix;
  463.                   END;
  464.  
  465.             END;
  466.  
  467.       END;
  468.  
  469.    Done := TRUE;
  470.                                    (* If session not already in progress, *)
  471.                                    (* change comm parms to match dialing  *)
  472.                                    (* directory entry.                    *)
  473.  
  474.    IF ( NOT Dialer_Carrier_Detect ) THEN
  475.       Reset_Comm_Params( Phone_Entry_Data , I );
  476.  
  477. END   (* Extract_Dialing_Entry *);
  478.  
  479. (*----------------------------------------------------------------------*)
  480. (*     Do_Manual_Dial --- Get number to dial from keyboard entry        *)
  481. (*----------------------------------------------------------------------*)
  482.  
  483. FUNCTION Do_Manual_Dial : BOOLEAN;
  484.  
  485. VAR
  486.    Local_Save_5 : Saved_Screen_Ptr;
  487.    Ch           : CHAR;
  488.    Quit         : BOOLEAN;
  489.    J            : INTEGER;
  490.    Entry_Str    : AnyStr;
  491.    I            : INTEGER;
  492.  
  493. BEGIN (* Do_Manual_Dial *)
  494.  
  495.    Draw_Titled_Box( Local_Save_5, 10, 10, 65, 13, 'Manual Dial');
  496.  
  497.    PibTerm_Window( 11, 11, 64, 12 );
  498.  
  499.    GoToXY( 1 , 1 );
  500.  
  501.    Prefix_Str  := '';
  502.    Postfix_Str := '';
  503.    SNumber     := '';
  504.  
  505.    TextColor( Menu_Text_Color_2 );
  506.    WRITE('Number to dial? ');
  507.    Read_Kbd( Ch );
  508.  
  509.    IF ( ( Ch = CHR( CR ) ) OR ( Ch = CHR( ESC ) ) ) THEN
  510.       BEGIN
  511.          SNumber := '';
  512.          Quit    := TRUE;
  513.       END
  514.    ELSE
  515.       Read_Number_Or_ESC( Ch , WhereX - 1, 40, SNumber, Prefix_Str, PostFix_Str,
  516.                           Quit, J, Entry_Str );
  517.  
  518.    Restore_Screen( Local_Save_5 );
  519.  
  520.    IF ( NOT Quit ) AND ( LENGTH( SNumber ) > 0 ) THEN
  521.       BEGIN
  522.          Phone_Number       := SNumber;
  523.          Phone_Entry_Number := -1;
  524.          FOR I := 1 TO 25 DO
  525.             Phone_Entry_Data.Phone_Name[I] := ' ';
  526.          FOR I := 1 TO 15 DO
  527.             Phone_Entry_Data.Phone_Number[I] := ' ';
  528.          FOR I := 1 TO 9 DO
  529.             Phone_Entry_Data.Phone_Script[I] := ' ';
  530.          J := 0;
  531.          FOR I := ( 16 - LENGTH( SNumber ) ) TO 15 DO
  532.             BEGIN
  533.                J := J + 1;
  534.                Phone_Entry_Data.Phone_Number[I] := SNumber[J];
  535.             END;
  536.          Do_Manual_Dial := TRUE;
  537.          Manual_Dial    := TRUE;
  538.       END
  539.    ELSE
  540.       Do_Manual_Dial := FALSE;
  541.  
  542. END   (* Do_Manual_Dial *);
  543.  
  544. (*----------------------------------------------------------------------*)
  545. (*     Get_List_Of_Phone_Numbers --- Get list of entries to dial        *)
  546. (*----------------------------------------------------------------------*)
  547.  
  548. PROCEDURE Get_List_Of_Phone_Numbers;
  549.  
  550. VAR
  551.    No_Num  : BOOLEAN;
  552.    SS_Num  : AnyStr;
  553.  
  554. BEGIN (* Get_List_Of_Phone_Numbers *)
  555.  
  556.    N_Dial_Nos := 0;
  557.    I_Dial_Nos := 0;
  558.    No_Num     := FALSE;
  559.  
  560.    WHILE ( ( N_Dial_Nos < Max_Dial_Nos ) AND ( NOT No_Num ) ) DO
  561.       BEGIN
  562.                                    (* Increment dialing number count *)
  563.  
  564.          INC( N_Dial_Nos );
  565.  
  566.                                    (* Read in number *)
  567.  
  568.          TextColor( Menu_Text_Color_2 );
  569.          WRITE('Select entry number ');
  570.          TextColor( Menu_Text_Color   );
  571.          WRITE(N_Dial_Nos:2);
  572.          TextColor( Menu_Text_Color_2 );
  573.          WRITE(': ');
  574.  
  575.          TextColor( Menu_Text_Color );
  576.          SS_Num := '';
  577.          Read_Edited_String( SS_Num );
  578.          WRITELN;
  579.                                    (* Empty line terminates list entry *)
  580.  
  581.          IF ( LENGTH( SS_Num ) <= 0 ) THEN
  582.             BEGIN
  583.                No_Num     := TRUE;
  584.                DEC( N_Dial_Nos );
  585.             END
  586.                                    (* ESC evicts current list          *)
  587.  
  588.          ELSE IF ( SS_Num = CHR( ESC ) ) THEN
  589.             BEGIN
  590.                No_Num     := TRUE;
  591.                N_Dial_Nos := 0;
  592.             END
  593.  
  594.          ELSE
  595.                                    (* Store number *)
  596.  
  597.             Dial_Nos[N_Dial_Nos].Number := SS_Num;
  598.             Dial_Nos[N_Dial_Nos].Tries  := 0;
  599.  
  600.       END;
  601.  
  602. END   (* Get_List_Of_Phone_Numbers *);
  603.  
  604. (*----------------------------------------------------------------------*)
  605. (*            Sort_Dialing_Directory --- Sort dialing entries           *)
  606. (*----------------------------------------------------------------------*)
  607.  
  608. PROCEDURE Sort_Dialing_Directory;
  609.  
  610. TYPE
  611.    Saved_Chars_Type = ARRAY[1..1] OF CHAR;
  612.    Saved_Chars_Ptr  = ^Saved_Chars_Type;
  613.  
  614. VAR
  615.    I            : INTEGER;
  616.    J            : INTEGER;
  617.    D            : INTEGER;
  618.    Key          : INTEGER;
  619.    Ascending    : BOOLEAN;
  620.    Hold_Entry   : Phone_Number_Record;
  621.    Sort_Menu    : Menu_Type;
  622.    Local_Save_5 : Saved_Screen_Ptr;
  623.    Empty_Char   : CHAR;
  624.    Saved_Chars  : Saved_Chars_Ptr;
  625.    Hold_Char    : CHAR;
  626.  
  627. CONST
  628.    Quit_Item    = 7;
  629.  
  630. (*----------------------------------------------------------------------*)
  631.  
  632. FUNCTION Comp : BOOLEAN;
  633.  
  634. VAR
  635.    Komp : BOOLEAN;
  636.  
  637. BEGIN (* Comp *)
  638.  
  639.    CASE Key OF
  640.       1:   Komp := Hold_Entry.Phone_Name      < Dialing_Directory^[J].Phone_Name;
  641.       2:   Komp := Hold_Entry.Phone_Number    < Dialing_Directory^[J].Phone_Number;
  642.       3:   Komp := Hold_Entry.Phone_Baud      < Dialing_Directory^[J].Phone_Baud;
  643.       4:   Komp := Hold_Entry.Phone_Term_Type < Dialing_Directory^[J].Phone_Term_Type;
  644.       5:   Komp := Hold_Entry.Phone_Script    < Dialing_Directory^[J].Phone_Script;
  645.       6:   IF Hold_Entry.Phone_Last_Date <> Dialing_Directory^[J].Phone_Last_Date THEN
  646.               Komp := Hold_Entry.Phone_Last_Date < Dialing_Directory^[J].Phone_Last_Date
  647.            ELSE
  648.               Komp := Hold_Entry.Phone_Last_Time < Dialing_Directory^[J].Phone_Last_Time;
  649.    END (* CASE *);
  650.  
  651.    IF ( NOT Ascending ) THEN
  652.       Comp := Komp
  653.    ELSE
  654.       Comp := ( NOT Komp );
  655.  
  656. END   (* Comp *);
  657.  
  658. (*----------------------------------------------------------------------*)
  659.  
  660. BEGIN (* Sort_Dialing_Directory *)
  661.                                    (* Display items to revise *)
  662.  
  663.    Make_And_Display_Menu( Sort_Menu, Quit_Item, 10, 30, 30, 0, Quit_Item,
  664.                           'Choose field to sort on: ',
  665.                           'Name;Number;Baud Rate;Terminal Type;Script Name;' +
  666.                           'Date/Time;Quit;',
  667.                           TRUE, TRUE, Key );
  668.  
  669.    IF ( Key > 0 ) AND ( Key <> Quit_Item ) THEN
  670.       BEGIN
  671.  
  672.          Make_And_Display_Menu( Sort_Menu, 2, 10, 30, 30, 0, 1,
  673.                           'Sort order: ',
  674.                           'A)scending;D)escending;',
  675.                           FALSE, TRUE, I );
  676.  
  677.          Ascending := ( I = 1 );
  678.  
  679.          Draw_Titled_Box( Local_Save_5, 10, 10, 65, 13, '' );
  680.  
  681.          IF Ascending THEN
  682.             Empty_Char := CHR( 255 )
  683.          ELSE
  684.             Empty_Char := CHR( 0 );
  685.  
  686.          GETMEM( Saved_Chars , Dialing_Dir_Size );
  687.  
  688.          IF ( Saved_Chars = NIL ) THEN
  689.             BEGIN
  690.                WRITE('Not enough room to perform sort.');
  691.                Press_Any;
  692.                Restore_Screen( Local_Save_5 );
  693.                EXIT;
  694.             END
  695.          ELSE
  696.             WRITE( 'Sorting ... ');
  697.  
  698.          FOR I := 1 TO Dialing_Dir_Size DO
  699.             CASE Key OF
  700.                1:  BEGIN
  701.                       Saved_Chars^[I] := Dialing_Directory^[I].Phone_Name[1];
  702.                       IF ( Dialing_Directory^[I].Phone_Name = Empty_Name ) THEN
  703.                          Dialing_Directory^[I].Phone_Name[1] := Empty_Char;
  704.                    END;
  705.                2:  BEGIN
  706.                       Saved_Chars^[I] := Dialing_Directory^[I].Phone_Number[1];
  707.                       IF ( Dialing_Directory^[I].Phone_Name = Empty_Name ) THEN
  708.                          Dialing_Directory^[I].Phone_Number[1] := Empty_Char;
  709.                    END;
  710.                3:  BEGIN
  711.                       Saved_Chars^[I] := Dialing_Directory^[I].Phone_Baud[1];
  712.                       IF ( Dialing_Directory^[I].Phone_Name = Empty_Name ) THEN
  713.                          Dialing_Directory^[I].Phone_Baud[1] := Empty_Char;
  714.                    END;
  715.                4:  BEGIN
  716.                       Saved_Chars^[I] := Dialing_Directory^[I].Phone_Term_Type;
  717.                       IF ( Dialing_Directory^[I].Phone_Name = Empty_Name ) THEN
  718.                          Dialing_Directory^[I].Phone_Term_Type := Empty_Char;
  719.                    END;
  720.                5:  BEGIN
  721.                       Saved_Chars^[I] := Dialing_Directory^[I].Phone_Script[1];
  722.                       IF ( Dialing_Directory^[I].Phone_Name = Empty_Name ) THEN
  723.                          Dialing_Directory^[I].Phone_Script[1] := Empty_Char;
  724.                    END;
  725.                6:  BEGIN
  726.                       Saved_Chars^[I] := Dialing_Directory^[I].Phone_Last_Date[1];
  727.                       IF ( Dialing_Directory^[I].Phone_Name = Empty_Name ) THEN
  728.                          Dialing_Directory^[I].Phone_Last_Date[1] := Empty_Char;
  729.                    END;
  730.             END (* CASE *);
  731.  
  732.                                    (* This is a shell sort *)
  733.          D := Dialing_Dir_Size;
  734.  
  735.          WHILE( D > 1 ) DO
  736.             BEGIN
  737.  
  738.                IF ( D < 5 ) THEN
  739.                   D := 1
  740.                ELSE
  741.                   D := TRUNC( 0.45454 * D );
  742.  
  743.                FOR I := ( Dialing_Dir_Size - D ) DOWNTO 1 DO
  744.                   BEGIN
  745.  
  746.                      Hold_Entry := Dialing_Directory^[I];
  747.                      Hold_Char  := Saved_Chars^[I];
  748.                      J          := I + D;
  749.  
  750.                      WHILE( Comp AND ( J <= Dialing_Dir_Size ) ) DO
  751.                         BEGIN
  752.                            Dialing_Directory^[J-D] := Dialing_Directory^[J];
  753.                            Saved_Chars^[J-D]       := Saved_Chars^[J];
  754.                            J                       := J + D;
  755.                         END;
  756.  
  757.                      Dialing_Directory^[J-D] := Hold_Entry;
  758.                      Saved_Chars^[J-D]       := Hold_Char;
  759.  
  760.                   END;
  761.  
  762.             END;
  763.  
  764.          FOR I := 1 TO Dialing_Dir_Size DO
  765.             CASE Key OF
  766.                1:  Dialing_Directory^[I].Phone_Name[1]      := Saved_Chars^[I];
  767.                2:  Dialing_Directory^[I].Phone_Number[1]    := Saved_Chars^[I];
  768.                3:  Dialing_Directory^[I].Phone_Baud[1]      := Saved_Chars^[I];
  769.                4:  Dialing_Directory^[I].Phone_Term_Type    := Saved_Chars^[I];
  770.                5:  Dialing_Directory^[I].Phone_Script[1]    := Saved_Chars^[I];
  771.                6:  Dialing_Directory^[I].Phone_Last_Date[1] := Saved_Chars^[I];
  772.             END (* CASE *);
  773.  
  774.          MyFreeMem( Saved_Chars , Dialing_Dir_Size );
  775.  
  776.          WRITE('Done');
  777.  
  778.          Window_Delay;
  779.  
  780.          Restore_Screen( Local_Save_5 );
  781.  
  782.          Any_Dialing_Changes := TRUE;
  783.  
  784.       END;
  785.  
  786. END   (* Sort_Dialing_Directory *);
  787.  
  788. (*----------------------------------------------------------------------*)
  789. (*        Dialing_Page_Title --- Display dialing window title           *)
  790. (*----------------------------------------------------------------------*)
  791.  
  792. PROCEDURE Dialing_Page_Title;
  793.  
  794. BEGIN (* Dialing_Page_Title *)
  795.  
  796.    IF First_Display_Time THEN
  797.       Draw_Menu_Frame( 1, 1, 79, 24, Menu_Frame_Color, Menu_Title_Color,
  798.                        Menu_Text_Color, 'Dialing Directory' );
  799.  
  800.    First_Display_Time := FALSE;
  801.  
  802.    PibTerm_Window( 2, 2, 78, 23 );
  803.                                    (* Display title                *)
  804.    GoToXY( 1 , 1 );
  805.    ClrEol;
  806.  
  807.    TextColor( Menu_Text_Color_2 );
  808.    TextBackGround( BLACK );
  809.  
  810.    CASE Dialing_Page OF
  811.       1:  BEGIN
  812.              WRITELN('No.  --------- Name ----------',
  813.                      '   --- Number ---   -Baud- -Bits- -Par- -Stp- ');
  814.           END;
  815.       2:  BEGIN
  816.              WRITELN('No.  --------- Name ----------',
  817.                      ' -Echo-  -BS-  -Add LF-  -Terminal-    -Xfer- ');
  818.           END;
  819.       3:  BEGIN
  820.              WRITELN('No.  --------- Name ----------',
  821.                      '  -Script-  -Last Date-  -Last Time-');
  822.           END;
  823.  
  824.    END (* CASE *);
  825.  
  826.    PibTerm_Window( 2, 3, 78, 23 );
  827.  
  828.    TextColor( Menu_Text_Color );
  829.  
  830. END   (* Dialing_Page_Title *);
  831.  
  832. (*----------------------------------------------------------------------*)
  833. (*        Display_Dialing_Window --- Display dialing window stuff       *)
  834. (*----------------------------------------------------------------------*)
  835.  
  836. PROCEDURE Display_Dialing_Window;
  837.  
  838. BEGIN (* Display_Dialing_Window *)
  839.  
  840.    Dialing_Page_Title;
  841.  
  842.    GoToXY( 1 , N_Nos + 2 );
  843.    TextColor( Menu_Text_Color_2 );
  844.    WRITE  (' -->');
  845.    TextColor( Menu_Text_Color );
  846.    WRITE  ('     R');
  847.    TextColor( Menu_Text_Color_2 );
  848.    WRITE  (' Revise entry   ');
  849.    TextColor( Menu_Text_Color );
  850.    WRITE  (' P');
  851.    TextColor( Menu_Text_Color_2 );
  852.    WRITE  (' Revise prefix   ');
  853.    TextColor( Menu_Text_Color );
  854.    WRITE  (' C');
  855.    TextColor( Menu_Text_Color_2 );
  856.    WRITE  (' Clear entry');
  857.    TextColor( Menu_Text_Color );
  858.    WRITE  ('    Q');
  859.    TextColor( Menu_Text_Color_2 );
  860.    WRITELN(' Redial');
  861.  
  862.    TextColor( Menu_Text_Color );
  863.    WRITE  ('         PgUp/PgDn');
  864.    TextColor( Menu_Text_Color_2 );
  865.    WRITE  (' Page');
  866.    TextColor( Menu_Text_Color );
  867.    WRITE  ('    Esc');
  868.    TextColor( Menu_Text_Color_2 );
  869.    WRITE  (' Exit        ');
  870.    TextColor( Menu_Text_Color );
  871.    WRITE  ('   //', ^[, '/', ^Z );
  872.    TextColor( Menu_Text_Color_2 );
  873.    WRITE  (' Scroll');
  874.    TextColor( Menu_Text_Color );
  875.    WRITE  ('   H');
  876.    TextColor( Menu_Text_Color_2 );
  877.    WRITELN(' Hang up');
  878.  
  879.    TextColor( Menu_Text_Color );
  880.    WRITE  ('         M ');
  881.    TextColor( Menu_Text_Color_2 );
  882.    WRITE  ('Manual dial');
  883.    TextColor( Menu_Text_Color );
  884.    WRITE  ('     Home ');
  885.    TextColor( Menu_Text_Color_2 );
  886.    WRITE  ('First page ');
  887.    TextColor( Menu_Text_Color );
  888.    WRITE  ('   End');
  889.    TextColor( Menu_Text_Color_2 );
  890.    WRITE  (' Last page');
  891.    TextColor( Menu_Text_Color );
  892.    WRITE  ('    G');
  893.    TextColor( Menu_Text_Color_2 );
  894.    WRITELN(' Goto page');
  895.  
  896.    WRITE  ('         Entry');
  897.    WRITE  (' to dial     ');
  898.    TextColor( Menu_Text_Color );
  899.    WRITE  ('ENTER ');
  900.    TextColor( Menu_Text_Color_2 );
  901.    WRITE('dials highlighted entry');
  902.    TextColor( Menu_Text_Color );
  903.    WRITE  ('       L ');
  904.    TextColor( Menu_Text_Color_2 );
  905.    WRITELN('Dial list');
  906.  
  907.    TextColor( Menu_Text_Color );
  908.    WRITE  ('         S ');
  909.    TextColor( Menu_Text_Color_2 );
  910.    WRITE  ('Search');
  911.    TextColor( Menu_Text_Color );
  912.    WRITE('          O ');
  913.    TextColor( Menu_Text_Color_2 );
  914.    WRITE('Order entries');
  915.    TextColor( Menu_Text_Color );
  916.    WRITE('    W ');
  917.    TextColor( Menu_Text_Color_2 );
  918.    WRITE('Write directory');
  919.  
  920.    TextColor( Menu_Text_Color );
  921.  
  922. END   (* Display_Dialing_Window *);
  923.  
  924. (*----------------------------------------------------------------------*)
  925. (*        Switch_To_Full_Display --- Switch to full dialing display     *)
  926. (*----------------------------------------------------------------------*)
  927.  
  928. PROCEDURE Switch_To_Full_Display;
  929.  
  930. BEGIN (* Switch_To_Full_Display *)
  931.  
  932.    IF Use_Short_Prompt THEN
  933.       BEGIN
  934.          Use_Short_Prompt := FALSE;
  935.          Display_Dialing_Window;
  936.       END;
  937.  
  938. END   (* Switch_To_Full_Display *);
  939.  
  940. (*----------------------------------------------------------------------*)
  941. (*        Update_Dialing_Directory --- Rewrite dialing directory        *)
  942. (*----------------------------------------------------------------------*)
  943.  
  944. PROCEDURE Update_Dialing_Directory;
  945.  
  946. VAR
  947.    Local_Save_5 : Saved_Screen_Ptr;
  948.    I            : INTEGER;
  949.  
  950. BEGIN (* Update_Dialing_Directory *)
  951.  
  952.    Draw_Titled_Box( Local_Save_5, 10, 10, 65, 15,
  953.                     'Write Updated Dialing Directory');
  954.  
  955.    Rewrite_Dialing_Directory;
  956.  
  957.    Restore_Screen( Local_Save_5 );
  958.  
  959. END   (* Update_Dialing_Directory *);
  960.  
  961. (*----------------------------------------------------------------------*)
  962. (*            Search_For_Entry --- Search for a dialing entry           *)
  963. (*----------------------------------------------------------------------*)
  964.  
  965. PROCEDURE Search_For_Entry;
  966.  
  967. VAR
  968.    Local_Save_5 : Saved_Screen_Ptr;
  969.    I            : INTEGER;
  970.    Found        : BOOLEAN;
  971.    K            : INTEGER;
  972.    T_Phone_Name : AnyStr;
  973.  
  974. BEGIN (* Search_For_Entry *)
  975.  
  976.    Draw_Titled_Box( Local_Save_5, 10, 10, 65, 14, 'Search for entry');
  977.  
  978.    TextColor( Menu_Text_Color_2 );
  979.  
  980.    GoToXY( 1 , 1 );
  981.    WRITE('String to search for? ');
  982.  
  983.    TextColor( Menu_Text_Color );
  984.  
  985.    T_Phone_Name := '';
  986.    Read_Edited_String( T_Phone_Name );
  987.  
  988.    IF LENGTH( T_Phone_Name ) > 0 THEN
  989.       Dial_Search_String := UpperCase( T_Phone_Name );
  990.  
  991.    IF LENGTH( Dial_Search_String ) <= 0 THEN
  992.       BEGIN
  993.          Restore_Screen( Local_Save_5 );
  994.          EXIT;
  995.       END;
  996.  
  997.    Found := FALSE;
  998.    I     := Low_Num + 1;
  999.    K     := 0;
  1000.  
  1001.    REPEAT
  1002.  
  1003.       MOVE( Dialing_Directory^[I].Phone_Name,   T_Phone_Name[1],  25 );
  1004.       MOVE( Dialing_Directory^[I].Phone_Number, T_Phone_Name[26], 15 );
  1005.       T_Phone_Name[0] := CHR( 40 );
  1006.  
  1007.       IF ( POS( Dial_Search_String , UpperCase( T_Phone_Name ) ) > 0 ) THEN
  1008.          BEGIN
  1009.             Found   := TRUE;
  1010.             Low_Num := I;
  1011.             Hi_Num  := MIN( Low_Num + N_Nos - 1 , Dialing_Dir_Size );
  1012.             ReDraw  := TRUE;
  1013.             Switch_To_Full_Display;
  1014.          END;
  1015.  
  1016.       I := I + 1;
  1017.  
  1018.       IF ( I > Dialing_Dir_Size ) THEN
  1019.          I := 1;
  1020.  
  1021.       K := K + 1;
  1022.  
  1023.    UNTIL ( FOUND OR ( K > Dialing_Dir_Size ) );
  1024.  
  1025.    IF ( NOT Found ) THEN
  1026.       BEGIN
  1027.          TextColor( Menu_Text_Color_2 );
  1028.          WRITELN;
  1029.          WRITE('String not found.');
  1030.          Window_Delay;
  1031.       END;
  1032.  
  1033.    TextColor( Menu_Text_Color );
  1034.    Restore_Screen( Local_Save_5 );
  1035.  
  1036. END   (* Search_For_Entry *);
  1037.  
  1038. (*----------------------------------------------------------------------*)
  1039.  
  1040. BEGIN (* Display_Phone_Numbers *)
  1041.                                    (* Save dialing box screen *)
  1042.  
  1043.    Save_Partial_Screen( Local_Save, 1, 1, Max_Screen_Col, 24 );
  1044.  
  1045.                                    (* Display dialing prompt          *)
  1046.    IF Use_Short_Prompt THEN
  1047.       BEGIN
  1048.          TextColor( Menu_Text_Color_2 );
  1049.          WRITELN;
  1050.          WRITE('Dialing Command --> ');
  1051.          TextColor( Menu_Text_Color  );
  1052.          XPos      := WhereX;
  1053.          YPos      := WhereY;
  1054.          Dial_Func := ' ';
  1055.       END
  1056.    ELSE
  1057.       Display_Dialing_Window;
  1058.                                    (* Figure numbers to display       *)
  1059.  
  1060.    Low_Num      := MIN( MAX( Phone_Entry_Page , 1 ) ,
  1061.                              Dialing_Dir_Size );
  1062.    Hi_Num       := MIN( Low_Num + N_Nos - 1 , Dialing_Dir_Size );
  1063.    Done         := FALSE;
  1064.  
  1065.    N_Dial_Nos   := 0;
  1066.  
  1067.    Esc_Hit      := FALSE;
  1068.    ReDraw       := ( NOT Use_Short_Prompt );
  1069.    Entry_String := '';
  1070.                                    (* If full menu display requested,    *)
  1071.                                    (* display dialing directory until    *)
  1072.                                    (* explicit exit requested or a       *)
  1073.                                    (* phone number selected for dialing  *)
  1074.    REPEAT
  1075.  
  1076.       IF ReDraw AND ( NOT Use_Short_Prompt ) THEN
  1077.          BEGIN
  1078.             Display_Directory_Page;
  1079.             GoToXY( 5 , N_Nos + 2 );
  1080.             XPos      := WhereX;
  1081.             YPos      := WhereY;
  1082.             Dial_Func := ' ';
  1083.          END;
  1084.  
  1085.       ReDraw    := TRUE;
  1086.                                    (* Read in dialing command *)
  1087.       GoToXY( Xpos, Ypos );
  1088.  
  1089.       FOR I := 1 TO 5 DO
  1090.          WRITE(' ');
  1091.  
  1092.       GoToXY( Xpos, Ypos );
  1093.                                    (* Get function to perform *)
  1094.       Read_Kbd_Old( Dial_Func );
  1095.       Dial_Func := UpCase( Dial_Func );
  1096.  
  1097.                                    (* Check for keypad key *)
  1098.  
  1099.       IF ( ORD( Dial_Func ) = ESC ) AND PibTerm_KeyPressed THEN
  1100.          BEGIN
  1101.  
  1102.             Read_Kbd_Old( Dial_Func );
  1103.  
  1104.             CASE ORD( Dial_Func ) OF
  1105.  
  1106.                PgUp:    Dial_Func := 'B';
  1107.                PgDn:    Dial_Func := 'F';
  1108.                U_Arrow: Dial_Func := 'U';
  1109.                D_Arrow: Dial_Func := 'D';
  1110.                L_Arrow: Dial_Func := '<';
  1111.                R_Arrow: Dial_Func := '>';
  1112.                End_Key: Dial_Func := 'E';
  1113.                Home:    Dial_Func := 'T';
  1114.                Alt_D:   Dial_Func := ^M;
  1115.                ELSE     Dial_Func := 'Z';
  1116.  
  1117.             END (* CASE *)
  1118.  
  1119.          END
  1120.                                    (* Flag invalid letters *)
  1121.  
  1122.       ELSE IF( NOT ( Dial_Func IN ['C','R','O','P','S',^[,^H,'0'..'9','+','-',
  1123.                                    '!','@',
  1124.                                    '#',' ',^M, 'M','L','H','Q','G', 'W' ] ) ) THEN
  1125.          Dial_Func := 'Z';
  1126.  
  1127.                                    (* Perform requested dialing command *)
  1128.  
  1129.       CASE Dial_Func OF
  1130.  
  1131.                                    (* Clear dialing entry        *)
  1132.          'C':     Clear_Dialing_Entry;
  1133.  
  1134.                                    (* Exit without dialing anything *)
  1135.          ^[ :     BEGIN
  1136.                      Done    := TRUE;
  1137.                      Esc_Hit := TRUE;
  1138.                   END;
  1139.  
  1140.                                    (* Display next page in directory *)
  1141.  
  1142.          'F':     IF Hi_Num < Dialing_Dir_Size THEN
  1143.                      BEGIN
  1144.                         Low_Num := Hi_Num + 1;
  1145.                         Hi_Num  := MIN( Low_Num + N_Nos - 1 ,
  1146.                                         Dialing_Dir_Size );
  1147.                         Switch_To_Full_Display;
  1148.                      END;
  1149.                                    (* Display previous page in directory *)
  1150.  
  1151.          'B':     IF Low_Num > 1 THEN
  1152.                      BEGIN
  1153.                         Low_Num := MAX( Low_Num - N_Nos , 1 );
  1154.                         Hi_Num  := MIN( Low_Num + N_Nos - 1 ,
  1155.                                         Dialing_Dir_Size );
  1156.                         Switch_To_Full_Display;
  1157.                      END;
  1158.                                    (* Display first page in directory *)
  1159.          'T':     BEGIN
  1160.                      Low_Num := 1;
  1161.                      Hi_Num  := N_Nos;
  1162.                      Switch_To_Full_Display;
  1163.                   END;
  1164.  
  1165.                                    (* Display last page in directory *)
  1166.  
  1167.          'E':     BEGIN
  1168.                      Hi_Num  := Dialing_Dir_Size;
  1169.                      Low_Num := MAX( Hi_Num - N_Nos + 1 , 1 );
  1170.                      Switch_To_Full_Display;
  1171.                   END;
  1172.  
  1173.                                    (* Go to specific page in directory *)
  1174.          'G':     BEGIN
  1175.                      Ch := 'G';
  1176.                      Read_Number_Or_ESC( Ch , WhereX , 5, SS, SS, SS, Q, J, SS );
  1177.                      IF ( NOT Q ) THEN
  1178.                         BEGIN
  1179.                            I       := ( Dialing_Dir_Size + N_Nos - 1 ) DIV
  1180.                                       N_Nos;
  1181.                            Low_Num := MAX( 1 , MIN( J , I ) );
  1182.                            Low_Num := ( Low_Num - 1 ) * N_Nos + 1;
  1183.                            Hi_Num  := MIN( Low_Num + N_Nos - 1 ,
  1184.                                            Dialing_Dir_Size );
  1185.                         END;
  1186.                      IF Use_Short_Prompt THEN
  1187.                         BEGIN
  1188.                            Use_Short_Prompt := FALSE;
  1189.                            Display_Dialing_Window;
  1190.                         END;
  1191.                   END;
  1192.  
  1193.          'U':     BEGIN (* Move up one line *)
  1194.  
  1195.                      Redraw           := Use_Short_Prompt;
  1196.  
  1197.                      Switch_To_Full_Display;
  1198.  
  1199.                      IF Low_Num > 1 THEN
  1200.                         IF ( NOT Redraw ) THEN
  1201.                            BEGIN
  1202.  
  1203.                               PibTerm_Window( 2, 3, 78, N_Nos + 2 );
  1204.  
  1205.                                    (* Remove highlight from top line *)
  1206.  
  1207.                               Display_One_Entry( Low_Num, 1, FALSE );
  1208.  
  1209.                                    (* Make room for new line *)
  1210.  
  1211.                               GoToXY( 1 , 1 );
  1212.                               InsLine;
  1213.  
  1214.                               Low_Num  := Low_Num  - 1;
  1215.                               Hi_Num   := Hi_Num   - 1;
  1216.  
  1217.                                    (* Get data for new line *)
  1218.  
  1219.                               Display_One_Entry( Low_Num, 1, TRUE );
  1220.  
  1221.                               PibTerm_Window( 2, 3, 78, 23 );
  1222.  
  1223.                            END
  1224.                         ELSE
  1225.                            BEGIN
  1226.                               Low_Num  := Low_Num  - 1;
  1227.                               Hi_Num   := Hi_Num   - 1;
  1228.                            END;
  1229.  
  1230.                   END   (* Move up one line *);
  1231.  
  1232.          'D':     BEGIN (* Move down one line *)
  1233.  
  1234.                      Redraw           := Use_Short_Prompt;
  1235.  
  1236.                      Switch_To_Full_Display;
  1237.  
  1238.                      IF Low_Num < Dialing_Dir_Size THEN
  1239.                         IF ( NOT Redraw ) THEN
  1240.                            BEGIN
  1241.                                    (* Make room for new line *)
  1242.  
  1243.                               PibTerm_Window( 2, 3, 78, N_Nos + 3 );
  1244.  
  1245.                               GoToXY( 1 , 1 );
  1246.                               DelLine;
  1247.  
  1248.                               Low_Num := Low_Num + 1;
  1249.                               Hi_Num  := MIN( Low_Num + N_Nos - 1 ,
  1250.                                            Dialing_Dir_Size );
  1251.                               J        := Hi_Num - Low_Num + 1;
  1252.  
  1253.                               Display_One_Entry( Hi_Num  , J , FALSE );
  1254.                               Display_One_Entry( Low_Num , 1 , TRUE  );
  1255.  
  1256.                               PibTerm_Window( 2, 3, 78, 23 );
  1257.  
  1258.                            END
  1259.                         ELSE
  1260.                            BEGIN
  1261.                               Low_Num := Low_Num + 1;
  1262.                               Hi_Num  := MIN( Low_Num + N_Nos - 1 ,
  1263.                                            Dialing_Dir_Size );
  1264.                            END;
  1265.  
  1266.                   END   (* Move down one line *);
  1267.  
  1268.                                    (* Entry to dial *)
  1269.  
  1270.          '0'..'9', '+','-','!','@','#':
  1271.                   Extract_Dialing_Entry( -1 , Entry_String );
  1272. {
  1273.                   IF ( NOT Dialer_Carrier_Detect ) THEN
  1274.                      Extract_Dialing_Entry( -1 , Entry_String )
  1275.                   ELSE
  1276.                      BEGIN
  1277.                         Draw_Titled_Box( Local_Save_3, 10, 10, 60, 14, '' );
  1278.                         WRITELN('Session already in progress.');
  1279.                         WRITE  ('Dialing request ignored.');
  1280.                         Window_Delay;
  1281.                         Restore_Screen( Local_Save_3 );
  1282.                         TextColor( Menu_Text_Color );
  1283.                         ReDraw    := FALSE;
  1284.                      END;
  1285. }
  1286.                                    (* Revise/add a dialing entry *)
  1287.  
  1288.          'R':     Revise_Phone_Entry;
  1289.  
  1290.                                    (* Revise dialing prefix/postfix *)
  1291.  
  1292.          'P':     BEGIN
  1293.                      Revise_Dialing_Prefix;
  1294.                      Redraw := FALSE;
  1295.                   END;
  1296.                                    (* Start a redial             *)
  1297.  
  1298.          'Q':     BEGIN
  1299.                      IF Phone_Number = '' THEN
  1300.                         Extract_Dialing_Entry( Low_Num , Entry_String );
  1301.                      Done   := TRUE;
  1302.                      ReDial := TRUE;
  1303.                   END;
  1304.  
  1305.                                    (* Ignore extraneous backspace *)
  1306.          ^H:      BEGIN
  1307.                      Redraw := FALSE;
  1308.                   END;
  1309.  
  1310.                                    (* Hang up the phone *)
  1311.          'H':     BEGIN
  1312.  
  1313.                      Redraw := FALSE;
  1314.  
  1315.                      Draw_Titled_Box( Local_Save_2, 10, 10, 60, 15, '' );
  1316.  
  1317.                      WRITELN;
  1318.                      WRITELN('*** Hanging up the phone ***');
  1319.  
  1320.                                    (* Hang up the phone *)
  1321.  
  1322.                      HangUpPhone;
  1323.  
  1324.                      IF Async_Carrier_Detect THEN
  1325.                         WRITELN('*** Phone not hung up, try again ***')
  1326.                      ELSE
  1327.                         BEGIN
  1328.                            WRITELN('*** Phone hung up ***');
  1329.                            Qerr := Async_Open( Comm_Port, Baud_Rate,
  1330.                                                Parity, Data_Bits,
  1331.                                                Stop_Bits );
  1332.                         END;
  1333.  
  1334.                      Window_Delay;
  1335.  
  1336.                      Restore_Screen( Local_Save_2 );
  1337.                      TextColor( Menu_Text_Color );
  1338.  
  1339.                   END;
  1340.  
  1341.                                    (* Dial top number on screen *)
  1342.          ^M,
  1343.          ' ':     IF ( Use_Short_Prompt ) THEN
  1344.                      BEGIN
  1345.                         Display_Dialing_Window;
  1346.                         Use_Short_Prompt := FALSE;
  1347.                         Redraw           := TRUE;
  1348.                      END
  1349.                   ELSE
  1350.                      Extract_Dialing_Entry( Low_Num , Entry_String );
  1351.  {
  1352.                      IF ( NOT Dialer_Carrier_Detect ) THEN
  1353.                         Extract_Dialing_Entry( Low_Num , Entry_String )
  1354.                      ELSE
  1355.                         BEGIN
  1356.                            Save_Partial_Screen( Local_Save_3, 10, 10, 60, 14 );
  1357.                            Draw_Menu_Frame( 10, 10, 60, 14, Menu_Frame_Color, Menu_Title_Color,
  1358.                                             Menu_Text_Color + Blink, '' );
  1359.                            WRITELN('Session already in progress.');
  1360.                            WRITE  ('Dialing request ignored.');
  1361.                            Window_Delay;
  1362.                            Restore_Screen( Local_Save_3 );
  1363.                            TextColor( Menu_Text_Color );
  1364.                            ReDraw    := FALSE;
  1365.                         END;
  1366. }
  1367.                                    (* Manual dial *)
  1368.          'M':     BEGIN
  1369.                      Done   := Do_Manual_Dial;
  1370.                      ReDraw := FALSE;
  1371.                   END;
  1372.  
  1373.                                    (* 'L' -- list of numbers given *)
  1374.          'L':     BEGIN
  1375.                      Draw_Titled_Box( Local_Save_3, 10, 10, 60, 22,
  1376.                                       'Numbers to Dial' );
  1377.                      Get_List_Of_Phone_Numbers;
  1378.                      Restore_Screen( Local_Save_3 );
  1379.                      TextColor( Menu_Text_Color );
  1380.                      ReDraw := FALSE;
  1381.                      Done   := ( N_Dial_Nos > 0 );
  1382.                   END;
  1383.                                    (* Back up parameters *)
  1384.  
  1385.          '<':     IF ( Dialing_Page > 1 ) THEN
  1386.                      BEGIN
  1387.                         DEC( Dialing_Page );
  1388.                         ReDraw       := TRUE;
  1389.                         Dialing_Page_Title;
  1390.                      END;
  1391.                                    (* Forward parameters *)
  1392.  
  1393.          '>':     IF ( Dialing_Page < 3 ) THEN
  1394.                      BEGIN
  1395.                         INC( Dialing_Page );
  1396.                         ReDraw       := TRUE;
  1397.                         Dialing_Page_Title;
  1398.                      END;
  1399.  
  1400.          'O':     BEGIN
  1401.                      Sort_Dialing_Directory;
  1402.                      Low_Num := 1;
  1403.                      Hi_Num  := MIN( N_Nos, Dialing_Dir_Size );
  1404.                      Switch_To_Full_Display;
  1405.                      ReDraw := TRUE;
  1406.                   END;
  1407.  
  1408.          'S':     BEGIN
  1409.                      Switch_To_Full_Display;
  1410.                      Search_For_Entry;
  1411.                      ReDraw := TRUE;
  1412.                   END;
  1413.  
  1414.          'W':     BEGIN
  1415.                      Switch_To_Full_Display;
  1416.                      Update_Dialing_Directory;
  1417.                      ReDraw := TRUE;
  1418.                   END;
  1419.  
  1420.                                    (* Beep on anything else -- bad *)
  1421.          ELSE
  1422.             Menu_Beep;
  1423.             ReDraw := FALSE;
  1424.  
  1425.       END (* CASE *);
  1426.  
  1427.    UNTIL Done;
  1428.                                    (* Remember current dialing page *)
  1429.    Phone_Entry_Page := Low_Num;
  1430.                                    (* Restore dialing box *)
  1431.  
  1432.    Restore_Screen_And_Colors( Local_Save );
  1433.  
  1434. END   (* Display_Phone_Numbers *);
  1435.