CONFIG.PAS

90.2 KB 892fb0f019c3c6a1…
{$I DIRECT.INC}
{ infusion online configuration, started on 03/22/98 by skaboy101 }
unit config;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
interface
     uses crt,dos,subs1,subs2,gensubs,gentypes,configrt,video,windows,little,modem,
          fileLock,dosMem,userRet,protedit,config2;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Procedure cConfig0;
Procedure cConfigSubs(sub : byte);
Procedure cUserEdit;
Procedure cMenuEdit;
Procedure cConferenceEdit(conf : byte);
Procedure cThemeEdit;
Procedure cProtocolEdit;
Procedure cMiniDos; {mini dos is in here too!}
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
const
 cTotalOptns  = 15;
 cMatrix : array[1..cTotalOptns] of string = (
 '    Main System Information 1    ',
 '    Main System Information 2    ',
 '          System Paths           ',
 '    Modem/Node Specifications    ',
 '        System Passwords         ',
 '     Access (ACS) Variables      ',
 '        File Area Setup          ',
 '      New User Voting / NUV      ',
 '            Infoforms            ',
 '          System Colors          ',
 '  File/Mail Network Information  ',
 '         Misc Information        ',
 '        Misc Information 2       ',
 ' Generic Menu Generation Options ',
 '             (Q)uit              ');
cTotals  : array[1..(cTotalOptns-1)] of byte = (9,19,12,13,6,14,11,13,11,17,3,17,10,12);
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
type
 cBarRec = record
           bLast    : array[0..cTotalOptns] of byte;
           bValue   : array[0..cTotalOptns] of byte;
           end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
var
 cBarData    : cBarRec;
 cTempVar    : byte;
 cSelectChar : array[1..26] of char;
 cIgnore     : boolean;
 cValue      : array[1..2] of byte;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
implementation
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Function b00lean(b00l : boolean) : string;
 begin
 if (b00l=true) then b00lean := 'Yup ' else
                     b00lean := 'Nope';
 end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
function colorWrite(color : integer) : string;
    const colorstr : array [0..15] of string[8] =
      ('Black   ','Blue    ','Green   ','Cyan    ','Red     ','Purple  ',
       'Brown   ','White    ','Gray    ','Hi Blue ','Hi Green','Hi Cyan ',
       'Hi Red  ','Magenta ','Yellow  ','Hi White ');
          colorstr2 : array[0..15] of string[2] =
          ('00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15');
          colorStr3 : array[0..7] of string[2] = ('B0','B1','B2','B3','B4','B5','B6','B7');
var colors : string;
begin
colors := '|'+colorStr2[color and 15]+'|'+colorStr3[(color shr 4) and 7];
colorWrite := colors+colorstr[Color and 15]+' on '+colorstr[(Color shr 4) and 7]+'|B0';
end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Procedure cDrawScreens(scrn : byte; id : byte);
begin
 if (scrn=0) then
  begin
   ansiCls;
   multiColor('|08┌────────────────────|07:|15: |03infusion online configuration |15:|07:|08───────────────────────┐');
   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
   for cTempVar := 1 to cTotalOptns do
    begin
    goXY(22,2+cTempVar);
    multicolor('|B0|08│|07'+cMatrix[cTempVar]+'|08│');
    end;
    goXY(1,18);
   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
   multiColor('|08└───────────|07:|15: |03arrow keys navigate lightbar, enter edits options |15:|07:|08────────────┘');
  end else
   if (scrn=1) then
  begin
   if (id=0) then begin
   ansiCls;
   multiColor('|08┌|07:|15: |03main system info 1 |15:|07:|08──────────────────────────────────────────────────────┐');
   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
   end;
   if (id in [0,1]) then begin goXY(1,3); multicolor('|08(|15a|08) |07System Name            |08: |15'+cfg.longname) end;
   if (id in [0,2]) then begin goXY(1,4); multicolor('|08(|15b|08) |07System Acronym         |08: |15'+cfg.shortname) end;
   if (id in [0,3]) then begin goXY(1,5); multicolor('|08(|15c|08) |07System Location        |08: |15'+cfg.location) end;
   if (id in [0,4]) then begin goXY(1,6); multicolor('|08(|15d|08) |07Node Phone Number      |08: |15'+cfg.boardphone) end;
   if (id in [0,5]) then begin goXY(1,7); multicolor('|08(|15e|08) |07Sysop Handle           |08: |15'+cfg.sysopname) end;
   if (id in [0,6]) then begin goXY(1,8); multicolor('|08(|15f|08) |07Co-Sysop Handle        |08: |15'+cfg.cosysopname) end;
   if (id in [0,7]) then begin goXY(1,9); multicolor('|08(|15g|08) |07Test Code 1            |08: |15'+cfg.regcode1) end;
   if (id in [0,8]) then begin goXY(1,10);multicolor('|08(|15h|08) |07Test Code 2            |08: |15'+cfg.regcode2) end;
   if (id in [0,9]) then begin goXY(1,11);multiColor('|08(|15i|08) |07Node Number            |08: |15'+strr(cfg.nodeNum)+'|CR')
       end;
   if (id=0) then begin
   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
   multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘');
   end;
  end else
 if (scrn=2) then
  begin
   if (id=0) then
    begin
    ansiCls;
    goXY(1,1);
    multiColor('|08┌|07:|15: |03main system info 2 |15:|07:|08──────────────────────────────────────────────────────┐');
    multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
    end;
   if (id in [0,1]) then
    begin goXY(1,3); multiColor('|08(|15a|08) |07Starting Menu          |08: |15'+cfg.startMenu) end;
   if (id in [0,2]) then
    begin goXY(1,4); multiColor('|08(|15b|08) |07Total Matrices         |08: |15'+strr(cfg.amtMatrix)) end;
   if (id in [0,3]) then
    begin goXY(1,5); multiColor('|08(|15c|08) |07Default WFC Screen     |08: |15'+cfg.defaultWfc) end;
   if (id in [0,4]) then
    begin goXY(1,6); multiColor('|08(|15d|08) |07Direct Screen Writes   |08: |15'+b00lean(cfg.directVideoMode)) end;
   if (id in [0,5]) then
    begin goXY(1,7); multiColor('|08(|15e|08) |07Use XMS/EMS            |08: |15'+b00lean(cfg.useEms)) end;
   if (id in [0,6]) then
    begin goXY(1,8); multiColor('|08(|15f|08) |07Swap Mem for Shell     |08: |15'+b00lean(cfg.maxDosShell)) end;
   if (id in [0,7]) then
    begin goXY(1,9); multiColor('|08(|15g|08) |07Local Sysop Login      |08: |15'+b00lean(cfg.autoLogin)) end;
   if (id in [0,8]) then
    begin goXY(1,10);multiColor('|08(|15h|08) |07Mins til Screen Saver  |08: |15'+strr(cfg.screenSave)) end;
   if (id in [0,9]) then
    begin goXY(1,11);multiColor('|08(|15i|08) |07Closed System          |08: |15'+b00lean(cfg.private)) end;
   if (id in [0,10]) then
    begin goXY(1,12);multiColor('|08(|15j|08) |07Chat Page Cost         |08: |15'+strr(cfg.chatCost)) end;
   if (id in [0,11]) then
    begin goXY(1,13);multiColor('|08(|15k|08) |07Allow Chat Time Start  |08: |15'+cfg.availTime) end;
   if (id in [0,12]) then
    begin goXY(1,14);multiColor('|08(|15l|08) |07Allow Chat Time End    |08: |15'+cfg.unAvailTime) end;
   if (id in [0,13]) then
    begin goXY(1,15);multiColor('|08(|15m|08) |07Make Noise on Page     |08: |15'+b00lean(cfg.chatNoise)) end;
   if (id in [0,14]) then
    begin goXY(1,16);multiColor('|08(|15n|08) |07Use Input Box          |08: |15'+b00lean(cfg.useBox)) end;
   if (id in [0,15]) then
    begin goXY(1,17);multiColor('|08(|15o|08) |07Input Box Char         |08: |15'+cfg.boxChar) end;
{!}if (id in [0,16]) then
    begin goXY(1,18);multiColor('|08(|15p|08) |07Default Bottom Line    |08: |15'+strr(cfg.defBottomLine)) end;
   if (id in [0,17]) then
    begin goXY(1,19);multiColor('|08(|15q|08) |07Default Top Five List  |08: |15'+strr(cfg.defTopFive)) end;
   if (id in [0,18]) then
    begin goXY(1,20);multiColor('|08(|15r|08) |07QWK Packet Name        |08: |15'+cfg.QWKName) end;
   if (id in [0,19]) then
    begin goXY(1,21);multiColor('|08(|15s|08) |07Max One Liners         |08: |15'+strr(cfg.MaxOneLiners)+'|CR') end;
   if (id=0) then begin multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
   multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘') end;
  end else
 if (scrn=3) then
   begin
   ansiCls;
   multiColor('|08┌|07:|15: |03system paths |15:|07:|08────────────────────────────────────────────────────────────┐');
   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
   goXY(1,3); multiColor('|08(|15a|08) |07Root Infusion Directory|08: |15'+cfg.infusionDir);
   goXY(1,4); multiColor('|08(|15b|08) |07Textfile Directory     |08: |15'+cfg.textFileDir);
   goXY(1,5); multiColor('|08(|15c|08) |07Message Base Directory |08: |15'+cfg.textDir);
   goXY(1,6); multiColor('|08(|15d|08) |07Ascii Upload Directory |08: |15'+cfg.uploadDir);
   goXY(1,7); multiColor('|08(|15e|08) |07Sub-Board Directory    |08: |15'+cfg.boardDir);
   goXY(1,8); multiColor('|08(|15f|08) |07Doors Directory        |08: |15'+cfg.doorDir);
   goXY(1,9); multiColor('|08(|15g|08) |07Datafiles Directory    |08: |15'+cfg.dataDir);
   goXY(1,10);multiColor('|08(|15h|08) |07Temp Extract Directory |08: |15'+cfg.extractDir);
   goXY(1,11);multiColor('|08(|15i|08) |07Menus Directory        |08: |15'+cfg.menuDir);
   goXY(1,12);multiColor('|08(|15j|08) |07Screens Directory      |08: |15'+cfg.screensDir);
   goXY(1,13);multiColor('|08(|15k|08) |07Scripts Directory      |08: |15'+cfg.iclDir);
   goXY(1,14);multiColor('|08(|15l|08) |07IVF Menu Directory     |08: |15'+cfg.gifMenuDir+'|CR');
   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
   multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘');
   end else
 if (scrn=4) then
   begin
   ansiCls;
   goXY(1,1);
   multiColor('|08┌|07:|15: |03modem/node info |15:|07:|08─────────────────────────────────────────────────────────┐');
   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
   goXY(1,3); multiColor('|08(|15a|08) |07Multinode System       |08: |15'+b00lean(cfg.multiNode));
   goXY(1,4); multiColor('|08(|15b|08) |07Total Nodes in System  |08: |15'+strr(cfg.totalNodes));
   goXY(1,5); multiColor('|08(|15c|08) |07Telnet Node            |08: |15'+b00lean(cfg.telnetNode));
   goXY(1,6); multiColor('|08(|15d|08) |07Comm Port (0-8)        |08: |15'+strr(cfg.useCom));
   goXY(1,7); multiColor('|08(|15e|08) |07Locked Baudrate        |08: |15'+strr(cfg.defBaudRate));
   goXY(1,8); multiColor('|08(|15f|08) |07Init String #1         |08: |15'+cfg.modemSetupStr);
   goXY(1,9); multiColor('|08(|15g|08) |07Init String #2         |08: |15'+cfg.modemSetupStr2);
   goXY(1,10);multiColor('|08(|15h|08) |07Init String #3         |08: |15'+cfg.modemSetupStr3);
   goXY(1,11);multiColor('|08(|15i|08) |07Hang-up String         |08: |15'+cfg.modemHangupStr);
   goXY(1,12);multiColor('|08(|15j|08) |07Offhook String         |08: |15'+cfg.offHookStr);
   goXY(1,13);multiColor('|08(|15k|08) |07Answer String          |08: |15'+cfg.autoAnswerStr);
   goXY(1,14);multiColor('|08(|15l|08) |07Force Auto (usually no)|08: |15'+b00lean(cfg.useAutoAnswer)+'|CR');
   goXY(1,15);multiColor('|08(|15m|08) |07Use FOSSIL Driver      |08: |15'+b00lean(cfg.useFossil)+'|CR');
   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
   multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘');
   end else
 if (scrn=5) then
    begin
   ansiCls;goXY(1,1);
   multiColor('|08┌|07:|15: |03system passwords |15:|07:|08────────────────────────────────────────────────────────┐');
   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
   goXY(1,3); multiColor('|08(|15a|08) |07Matrix Password        |08: |15'+cfg.systemPassword);
   goXY(1,4); multiColor('|08(|15b|08) |07New User Password      |08: |15'+cfg.newUserPassword);
   goXY(1,5); multiColor('|08(|15c|08) |07Sysop Password         |08: |15'+cfg.dosPassword);
   goXY(1,6); multiColor('|08(|15d|08) |07Lowbaud Password       |08: |15'+cfg.lowBaudPassword);
   goXY(1,7); multiColor('|08(|15e|08) |07Local Keyboard Password|08: |15'+cfg.kbUnlockPassword);
   goXY(1,8); multiColor('|08(|15f|08) |07Local Exit Password    |08: |15'+cfg.exitPassword+'|CR');
   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
   multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘');
   end else
 if (scrn=6) then
   begin
   ansiCls;goXY(1,1);
   multiColor('|08┌|07:|15: |03acs information |15:|07:|08─────────────────────────────────────────────────────────┐');
   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
   goXY(1,3); multiColor('|08(|15a|08) |07New User ACS Level     |08: |15'+strr(cfg.defLevel));
   goXY(1,4); multiColor('|08(|15b|08) |07New User Note          |08: |15'+cfg.defUserNote);
   goXY(1,5); multiColor('|08(|15c|08) |07New User File Level    |08: |15'+strr(cfg.defUdLevel));
   goXY(1,6); multiColor('|08(|15d|08) |07New User File Points   |08: |15'+strr(cfg.defUdPoints));
   goXY(1,7); multiColor('|08(|15e|08) |07New User U/D Ratio     |08: |15'+strr(cfg.defUdRatio));
   goXY(1,8); multiColor('|08(|15f|08) |07New User U/D KB Ratio  |08: |15'+strr(cfg.defUdKRatio));
   goXY(1,9); multiColor('|08(|15g|08) |07Daily D/L KB Limit     |08: |15'+strr(cfg.defDailyKBLimit));
   goXY(1,10);multiColor('|08(|15h|08) |07Required P/C Ratio     |08: |15'+strr(cfg.defPCR));
   goXY(1,11);multiColor('|08(|15i|08) |07Required Msg Length    |08: |15'+strr(cfg.defMsgLength));
   goXY(1,12);multiColor('|08(|15j|08) |07New User ACS Flags     |08: |15'+cfg.defFlags);
   goXY(1,13);multiColor('|08(|15k|08) |07Min. Sysop ACS Level   |08: |15'+strr(cfg.sysopLevel));
   goXY(1,14);multiColor('|08(|15l|08) |07Min. Logon ACS Level   |08: |15'+strr(cfg.logonLevel));
   goXY(1,15);multiColor('|08(|15m|08) |07Ratio-Exempt ACS Level |08: |15'+strr(cfg.exemptLevel));
   goXY(1,16);multiColor('|08(|15n|08) |07Post Anon ACS Level    |08: |15'+strr(cfg.anonymousLevel)+'|CR');
   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
   multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘');
   end else
 if (scrn=7) then
   begin
   ansiCls;goXY(1,1);
   multiColor('|08┌|07:|15: |03file area setup |15:|07:|08─────────────────────────────────────────────────────────┐');
   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
   goXY(1,3); multiColor('|08(|15a|08) |07Min. Freespace for UL  |08: |15'+strr(cfg.minFreeSpace));
   goXY(1,4); multiColor('|08(|15b|08) |07DSZLOG Environment Dir |08: |15'+cfg.dszLog);
   goXY(1,5); multiColor('|08(|15c|08) |07Force DIZ/SAUCE Usage  |08: |15'+b00lean(cfg.forceDiz));
   goXY(1,6); multiColor('|08(|15d|08) |07UL File Point Grant    |08: |15'+strr(cfg.uploadFactor));
   goXY(1,7); multiColor('|08(|15e|08) |07# of K per Point       |08: |15'+strr(cfg.kPerPoint));
   goXY(1,8); multiColor('|08(|15f|08) |07UL Time % Returned    |08: |15'+strr(cfg.timePercentBack));
   goXY(1,9); multiColor('|08(|15g|08) |07Cost per Extract_File  |08: |15'+strr(cfg.extractCost));
   goXY(1,10);multiColor('|08(|15h|08) |07MCI File Point String  |08: |15'+cfg.filePoint);
   goXY(1,11);multiColor('|08(|15i|08) |07MCI File Points String |08: |15'+cfg.filePoints);
   goXY(1,12);multiColor('|08(|15j|08) |07Use MOVE.EXE           |08: |15'+b00lean(cfg.useMove));
   goXY(1,13);multiColor('|08(|15k|08) |07DL Commision Points    |08: |15'+strr(cfg.pointCommision)+'|CR');
   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
   multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘');
   end else
 if (scrn=8) then
   begin
   ansiCls;goXY(1,1);
   multiColor('|08┌|07:|15: |03new user voting |15:|07:|08─────────────────────────────────────────────────────────┐');
   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
   goXY(1,3); multiColor('|08(|15a|08) |07Use New User Voting    |08: |15'+b00lean(cfg.useNuv));
   goXY(1,4); multiColor('|08(|15b|08) |07NUV Infoform Number    |08: |15'+strr(cfg.nuvForm));
   goXY(1,5); multiColor('|08(|15c|08) |07Look in AUTOVAL.TXT    |08: |15'+b00lean(cfg.useAutoVal));
   goXY(1,6); multiColor('|08(|15d|08) |07Min. Voting ACS Level  |08: |15'+strr(cfg.nuvUseLevel));
   goXY(1,7); multiColor('|08(|15e|08) |07Required Yes Votes     |08: |15'+strr(cfg.nuvY));
   goXY(1,8); multiColor('|08(|15f|08) |07Required No Votes      |08: |15'+strr(cfg.nuvN));
   goXY(1,9); multiColor('|08(|15g|08) |07Force NUV on ALL Users |08: |15'+b00lean(cfg.autoAddNuv));
   goXY(1,10);multiColor('|08(|15h|08) |07AutoVal Accepted Users |08: |15'+b00lean(cfg.nuvValidate));
   goXY(1,11);multiColor('|08(|15i|08) |07Ban Rejected Users     |08: |15'+b00lean(cfg.nuvKill));
   goXY(1,12);multiColor('|08(|15j|08) |07Acc. Users ACS Level   |08: |15'+strr(cfg.nuvLevel));
   goXY(1,13);multiColor('|08(|15k|08) |07Acc. Users File Level  |08: |15'+strr(cfg.nuvUDLevel));
   goXY(1,14);multiColor('|08(|15l|08) |07Acc. Users File Points |08: |15'+strr(cfg.nuvPoints));
   goXY(1,15);multiColor('|08(|15m|08) |07Local AC Users Percent |08: |15'+strr(cfg.percentLocal)+'|CR');
   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
   multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘');
   end else
 if (scrn=9) then
   begin
   ansiCls;goXY(1,1);
   multiColor('|08┌|07:|15: |03infoforms stuff |15:|07:|08─────────────────────────────────────────────────────────┐');
   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
   goXY(1,3); multiColor('|08(|15a|08) |07Required Infoforms     |08: |15'+cfg.requiredForms);
   goXy(1,4); multiColor('|08(|15b|08) |07Infoform 1 Descrip.    |08: |15'+cfg.infoformStr[1]);
   goXY(1,5); multiColor('|08(|15c|08) |07Infoform 1 Min. Level  |08: |15'+strr(cfg.infoformLvl[1]));
   goXY(1,6); multiColor('|08(|15d|08) |07Infoform 2 Descrip.    |08: |15'+cfg.infoformStr[2]);
   goXY(1,7); multiColor('|08(|15e|08) |07Infoform 2 Min. Level  |08: |15'+strr(cfg.infoformLvl[2]));
   goXY(1,8); multiColor('|08(|15f|08) |07Infoform 3 Descrip.    |08: |15'+cfg.infoformStr[3]);
   goXY(1,9); multiColor('|08(|15g|08) |07Infoform 3 Min. Level  |08: |15'+strr(cfg.infoformLvl[3]));
   goXY(1,10);multiColor('|08(|15h|08) |07Infoform 4 Descrip.    |08: |15'+cfg.infoformStr[4]);
   goXY(1,11);multiColor('|08(|15i|08) |07Infoform 4 Min. Level  |08: |15'+strr(cfg.infoformLvl[4]));
   goXY(1,12);multiColor('|08(|15j|08) |07Infoform 5 Descrip.    |08: |15'+cfg.infoformStr[5]);
   goXY(1,13);multiColor('|08(|15k|08) |07Infoform 5 Min. Level  |08: |15'+strr(cfg.infoformLvl[5])+'|CR');
   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
   multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘');
   end else
  if (scrn=10) then
   begin
   ansiCls;goXY(1,1);
   multiColor('|08┌|07:|15: |03system colors |15:|07:|08───────────────────────────────────────────────────────────┐');
   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
   goXY(1,3); multiColor('|08(|15a|08) |07Default User Color 1   |08: |15'+colorWrite(cfg.defColor1));
   goXY(1,4); multiColor('|08(|15b|08) |07Default User Color 2   |08: |15'+colorWrite(cfg.defColor2));
   goXY(1,5); multiColor('|08(|15c|08) |07Default User Color 3   |08: |15'+colorWrite(cfg.defColor3));
   goXY(1,6); multiColor('|08(|15d|08) |07Default User Color 4   |08: |15'+colorWrite(cfg.defColor4));
   goXY(1,7); multiColor('|08(|15e|08) |07Default User Color 5   |08: |15'+colorWrite(cfg.defColor5));
   goXY(1,8); multiColor('|08(|15f|08) |07Default User Color 6   |08: |15'+colorWrite(cfg.defColor6));
   goXY(1,9); multiColor('|08(|15g|08) |07Default User Color 7   |08: |15'+colorWrite(cfg.defColor7));
   goXY(1,10);multiColor('|08(|15h|08) |07Uploaded By Color      |08: |15'+colorWrite(cfg.uploadedByColor));
   goXY(1,11);multiColor('|08(|15i|08) |07Crazy Chat Color 1     |08: |15'+colorWrite(cfg.cc[1]));
   goXY(1,12);multiColor('|08(|15j|08) |07Crazy Chat Color 2     |08: |15'+colorWrite(cfg.cc[2]));
   goXY(1,13);multiColor('|08(|15k|08) |07Crazy Chat Color 3     |08: |15'+colorWrite(cfg.cc[3]));
   goXY(1,14);multiColor('|08(|15l|08) |07Crazy Chat Color 4     |08: |15'+colorWrite(cfg.cc[4]));
   goXY(1,15);multiColor('|08(|15m|08) |07Crazy Chat Color 5     |08: |15'+colorWrite(cfg.cc[5]));
   goXY(1,16);multiColor('|08(|15n|08) |07Crazy Chat Color 6     |08: |15'+colorWrite(cfg.cc[6]));
   goXY(1,17);multiColor('|08(|15o|08) |07Crazy Chat Color 7     |08: |15'+colorWrite(cfg.cc[7]));
   goXY(1,18);multiColor('|08(|15p|08) |07Yes/No Selected Color  |08: |15'+colorWrite(cfg.yesColor));
   goXY(1,19);multiColor('|08(|15q|08) |07Yes/No Normal Color    |08: |15'+colorWrite(cfg.noColor)+'|CR');
   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
   multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘');
   end else
 if (scrn=11) then
   begin
   ansiCls;goXY(1,1);
   multiColor('|08┌|07:|15: |03file/mail network info |15:|07:|08──────────────────────────────────────────────────┐');
   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
   goXY(1,3); multiColor('|08(|15a|08) |07Default Net Origin     |08: |15'+cfg.fidoOrigin);
   goXY(1,4); multiColor('|08(|15b|08) |07Default Net Address    |08: |15'+cfg.defFidoAddress);
   goXY(1,5); multiColor('|08(|15c|08) |07Default Net Name       |08: |15'+cfg.netName+'|CR');
   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
   multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘');
   end else
 if (scrn=12) then
   begin
   ansiCls;goXY(1,1);
   multiColor('|08┌|07:|15: |03misc information 1 |15:|07:|08──────────────────────────────────────────────────────┐');
   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
   goXY(1,3); multiColor('|08(|15a|08) |07Password Character     |08: |15'+cfg.dotChar);
   goXY(1,4); multiColor('|08(|15b|08) |07Use One Liners         |08: |15'+b00lean(cfg.use_one_liners));
   goXY(1,5); multiColor('|08(|15c|08) |07Yes Bar String         |08: |15'+cfg.yesStr);
   goXY(1,6); multiColor('|08(|15d|08) |07No Bar String          |08: |15'+cfg.noStr);
   goXY(1,7); multiColor('|08(|15e|08) |07Total Prelogon Screens |08: |15'+strr(cfg.numPrelogon));
   goXY(1,8); multiColor('|08(|15f|08) |07Total Stat Screens     |08: |15'+strr(cfg.numStats));
   goXY(1,9); multiColor('|08(|15g|08) |07Total Welcome Screens  |08: |15'+strr(cfg.numWelcomes));
   goXY(1,10);multiColor('|08(|15h|08) |07Minutes Until Timeout  |08: |15'+strr(cfg.minTimeOut));
   goXY(1,11);multiColor('|08(|15i|08) |07Bar Menu Brackets      |08: |15'+cfg.barChar);
   goXY(1,12);multiColor('|08(|15j|08) |07Rumor Brackets         |08: |15'+cfg.rumChar);
   goXY(1,13);multiColor('|08(|15k|08) |07Nightly Event Time     |08: |15'+cfg.eventTime);
   goXY(1,14);multiColor('|08(|15l|08) |07Event Batch File       |08: |15'+cfg.eventBatch);
   goXY(1,15);multiColor('|08(|15m|08) |07Use Bios Screen Writes |08: |15'+b00lean(cfg.directVideoMode));
   goXY(1,16);multiColor('|08(|15n|08) |07Enable Snow Checking   |08: |15'+b00lean(cfg.checkSnowMode));
   goXY(1,17);multiColor('|08(|15o|08) |07Allow Note Changing    |08: |15'+b00lean(cfg.changeNote));
   goXY(1,18);multiColor('|08(|15p|08) |07Filter Msg Quotes      |08: |15'+b00lean(cfg.filterQuote));
   goXY(1,19);multiColor('|08(|15q|08) |07Inputbox Abort String  |08: |15'+cfg.boxAbort+'|CR');
   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
   multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘');
   end else
 if (scrn=13) then
   begin
   ansiCls;goXY(1,1);
   multiColor('|08┌|07:|15: |03misc information 2 |15:|07:|08──────────────────────────────────────────────────────┐');
   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
   goXY(1,3); multiColor('|08(|15a|08) |07Anonymous String       |08: |15'+cfg.anonymousStr);
   goXY(1,4); multiColor('|08(|15b|08) |07Max Msg Quoted Lines   |08: |15'+strr(cfg.maxQuotedLines));
   goXY(1,5); multiColor('|08(|15c|08) |07Max Time in Time Bank  |08: |15'+strr(cfg.maxTimeBank));
   goXY(1,6); multiColor('|08(|15d|08) |07Total File Conferences |08: |15'+strr(cfg.maxFileConf));
   goXY(1,7); multiColor('|08(|15e|08) |07Total Msg Conferences  |08: |15'+strr(cfg.maxMsgConf));
   goXY(1,8); multiColor('|08(|15f|08) |07Hangup on New Users    |08: |15'+b00lean(cfg.hangUpOnNew));
   goXY(1,9); multiColor('|08(|15g|08) |07CD-ROM Drives          |08: |15'+cfg.cdRom);
   goXY(1,10);multiColor('|08(|15h|08) |07Terminal Batch File    |08: |15'+cfg.terminalFile);
   goXY(1,11);multiColor('|08(|15i|08) |07Use Animated Prompts   |08: |15'+b00lean(cfg.useAnimatedPrompts));
   goXY(1,12);multiColor('|08(|15j|08) |07Total Animated Prompts |08: |15'+strr(cfg.totalAnimatedPrompts)+'|CR');
   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
   multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘');
   end else
 if (scrn=14) then
   begin
   ansiCls;goXY(1,1);
   multiColor('|08┌|07:|15: |03generic menu options |15:|07:|08────────────────────────────────────────────────────┐');
   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
   goXY(1,3); multiColor('|08(|15a|08) |07Auto-Generate Menus    |08: |15'+b00lean(cfg.genGenerate)+'|CR');
   goXY(1,4); multiColor('|08(|15b|08) |07Header/Top Filename    |08: |15'+cfg.genHeaderFile);
   goXY(1,5); multiColor('|08(|15c|08) |07Command/Mid Filename   |08: |15'+cfg.genMiddleFile);
   goXY(1,6); multiColor('|08(|15d|08) |07Footer/Bot Filename    |08: |15'+cfg.genFooterFile);
   goXY(1,7); multiColor('|08(|15e|08) |07Key Box Characters     |08: |15'+cfg.genKeyBoxCharz);
   goXY(1,8); multiColor('|08(|15f|08) |07Key Box Color          |08: |15'+colorWrite(cfg.genKeyBoxColor));
   goXY(1,9); multiColor('|08(|15g|08) |07Key Color              |08: |15'+colorWrite(cfg.genKeyColor));
   goXY(1,10);multiColor('|08(|15h|08) |07Description Color      |08: |15'+colorWrite(cfg.genDescriptionColor));
   goXY(1,11);multiColor('|08(|15i|08) |07Commands Per Line      |08: |15'+strr(cfg.genCmndsPerLine));
   goXY(1,12);multiColor('|08(|15j|08) |07Start X Pos for Menu   |08: |15'+strr(cfg.genStartXPos));
   goXY(1,13);multiColor('|08(|15k|08) |07Start Y Pos for Menu   |08: |15'+strr(cfg.genStartYPos));
   goXY(1,14);multiColor('|08(|15l|08) |07Description Padding    |08: |15'+strr(cfg.genDescriptionPadding)+'|CR');
   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
   multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘');
   end;
end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Function cSelectShit(cOptions : byte) : char;
var cInKey : char;
    cKill  : boolean;
  {:::::::::::::::::::::::::::::::::::::::::::::::::::::::}
 Procedure cShowSelection;
  begin
  goXY(1,2+cValue[1]);multicolor('|08(|15'+chr(cValue[1]+96)+'|08)');
  goXY(1,2+cValue[2]);multicolor('|B7 |08'+chr(cValue[2]+96)+'|B7 ');
  goXY(1,1);
  end;
  {:::::::::::::::::::::::::::::::::::::::::::::::::::::::}
begin
 cShowSelection;
 repeat
 cInKey := upCase(ArrowKey(True));
  case cInKey of
    ^A   : begin
           cValue[1] := cValue[2];
           if (cValue[1]<>1) then dec(cValue[2]);
           cShowSelection;
           end;
    ^B   : begin
           cValue[1] := cValue[2];
           if (cValue[1]<>cOptions) then inc(cValue[2]);
           cShowSelection;
           end;
  ']'    : begin
           cSelectShit := ']';
           cKill := true;
           end;
  '['    : begin
           cSelectShit := '[';
           cKill := true;
           end;
  ' '    : begin
           cSelectShit := #32;
           cKill := true;
           end;
#27,'X'  : begin
           cSelectShit := 'X';
           cKill := True;
           end;
 'A'..'Z': begin
            if (ord(cInkey)<=64+cOptions) then
             begin
             cValue[1] := cValue[2];
             cValue[2] := ord(cInKey)-64;
             cShowSelection;
             cSelectShit := cInkey;
             cKill := true;
             end;
           end;
  #13    : begin
           cSelectShit := cSelectChar[cValue[2]];
           cKill := true;
           end;
  #27    : begin
           cSelectShit := #0;
           cKill := true;
           end;
   end;
 until (cKill=true);
end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Procedure cUpdateBars(bSet : byte);
begin
 if (bSet=0) then
  begin
  goxy(23,2+cBarData.bLast[0]);
  multicolor('|07|B0'+cMatrix[cBarData.bLast[0]]);
  goxy(23,2+cBarData.bValue[0]);
  multicolor('|15|B3'+cMatrix[cBarData.bValue[0]]);
  goXY(1,1);
  end;
end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Function cInputStr(x,y,fg,bg,len : byte; bufStr : lStr) : lStr;
var iPos     : byte;
    iStr     : lStr;
    iChar    : char;
begin
cChange := true;
iStr := bufStr;
goxy(x,y);
for iPos := 1 to len do multicolor('|B0|07'+#32);goxy(x,y);
inputbox2(len, bufStr);
if inpt<>'<<undo>>' then cInputStr := inpt else
                         cInputStr := iStr;
goxy(x,y);
for iPos := 1 to len do multicolor('|B0|07'+#32);goxy(x,y);
end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Procedure writeConfig;
 var f : file of configsettype;
 begin
 assign(f,configFile);
 rewrite(f);
 write(f,cfg);
 close(f);
 end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Function  cPromptSave : boolean;
 begin
 goXy(1,24);
 ansiColor(7);
 writeStr('Save your changes :: !');
 if yes then cPromptSave := true;
 end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Function cBoolToggle(b : boolean) : boolean;
 begin
 asm xor b, 1 end;
 cBoolToggle := b;
 cChange := true;
 end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Function cEditColor(x,y : byte;color : integer) : integer;
 var fg,bg,col : byte;
 begin
 cChange := true;
 goXY(x,y);
 multiColor('|07Enter Forground Color (0-15) :: ');
 inputBox(2);fg := stoi(inpt);
 goXY(x,y);for bg := 1 to 40 do sendFull(' ');
 goXY(x,y);
 multiColor('|07Enter Background Color (0-7) :: ');
 inputBox(1);bg := stoi(inpt);
 cEditColor := bg*16+fg;
 end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Function cInputCh(x,y,fg,bg,len : byte;bufStr : char) : char;
 var s : string;
 begin
 s := cInputStr(x,y,fg,bg,1,bufStr);
 cInputCh := s[1];
 end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Procedure cEditShit(cSection,cNumber : byte);
begin
if (cSection=1) then
 begin
  case cNumber of
  1 : cfg.longname    := cInputStr(30,2+cNumber,00,7,45,cfg.longname);
  2 : cfg.shortname   := cInputStr(30,2+cNumber,00,7,04,cfg.shortname);
  3 : cfg.location    := cInputStr(30,2+cNumber,00,7,45,cfg.location);
  4 : cfg.boardphone  := cInputStr(30,2+cNumber,00,7,12,cfg.boardphone);
  5 : cfg.sysopname   := cInputStr(30,2+cNumber,00,7,15,cfg.sysopname);
  6 : cfg.cosysopname := cInputStr(30,2+cNumber,00,7,15,cfg.cosysopname);
  7 : cfg.regcode1    := cInputStr(30,2+cNumber,00,7,12,cfg.regcode1);
  8 : cfg.regcode2    := cInputStr(30,2+cNumber,00,7,12,cfg.regcode2);
  9 : cfg.nodeNum     := stoi(cInputStr(30,2+cNumber,00,7,3,strr(cfg.nodeNum)));
 10 : cfg.useGifMenus := cBoolToggle(cfg.useGifMenus);
  end;
  end else
 if (cSection=2) then
  begin
  case cNumber of
   1 : cfg.startMenu       := cInputStr(30,3,00,7,8,cfg.startMenu);
   2 : cfg.amtMatrix       := stoi(cInputStr(30,4,00,7,3,strr(cfg.amtMatrix)));
   3 : cfg.defaultWfc      :=      cInputStr(30,5,00,7,12,cfg.defaultWfc);
   4 : cfg.directVideoMode := cBoolToggle(cfg.directVideoMode);
   5 : cfg.useEms          := cBoolToggle(cfg.useEms);
   6 : cfg.maxDosShell     := cBoolToggle(cfg.maxDosShell);
   7 : cfg.autoLogin       := cBoolToggle(cfg.autoLogin);
   8 : cfg.screenSave      := stoi(cInputStr(30,10,00,7,3,strr(cfg.screenSave)));
   9 : cfg.private         := cBoolToggle(cfg.private);
  10 : cfg.chatCost        := stoi(cInputStr(30,12,00,7,3,strr(cfg.chatCost)));
  11 : cfg.availTime       :=      cInputStr(30,13,00,7,12,cfg.availTime);
  12 : cfg.unAvailTime     :=      cInputStr(30,14,00,7,12,cfg.unAvailTime);
  13 : cfg.chatNoise       := cBoolToggle(cfg.chatNoise);
  14 : cfg.useBox          := cBoolToggle(cfg.useBox);
  15 : cfg.boxChar         :=      cInputCh(30,17,00,7,1,cfg.boxChar);
  16 : cfg.defBottomLine   := stoi(cInputStr(30,18,00,7,1,strr(cfg.defBottomLine)));
  17 : cfg.defTopFive      := stoi(cInputStr(30,19,00,7,1,strr(cfg.defTopFive)));
  18 : cfg.QWKName         :=      cInputStr(30,20,00,7,15,cfg.qwkName);
  19 : cfg.maxOneLiners    := stoi(cInputStr(30,21,00,7,2,strr(cfg.maxOneLiners)));
  end;
  end else
 if (cSection=3) then
  begin
  case cNumber of
   1 : cfg.infusionDir     := cInputStr(30,3,00,7,44,cfg.infusionDir);
   2 : cfg.textFileDir     := cInputStr(30,4,00,7,44,cfg.textFileDir);
   3 : cfg.textDir         := cInputStr(30,5,00,7,44,cfg.textDir);
   4 : cfg.uploadDir       := cInputStr(30,6,00,7,44,cfg.uploadDir);
   5 : cfg.boardDir        := cInputStr(30,7,00,7,44,cfg.boardDir);
   6 : cfg.doorDir         := cInputStr(30,8,00,7,44,cfg.doorDir);
   7 : cfg.dataDir         := cInputStr(30,9,00,7,44,cfg.dataDir);
   8 : cfg.extractDir      := cInputStr(30,10,00,7,44,cfg.extractDir);
   9 : cfg.menuDir         := cInputStr(30,11,00,7,44,cfg.menuDir);
  10 : cfg.screensDir      := cInputStr(30,12,00,7,44,cfg.screensDir);
  11 : cfg.iclDir          := cInputStr(30,13,00,7,44,cfg.iclDir);
  12 : cfg.gifMenuDir      := cInputStr(30,14,00,7,44,cfg.gifMenuDir);
  end;
  end else
 if (cSection=4) then
  begin
   case cNumber of
   1 : cfg.multiNode       := cBoolToggle(cfg.multiNode);
   2 : cfg.totalNodes      := stoi(cInputStr(30,4,00,7,3,strr(cfg.totalNodes)));
   3 : cfg.telnetNode      := cBoolToggle(cfg.telnetNode);
   4 : cfg.useCom          := stoi(cInputStr(30,6,00,7,3,strr(cfg.useCom)));
   5 : cfg.defBaudRate     := stoi(cInputStr(30,7,00,7,5,strr(cfg.defBaudRate)));
   6 : cfg.modemSetupStr   := cInputStr(30,8,00,7,40,cfg.modemSetupStr);
   7 : cfg.modemSetupStr2  := cInputStr(30,9,00,7,40,cfg.modemSetupStr2);
   8 : cfg.modemSetupStr3  := cInputStr(30,10,00,7,40,cfg.modemSetupStr3);
   9 : cfg.modemHangupStr  := cInputStr(30,11,00,7,40,cfg.modemHangupStr);
  10 : cfg.offHookStr      := cInputStr(30,12,00,7,40,cfg.offHookStr);
  11 : cfg.autoAnswerStr   := cInputStr(30,13,00,7,40,cfg.autoAnswerStr);
  12 : cfg.useAutoAnswer   := cBoolToggle(cfg.useAutoAnswer);
  13 : cfg.useFossil       := cBoolToggle(cfg.useFossil);
  end;
  end else
 if (cSection=5) then
  begin
   case cNumber of
   1 : cfg.systemPassword  := cInputStr(30,3,00,7,20,cfg.systemPassword);
   2 : cfg.newUserPassword := cInputStr(30,4,00,7,20,cfg.newUserPassword);
   3 : cfg.dosPassword     := cInputStr(30,5,00,7,20,cfg.dosPassword);
   4 : cfg.lowBaudPassword := cInputStr(30,6,00,7,20,cfg.lowBaudPassword);
   5 : cfg.kbUnlockPassword:= cInputStr(30,7,00,7,20,cfg.kbUnlockPassword);
   6 : cfg.exitPassword    := cInputStr(30,8,00,7,20,cfg.exitPassword);
   end;
  end else
 if (cSection=6) then
  begin
   case cNumber of
   1 : cfg.defLevel        := stoi(cInputStr(30,3,00,7,5, strr(cfg.defLevel)));
   2 : cfg.defUserNote     :=      cInputStr(30,4,00,7,40,cfg.defUserNote);
   3 : cfg.defUdLevel      := stoi(cInputStr(30,5,00,7,5, strr(cfg.defudLevel)));
   4 : cfg.defUdPoints     := stoi(cInputStr(30,6,00,7,5, strr(cfg.defUdPoints)));
   5 : cfg.defUdRatio      := stoi(cInputStr(30,7,00,7,5, strr(cfg.defUdRatio)));
   6 : cfg.defUdKratio     := stoi(cInputStr(30,8,00,7,5, strr(cfg.defUdKRatio)));
   7 : cfg.defDailyKBLimit := stoi(cInputStr(30,9,00,7,5, strr(cfg.defDailyKBLimit)));
   8 : cfg.defPcr          := stoi(cInputStr(30,10,00,7,5, strr(cfg.defPcr)));
   9 : cfg.defMsgLength    := stoi(cInputStr(30,11,00,7,5,strr(cfg.defMsgLength)));
  10 : cfg.defFlags        :=      cInputStr(30,12,0,7,26,cfg.defFlags);
  11 : cfg.sysopLevel      := stoi(cInputStr(30,13,00,7,5,strr(cfg.sysopLevel)));
  12 : cfg.logonLevel      := stoi(cInputStr(30,14,00,7,5,strr(cfg.logonLevel)));
  13 : cfg.exemptLevel     := stoi(cInputStr(30,15,00,7,5,strr(cfg.exemptLevel)));
  14 : cfg.anonymousLevel  := stoi(cInputStr(30,16,00,7,5,strr(cfg.anonymousLevel)));
   end;
  end else
 if (cSection=7) then
  begin
   case cNumber of
   1 : cfg.minFreeSpace    := stoi(cInputStr(30,3,00,7,4,strr(cfg.minFreeSpace)));
   2 : cfg.dszLog          :=      cInputStr(30,4,00,7,44,cfg.dszLog);
   3 : cfg.forceDiz        :=      cBoolToggle(cfg.forceDiz);
   4 : cfg.uploadFactor    := stoi(cInputStr(30,6,00,7,3,strr(cfg.uploadFactor)));
   5 : cfg.kPerPoint       := stoi(cInputStr(30,7,00,7,3,strr(cfg.kPerPoint)));
   6 : cfg.timePercentBack := stoi(cInputStr(30,8,00,7,3,strr(cfg.timePercentBack)));
   7 : cfg.extractCost     := stoi(cInputStr(30,9,00,7,3,strr(cfg.extractCost)));
   8 : cfg.filePoint       :=      cInputStr(30,10,00,7,30,cfg.filePoint);
   9 : cfg.filePoints      :=      cInputStr(30,11,00,7,30,cfg.filePoints);
  10 : cfg.useMove         :=      cBoolToggle(cfg.useMove);
  11 : cfg.pointCommision  := stoi(cInputStr(30,13,00,7,3,strr(cfg.pointCommision)));
   end;
  end else
 if (cSection=8) then
  begin
   case cNumber of
   1 : cfg.useNuv          := cBoolToggle(cfg.useNuv);
   2 : cfg.nuvForm         := stoi(cInputStr(30,4,00,7,1,strr(cfg.nuvForm)));
   3 : cfg.useAutoVal      := cBoolToggle(cfg.useAutoVal);
   4 : cfg.nuvUseLevel     := stoi(cInputStr(30,6,00,7,5,strr(cfg.nuvUseLevel)));
   5 : cfg.nuvY            := stoi(cInputStr(30,7,00,7,2,strr(cfg.nuvY)));
   6 : cfg.nuvN            := stoi(cInputStr(30,8,00,7,2,strr(cfg.nuvN)));
   7 : cfg.autoAddNuv      := cBoolToggle(cfg.autoAddNuv);
   8 : cfg.nuvValidate     := cBoolToggle(cfg.nuvValidate);
   9 : cfg.nuvKill         := cBoolToggle(cfg.nuvKill);
  10 : cfg.nuvLevel        := stoi(cInputStr(30,12,00,7,5,strr(cfg.nuvLevel)));
  11 : cfg.nuvUDLevel      := stoi(cInputStr(30,13,00,7,5,strr(cfg.nuvUDLevel)));
  12 : cfg.nuvPoints       := stoi(cInputStr(30,14,00,7,5,strr(cfg.nuvPoints)));
  13 : cfg.percentLocal    := stoi(cInputStr(30,15,00,7,3,strr(cfg.percentLocal)));
   end;
  end else
 if (cSection=9) then
  begin
   case cNumber of
   1 : cfg.requiredForms   :=      cInputStr(30,3,00,7,5, cfg.requiredForms);
   2 : cfg.infoformStr[1]  :=      cInputStr(30,4,00,7,40,cfg.infoformStr[1]);
   3 : cfg.infoformLvl[1]  := stoi(cInputStr(30,5,00,7,5,strr(cfg.infoformLvl[1])));
   4 : cfg.infoformStr[2]  :=      cInputStr(30,6,00,7,40,cfg.infoformStr[2]);
   5 : cfg.infoformLvl[2]  := stoi(cInputStr(30,7,00,7,5,strr(cfg.infoformLvl[2])));
   6 : cfg.infoformStr[3]  :=      cInputStr(30,8,00,7,40,cfg.infoformStr[3]);
   7 : cfg.infoformLvl[3]  := stoi(cInputStr(30,9,00,7,5,strr(cfg.infoformLvl[3])));
   8 : cfg.infoformStr[4]  :=      cInputStr(30,10,00,7,40,cfg.infoformStr[4]);
   9 : cfg.infoformLvl[4]  := stoi(cInputStr(30,11,00,7,5,strr(cfg.infoformLvl[4])));
  10 : cfg.infoformStr[5]  :=      cInputStr(30,12,00,7,40,cfg.infoformStr[5]);
  11 : cfg.infoformLvl[5]  := stoi(cInputStr(30,13,00,7,5,strr(cfg.infoformLvl[5])));
   end;
  end else
 if (cSection=10) then
  begin
   case cNumber of
   1 : cfg.defColor1       := cEditColor(30,3, cfg.defColor1);
   2 : cfg.defColor2       := cEditColor(30,4, cfg.defColor2);
   3 : cfg.defColor3       := cEditColor(30,5, cfg.defColor3);
   4 : cfg.defColor4       := cEditColor(30,6, cfg.defColor4);
   5 : cfg.defColor5       := cEditColor(30,7, cfg.defColor5);
   6 : cfg.defColor6       := cEditColor(30,8, cfg.defColor6);
   7 : cfg.defColor7       := cEditColor(30,9, cfg.defColor7);
   8 : cfg.uploadedByColor := cEditColor(30,10,cfg.uploadedByColor);
   9 : cfg.cc[1]           := cEditColor(30,11,cfg.cc[1]);
  10 : cfg.cc[2]           := cEditColor(30,12,cfg.cc[2]);
  11 : cfg.cc[3]           := cEditColor(30,13,cfg.cc[3]);
  12 : cfg.cc[4]           := cEditColor(30,14,cfg.cc[4]);
  13 : cfg.cc[5]           := cEditColor(30,15,cfg.cc[5]);
  14 : cfg.cc[6]           := cEditColor(30,16,cfg.cc[6]);
  15 : cfg.cc[7]           := cEditColor(30,17,cfg.cc[7]);
  16 : cfg.yesColor        := cEditColor(30,18,cfg.yesColor);
  17 : cfg.noColor         := cEditColor(30,19,cfg.noColor);
   end;
  end else
 if (cSection=11) then
  begin
   case cNumber of
    1 : cfg.fidoOrigin     := cInputStr(30,3,00,7,40,cfg.fidoOrigin);
    2 : cfg.defFidoAddress := cInputStr(30,4,00,7,15,cfg.defFidoAddress);
    3 : cfg.netName        := cInputStr(30,5,00,7,30,cfg.netName);
   end;
  end else
 if (cSection=12) then
  begin
   case cNumber of
    1 : cfg.dotChar        := cInputCh(30,3,00,7,1,cfg.dotChar);
    2 : cfg.use_one_liners := cBoolToggle(cfg.use_one_liners);
    3 : cfg.yesStr         := cInputStr(30,5,00,7,40,cfg.yesStr);
    4 : cfg.noStr          := cInputStr(30,6,00,7,40,cfg.noStr);
    5 : cfg.numPrelogon    := stoi(cInputStr(30,7,00,7,3,strr(cfg.numPreLogon)));
    6 : cfg.numStats       := stoi(cInputStr(30,8,00,7,3,strr(cfg.numStats)));
    7 : cfg.numWelcomes    := stoi(cInputStr(30,9,00,7,3,strr(cfg.numWelcomes)));
    8 : cfg.minTimeOut     := stoi(cInputStr(30,10,00,7,3,strr(cfg.minTimeOut)));
    9 : cfg.barChar        := cInputStr(30,11,00,7,2,cfg.barChar);
   10 : cfg.rumChar        := cInputStr(30,12,00,7,2,cfg.rumChar);
   11 : cfg.eventTime      := cInputStr(30,13,00,7,12,cfg.eventTime);
   12 : cfg.eventBatch     := cInputStr(30,14,00,7,12,cfg.eventBatch);
   13 : cfg.directVideoMode:= cBoolToggle(cfg.directVideoMode);
   14 : cfg.checkSnowMode  := cBoolToggle(cfg.checkSnowMode);
   15 : cfg.changeNote     := cBoolToggle(cfg.changeNote);
   16 : cfg.filterQuote    := cBoolToggle(cfg.filterQuote);
   17 : cfg.boxAbort       := cInputStr(30,19,00,7,15,cfg.boxAbort);
   end;
  end else
 if (cSection=13) then
  begin
   case cNumber of
    1 : cfg.anonymousStr   := cInputStr(30,3,00,7,15,cfg.anonymousStr);
    2 : cfg.maxQuotedLines := stoi(cInputStr(30,4,00,7,2,strr(cfg.maxQuotedLines)));
    3 : cfg.maxTimeBank    := stoi(cInputStr(30,5,00,7,3,strr(cfg.maxTimeBank)));
    4 : cfg.maxFileConf    := stoi(cInputStr(30,6,00,7,3,strr(cfg.maxFileConf)));
    5 : cfg.maxMsgConf     := stoi(cInputStr(30,7,00,7,3,strr(cfg.maxMsgConf)));
    6 : cfg.hangUpOnNew    := cBoolToggle(cfg.hangUpOnNew);
    7 : cfg.cdRom          := cInputStr(30,9,00,7,26,cfg.cdRom);
    8 : cfg.terminalFile   := cInputStr(30,10,00,7,12,cfg.terminalFile);
    9 : cfg.useAnimatedPrompts := cBoolToggle(cfg.useAnimatedPrompts);
   10 : cfg.totalAnimatedPrompts := stoi(cInputStr(30,12,00,7,3,strr(cfg.totalAnimatedPrompts)));
   end;
  end else
 if (cSection=14) then
   begin
    case cNumber of
    1 : cfg.genGenerate     := cBoolToggle(cfg.genGenerate);
    2 : cfg.genHeaderFile   := cInputStr(30,4,00,7,12,cfg.genHeaderFile);
    3 : cfg.genMiddleFile   := cInputStr(30,5,00,7,12,cfg.genMiddleFile);
    4 : cfg.genFooterFile   := cInputStr(30,6,00,7,12,cfg.genFooterFile);
    5 : cfg.genKeyBoxCharz  := cInputStr(30,7,00,7,2,cfg.genKeyBoxCharz);
    6 : cfg.genKeyBoxColor  := cEditColor(30,8,cfg.genKeyBoxColor);
    7 : cfg.genKeyColor     := cEditColor(30,9,cfg.genKeyColor);
    8 : cfg.genDescriptionColor := cEditColor(30,10,cfg.genDescriptionColor);
    9 : cfg.genCmndsPerLine := stoi(cInputStr(30,11,00,7,1,strr(cfg.genCmndsPerLine)));
   10 : cfg.genStartXPos    := stoi(cInputStr(30,12,00,7,2,strr(cfg.genStartXPos)));
   11 : cfg.genStartYPos    := stoi(cInputStr(30,13,00,7,2,strr(cfg.genStartYPos)));
   12 : cfg.genDescriptionPadding := stoi(cInputStr(30,14,00,7,2,strr(cfg.genDescriptionPadding)));
    end;
   end;
  if (cChange=true) then cDrawScreens(cSection,cNumber);cChange := false;
 end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Procedure cConfig0;
var cDone  : boolean;
    cInkey : char;
begin
cDone := false;
cDrawScreens(0,0);
cUpdateBars(0);
repeat
 cInkey := upCase(ArrowKey(True));
  Case cInkey of
      ^A : begin
           cBarData.bLast[0] := cBarData.bValue[0];
           if (cBarData.bLast[0] <> 1) then dec(cBarData.bValue[0]);
            cUpdateBars(0);
           end; {up}
      ^B : begin
           cBarData.bLast[0] := cBarData.bValue[0];
           if (cBarData.bLast[0] <> cTotalOptns) then inc(cBarData.bValue[0]);
            cUpdateBars(0);
           end; {dn}
     #13 : begin
           if cBarData.bValue[0] in [1..(cTotalOptns-1)] then cConfigSubs(cBarData.bValue[0]);
           if cBarData.bValue[0] = cTotalOptns then cDone := true;
           end;
     'Q' : cDone := true;
    End;
until (cDone=true or HungUpOn);
ansiCls;multiColor('|15i|07nfusion |15o|07nline |15c|07onfiguration - |15v|07ersion .01a (c) |15s|07kaboy101 / |15a|07venge!'+
'|CR');
end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Procedure cConfigSubs(sub : byte);
var cDone : boolean;
    cRet  : char;
begin
cDrawScreens(sub,0);
cValue[1] := 1;cValue[2] := 1;
repeat
 cRet := cSelectShit(cTotals[sub]);
 case cRet of
      'X' : cDone := true;
    else   begin
           cEditShit(sub,ord(cRet)-64);
           cDone := false;
           end;
 end;
until (cDone or HungUpOn);
if (cPromptSave=true) then writeConfig
   else readCfg(false);
ansiCLS;
cDrawScreens(0,0);
cUpdateBars(0);
end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Procedure cMiniDos;
 const
  mVersion  = '1.0';
 var
  mInString : lStr;
  mDone     : boolean;
 begin
   ansiCls;
   if exist(cfg.textfiledir+'MDSTART.ANS') then printFile(cfg.textFileDir+'MDSTART.ANS');
   multiColor('|08 -- |07Infusion BBS Mini-Dos version '+mVersion+' (c)copyright Grant Passmore|CR');
   multiColor('|08 -- |07Command help is available at /HELP ...|CR');
    repeat
     writeStr('C:\>*');
     mInString := inpt;
      inpt := upString(inpt);
      if (inpt='EXIT') then mDone := true;
    until (mDone=true);
 end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Procedure cUserEdit;
 var
     uShit   : ^userRec;
     uTotal  : word;
     uCurr   : word;
     uInChar : char;
     uDone   : boolean;
     uChanged: boolean;
     uBarData: array[1..2] of word;

       Function uSelectWithBar : char;
       const
        uMatrix : array[1..36] of char =
       ('A','S','B','T','C','U','D','V','E','W','F','!','G','Y','H','Z','I','1',
        'J','2','K','3','L','4','M','5','N','6','O','7','P',']','(','[',')','X');
        uBarPos : array[1..36] of byte =
        (3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,
         17,18,18,19,19,20,20);

           procedure uShowBar;
            begin
            if (odd(uBarData[1])=true) then
                goXY(3,uBarPos[uBarData[1]]) else
                goXY(52,uBarPos[uBarData[1]]);
                multiColor('|08(|15'+uMatrix[uBarData[1]]+'|08)');
            if (odd(uBarData[2])=true) then
                goXY(3,uBarPos[uBarData[2]]) else
                goXY(52,uBarPos[uBarData[2]]);
                multiColor('|B7 |00'+uMatrix[uBarData[2]]+' |B0');
            goXY(1,1);
            end;

       var inKey   : char;
           uGotBar : boolean;
                 x : byte;
           uFound  : boolean;

        begin
         uShowBar;
         repeat
         inKey := upCase(arrowKey(true));
          case upcase(inKey) of
           ^M : begin
                uSelectWithBar := uMatrix[uBarData[2]];
                uGotBar := true;
                end;
           ^B : begin
                uBarData[1] := uBarData[2];
                inc(uBarData[2],2);
                if (uBarData[2]>36) then uBarData[2] := 36;
                uShowBar;
                end;
           ^A : begin
                uBarData[1] := uBarData[2];
                dec(uBarData[2],2);
                if (uBarData[2]<1) then uBarData[2] := 1;
                if (uBarData[2]>36) then uBarData[2] := 1;
                uShowBar;
                end;
           ^C : begin
                uBarData[1] := uBarData[2];
                inc(uBarData[2]);
                if (uBarData[2]>36) then uBarData[2] := 36;
                uShowBar;
                end;
           ^D : begin
                uBarData[1] := uBarData[2];
                dec(uBarData[2]);
                if (uBarData[2]<1) then uBarData[2] := 1;
                uShowBar;
                end;
           '@': begin
                uSelectWithBar := '@';
                uGotBar := true;
                end;
           '^': begin
                uSelectWithBar := '^';
                uGotBar := true;
                end;
     #0..#255 : begin
                x := 0;
                repeat
                inc(x);
                if (uMatrix[x]=inKey) then uFound := true
                else uFound := false;
                until (uFound=true) or (x>=36);
                if uFound=true then
                begin
                uBarData[1] := uBarData[2];
                uBarData[2] := x;
                uShowBar;
                uSelectWithBar := inKey;
                uGotBar := true;
                end;
               end;
          end;
         if (uBarData[1]>36) then uBarData[1] := 36;
         if (uBarData[2]>36) then uBarData[2] := 36;
         if (uBarData[1]<1)  then uBarData[1] := 1;
         if (uBarData[2]<1)  then uBarData[2] := 1;
         until (uGotBar=true);
        end;

       Procedure cLoadUser(uNumber : word);
       var     n : byte;
         result  : word;
       begin
       fillChar(uShit^,sizeOf(uShit^),0);
       if not exist(cfg.dataDir+'USERS') then
        begin
        uTotal := 1;
        uShit^.Handle       := cfg.SysopName;
        uShit^.Password     := 'Sysop';
        uShit^.RealName     := 'Jack Kevorkian';
        uShit^.PhoneNum     := cfg.BoardPhone;
        uShit^.TimeToday    := 9999;
        uShit^.Level        := succ(cfg.SysopLevel);
        uShit^.UDLevel      := 101;
        uShit^.UDPoints     := 101;
        uShit^.Config       := [ansigraphics, asciigraphics, lowercase, eightycols, linefeeds, postprompts];
        uShit^.Config       := uShit^.Config + [mainsysop, udsysop, bulletinsysop, emailsysop, votingsysop, doorssysop,
                                                fseditor, usebars];
        uShit^.Color1       := cfg.DefColor1;
        uShit^.Color2       := cfg.DefColor2;
        uShit^.Color3       := cfg.DefColor3;
        uShit^.Color4       := cfg.DefColor4;
        uShit^.Color5       := cfg.DefColor5;
        uShit^.Color6       := cfg.DefColor6;
        uShit^.Color7       := cfg.DefColor7;
        uShit^.Prompt       := strng^.DefPrompt;
        uShit^.SysopNote    := 'System Operator';
        uShit^.KDownToday   := 0;
        uShit^.DailyKBLimit := 0;
        uShit^.EmailAnnounce := -1;
        for n := 1 to 5 do uShit^.InfoForm[n] := -1;
        uShit^.Displaylen   := 24;
        uShit^.Config       := uShit^.Config + [ansigraphics];
        writeUFile(uShit^,1);
        end;
       uTotal := fileSize(uFile) - 1;   {stored with nul as #1}
       seek(uFile,uCurr);
       nRead(uFile,uShit^);
       end;

       Function uStatus : string;
        begin
        if (uShit^.level=0) then uStatus := '|07-->|15DELETED|07<--'
            else uStatus := '|07-->|15ACTIVE|07<--';
        end;

       Procedure cDrawScreen;
       begin
        ansiCls;
 multiColor('|07Infusion BBS Online |15Advanced |07User Editing System |CR');
 multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
 multiColor('|08│ |07(|15A|08)|07 Handle         :                             |08(|15S|08) |07UD Ratio  :             |08│');
 multiColor('|08│ |08(|15B|08)|07 Realname       :                             |08(|15T|08) |07UDK Ratio :             |08│');
 multiColor('|08│ |08(|15C|08)|07 Password       :                             |08(|15U|08) |07PC Ratio  :             |08│');
 multiColor('|08│ |08(|15D|08)|07 Public Note    :                             |08(|15V|08) |07KB/Day    :             |08│');
 multiColor('|08│ |08(|15E|08)|07 Private Note   :                             |08(|15W|08) |07Def Proto :             |08│');
 multiColor('|08│ |08(|15F|08)|07 Phone Number   :                             |08(|15!|08) |07Time Lock :             |08│');
 multiColor('|08│ |08(|15G|08)|07 Birth Date     :                             |08(|15Y|08) |07Skills    :             |08│');
 multiColor('|08│ |08(|15H|08)|07 Security Level :                             |08(|15Z|08) |07Aphils    :             |08│');
 multiColor('|08│ |08(|15I|08)|07 Total Calls    :                             |08(|151|08) |07PC Type   :             |08│');
 multiColor('|08│ |08(|15J|08)|07 Access Flags   :                             |08(|152|08) |07ReqMsgLen :             |08│');
 multiColor('|08│ |08(|15K|08)|07 File Level     :                             |08(|153|08) |07Time/DAY  :             |08│');
 multiColor('|08│ |08(|15L|08)|07 File Points    :                             |08(|154|08) |07Timebank  :             |08│');
 multiColor('|08│ |08(|15M|08)|07 Uploads        :                             |08(|155|08) |07Scrn Len  :             |08│');
 multiColor('|08│ |08(|15N|08)|07 Downloads      :                             |08(|156|08) |07Msg Hdr # :             |08│');
 multiColor('|08│ |08(|15O|08)|07 Upload Bytes   :                             |08(|157|08) |07Time Tday :             |08│');
 multiColor('|08│ |08(|15P|08)|07 Download Bytes :                             |08(|15]|08) |07Next User               |08│');
 multiColor('|08│ |08(|15(|08)|07 Hack Attempts  :                             |08(|15[|08) |07Prev User               |08│');
 multiColor('|08│ |08(|15)|08)|07 Theme #        :                             |08(|15X|08) |07Exit                    |08│');
 multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
 multiColor('|03           (|08@|08) |07Delete This User           |03(|08^|08) |07Auto-validate User |CR');
 multiColor('|08 ────────────────────────────────────────────────────────────────────────────── ');
        goXY(70,1); multiColor('|03(|07'+strr(uCurr)+'|03/|07'+strr(uTotal)+'|03)');
        goXY(55,1); multiColor(uStatus);
        goXY(24,3); multiColor('|03'+uShit^.handle);
        goXY(24,4); multiColor('|03'+uShit^.realname);
        goXY(24,5); multiColor('|03'+uShit^.password);
        goXY(24,6); multiColor('|03'+uShit^.sysopNote);
        goXY(24,7); multiColor('|03'+uShit^.privateNote);
        goXY(24,8); multiColor('|03'+uShit^.phoneNum);
        goXY(24,9); multiColor('|03'+uShit^.birthDate);
        goXY(24,10);multiColor('|03'+strr(uShit^.level));
        goXY(24,11);multiColor('|03'+strr(uShit^.numOn));
        goXY(24,12);multiColor('|03'+uShit^.flags);
        goXY(24,13);multiColor('|03'+strr(uShit^.udLevel));
        goXY(24,14);multiColor('|03'+strr(uShit^.udPoints));
        goXY(24,15);multiColor('|03'+strr(uShit^.upLoads));
        goXY(24,16);multiColor('|03'+strr(uShit^.downLoads));
        goXY(24,17);multiColor('|03'+strr(uShit^.kUp));
        goXY(24,18);multiColor('|03'+strr(uShit^.kDown));
        goXY(24,19);multiColor('|03'+strr(uShit^.hackAttempts));
        goXY(24,20);multiColor('|03'+strr(uShit^.graphics));
        goXY(68,3); multiColor('|03'+strr(uShit^.udfRatio));
        goXY(68,4); multiColor('|03'+strr(uShit^.udkRatio));
        goXY(68,5); multiColor('|03'+strr(uShit^.pcR));
        goXY(68,6); multiColor('|03'+strr(uShit^.dailyKBLimit));
        goXY(68,7); multiColor('|03'+uShit^.defProto);
        goXY(68,8); multiColor('|03'+b00lean(uShit^.timeLock));
        goXY(68,9); multiColor('|03'+uShit^.skillz);
        goXY(68,10);multiColor('|03'+uShit^.aphilz);
        goXY(68,11);multiColor('|03'+uShit^.computer_type);
        goXY(68,12);multiColor('|03'+strr(uShit^.msgLength));
        goXY(68,13);multiColor('|03'+strr(uShit^.TimePerDay));
        goXY(68,14);multiColor('|03'+strr(uShit^.timBank));
        goXY(68,15);multiColor('|03'+strr(uShit^.displayLen));
        goXY(68,16);multiColor('|03'+strr(uShit^.msgHdr));
        goXY(68,17);multiColor('|03'+strr(uShit^.timeToday));
        goXY(1,1);
       end;

       Procedure doLn;
        var uDl : byte;
        begin
        goXY(1,22);for uDl := 1 to 80 do sendFull(' ');
        goXY(1,22);
        end;

       Procedure uEditLetter(num : char);
        var dummyBool : boolean;
        begin
          uChanged := true;
          case num of
           'A'  : begin
                 uShit^.handle := cInputStr(24,3,00,7,27,uShit^.handle);
                 cDrawScreen;
                 end;
           'B' : begin
                 uShit^.realname := cInputStr(24,4,00,7,27,uShit^.realName);
                 cDrawScreen;
                 end;
           'C' : begin
                 uShit^.password := cInputStr(24,5,00,7,15,uShit^.passWord);
                 cDrawScreen;
                 end;
           'D' : begin
                 uShit^.sysopNote := cInputStr(24,6,00,7,20,uShit^.sysopNote);
                 cDrawScreen;
                 end;
          'E' :  begin
                 uShit^.privateNote := cInputStr(24,7,00,7,20,uShit^.privateNote);
                 cDrawScreen;
                 end;
          'F' :  begin
                 uShit^.phoneNum := cInputStr(24,8,00,7,12,uShit^.phoneNum);
                 cDrawScreen;
                 end;
          'G' :  begin
                 uShit^.birthDate := cInputStr(24,9,00,7,8,uShit^.birthDate);
                 cDrawScreen;
                 end;
          'H' :  begin
                 uShit^.level := stoi(cInputStr(24,10,00,7,5,strr(uShit^.level)));
                 cDrawScreen;
                 end;
          'I' :  begin
                 uShit^.numOn := stoi(cInputStr(24,11,00,7,5,strr(uShit^.numOn)));
                 cDrawScreen;
                 end;
          'J' :  begin
                 uShit^.flags := cInputStr(24,12,00,7,26,uShit^.flags);
                 cDrawScreen;
                 end;
          'K' :  begin
                 uShit^.udLevel := stoi(cInputStr(24,13,00,7,5,strr(uShit^.udLevel)));
                 cDrawScreen;
                 end;
          'L' :  begin
                 uShit^.udPoints := stoi(cInputStr(24,14,00,7,5,strr(uShit^.udPoints)));
                 cDrawScreen;
                 end;
          'M' :  begin
                 uShit^.uploads := stoi(cInputStr(24,15,00,7,5,strr(uShit^.uploads)));
                 cDrawScreen;
                 end;
          'N' :  begin
                 uShit^.downloads := stoi(cInputStr(24,16,00,7,5,strr(uShit^.downloads)));
                 cDrawScreen;
                 end;
          'O' :  begin
                 uShit^.kUp := stoi(cInputStr(24,17,00,7,9,strr(uShit^.kUp)));
                 cDrawScreen;
                 end;
          'P' :  begin
                 uShit^.kDown := stoi(cInputStr(24,18,00,7,9,strr(uShit^.kDown)));
                 cDrawScreen;
                 end;
          '(' :  begin
                 uShit^.hackAttempts := stoi(cInputStr(24,19,00,7,3,strr(uShit^.hackAttempts)));
                 cDrawScreen;
                 end;
          ')' :  begin
                 uShit^.graphics := stoi(cInputStr(24,20,00,7,3,strr(uShit^.graphics)));
                 cDrawScreen;
                 end;
          'S' :  begin
                 uShit^.udfRatio := stoi(cInputStr(68,3,00,7,3,strr(uShit^.udfRatio)));
                 cDrawScreen;
                 end;
          'T' :  begin
                 uShit^.udKratio := stoi(cInputStr(68,4,00,7,3,strr(uShit^.udKratio)));
                 cDrawScreen;
                 end;
          'U' :  begin
                 uShit^.pcr := stoi(cInputStr(68,5,00,7,3,strr(uShit^.pcr)));
                 cDrawScreen;
                 end;
          'V' :  begin
                 uShit^.dailyKBlimit := stoi(cInputStr(68,6,00,7,10,strr(uShit^.dailyKbLimit)));
                 cDrawScreen;
                 end;
          'W' :  begin
                 uShit^.defProto := cInputCh(68,7,00,7,1,uShit^.defProto);
                 cDrawScreen;
                 end;
          '!' :  begin
                 uShit^.timeLock := cBoolToggle(uShit^.timeLock);
                 cDrawScreen;
                 end;
          'Y' :  begin
                 uShit^.skillz := cInputStr(68,9,00,7,10,uShit^.skillz);
                 cDrawScreen;
                 end;
          'Z' :  begin
                 uShit^.aphilz := cInputStr(68,10,00,7,10,uShit^.aphilz);
                 cDrawScreen;
                 end;
          '1' :  begin
                 uShit^.computer_type := cInputStr(68,11,00,7,10,uShit^.computer_type);
                 cDrawScreen;
                 end;
          '2' :  begin
                 uShit^.msgLength := stoi(cInputStr(68,12,00,7,4,strr(uShit^.msgLength)));
                 cDrawScreen;
                 end;
          '3' :  begin
                 uShit^.timePerDay := stoi(cInputStr(68,13,00,7,4,strr(uShit^.timePerDay)));
                 cDrawScreen;
                 end;
          '4' :  begin
                 uShit^.timBank := stoi(cInputStr(68,14,00,7,4,strr(uShit^.timBank)));
                 cDrawScreen;
                 end;
          '5' :  begin
                 uShit^.displayLen := stoi(cInputStr(68,15,00,7,2,strr(uShit^.displayLen)));
                 cDrawScreen;
                 end;
          '6' :  begin
                 uShit^.msgHdr := stoi(cInputStr(68,16,00,7,2,strr(uShit^.msgHdr)));
                 cDrawScreen;
                 end;
          '7' :  begin
                 uShit^.timeToday := stoi(cInputStr(68,17,00,7,4,strr(uShit^.timeToday)));
                 cDrawScreen;
                 end;
          end;
        end;

        Procedure SaveUser(number : byte);
        var result: word;
        begin
        goXY(1,24);writeStr('Save this user - !');
        if (yes=true) then
         begin
          uChanged := false;
          writeUFile(uShit^,uCurr);
         end;
        end;

 begin
 uDone := false;
 uBarData[1] := 1;
 uBarData[2] := 1;
 new(uShit);
 uCurr  := 1;
 uTotal := 1;
 If IsOpen(UFile) Then Close(UFile);
 Assign(UFile, cfg.DataDir + 'USERS');
 ResetOrReWrite(UFile, SizeOf(UserRec));
 cLoadUser(uCurr);
 cDrawScreen;
   repeat
   uInChar := upCase(uSelectWithBar);
   if (uCurr=0)  then uCurr  := 1;
   if (uTotal=0) then uTotal := 1;
    case uInChar of
          ']' : begin
                if uChanged then begin
                saveUser(uCurr);
                end;
                if (uCurr=uTotal) then uCurr := 1
                    else inc(uCurr);
                cLoadUser(uCurr);
                cDrawScreen;
                end;
          '[' : begin
                if uChanged then begin
                saveUser(uCurr);
                end;
                if (uCurr=1) then uCurr := uTotal
                    else dec(uCurr);
                cLoadUser(uCurr);
                cDrawScreen;
                end;
          'X' : begin
                if uChanged then begin
                saveUser(uCurr);
                end;
                uDone := true;
                end;
          '@' : begin
                uShit^.level := 0;
                uChanged := true;
                cDrawScreen;
                end;
          '^' : begin
                uShit^.udLevel   := cfg.defUdLevel;
                uShit^.udPoints  := cfg.defUdPoints;
                uShit^.level     := cfg.defLevel;
                uShit^.udfRatio  := cfg.defUdRatio;
                uShit^.udKRatio  := cfg.defUdKRatio;
                uShit^.pcr       := cfg.defPcr;
                uShit^.msgLength := cfg.defMsgLength;
                uShit^.dailyKbLimit := cfg.defDailyKbLimit;
                uShit^.flags     := cfg.defFlags;
                uChanged := true;
                cDrawScreen;
                end;
     #0..#255 : uEditLetter(uInChar);
    end;
   until (uDone=true);
 dispose(uShit);
 ansiCls;
 end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Procedure cMenuEdit;
type
 mFileType =     array[1..50] of string[8];
 mCommandArray = array[1..50] of commandRec;
var
 mFileData : ^mFileType;
 mMenuData : ^MenuRec;
 mCommands : ^mCommandArray;
 mTotalC   : 0..50;
 mTotal    : 0..50;
 mCurrentC : 0..50;
    mMenu  : string[8];
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
          Procedure mCheckSave(sec : byte);
           var f  : file {of menuRec};
           sCount : 1..50;
           begin
             goxy(1,24);writeStr('save yer changes ::: !');
            if (sec=1) and (yes=true) then
             begin
              assign(f,cfg.menuDir+mMenu+'.MNU');
              reset(f,1);
              blockWrite(f,mMenuData^,sizeOf(menuRec));
              close(f);
             end else
            if (sec=2) and (yes=true) then
             begin
              assign(f,cfg.menuDir+mMenu+'.MNU');
              rewrite(f,1);
              blockWrite(f,mMenuData^,sizeOf(menuRec));
              blockWrite(f,mCommands^,sizeOf(commandRec)*mTotalC);
              close(f);
             end;
           end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
          Procedure mLoadFiles;
          var dosList : searchRec;
          begin
          mTotal := 0;
          findfirst(cfg.menudir+'*.MNU',archive,doslist);
           while (doserror = 0) AND (mTotal <= 50) do
           begin
           inc(mTotal);
           mFileData^[mTotal] := dosList.name;
           findnext(doslist);
           end;
          end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
          Procedure mLoadMenu(menuName : string);
           var f : file;
           mCount: 1..50;
           begin
           fillChar(mMenuData^,sizeOf(mMenuData^),0);
           fillChar(mCommands^,sizeOf(mCommands^),0);
           assign(f,cfg.menuDir+menuName+'.MNU');
           reset(f,1);
           blockRead(f,mMenuData^,sizeOf(menuRec));
           seek(f,sizeOf(menuRec));
           mTotalC := (fileSize(f)-sizeOf(menuRec)) div (sizeOf(commandRec));
           for mCount := 1 to mTotalC do
             begin
             blockRead(f,mCommands^[mCount],sizeOf(commandRec));
             end;
           close(f);
           end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
           Procedure mDrawScreen(scrn : byte);
            var mCount : 1..80;
            begin
             if (scrn=1) then
                   begin
                   ansiCls;
          multiColor('|08┌|07:|15: |03menu data editor |15:|07:|08────────────────────────────────────────────────────────┐');
                   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
                   goXY(1,3); multiColor('|08(|15a|08) |07Menu Title           |08: |03'+mMenuData^.title);{20}
                   goXY(1,4); multiColor('|08(|15b|08) |07Display File         |08: |03'+mMenuData^.helpMenu);{12}
                   goXY(1,5); multiColor('|08(|15c|08) |07Required ACS         |08: |03'+mMenuData^.acs);{30}
                   goXY(1,6); multiColor('|08(|15d|08) |07Password             |08: |03'+mMenuData^.password);{15}
                   goXY(1,7); multiColor('|08(|15e|08) |07Fallback Menu        |08: |03'+mMenuData^.fallBack);{8}
                   goXY(1,8); multiColor('|08(|15f|08) |07Force Help Level     |08: |03'+strr(mMenuData^.forceHelpLevel));{00}
                   goXY(1,9); multiColor('|08(|15g|08) |07PullBar Menu         |08: |03'+b00lean(mMenuData^.usePullBar));{bool}
                   goXY(1,10);multiColor('|08(|15h|08) |07Clear Screen Before  |08: |03'+b00lean(mMenuData^.clrScrBefore));{""}
                   goXY(1,11);multiColor('|08(|15i|08) |07Force Hotkeys        |08: |03'+b00lean(mMenuData^.force_HotKey));{""}
                   goXY(1,12);multiColor('|08(|15j|08) |07Message Conference   |08: |03'+strr(mMenuData^.mes_Conf));{byte}
                   goXY(1,13);multiColor('|08(|15k|08) |07File Conference      |08: |03'+strr(mMenuData^.file_conf));{""}
                   goXY(1,14);multiColor('|08(|15l|08) |07Use Prompt           |08: |03'+b00lean(mMenuData^.usePrompt));{b}
                   goXY(1,15);multiColor('|08(|15m|08) |07Prompt line 1        |08: |03'+mMenuData^.prompt1);{str}
                   goXY(1,16);multiColor('|08(|15n|08) |07Prompt line 2        |08: |03'+mMenuData^.prompt2);
                   goXY(1,17);multiColor('|08(|15o|08) |07UpKey PullBar INC    |08: |03'+strr(mMenuData^.upKey));
                   goXY(1,18);multiColor('|08(|15p|08) |07DownKey PullBar DEC  |08: |03'+strr(mMenuData^.downKey));
                   goXY(1,19);multiColor('|08(|15q|08) |07RightKey PullBar INC |08: |03'+strr(mMenuData^.rightKey));
                   goXY(1,20);multiColor('|08(|15r|08) |07LeftKey PullBar DEC  |08: |03'+strr(mMenuData^.leftKey)+'|CR');
                   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
          multiColor('|08└|07:|15: |03arrow keys navigate, X exits, [space] edits commands |15:|07:|08────────────────────┘');


                   end else
                 if (scrn=2) then
                   begin
                   ansiCls;
          multiColor('|08┌|07:|15: |03menu command editor |15:|07:|08─────────────────────────────────────────────────────┐');
                   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
                   goXy(50,1);multiColor('|07:|15: |03'+strr(mCurrentC)+' of '+strr(mTotalC)+' |15:|07:');
                   goXY(1,3); multiColor('|08(|15a|08) |07Pullbar ID (REQUIRED)|08: |03'+strr(mCommands^[mCurrentC].IDNumber));
                   goXY(1,4); multiColor('|08(|15b|08) |07Command Description  |08: |03'+mCommands^[mCurrentC].descrip);
                   goXY(1,5); multiColor('|08(|15c|08) |07Activation Key(s)    |08: |03'+mCommands^[mCurrentC].keys);
                   goXY(1,6); multiColor('|08(|15d|08) |07Menu Command         |08: |03'+mCommands^[mCurrentC].command);
                   goXY(1,7); multiColor('|08(|15e|08) |07Required ACS Flags   |08: |03'+mCommands^[mCurrentC].acs);
             goXY(1,8); multiColor('|08(|15f|08) |07List in Generics     |08: |03'+b00lean(mCommands^[mCurrentC].hidden));
                   goXY(1,9); multiColor('|08(|15g|08) |07Pullbar XPos         |08: |07'+strr(mCommands^[mCurrentC].barX));
                   goXY(1,10); multiColor('|08(|15h|08) |07Pullbar Ypos         |08: |07'+strr(mCommands^[mCurrentC].barY));
                   goXY(1,11);multiColor('|08(|15i|08) |07Pullbar Lit String   |08: |07'+mCommands^[mCurrentC].barLit);
                   goXY(1,12);multiColor('|08(|15j|08) |07Pullbar Unlit String |08: |07'+mCommands^[mCurrentC].barUnlit);
                   goXY(1,13); multiColor('|08(|15k|08) |07Next Command');
                   goXY(1,14); multiColor('|08(|15l|08) |07Previous Command');
                   goXY(1,15);multiColor('|08(|15m|08) |07Insert Command');
                   goXY(1,16);multiColor('|08(|15n|08) |07Delete Command|CR');
                   multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
           multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘');
                   end;
            end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
          Procedure mEditShit(part,num : byte);
           var shitOnMyFinger : boolean;
           begin
            if (part=1) then
              begin
               case num of
               1 : mMenuData^.title          := cInputStr(28,3,00,7,20,mMenuData^.title);
               2 : mMenuData^.helpMenu       := cInputStr(28,4,00,7,12,mMenuData^.helpMenu);
               3 : mMenuData^.acs            := cInputStr(28,5,00,7,40,mMenuData^.acs);
               4 : mMenuData^.password       := cInputStr(28,6,00,7,15,mMenuData^.passWord);
               5 : mMenuData^.fallBack       := cInputStr(28,7,00,7,08,mMenuData^.fallBack);
               6 : mMenuData^.forceHelpLevel := stoi(cInputStr(28,8,00,7,4,strr(mMenuData^.forceHelpLevel)));
               7 : begin shitOnMyFinger := mMenuData^.usePullBar;
                         asm xor shitOnMyFinger,1 end;
                   mMenuData^.usePullBar := shitOnMyFinger;
                   end;
               8 : begin shitOnMyFinger := mMenuData^.clrScrBefore;
                         asm xor shitOnMyFinger,1 end;
                   mMenuData^.clrScrBefore := shitOnMyFinger;
                   end;
               9 : begin shitOnMyFinger := mMenuData^.force_hotKey;
                         asm xor shitOnMyFinger,1 end;
                   mMenuData^.force_hotKey := shitOnMyFinger;
                   end;
              10 : mMenuData^.mes_conf  := stoi(cInputStr(28,12,00,7,3,strr(mMenuData^.mes_conf)));
              11 : mMenuData^.file_conf := stoi(cInputStr(28,13,00,7,3,strr(mMenuData^.file_conf)));
              12 : begin shitOnMyFinger := mMenuData^.usePrompt;
                         asm xor shitOnMyFinger,1 end;
                   mMenuData^.usePrompt := shitOnMyFinger;
                   end;
              13 : mMenuData^.prompt1 := cInputStr(28,15,00,7,40,mMenuData^.prompt1);
              14 : mMenuData^.prompt2 := cInputStr(28,16,00,7,40,mMenuData^.prompt2);
              15 : mMenuData^.upKey   := stoi(cInputStr(28,17,00,7,2,strr(mMenuData^.upKey)));
              16 : mMenuData^.downKey := stoi(cInputStr(28,18,00,7,2,strr(mMenuData^.DownKey)));
              17 : mMenuData^.RightKey:= stoi(cInputStr(28,19,00,7,2,strr(mMenuData^.RightKey)));
              18 : mMenuData^.LeftKey := stoi(cInputStr(28,20,00,7,2,strr(mMenuData^.LeftKey)));
               end;
              mDrawScreen(1);
              end else
             if (part=2) then
              begin
               case num of
               1 : mCommands^[mCurrentC].IDNumber:= stoi(cInputStr(28,3,00,7,3,strr(mCommands^[mCurrentC].IDNumber)));
               2 : mCommands^[mCurrentC].descrip := cInputStr(28,4,00,7,30,mCommands^[mCurrentC].descrip);
               3 : mCommands^[mCurrentC].keys    := cInputStr(28,5,00,7,15,mCommands^[mCurrentC].keys);
               4 : mCommands^[mCurrentC].command := cInputStr(28,6,00,7,30,mCommands^[mCurrentC].command);
               5 : mCommands^[mCurrentC].acs     := cInputStr(28,7,00,7,26,mCommands^[mCurrentC].acs);
               6 : mCommands^[mCurrentC].hidden  := cBoolToggle(mCommands^[mCurrentC].hidden);
               7 : mCommands^[mCurrentC].barX    := stoi(cInputStr(28,9,00,7,2,strr(mCommands^[mCurrentC].barX)));
               8 : mCommands^[mCurrentC].barY    := stoi(cInputStr(28,10,00,7,2,strr(mCommands^[mCurrentC].barY)));
               9 : mCommands^[mCurrentC].barLit  := cInputStr(28,11,00,7,50,mCommands^[mCurrentC].barLit);
              10 : mCommands^[mCurrentC].barUnLit:= cInputStr(28,12,00,7,50,mCommands^[mCurrentC].barUnLit);
               end;
              mDrawScreen(2);
              end;

           end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
          Procedure mDeleteCommand;
           var
           cCount : 1..50;
            begin
            goXY(1,19);writeStr('verify command #'+strr(mCurrentC)+'''s deletion - !');
             if yes then
              begin
              for cCount := mCurrentC to mTotalC do
                  mCommands^[cCount] := mCommands^[cCount+1];
              dec(mTotalC);
              if mCurrentC > mTotalC then mCurrentC := mTotalC;
              mDrawScreen(2);
              end;
           goXY(1,19);sendFull('                                        ');
            end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
          Procedure mInsertCommand;
           var
           cCount : 1..50;
           mInsertPos : 1..50;
           begin
            goXy(1,19);multiColor('|07insert command where (1-'+strr(mTotalC+1)+'): ');
            inputBox(2);if (stoi(inpt) <= mTotalC+1) and (stoi(inpt)>0) then
            begin
            inc(mTotalC);
            mInsertPos := stoi(inpt);
            for cCount := mTotalC downto mInsertPos do
                mCommands^[cCount] := mCommands^[cCount-1];
            fillChar(mCommands^[mInsertPos],sizeOf(commandRec),0);
            mCommands^[mInsertPos].IDNumber:= mInsertPos;
            mCommands^[mInsertPos].descrip := 'New Command';
            mCommands^[mInsertPos].keys    := 'X';
            mCommands^[mInsertPos].command := 'X';
            mCommands^[mInsertPos].acs     := '';
            mDrawScreen(2);
            end;
           goXY(1,19);sendFull('                                        ');
           end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
          Procedure mInsertMenu;
           var f : file;
           begin
           if (whereX<>1) then sendCr('');
           multiColor('|07Enter the menu to insert: ');
           inputBox(8);
           assign(f,cfg.menuDir+inpt+'.MNU');
           rewrite(f,1);
           fillChar(mMenuData^,sizeOf(mMenuData^),0);
           mMenuData^.title    := 'New Menu';
           mMenuData^.helpMenu := 'NEWMENU.ANS';
           fillChar(mCommands^,sizeOf(mCommands^),0);
           mCommands^[1].descrip := 'New Command';
           mCommands^[1].keys    := 'X';
           mCommands^[1].command := 'CHANGE';
           mCommands^[1].idnumber:= 1;
           blockWrite(f,mMenuData^,sizeOf(mMenuData^));
           blockWrite(f,mCommands^[1],sizeOf(mCommands^[1]));
           close(f);
           mLoadFiles;
           end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
          Procedure mEditCommands;
           var cMInShit : char;
               cMDone   : boolean;
           begin
           mCurrentC := 1;
           mDrawScreen(2);
           cValue[1] := 1;cValue[2] := 1;
            repeat
            cMInShit := cSelectShit(14);
             case cMInShit of
             'A'..'J' : mEditShit(2,ord(cMInShit)-64);
             'X'  : cMDone := true;
             'K',']'  : begin
                    if (mCurrentC<>mTotalC) then
                     begin inc(mCurrentC);
                           mDrawScreen(2) end;
                    end;
             'L','['  : begin
                    if (mCurrentC<>1) then begin
                        dec(mCurrentC);
                        mDrawScreen(2);
                       end;
                     end;
             'M'      : mInsertCommand;
             'N'      : mDeleteCommand;
             end;
            until (cMDone=true);
           mCheckSave(2);
           mDrawScreen(1);
           end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
          Procedure mModify;
           var
           mCount : byte;
           mInKey : char;
           mDone  : boolean;
           begin
           if (whereX<>1) then sendCr('');
           multiColor('|07Enter menu to modify: ');
           inputBox(8);
           mMenu := inpt; if Not exist(cfg.menudir+mMenu+'.MNU') then
                             begin
                             goXY(1,whereY);
                             for mCount := 1 to 80 do sendFull(' ');
                             exit;
                             end;
           mLoadMenu(mMenu);
           ansiCls;
           mDrawScreen(1);
           cValue[1] := 1;cValue[2] := 1;
               repeat
               mInKey := cSelectShit(18);
                case mInKey of
                     'X' : mDone := true;
                     'A'..'R' : mEditShit(1,(ord(mInKey)-64));
                     ' ' : mEditCommands;
                end;
               until (mDone=true);
             mCheckSave(1);
           mDone := false;
           end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
          Procedure mSelectMenu;
          var   mInKey : char;
                mDone  : boolean;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
           procedure mDisplayOne;
            var
                mCount : byte;
                mYPos  : byte;
           begin
           ansiCls;
          multiColor('|08┌|07:|15: |03infusion menu editor |15:|07:|08────────────────────────────────────────────────────┐');
                   multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
           goXY(1,3);
           for mCount := 1 to mTotal do
             begin
             if (pos('.',mFileData^[mCount])>0) then
                 delete(mFileData^[mCount],pos('.',mFileData^[mCount]),length(mFileData^[mCount])-1);
             multiColor('|07'+tab(mFileData^[mCount],10));
             if (whereX=80) then goXY(1,whereY+1);
             end;
           if (whereX<>1) and (whereX<>80) then sendCr('');
           for mCount := 1 to 80 do multiColor('|08─');
            mYPos := whereY;
            multiColor('|07Enter command (|15M|07)odify, (|15I|07)nsert, (|15D|07)elete, or (|15X|07)Exit|03: ');
           end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
           begin
           mLoadFiles;
           mDisplayOne;
             repeat
             mInKey := upCase(arrowKey(false));
             case mInKey of
             'X' :  begin
                     mDone := true;
                     end;
             'M' :  begin
                    mModify;
                    mDisplayOne;
                    end;
             'D' :  begin
                    if (whereX<>1) then sendCr('');
                    multiColor('|07Enter the menu to delete: ');
                    inputBox(8);
                    if exist(cfg.menuDir+inpt+'.MNU') then
                       begin
                       deleteFile(cfg.menuDir+inpt+'.MNU');
                       mLoadFiles;
                       end;
                       mDisplayOne;
                    end;
              'I' : begin
                    mInsertMenu;
                    mDisplayOne;
                    end;
              end;
             until (mDone=true);
           end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
begin
inConfigMode := true;
mTotal := 0;
new(mFileData);
new(mMenuData);
new(mCommands);
mSelectMenu;
dispose(mFileData);
dispose(mMenuData);
dispose(mCommands);
inConfigMode := false;
end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Procedure cMessageEdit;
Type ConfRec = Record
       Name,
       Password : Lstr;
       Flags : String[26];
       Minlevel,
       Maxlevel : integer;
       OpenTime,
       CloseTime : Sstr;
     End;
var
cFile    : file of confRec;
cData    : ^confRec;
cTotal   : byte;
cCurrent : byte;
cDone    : boolean;
cInChar  : char;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
 Procedure cMakeNew;
  Begin
   fillChar(cData^,sizeOf(cData^),0);
   ReWrite(cFile);
   cData^.Name      := 'New Conference';
   cData^.OpenTime  := '4:01 am';
   cData^.CloseTime := '4:00 am';
   cData^.MinLevel  := 5;
   cData^.MaxLevel  := 9999;
   Seek(cFile,0);
   NWrite(cFile,cData^);
  End;

 Procedure cLoadConference;
  begin
  cTotal := fileSize(cFile);
  seek(cFile,cCurrent-1);
  read(cFile,cData^);
  end;

 Procedure cDrawScreens(scrn : byte);
  begin
   if (scrn=1) then
     begin
     ansiCls;
     multiColor('|08┌|07:|15: |03infusion conference editor |15:|07:|08──────────────────────────────────────────────┐');
     multiColor('|08└──────────────────────────────────────────────────────────────────────────────┘');
     goXY(50,1);multiColor('|07:|15: |03'+strr(cCurrent)+' of '+strr(cTotal)+' |15:|07:');
     goXY(1,3); multiColor('|08(|15a|08) |07Conference Name        |08: |15'+cData^.name);
     goXY(1,4); multiColor('|08(|15b|08) |07Conference Password    |08: |15'+cData^.password);
     goXY(1,5); multiColor('|08(|15c|08) |07Conference Flags       |08: |15'+cData^.flags);
     goXY(1,6); multiColor('|08(|15d|08) |07Minimum Entry Level    |08: |15'+strr(cData^.minLevel));
     goXY(1,7); multiColor('|08(|15e|08) |07Maximum Entry Level    |08: |15'+strr(cData^.maxLevel));
     goXY(1,8); multiColor('|08(|15f|08) |07Conference Open Time   |08: |15'+cData^.openTime);
     goXY(1,9); multiColor('|08(|15g|08) |07Conference Close Time  |08: |15'+cData^.closeTime);
     goXY(1,10);multiColor('|08(|15h|08) |07Next Conference');
     goXY(1,11);multiColor('|08(|15i|08) |07Previous Conference');
     goXY(1,12);multiColor('|08(|15j|08) |07Insert Conference');
     goXY(1,13);multiColor('|08(|15k|08) |07Delete Conference|CR');
     multiColor('|08┌──────────────────────────────────────────────────────────────────────────────┐');
     multiColor('|08└|07:|15: |03arrow keys navigate, X exits, hot keys jump to editing field |15:|07:|08────────────┘');
     end;
  end;

     Procedure cEditConf(num : byte);
       begin
        case num of
         1 : cData^.name      := cInputStr(30,3,00,7,40,cData^.name);
         2 : cData^.password  := cInputStr(30,4,00,7,30,cData^.password);
         3 : cData^.flags     := cInputStr(30,5,00,7,26,cData^.flags);
         4 : cData^.minLevel  := stoi(cInputStr(30,6,00,7,4,strr(cData^.minLevel)));
         5 : cData^.maxLevel  := stoi(cInputStr(30,7,00,7,4,strr(cData^.maxLevel)));
         6 : cData^.openTime  := cInputStr(30,8,00,7,12,cData^.openTime);
         7 : cData^.closeTime := cInputStr(30,9,00,7,12,cData^.closeTime);
        end;
       cDrawScreens(1);
       end;

       Procedure cCheckSave;
        begin
        goXY(1,17);writeStr('Save this conference''s changes :: @');
        if (yes=true) then begin
            seek(cFile,cCurrent-1);
            NWrite(cFile,cData^);
            end;
        end;

begin
new(cData);
cCurrent := 1;
{>}assign(cFile,cfg.dataDir+'MSGCONF.DAT');
{>}if not exist(cfg.dataDir+'MSGCONF.DAT') or (cTotal=0) then cMakeNew else reset(cFile);
cLoadConference;
cDrawScreens(1);
  repeat
  cInChar := cSelectShit(11);
   case cInChar of
   'A'..'G' : cEditConf(ord(cInChar)-64);
   'H'      : begin
              cCheckSave;
              inc(cCurrent);
              if (cCurrent>cTotal) then cCurrent := 1;
              cLoadConference;
              cDrawScreens(1);
              end;
   'I'      : begin
              cCheckSave;
              dec(cCurrent);
              if (cCurrent<1) then cCurrent := cTotal;
              cLoadConference;
              cDrawScreens(1);
              end;
   'J'      : begin
              cCheckSave;
              FillChar(cData^,SizeOf(cData^),0);
              Seek(cFile,FileSize(cFile));
              cData^.Name := 'New Conference';
              cData^.OpenTime := '4:01 am';
              cData^.CloseTime := '4:00 am';
              cData^.MinLevel := 5;
              cData^.MaxLevel := 9999;
              NWrite(cFile,cData^);
              Inc(cTotal);
              cCurrent := cTotal;
              cLoadConference;
              cDrawScreens(1);
              end;
   'K'      : begin
              goXY(1,17);writeStr('Confirm conference deletion :: @');
              if (yes=true) then
                begin
                fillchar(cData^,SizeOf(cData^),0);
                Seek(cFile,cCurrent-1);
                NWrite(cFile,cData^);
                If cCurrent = cTotal Then Begin
                Seek(cFile,cCurrent-1);
                Truncate(cFile);
                End;
               end;
               cCurrent := 1;
               cLoadConference;
              cDrawScreens(1);
              end;
   'X'      : cDone := true;
   end;
  until (cDone=true);
cCheckSave;
dispose(cData);
close(cFile);
end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Procedure cThemeEdit;
 begin config2.cThemeEdit end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Procedure cConferenceEdit(conf : byte);
 begin config2.cConfEdit(conf); end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
Procedure cProtocolEdit;
 begin protedit.cProtocolEdit end;
{:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
begin
 cValue[1]:=1;cValue[2]:=1;
for cTempVar := 0 to cTotalOptns do
 begin
 cBarData.bLast[cTempVar]  := 1;
 cBarData.bValue[cTempVar] := 1;
 end;
for cTempVar := ord('A') to ord('Z') do
 cSelectChar[cTempVar-64] := chr(cTempVar);
inConfigMode := false;
end.