home *** CD-ROM | disk | FTP | other *** search
/ Monster Disc 2: The Best of 1992 / MONSTER1.ISO / bbs / rbbs / rbbs-bas.zip / RBBS-PC.BAS < prev    next >
BASIC Source File  |  1992-06-20  |  147KB  |  4,601 lines

  1. 3 ' $linesize: 132
  2. 4 ' $title: 'RBBS-PC 17.4, Copyright 1992 by D. Thomas Mack'
  3. 5 ' WARNING !!! DO NOT CHANGE, BYPASS OR Remove LINES 3-29
  4. 9 'by D. Thomas Mack, 39 Cranbury Drive, Trumbull, CT 06611 (up to 16)
  5.    '  Jon Martin, 4396 N Prairie Willow Ct, Concord, CA 94521 (up to 17.2B)
  6.    '  Ken Goosens, 5020 Portsmouth Road, Fairfax, VA 22032
  7.    '  Doug Azzarito, 2399 NW 30th Road, Boca Raton, FL 33431
  8. 13 '
  9. 14 ' *******************************NOTICE*************************************
  10. 15 ' *  A limited license is granted to all users of this program and it's    *
  11. 16 ' *  companion program, CONFIG (version 17.4), to make copies of this      *
  12. 17 ' *  program and distribute the copies to other users, on the following    *
  13. 18 ' *  conditions:                                                           *
  14. 19 ' *    1.   The notices contained in lines 3 through 29 of the program     *
  15. 20 ' *         are not altered, bypassed, or removed.                         *
  16. 21 ' *    2.   The program is not to be distributed to others in modified     *
  17. 22 ' *         form (i.e. the line numbers must remain the same).             *
  18. 23 ' *    3.   No fee is to be charged (or any other consideration received)  *
  19. 24 ' *         for copying or distributing these programs without an express  *
  20. 25 ' *         written agreement with the authors.                            *
  21. 27 ' *                                                                        *
  22. 28 ' *       Copyright (c) 1983-1992 T. Mack, J. Martin, K. Goosens, CPCUG    *
  23. 29 ' **************************************************************************
  24.    '
  25.    ' $INCLUDE: 'RBBS-VAR.BAS'
  26.    '
  27.    ' $SUBTITLE: 'Main-line RBBS-PC Program'
  28.     ZCrLf$ = CHR$(13) + CHR$(10)
  29.     WasJ = 60
  30.     DIM ZOptSec(WasJ)
  31.     ZConfigFileName$ = "RBBS-PC.DEF"
  32.     CALL GetCommand (ZDebug,ZNetTime$,ZNetBaud$,ZNetReliable$)
  33.     ZSubParm = -62
  34.     ZBulletinMenu$ = ""
  35.     CALL ReadDef (ZConfigFileName$)
  36.     IF ZErrCode > 0 THEN _
  37.        GOTO 31
  38.     CALL MLInit (1)
  39.     GOTO 100
  40. 31  ZSnoop = ZTrue
  41.     CALL PScrn ("Configuration "+ZConfigFileName$+" missing/improper format") : _
  42.     GOTO 204
  43. 100 CLEAR,,ZSizeOfStack
  44.     CALL VarInit
  45.     IF ZErrCode > 0 THEN _
  46.        GOTO 31
  47.     OrigUpgradeSec = ZAutoUpgradeSec
  48.     OrigMainSec = ZMinLogonSec
  49.     CALL BreakFileName (ZOrigMsgFile$,Drive$,OrigMsgName$,ZWasY$,ZFalse)
  50.     IF OrigMsgName$ = "MESSAGES" THEN _
  51.        OrigMsgName$ = "MAIN" _
  52.     ELSE IF RIGHT$(OrigMsgName$,1) = "M" THEN _
  53.             OrigMsgName$ = LEFT$(OrigMsgName$,LEN(OrigMsgName$)-1)
  54.     ConfFileName$ = OrigMsgName$
  55.     OrigNewsFileName$ = ZWelcomeFileDrvPath$ + _
  56.               OrigMsgName$ + ".NWS"
  57.     ZNewsFileName$ = OrigNewsFileName$
  58.     IF ZNetMail$ <> "NONE" AND VAL(ZNetTime$) > 0 THEN _
  59.        ZLimitMinsPerSession = VAL(ZNetTime$)
  60.     IF ZNetMail$ <> "NONE" AND VAL(ZNetBaud$) > 0 THEN _
  61.        ZExpectActiveModem = ZTrue : _
  62.        IF NOT ZKeepInitBaud THEN _
  63.           ZModemInitBaud$ = ZNetBaud$
  64.     IF ZFossil THEN _
  65.        ZComPort = VAL(RIGHT$(ZComPort$,1)) - 1 : _
  66.        IF ZComPort < 0 THEN _
  67.           GOTO 108 _
  68.        ELSE CALL FOSinit(ZComPort,Result) : _
  69.             IF Result = -1 THEN _
  70.                ZSnoop = ZTrue : _
  71.                CALL PScrn("ERROR INITIALIZING FOSSIL") : _
  72.                GOTO 204
  73. 108 CALL BreakFileName (ZCallersFile$,Drive$,WasX$,ZWasY$,ZTrue)
  74.     ZCallersFilePrefix$ = WasX$
  75.     ZNodeWorkDrvPath$ = Drive$
  76.     ZArcWork$ = ZNodeWorkDrvPath$ + _
  77.                 "ARCWORK" + _
  78.                 ZNodeFileID$ + _
  79.                 ".DEF"
  80.     IF ZUseBASICWrites THEN _
  81.        ZLocalBksp$ = ZBackArrow$ _
  82.     ELSE ZLocalBksp$ = ZBackSpace$
  83.     ZSysopFullName$ = LEFT$(ZSysopFirstName$ + " " + ZSysopLastName$ + "  ",22)
  84.     ZFastFileSearch = ZFalse
  85.     CALL FindIt (ZFastFileList$)
  86.     IF ZOK THEN _
  87.        CALL FindIt (ZFastFileLocator$) : _
  88.        IF ZOK THEN _
  89.           ZFastFileSearch = ZTrue : _
  90.           CALL BreakFileName (ZFastFileList$, Drive$,WasX$,ZWasY$,ZTrue) : _
  91.           ZFileName$ = Drive$ + WasX$ + "T" + ZWasY$ : _
  92.           CALL FindIt (ZFileName$) : _
  93.           ZErrCode = 0 : _
  94.           IF ZOK THEN _
  95.              CALL OpenRSeq (ZFileName$, WasX, WasY, 72) : _
  96.              FIELD 2, 72 AS IndexRec$ : _
  97.              GET 2, 1 : _
  98.              ZFastTabs$ = IndexRec$ : _
  99.              CLOSE 2 _
  100.           ELSE ZFastTabs$ = ""
  101. '
  102. ' *****  INITIALIZE NetBIOS INTERFACE   ****
  103. '
  104.    IF ZNetworkType = 6 AND NOT ZSubBoard THEN _
  105.       CALL InitIBM
  106. '
  107. ' *****  ESTABLISH NEXT CALLERS FILE RECORD AVAILABLE   ***
  108. '
  109.     CALL SetCall
  110. 112 IF NOT ZSubBoard THEN _
  111.        ZLocalUser = ZTrue : _
  112.        ZOutTxt$ = ZColorReset$ : _
  113.        ZSubParm = 1 : _
  114.        CALL TPut : _
  115.        ZLocalUser = ZFalse
  116.     ZUpldDriveFile$ = RIGHT$(ZDnldDrives$,1)+":FREESPAC.UPL"
  117.     ZMinsPerSessionDef = ZMinsPerSession
  118.     ZMaxPerDayDef = ZMaxPerDay
  119.     ZMaxBankTimeDef = ZMaxBank
  120. '
  121. ' *****  TEST FOR MESSAGE FILE PRESENT (Abort IF NOT PRESENT)  ****
  122. '
  123. 135 IF ZCurDef$ = ZOrigCnfg$ THEN _
  124.        ZActiveMessageFile$ = ZMainMsgFile$ : _
  125.        ZActiveUserFile$ = ZMainUserFile$
  126.     GOSUB 4910
  127.     IF ZConfMode THEN _
  128.        GOTO 150
  129.     ZLocalUserMode = (RIGHT$(ZComPort$,1) < "1")
  130.     GET 1,ZNodeRecIndex
  131.     ZWasY$ = MID$(ZMsgRec$,77,2)
  132.     CALL UnPackDate (ZWasY$,WasX,WasL,WasI,ZOldDate$)
  133.     ZOldDate$ = LEFT$(ZOldDate$,6) + MID$(STR$(WasX),2)
  134.     ZHourMinToDropToDos = - (ZHourMinToDropToDos > 0) * ZHourMinToDropToDos
  135.     Hour = INT(ZHourMinToDropToDos / 100)
  136.     WasMN = ZHourMinToDropToDos - Hour * 100
  137.     ZTimeToDropToDos! = Hour * 3600! + WasMN * 60!
  138. '
  139. ' ******  TEST FOR TIMED EXIT ACTIVE   *****
  140. '
  141. 140 IF ZHourMinToDropToDos > 0 AND _
  142.        ZOldDate$ <> DATE$ AND _
  143.        TIMER >= ZTimeToDropToDos! AND _
  144.        TIMER < 86340 THEN _
  145.           GOTO 206
  146. '
  147. ' **** GET CURRENT STATUS OF SYSOP AVAIL, SYSOP ANNOY, SYSOP NEXT, & PRINTER
  148. '
  149. 150 IF ZSubBoard THEN _
  150.        GOSUB 12987 : _
  151.        GOSUB 5135 : _
  152.        GOTO 170
  153.     ZSysopAvail = VAL(MID$(ZMsgRec$,32,2))
  154.     ZSysopAnnoy = VAL(MID$(ZMsgRec$,34,2))
  155.     ZSysopNext = VAL(MID$(ZMsgRec$,36,2))
  156.     MID$(ZMsgRec$,36,2) = STR$(ZFalse)
  157.     ZPrinter = VAL(MID$(ZMsgRec$,38,2))
  158.     IF ZTurnPrinterOff THEN _
  159.        ZPrinter = ZFalse
  160.     ZExitToDoors = (MID$(ZMsgRec$,40,2) = "-1" AND ZNetBaud$ = "" _
  161.                     AND INSTR(COMMAND$," LOCAL") = 0)
  162.     ZEightBit = VAL(MID$(ZMsgRec$,42,2))
  163.     ZBPS = -VAL(MID$(ZMsgRec$,44,2))
  164.     ZSnoop = VAL(MID$(ZMsgRec$,58,2))
  165.     MID$(ZMsgRec$,57,1) = "I"
  166.     ZPrivateDoor = (MID$(ZMsgRec$,72,2) = "-1")
  167.     IF ZPrivateDoor THEN _
  168.        ZHasPrivDoor = ZTrue
  169.     MID$(ZMsgRec$,72,2) = STR$(ZFalse)
  170.     ZLocalUser = (MID$(ZMsgRec$,101,2) = ZCarriageReturn$+ZCarriageReturn$) OR _
  171.                  ZLocalUserMode
  172.     IF ZExitToDoors OR ZPrivateDoor THEN _
  173.        ZHasDoored = ZTrue : _
  174.        TurboLogon = ZTrue
  175.     PUT 1,ZNodeRecIndex
  176.     GOSUB 12985
  177.     GET 1,1
  178.     CallsToDate! = VAL(MID$(ZMsgRec$,11,10))
  179.     IF CallsToDate! < 11 THEN _
  180.        CALL CopyRight
  181. '
  182. ' *****  INITIALIZE VOICE SYNTHESIZER   ****
  183. '
  184.     CALL Talk (Init,ZOutTxt$)
  185. '
  186. ' *****  TEST FOR MULTI LINK PRESENT IF NOT COMPAQ COMPUTER   ****
  187. '
  188. 160 CALL MLInit (4)
  189. 170 FOR FunctionKeyIndex = 1 TO 10
  190.        KEY FunctionKeyIndex,""
  191.     NEXT
  192.     CALL LoadNew (ZMsgPtr())
  193. '
  194. ' ******  INITIALIZE FILE MANAGEMENT SYSTEM, CHECK FOR LOCAL BBS MODE
  195. '
  196. 175 GOSUB 5344
  197.     CALL CountLines (MaxEntries)
  198.     REDIM ZCategoryName$(MaxEntries),ZCategoryCode$(MaxEntries),_
  199.           ZCategoryDesc$(MaxEntries)
  200.     CALL InitFMS (ZNumCategories)
  201.     ZMaxMsgLines = ZMaxMsgLinesDef
  202.     IF (NOT ZLocalUser) AND (NOT ZSubBoard) THEN _
  203.        CALL OpenCom (ZModemInitBaud$,",N,8,1")
  204.     IF NOT ZSubBoard THEN _
  205.        CALL SetEcho (ZDefaultEchoer$)
  206.     ZNodeWorkFile$ = ZNodeWorkDrvPath$ + _
  207.                       "NODE" + _
  208.                       ZNodeFileID$ + _
  209.                       "WRK"
  210.     ZSecsPerSession! = ZMinsPerSession * 60!
  211.     LogIndex = 1
  212.     IF NOT ZLocalUserMode THEN _
  213.        IF NOT ZExitToDoors THEN _
  214.           GOTO 180 _
  215.        ELSE IF NOT ZLocalUser THEN _
  216.                GOTO 180
  217.     ZLocalUser = ZTrue
  218.     ZBPS = -7
  219.     ZBaudTest! = 9600
  220.     ZCBaud$ = "9600"
  221.     ZCBPS = -7
  222.     ZEightBit = ZTrue
  223.     ZSnoop = ZTrue
  224.     IF ZExitToDoors THEN _
  225.        CALL AMorPM : _
  226.        CALL ReadProf : _
  227.        GOTO 410
  228.     GOSUB 178
  229.     GOTO 345
  230. 178 IF NOT ZSubBoard THEN _
  231.        RETURN
  232.     IF ZNewUser THEN _
  233.        GOSUB 758
  234.     IF ZFirstName$ = ZSysopFirstName$ AND _
  235.        ZLastName$ = ZSysopLastName$ THEN _
  236.           RETURN 832 _
  237.     ELSE RETURN 790
  238. 180 ZSubParm = 2
  239.     CALL Line25
  240.     GOSUB 178
  241. '
  242. ' ******  WAIT FOR THE PHONE TO RING AND ANSWER IT   ****
  243. '
  244.     ZSubParm = 1
  245. 200 ZToggleOnly = ZTrue
  246.     CALL AnswerIt
  247.     GET 1,ZNodeRecIndex
  248.     ZSnoop = VAL(MID$(ZMsgRec$,58,2))
  249.     ZToggleOnly = ZFalse
  250.     IF ZErrCode > 1 THEN _
  251.        GOTO 13000
  252.     IF ZSubParm < 0 THEN _
  253.        GOTO 202
  254.     ON ZSubParm GOTO   410, _   '  1 = ANSWERED PHONE & CARRIER FOUND
  255.                        330, _   '  2 = CARRIER FOUND BEFORE ANSWERING
  256.                        822, _   '  3 = SysOp GETS SYSTEM NEXT
  257.                      10595, _   '  4 = ANSWERED PHONE BUT NO CARRIER
  258.                      13540, _   '  5 = NOT USED
  259.                        202, _   '  6 = LOCAL SYSOP KEY PRESSED
  260.                        206, _   '  7 = TIME TO DROP TO DOS
  261.                      13538      '  8 = No CALLS! TIME TO RECYCLE
  262. 202 ZFF = -ZSubParm
  263.     ON ZFF GOTO 10595, _   '  -1 = CARRIER DROPPED
  264.                  4770, _   '  -2 = SYSOP INITIATED CHAT
  265.                   205, _   '  -3 = FORCE SYSTEM TO ANSWER THE PHONE
  266.                   204, _   '  -4 = EXIT TO DOS IMMEDIATELY
  267.                   203, _   '  -5 = EXIT TO DOS AFTER CLEAN-UP
  268.                 10698, _   '  -6 = INDICATE ACCESS IS DENIED AND LOGOFF USER
  269.                 10620      '  -7 = UPDATE CALLERS FILE AND LOGOFF USER
  270. 203 CALL MLInit(3)
  271. 204 IF Zfossil THEN _
  272.        CALL FOSExit(ZComPort)
  273.     SYSTEM
  274. 205 ZSubParm = 4
  275.     GOTO 200
  276. 206 CALL TimedOut
  277.     GOTO 203
  278. 330 CALL Carrier
  279.     IF ZSubParm = -1 THEN _
  280.        GOTO 10595
  281.     CALL EofComm (Char)
  282.     IF Char = -1 THEN _
  283.        GOTO 335
  284.     CALL FlushCom (ZWasDF$)
  285.     IF ZSubParm = -1 THEN _
  286.         GOTO 10595
  287.     GOTO 330
  288. 335 ZExitToDoors = ZFalse
  289.     ZPrivateDoor = ZFalse
  290.     IF ZWasCL <> 1 THEN _
  291.        LOCATE 22,34
  292.     WasD$ ="CONNECT" + _
  293.         STR$(ZBaudTest!) + _
  294.         "     "
  295.     GOSUB 1315
  296. '
  297. ' *****  DISPLAY WELCOME LINE  ****
  298. '
  299. 345 CALL SayWelcome
  300. 346 GOSUB 466
  301.     IF ZSubParm = -1 THEN _
  302.        GOTO 13540
  303.     ZFF = ZFalse
  304. '
  305. ' *****  GET USER NAME
  306. ' *****  C - COMMAND FROM NEWUSER REGISTER OPTIONS (CHANGE NAME OR ADDRESS)
  307. '
  308. 400 CALL SkipLine(1)
  309.     ZEscapeInsecure = ZFalse
  310.     ZUpperCase = ZFalse
  311.     CALL SetExpert
  312.     WasA1$ = "What is your "
  313.     CALL FlushCom (ZWasDF$)
  314.     GOSUB 12500
  315.     CALL CommInfo
  316.     IF ZFF THEN _
  317.        ZLogonErrorIndex = 1 : _
  318.        GOTO 10620
  319.     IF ZMinOldCallerBaud > ZBaudTest! THEN _
  320.        CALL QuickTPut1 ("Sorry," + STR$(ZBaudTest!) + " BPS not allowed") : _
  321.        ZWasLG$(7) = "OLD CALLER BAUD RESTRICTION" : _
  322.        ZLogonErrorIndex = 7 : _
  323.        GOTO 10620
  324.     LogIndex = 4 - (ZLenIndiv > 0 AND ZStartIndiv > 0)
  325.     TurboLogon = (LEFT$(ZUserIn$(LogIndex),1) = "!")
  326.     SkipWelcomeScreen = (LEFT$(ZUserIn$(LogIndex),1) = "$")
  327.     ZHomeConf$ = RIGHT$(ZUserIn$(LogIndex),LEN(ZUserIn$(LogIndex)) _
  328.                      + (TurboLogon OR SkipWelcomeScreen))
  329.     CALL AllCaps(ZHomeConf$)
  330. '
  331. ' *****  CHECK IF SAME USER ON ANOTHER NODE   ***
  332. '
  333. 410 IF ZExitToDoors THEN _
  334.        ZCurDate$ = MID$(ZMsgRec$,119,2) + _
  335.                        "-" + _
  336.                        MID$(ZMsgRec$,121,2) + _
  337.                        "-" + _
  338.                        MID$(ZMsgRec$,123,2) : _
  339.        ZTime$ = MID$(ZMsgRec$,125,2) + _
  340.               ":" + _
  341.               RIGHT$(ZMsgRec$,2) : _
  342.        IF LEFT$(ZTime$,2) < "12" THEN _
  343.           ZTime$ = ZTime$ + _
  344.                  " AM" _
  345.        ELSE ZTime$ = ZTime$ + _
  346.                    " PM"
  347.     NodeIndex = 2
  348.     WasXX = ZMaxNodes + 1
  349.     WasX$ = LEFT$(ZActiveUserName$+"  ",30)
  350. 412 IF NodeIndex > WasXX THEN _
  351.        GOTO 430
  352.     GET 1,NodeIndex
  353.     IF INSTR(ZMsgRec$,WasX$) THEN _
  354.        GOTO 420
  355.     NodeIndex = NodeIndex + 1
  356.     GOTO 412
  357. 420 IF MID$(ZMsgRec$,57,1) = "A" THEN _
  358.        ZLogonErrorIndex = 6 : _
  359.        ZWasLG$(6) = ZWasLG$(6) + _
  360.                 LEFT$(ZMsgRec$,25) : _
  361.        ZOutTxt$ = "The name '" + ZActiveUserName$ + _
  362.                   "' is in use on another node" : _
  363.        CALL RingCaller : _
  364.        GOTO 10620
  365.     ZFirstName$ = LEFT$(ZMsgRec$,INSTR(ZMsgRec$, " ") - 1)
  366.     IF NOT ZPrivateDoor THEN _
  367.        CALL SkipLine (1) : _
  368.        CALL QuickTPut1 (ZFirstName$ + ", welcome back!") : _
  369.        CALL Talk (11,ZOutTxt$)
  370.     IF ZExitToDoors THEN _
  371.        GOTO 457
  372. '
  373. ' *****  TEST FOR REMOTE SYSOP LOGGING ON   ***
  374. '
  375. 430 GET 1,ZNodeRecIndex
  376.     SameUser = (ZActiveUserName$ = LEFT$(ZMsgRec$,LEN(ZActiveUserName$)))
  377. '
  378. ' *****  TEST FOR SYSOP NAME ATTEMPT  ***
  379. '
  380. 445 IF INSTR(ZActiveUserName$,"SYSOP") OR _
  381.        INSTR(ZActiveUserName$,ZSysopFirstName$ + " " + ZSysopLastName$) THEN _
  382.        ZLogonErrorIndex = 2 : _
  383.        GOTO 10620
  384. '
  385. ' *****  REMOVE INVALID CHARACTERS FROM USER NAME  ***
  386. '
  387. 455 CALL BadChar (ZActiveUserName$)
  388.     IF ZActiveUserName$ = "" THEN _
  389.        GOTO 400
  390. '
  391. ' ****  CHECK FOR ACTIVE USER   ***
  392. '
  393. 457 CALL SkipLine (1)
  394.     GOSUB 12840
  395.     GOSUB 12850
  396.     GOSUB 12598
  397.     CALL RegToCurrent
  398.     CALL CompDate (ZTodayRegYY,ZTodayRegMM,ZTodayRegDD,TodayComputeDate!)
  399.     IF NOT Found THEN _
  400.        GOTO 700
  401.     GOSUB 12984
  402. '
  403. ' *****  ACTIVE USER FOUND  ****
  404. '
  405. 459 GOSUB 9500
  406.     ZLastDateTimeOnSave$ = ZLastDateTimeOn$
  407.     ZMinsInDoors = 0
  408.     IF ZExitToDoors THEN _
  409.        TempHoldTime! = VAL(LEFT$(ZTime$,2))*3600! + _
  410.                          VAL(MID$(ZTime$,4,2))*60! : _
  411.        CALL CheckTime(TempHoldTime!, TempTime!, 2) : _
  412.        ZMinsInDoors = TempTime! / 60 : _
  413.        CALL TimeRemain (MinsRemaining)
  414.     ZUserFileIndex = LOC(5)
  415.     GOSUB 5135
  416. '
  417. ' ***  COMPUTE THE NUMBER OF DAYS REMAINING UNTIL REGISTRATION EXPIRES **
  418. '
  419.     GOSUB 462
  420. 460 UserSecLevel$ = STR$(ZUserSecLevel)
  421.     IF ZUserSecLevel > -1 THEN _
  422.        UserSecLevel$ = MID$(UserSecLevel$,2)
  423.     IF ZUserSecLevel >= ZMinLogonSec THEN _
  424.        GOTO 470
  425.     IF NOT ZPrivateDoor THEN _
  426.        GOSUB 465 : _
  427.        CALL DelayTime (8 + ZBPS)
  428.     IF ZLogonErrorIndex < 9 AND _
  429.        ZErrCode = 0 THEN _
  430.        ZLogonErrorIndex = 8
  431.     GOTO 10620
  432. 462 IF ZRestrictByDate AND ZDaysInRegPeriod > 0 THEN _
  433.        CALL CompDate (ZUserRegYY,ZUserRegMM,ZUserRegDD,UserComputeDate!) : _
  434.        ZRegDaysRemaining = UserComputeDate! + _
  435.                             ZDaysInRegPeriod - _
  436.                             TodayComputeDate! : _
  437.        CALL ExpireDate (UserComputeDate!,ZDaysInRegPeriod,ZExpirationDate$) _
  438.     ELSE ZDaysInRegPeriod = 0
  439.     IF NOT ZPrivateDoor THEN _
  440.        IF ZRegDaysRemaining < 0 AND ZDaysInRegPeriod > 0 THEN _
  441.        IF ZUserSecLevel > ZTempExpiredSec THEN _
  442.           CALL QuickTPut1 (ZWasLG$(9) + _
  443.                       " - security level set to" + _
  444.                       STR$(ZTempExpiredSec)) : _
  445.           CALL BufFile(ZHelpPath$+"RGXPIRD"+ZHelpExtension$,WasX) : _
  446.           ZLogonErrorIndex = 9 : _
  447.           ZUserSecLevel = ZTempExpiredSec : _
  448.           LSET ZSecLevel$ = MKI$(ZUserSecLevel) : _
  449.           GOSUB 5135
  450.     RETURN
  451. '
  452. ' ***  DISPLAY LOG-ON MESSAGE FOR SPECIFIC SECURITY LEVEL  **
  453. '
  454. 465 TurboLogon = TurboLogon AND (ZExitToDoors OR _
  455.                   (ZUserSecLevel >= ZAllowCallerTurbo))
  456.     IF TurboLogon THEN _
  457.        RETURN
  458.     ZFileName$ = ZWelcomeFileDrvPath$ + _
  459.                  "LG" + _
  460.                  UserSecLevel$ + _
  461.                  ".DEF"
  462. 466 CALL Graphic (ZFileName$)
  463.     ZStopInterrupts = ZTrue
  464.     ZBypassTimeCheck = ZTrue
  465.     CALL BufFile (ZFileName$,WasX)
  466.     RETURN
  467. 470 GOSUB 12989
  468.     ZWasCI$ = ZCityState$
  469.     CALL Trim (ZWasCI$)
  470.     ZAttemptsAllowed = 4
  471.     ZPswdSave$ = ZPswd$
  472.     TempSysop = (ZUserSecLevel >= ZSysopSecLevel)
  473.     ZMsgPswd = ZFalse
  474.     IF NOT ZSubBoard THEN _
  475.        ZElapsedTime = CVI(ZElapsedTime$)
  476.     IF (NOT ZExitToDoors) AND _
  477.        (ZCurDate$ <> LEFT$(ZLastDateTimeOn$,8)) AND _
  478.        (ZElapsedTime > 0 OR NOT ZKeepTimeCredits) THEN _
  479.        ZElapsedTime = 0
  480.     IF ZPrivateDoor AND _
  481.        ZTransferFunction = 3 THEN _
  482.        GOSUB 755 : _
  483.        GOTO 800
  484.     IF ZPswdSave$ = SPACE$(LEN(ZPswdSave$)) THEN _
  485.        GOSUB 755 : _
  486.        GOTO 800
  487. 480 CALL SetSysOp
  488.     IF ZPrivateDoor OR (ZWasA AND ZEscapeInsecure) OR ZDoorSkipsPswd THEN _
  489.        ZWasZ$ = ZPswdSave$ : _
  490.        ZPswdFailed = 0 : _
  491.        GOTO 644
  492.     ZSubParm = 4
  493.     CALL PassWrd
  494.     LogonPswdFailed = ZPswdFailed
  495.     ZAnsIndex = LogIndex
  496. 643 IF NOT LogonPswdFailed THEN _
  497.        GOSUB 41070 : _
  498.        GOTO 644 _
  499.     ELSE IF ZExitToDoors THEN _
  500.             GOTO 644
  501.     GOSUB 12991
  502.     ZOutTxt$ = "Forget password?  Leave comment to SysOp (Y,[N])"
  503.     GOSUB 12999
  504.     IF ZYes THEN _
  505.        OrigSubject$ = "FORGOTTEN PASSWORD" : _
  506.        GOSUB 1801
  507.     ZFirstName$ = ""
  508.     GOTO 902
  509. 644 ZNewUser = ZFalse
  510.     WasWK$ = RIGHT$(STR$(ASC(MID$(ZListNewDate$,2))),2) + _  ' MM
  511.            "/" + _
  512.            RIGHT$(STR$(ASC(MID$(ZListNewDate$,3))),2) + _    ' DD
  513.            "/" + _
  514.            RIGHT$(STR$(ASC(ZListNewDate$)),2)                ' YY
  515.     ZWasLM$ = RIGHT$(WasWK$,2) + _                           ' YY
  516.           LEFT$(WasWK$,2) + _                                ' MM
  517.           MID$(WasWK$,4,2)                                   ' DD
  518.     IF MID$(ZWasLM$,3,1) = " " THEN _
  519.        MID$(ZWasLM$,3,1) = "0"
  520. 655 IF MID$(ZWasLM$,5,1) = " " THEN _
  521.        MID$(ZWasLM$,5,1) = "0"
  522. 660 CALL Muzak (1)
  523.     GOTO 800
  524. 670 GOSUB 12570
  525.     IF Found THEN _
  526.        GOSUB 12984 : _
  527.        RETURN 12595
  528.     RETURN
  529. '
  530. ' ****  ACTIVE USER NOT FOUND (NEWUSER ROUTINE)  ***
  531. '
  532. 700 ZExpertUser = ZFalse
  533.     CALL SetExpert
  534.     IF ZMinNewCallerBaud > ZBaudTest! THEN _
  535.        CALL QuickTPut ("Sorry," + STR$(ZBaudTest!) + _
  536.                        " BPS only for registered users",1) : _
  537.        ZWasLG$(7) = "NEW CALLER BAUD RESTRICTION" : _
  538.        ZLogonErrorIndex = 7 : _
  539.        GOTO 10620
  540.     CALL QuickTPut1 ("User not found")
  541.     ZLastIndex = 0
  542.     GOSUB 12558
  543.     IF ZNo THEN _
  544.        GOSUB 13700 : _
  545.        GOTO 400
  546.     CALL Line25
  547.     ZWasZ$ = ZFirstName$
  548.     GOSUB 670
  549.     ZWasZ$ = ZLastName$
  550.     GOSUB 670
  551.     ZWasZ$ = ZActiveUserName$
  552.     GOSUB 670
  553.     TurboLogon = ZFalse
  554. 710 IF ZUserFileIndex = 0 AND NOT ZSurviveNoUserRoom THEN _
  555.        GOTO 13540
  556. 720 CALL SetSysOp
  557.     IF ZWasA THEN _
  558.        ZUserSecLevel = ZSysopSecLevel _
  559.     ELSE ZUserSecLevel = ZDefaultSecLevel
  560. 725 IF ZUserSecLevel < ZMinLogonSec THEN _
  561.        ZLogonErrorIndex = 1 : _
  562.        GOTO 460
  563.     IF ZFirstName$ = ZLastName$ THEN _
  564.        CALL QuickTPut1 (ZFirstNamePrompt$+"/"+ZLastNamePrompt$+" cannot be same") : _
  565.        ZLogonErrorIndex = 3 : _
  566.        GOTO 10620
  567.     IF NOT ZRememberNewUsers THEN _
  568.        GOSUB 13700 : _
  569.        ZUserFileIndex = 0 : _
  570.        GOSUB 12960: _
  571.        PrevLastOn$ = "00-00-00": _
  572.        GOTO 735
  573.     ZNewUser = ZTrue
  574.     CALL OpenUser (ZHighestUserRecord)
  575.     GOSUB 9450
  576.     GOSUB 12630
  577.     MID$(ZUserRecord$,ZStartHash,ZLenHash) = LEFT$("NEWUSER",ZLenHash)
  578.     IF ZStartIndiv > 0 THEN _
  579.        MID$(ZUserRecord$,ZStartIndiv,ZLenIndiv) = ZIndivValue$
  580.     GOSUB 9440
  581. 730 GOSUB 12960
  582. 735 ZBypassTimeCheck = ZTrue
  583.     GOSUB 758
  584. 739 CALL QuickTPut1 (ZActiveUserName$ + " from " + ZWasCI$)
  585. 740 ZOutTxt$ = "C)hange "+ZFirstNamePrompt$+"/"+ZLastNamePrompt$+"/"+ZUserLocation$+", D)isconnect, [R]egister"
  586.     GOSUB 12995
  587.     IF ZWasQ = 0 THEN _
  588.        ZWasZ$ = "R" _
  589.     ELSE CALL AraAllCaps (ZUserIn$(),1) : _
  590.          ZWasZ$ = ZUserIn$(1)
  591.     ZWasS = INSTR("CDR",ZWasZ$)
  592. 745 IF NOT ZRememberNewUsers THEN _
  593.        ON ZWasS GOTO 748,752,754
  594.     ON ZWasS GOTO 747,750,760
  595.     GOTO 740
  596. 747 CALL UpdtCalr (ZActiveUserName$ + " from " + ZWasCI$ + _
  597.                            " changed Name/Address",2)
  598.     MID$(ZUserRecord$,ZStartHash,ZLenHash) = STRING$(ZLenHash,0)
  599.     GOSUB 9440
  600.     GOSUB 12991
  601. 748 ZFF = ZFalse
  602.     ZLastIndex = 0
  603.     GOTO 400
  604. '
  605. ' ***  D - COMMAND FROM NEWUSER ROUTINE (DISCONNECT - REFUSE TO REGISTER) **
  606. '
  607. 750 CALL UpdtCalr (ZActiveUserName$ + " from " + ZWasCI$ + _
  608.                            " didn't register",2)
  609.     MID$(ZUserRecord$,ZStartHash,ZLenHash) = STRING$(ZLenHash,0)
  610.     GOSUB 9440
  611.     GOSUB 12991
  612. 752 ZFF = ZFalse
  613.     ZUserFileIndex = 0
  614.     GOTO 13540
  615. '
  616. ' *****  GET AND VERIFY PASSWORD   ****
  617. '
  618. 754 CALL QuickTPut1 ("GUEST privileges granted.  Re-register on future calls")
  619.     ZUserSecSave = ZUserSecLevel
  620.     GOTO 832
  621. 755 IF ZPrivateDoor THEN _
  622.        ZUserIn$ = ZPswd$ : _
  623.        ZWasZ$ = ZUserIn$ : _
  624.        RETURN
  625.     GOSUB 12800
  626.     ZOutTxt$ = "Re-Enter password for Verification"
  627.     GOSUB 45010
  628.     SWAP ZWasZ$,ZUserIn$
  629.     CALL AllCaps (ZWasZ$)
  630.     IF ZUserIn$ <> ZWasZ$ THEN _
  631.        CALL QuickTPut1 ("Passwords Don't Match!") : _
  632.        GOTO 755
  633.     RETURN
  634. 758 CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  635.     CALL Line25
  636.     ZFileName$ = ZNewUserFile$
  637.     ZStopInterrupts = ZTrue
  638.     GOSUB 1790
  639.     CALL SkipLine(1)
  640.     RETURN
  641. '
  642. ' ***  R - COMMAND FROM NEWUSER ROUTINE - REGISTER   **
  643. '
  644. 760 ZLastIndex = 0
  645.     GOSUB 755
  646.     CALL AllCaps (ZWasZ$)
  647.     LSET ZPswd$ = ZWasZ$
  648.     CALL QuickTPut1 ("Please REMEMBER your password")
  649.     ZUserTextColor = 37
  650.     ZTempSecLevel = ZUserSecLevel
  651.     CALL Protocol
  652.     ZUserXferDefault$ = "N"
  653.     ZProtoPrompt$ = "None"
  654.     IF ZNewUserSetsDefaults THEN _
  655.        ZBypassTimeCheck = ZTrue : _
  656.        GOSUB 43000 : _
  657.        ZBypassTimeCheck = ZFalse : _
  658.        CALL Graphic (ZFileName$) : _
  659.        GOSUB 42805 : _
  660.        GOSUB 42700 _
  661.     ELSE ZUpperCase = ZFalse : _
  662.          ZNulls = ZFalse
  663.     ZPageLength = ZPageLengthDef
  664.     CALL SetNewUserDef
  665.     GOSUB 5135
  666.     CALL DefaultU
  667. 790 IF NOT ZNewUser THEN _
  668.        GOTO 800
  669.     ZFileName$ = ZNewUserQuestionnaire$
  670.     GOSUB 11520
  671.     LSET ZSecLevel$ = MKI$(ZUserSecLevel)
  672.     UserSecLevel$ = STR$(ZUserSecLevel)
  673.     CALL Remove (UserSecLevel$," ")
  674. '
  675. ' ****  LOGIN ALL USERS  ***
  676. '
  677. 800 IF ZAdjustedSecurity THEN _
  678.        GOSUB 5135
  679.     IF ZOrigCnfg$ = ZCurDef$ THEN _
  680.        ZMainUserFileIndex = ZUserFileIndex : _
  681.        ZOrigSec = ZUserSecLevel : _
  682.        ZUserSecSave = ZUserSecLevel : _
  683.        ZOrigUserName$ = ZActiveUserName$
  684.     ZTimesLoggedOn = CVI(MID$(ZUserOption$,1,2)) - _
  685.        ((ZOrigCnfg$ <> ZCurDef$ OR NOT ZSubBoard) AND _
  686.         (NOT ZPrivateDoor) AND (NOT ZExitToDoors))
  687.     GOSUB 9500
  688.     IF (NOT ZExitToDoors) AND (NOT ZSubBoard) THEN _
  689.        CALL UpdtCalr (ZActiveUserName$ + " from " + ZWasCI$ + _
  690.                  " Lvl" + STR$(ZUserSecLevel) + " " + TIME$,2)
  691.     PrevLastOn$ = ZLastDateTimeOn$
  692.     IF ZLocalUser THEN _
  693.        ZTalkToModemAt$ = "9600" : _
  694.        ZBaudParity$ = "9600 BPS,N,8,1" : _
  695.        ZModemInitBaud$ = "9600" : _
  696.        ZSnoop = ZTrue : _
  697.        ZLineFeeds = ZTrue
  698.     CALL SetCrLf
  699.     CALL SetPrompt
  700.     CALL XferType (2,ZTrue)
  701.     IF NOT ZSubBoard THEN _
  702.        BoardCheckDate$ = PrevLastOn$
  703.     CALL SetSysOp
  704.     IF ZWasA THEN _
  705.        ZActiveUserName$ = "SYSOP" : _
  706.        ZFirstName$ = "SysOp"
  707.     IF ZExitToDoors OR ZSubBoard THEN _
  708.        GOTO 815
  709.     GOSUB 465
  710.     IF (ZEightBit AND _
  711.        ZAutoDownDesired) OR _
  712.        ZAskID THEN _
  713.        CALL TestUser
  714.     CALL QuickTPut1 ("Logging " + ZActiveUserName$)
  715.     CALL Talk (1,ZOutTxt$)
  716.     Temp$ = STR$(ZBaudTest!) + MID$(ZBaudParity$,INSTR(ZBaudParity$," B"))
  717.     CALL QuickTPut1 ("RBBS-PC " + ZVersionID$ + " Node " + ZNodeID$ + _
  718.                 ", operating at" + Temp$)
  719.     CALL SkipLine (1)
  720.     Attempts = 0
  721.     ZWasZ$ = ZActiveUserName$ + _
  722.             " on at " + _
  723.             ZCurDate$ + _
  724.             ", " + _
  725.             ZTime$ + _
  726.             " from " + _
  727.             ZWasCI$ + _
  728.             "," + Temp$
  729.      ZWasNG$ = ZWasZ$ + SPACE$(128 - LEN(ZWasZ$))
  730. '
  731. ' *  ALWAYS RECORD THE HASH/INDIVIDUATING FIELD TO EACH RECORD LOGGED OUT
  732. '
  733.      WasX$ = "{" + _
  734.           HashValue$ + _
  735.           "/" + _
  736.           ZIndivValue$ + _
  737.           "}"
  738.      IF LEN(ZWasZ$) < 65 THEN _
  739.         WasX = 65 _
  740.      ELSE WasX = LEN(ZWasZ$) + 2
  741.      MID$(ZWasNG$,WasX) = WasX$
  742.      CALL Printit ("  " + ZWasZ$)
  743.      IF ZNewUser THEN _
  744.         CALL UpdtCalr ("NEWUSER",1) : _
  745.         CALL Muzak (2)
  746. '
  747. ' *****  NOTIFY CALLER IF ABLE TO "AUTODOWN"  ****
  748. '
  749.     IF ZEightBit AND ZAutoDownYes THEN _
  750.        ZOutTxt$ = CHR$(9) + _
  751.             ZReturnLineFeed$ + _
  752.             "You may use AUTODOWNLOADing!" : _
  753.        CALL RingCaller : _
  754.        CALL DelayTime(4)
  755. 815 CALL SetUserUpDn
  756.     IF ZCurDate$ <> LEFT$(ZLastDateTimeOnSave$,8) THEN  _
  757.        ZDLToday! = 0 : _
  758.        ZBytesToday! = 0
  759.     CALL SetGlobalUpDn
  760.     GOSUB 827
  761.     LSET ZUserOption$ = MKI$(ZTimesLoggedOn) + _
  762.                         MID$(ZUserOption$,3)
  763.     LSET ZLastDateTimeOn$ = ZCurDate$ + _
  764.                               " " + _
  765.                               ZTimeLoggedOn$
  766.     MID$(ZUserRecord$,ZStartHash,ZLenHash) = HashValue$
  767.     IF ZStartIndiv > 0 THEN _
  768.        MID$(ZUserRecord$,ZStartIndiv,ZLenIndiv) = ZIndivValue$
  769.     LSET ZUserName$ = ZOrigUserName$
  770.     IF (NOT ZExitToDoors) AND NOT (ZOrigMsgFile$ = ZActiveMessageFile$ AND ZSubBoard) THEN _
  771.        CALL AutoPage
  772.     IF NOT ZSubBoard THEN _
  773.        ZOrigUserFileIndex = ZUserFileIndex
  774.     IF NOT ZConfMode THEN _
  775.        IF ZOrigDateTimeOn$ = "" THEN _
  776.           ZOrigDateTimeOn$ = ZLastDateTimeOn$ : _
  777.           ZOrigTimeLoggedOn$ = ZTimeLoggedOn$ _
  778.        ELSE ZLastDateTimeOn$ = ZOrigDateTimeOn$ : _
  779.             ZTimeLoggedOn$ = ZOrigTimeLoggedOn$
  780.     GOSUB 9440
  781.     GOSUB 12991
  782.     GOSUB 41000
  783.     CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  784.     IF TurboLogon THEN _
  785.        GOTO 819
  786.     IF SkipWelcomeScreen AND _
  787.        (ZUserSecLevel >= ZAllowCallerTurbo) THEN _
  788.        GOTO 816
  789.     IF NOT SameUser THEN _
  790.        ZStopInterrupts = NOT ZWelcomeInterruptable : _
  791.        ZBypassTimeCheck = ZTrue : _
  792.        ZFileName$ = ZWelcomeFile$ : _
  793.        ZDisplayAsUnit = ZTrue : _
  794.        GOSUB 1790 : _
  795.        ZDisplayAsUnit = ZFalse
  796.     ZBypassTimeCheck = ZFalse
  797.     ZStopInterrupts = ZTrue
  798. 816 IF NOT ZNewUser THEN _
  799.        CALL QuickTPut1 ("Times on:" + STR$(ZTimesLoggedOn) + _
  800.             "  Last on: " + PrevLastOn$)
  801. 817 IF NOT ZRemindFileXfers OR ZNewUser THEN _
  802.        GOTO 818
  803.     ZOutTxt$ = "Files Downloaded:" + _
  804.          STR$(ZDnlds) + _
  805.          "  Uploaded:" + _
  806.          STR$(ZUplds)
  807.     GOSUB 12977
  808.     CALL CheckRatio (ZFalse)
  809. 818 CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  810.     IF ZRemindProfile THEN _
  811.        GOSUB 5400 : _
  812.        CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  813. 819 CALL Trim (ZWasCI$)
  814.     IF (ZNodeRecIndex < 2) THEN _
  815.        GOTO 821
  816.     GOSUB 4910
  817.     GOSUB 24000
  818.     GET 1,ZNodeRecIndex
  819.     MID$(ZMsgRec$,1,31) = ZActiveUserName$ + _
  820.                                  SPACE$(31 - LEN(ZActiveUserName$))
  821.     MID$(ZMsgRec$,40,2) = " 0"
  822.     MID$(ZMsgRec$,44,2) = RIGHT$(STR$(-ZBPS),2)
  823.     MID$(ZMsgRec$,55,2) = " 0"
  824.     MID$(ZMsgRec$,57,1) = "A"
  825.     MID$(ZMsgRec$,60,5) = ZTalkToModemAt$ + _
  826.                                  SPACE$(5 - LEN(ZTalkToModemAt$))
  827.     MID$(ZMsgRec$,72,2) = " 0"
  828.     MID$(ZMsgRec$,93,24) = ZWasCI$ + _
  829.                                   SPACE$(24)
  830.     PUT 1,ZNodeRecIndex
  831.     GOSUB 12985
  832. 821 IF ZExitToDoors THEN _
  833.        IF ZTransferFunction = 3 THEN _
  834.           ZNewUser = ZTrue : _
  835.           TurboLogon = ZFalse : _
  836.           SameUser = ZFalse : _
  837.           ZTransferFunction = 0 : _
  838.           GOTO 832 _
  839.        ELSE GOTO 832
  840.     GOSUB 1241
  841.     IF (ZSubBoard AND (ZOrigMsgFile$ = ZActiveMessageFile$)) _
  842.        OR ((ZUserSecLevel > ZMaxRegSec) AND (NOT ZNewUser)) THEN _
  843.        GOTO 832
  844.     ZWasZ$ = ZRegProgram$
  845.     ZTransferFunction = 3
  846.     CALL DoorExit (ZFalse)
  847.     ZTransferFunction = 0
  848.     GOTO 832
  849. '
  850. ' ****  ESC PRESSED ON LOCAL CONSOLE ENTERS HERE   ***
  851. '
  852. 822 LOCATE 24,1
  853.     CALL TakeOffHook
  854.     ZLocalUser = ZTrue
  855.     ZSnoop = ZTrue
  856.     ZBPS = -7
  857.     CALL CommInfo
  858.     CALL Muzak (2)
  859.     IF NOT ZEscapeInsecure THEN _
  860.        GOTO 345
  861.     ZActiveUserName$ = ZSecretName$
  862.     ZFirstName$ = ZSysopPswd1$
  863.     ZLastName$ = ZSysopPswd2$
  864.     ZUserLogonTime! = TIMER
  865.     ZTimeLoggedOn$ = TIME$
  866.     ZLinesPrinted = 0
  867.     ZSysop = ZTrue
  868.     GOTO 457
  869. 827 IF ZLastMsgRead > HighMsgNumber THEN _
  870.        ZLastMsgRead = 0 : _
  871.        MID$(ZUserOption$,3,2) = MKI$(0)
  872.     RETURN
  873. 832 IF ZRestrictByDate AND ZDaysInRegPeriod > 0 THEN _
  874.        IF ZRegDaysRemaining <= ZDaysToWarn AND _
  875.           ZRegDaysRemaining > 0 AND ZUserSecLevel > ZTempExpiredSec THEN _
  876.              CALL QuickTPut1 ("Registration EXPIRES in" + _
  877.                        STR$(ZRegDaysRemaining) + " days!") : _
  878.              CALL BufFile(ZHelpPath$+"RGXPIRE"+ZHelpExtension$,WasX) : _
  879.              IF NOT ZOK THEN CALL DelayTime (5)
  880.     IF (NOT ZReqQuesAnswered) AND _
  881.        ZReqQues$ <> "" THEN _
  882.          ZFileName$ = ZReqQues$ : _
  883.          GOSUB 11520 : _
  884.          IF ZOK THEN _
  885.             ZReqQuesAnswered = ZTrue
  886. 842 CALL SetSessionTime
  887.     ZSysop = (ZUserSecLevel >= ZSysopSecLevel)
  888.     GOSUB 12987
  889.     IF ZSubBoard THEN _
  890.        GOTO 850
  891.     GOSUB 12986
  892.     GOSUB 23000
  893.     CallsToDate! = CallsToDate! + 1 + (ZSysop OR ZHasDoored)
  894.     GOSUB 24000
  895.     GOSUB 12985
  896. 850 ZSubParm = 2
  897.     CALL Line25
  898.     CALL SkipLine (1)
  899.     IF TurboLogon THEN _
  900.        ZBulletinSave$ = ZBulletinMenu$ : _
  901.        GOSUB 9750 : _
  902.        GOTO 900
  903.     CALL CountNewFiles (BoardCheckDate$,ZMsgPtr(),LastNew,ZOutTxt$)
  904.     IF ZFMSDirectory$ <> "" THEN _
  905.        CALL QuickTPut1 (ZOutTxt$ + STR$(LastNew) + " NEW file(s) since last on") _
  906.     ELSE GOTO 852
  907.     IF ZNewUser OR LastNew < 1 OR NOT ZNewFilesCheck THEN _
  908.        GOTO 852
  909.     WasL = LEN(ZDnldDrives$)
  910.     SecNum = 19
  911.     IF (NOT ZSkipFilesLogon) AND _
  912.        ZUserSecLevel >= ZOptSec(SecNum) THEN _
  913.           ZOutTxt$ = "Review new files to download ([Y],N)" : _
  914.           GOSUB 12999 : _
  915.           IF NOT ZNo THEN _
  916.              ZLastIndex = 3 : _
  917.              ZAnsIndex = 1 : _
  918.              ZWasQ = 3 : _
  919.              ZUserIn$(2) = MID$(BoardCheckDate$,1,2) + _
  920.                      MID$(BoardCheckDate$,4,2) + _
  921.                      MID$(BoardCheckDate$,7,2) : _
  922.              ZWasY$ = ZUserIn$(3) : _
  923.              CALL BreakFileName (ZFMSDirectory$,DR$,ZWasY$,WasX$,ZFalse) : _
  924.              ZUserIn$(3) = ZWasY$ : _
  925.              TimeLockExempt = ZTrue : _
  926.              GOSUB 20185 : _
  927.              ZLastIndex = 0 : _
  928.              TimeLockExempt = ZFalse
  929. 852 ZStopInterrupts = ZFalse
  930.     ZSysop = (ZUserSecLevel >= ZSysopSecLevel)
  931.     IF ZUserSecLevel < ZOptSec (2) OR _
  932.        ZActiveBulletins < 1 OR _
  933.        ZSysop OR _
  934.        SameUser THEN _
  935.           GOTO 900
  936.     IF ZBulletinMenu$ = ZBulletinSave$ THEN _
  937.         GOTO 900
  938.     ZBulletinSave$ = ZBulletinMenu$
  939. 855 CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  940.     IF ZBulletinsOptional AND NOT ZNewUser THEN _
  941.        GOTO 856
  942.     ZStopInterrupts = ZTrue
  943.     ZNewUser = ZFalse
  944.     GOSUB 9700
  945.     ZStopInterrupts = ZFalse
  946.     GOTO 900
  947. 856 IF NOT ZCheckBulletLogon THEN _
  948.        ZAnsIndex = 0 : _
  949.        GOSUB 9760 : _
  950.        GOTO 900
  951.     CALL SkipLine (1)
  952.     ZOutTxt$ = "Skip the bulletins (Y,[N])"
  953.     GOSUB 12999
  954.     IF ZYes THEN _
  955.        GOTO 900
  956. 860 ZNewUser = ZFalse
  957.     GOSUB 9700
  958. 900 ZNewUser = ZFalse
  959.     ActionFlag = (ZLogonMailLevel$ = "S")
  960.     LogonMailNew = (ZLogonMailLevel$ = "N")
  961.     GOSUB 1895
  962.     IF ZActiveUserName$ = "SYSOP" AND NOT ZSysop THEN _
  963.        ZActiveUserName$ = ZOrigUserName$
  964.     LogonMailNew = ZFalse
  965.     ZSubParm = 2
  966.     CALL Line25
  967.     ZSection$ = "    "
  968.     ZOutTxt$ = ""
  969.     IF (NOT ZConfMode) AND (NOT ZSubBoard) AND NOT TurboLogon THEN _
  970.        MailCheckConfirm = ZTrue : _
  971.        LinkNew = ZTrue : _
  972.        GOSUB 5800
  973.     MailCheckConfirm = ZFalse
  974.     ZWasQ! = ZMinsInDoors * 60
  975.     ZMinsInDoors = 0
  976. 902 IF LogonPswdFailed THEN _
  977.        ZExitToDoors = ZFalse : _
  978.        CALL UpdateU (ZTrue) : _
  979.        ZLogonErrorIndex = 4 : _
  980.        GOTO 10620
  981.     IF ZExitToDoors and ZDooredTo$ <> "" THEN _
  982.        CALL BufFile (ZOutTxt$(7),WasX)
  983.     ZExitToDoors = ZFalse
  984.     IF ZHomeConf$ = "" THEN _
  985.        GOSUB 2350
  986.     IF NOT ZPrivateDoor THEN _
  987.        GOTO 955
  988.     GOSUB 20165
  989.     CALL SetSection
  990.     ZPrivateDoor = ZFalse
  991.     GOTO 1205
  992. 955 IF NOT TurboLogon THEN _
  993.        IF NOT SkipMain THEN _
  994.           GOSUB 4850
  995.     SkipMain = ZFalse
  996.     TurboLogon = ZFalse
  997. '
  998. ' *                           COMMAND PROCESSING
  999. '
  1000. 1200 CLOSE 1
  1001.      GOSUB 1280
  1002. 1205 IF ZSubParm < 0 THEN _
  1003.         GOTO 202
  1004.      ZSubParm = 1
  1005.      ZStopInterrupts = ZFalse
  1006.      ZWasQ = 0
  1007.      IF (NOT ConfMailJoin) AND (ZHomeConf$ = "" OR ZHomeConf$ = "MAIN") THEN _
  1008.         GOTO 1209
  1009.      TurboLogon = LinkNext OR (NOT ConfMailJoin)
  1010.      ConfMailJoin = ZFalse
  1011.      ZFF = 8
  1012.      IF ZHomeConf$ = "MAIN" THEN _
  1013.         ZHomeConf$ = "M"
  1014.      ZUserIn$(ZAnsIndex) = ZHomeConf$
  1015.      IF LinkNext THEN _
  1016.         ZUserIn$(ZAnsIndex + 1) = "R" : _
  1017.         ZLastIndex = ZAnsIndex + 1
  1018.      ZLastIndex = -ZLastIndex*(ZLastIndex > ZAnsIndex)-ZAnsIndex*(ZLastIndex <= ZAnsIndex)
  1019.      ZAnsIndex = ZAnsIndex - 1
  1020.      ZHomeConf$ = ""
  1021.      ZWasQ = ZLastIndex
  1022.      ZStoreParseAt = 1
  1023.      ZLastCommand$ = "MJ"
  1024.      GOTO 1240
  1025. 1209 CALL SkipLine (1)
  1026. 1210 GOSUB 41000
  1027.      IF ZAnsIndex < ZLastIndex THEN _
  1028.         GOTO 1232
  1029.      CALL Talk (10,ZOutTxt$)
  1030.      CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  1031.      IF ZExpertUser THEN _
  1032.         GOTO 1230
  1033. 1212 ZLinesPrinted = -ZMenusCanPause * ZLinesPrinted
  1034.      IF ZCustomPUI THEN _
  1035.         GOTO 1230
  1036.      IF ZSubSection < ZBegFile THEN _
  1037.         IF ZUserSecLevel >= ZSysopMenuSecLevel THEN _
  1038.            ZFileName$ = ZMenu$(1) : _
  1039.            GOSUB 43025
  1040.      ZFileName$ = ZMenu$(ZMenuIndex)
  1041.      ZDeleteInvalid = ZTrue
  1042.      GOSUB 1790
  1043.      ZDeleteInvalid = ZFalse
  1044. 1230 CALL Line25
  1045.      ZOutTxt$ = ZConfName$ + ":"
  1046.      GOSUB 12978
  1047.      CALL Talk (65,ZConfName$)
  1048.      CALL DispTimeRemain (MinsRemaining)
  1049.      IF ZMenuIndex = 6 THEN _
  1050.         ZSubParm = 1 : _
  1051.         CALL Library
  1052.      CALL Talk (ZMenuIndex, ZOutTxt$)
  1053. 1232 MID$(ZLastCommand$,2,1) = " "
  1054.      IF ZCustomPUI THEN _
  1055.         CALL UserFace : _
  1056.         GOSUB 12997 : _
  1057.         GOTO 1235
  1058.      ZOutTxt$ = ZCmdPrompt$
  1059.      GOSUB 12930
  1060.      IF ZWasQ = 0 THEN _
  1061.         GOTO 1230
  1062. 1235 ZWasZ$ = ZUserIn$(ZAnsIndex)
  1063.      IF ZWasZ$ = SPACE$(LEN(ZWasZ$)) THEN _
  1064.         GOTO 1230
  1065.      CALL SearchCmd (ZSubSection,ZFF)
  1066.      IF ZFF > 0 THEN _
  1067.         GOTO 1239
  1068.      IF ZWasQ > 0 THEN _
  1069.         CALL QuickTPut1 ("Unknown command <"+ZWasZ$+">")
  1070.      CALL FlushKeys
  1071.      GOTO 1230
  1072. 1239 CALL Talk (65,"OPTION "+ZWasZ$+" SELECTED")
  1073. 1240 IF ZUserSecLevel < ZOptSec(ZFF) THEN _
  1074.        ZViolation$ = ZSection$ + _
  1075.                      " " + _
  1076.                      ZWasZ$ : _
  1077.         GOSUB 1380 : _
  1078.         GOTO 1205
  1079.      IF ZFF > 39 THEN _
  1080.         ZDirExtension$ = ZLibDirExtension$ _
  1081.      ELSE ZDirExtension$ = ZMainDirExtension$
  1082.         ON ZFF GOSUB _
  1083.                  1400, _      ' 1  A)nswer questionnaire 1
  1084.                  9700, _      ' 2  B)ulletins
  1085.                  1800, _      ' 3  C)omments
  1086.                  10970, _     ' 4  D)oor (exit to)
  1087.                  2000, _      ' 5  E)nter a message
  1088.                  1275, _      ' 6  F)ile system (exit to)
  1089.                  1760, _      ' 7  I)nitial welcome redisplayed
  1090.                  5300, _      ' 8  J)oin a conference
  1091.                  3900, _      ' 9  K)ill a message
  1092.                  4700, _      '10  O)perator page
  1093.                  1900, _      '11  P)ersonal mail (look for)
  1094.                  4330, _      '12  R)ead messages
  1095.                  4340, _      '13  S)can message headers
  1096.                  4320, _      '14  T)opic msg scan
  1097.                  1285, _      '15  U)tilities (exit to)
  1098.                  5800, _      '16  V)iew a conference
  1099.                  9800, _      '17  W)ho's on other nodes displayed
  1100.                  1283, _      '18  @)Library (exit to) 18
  1101.                 20160, _      '19  D)ownload
  1102.                 10570, _      '20  G)oodbye
  1103.                 20155, _      '21  L)ist
  1104.                 20185, _      '22  N)ew
  1105.                 20180, _      '23  P)ersonal files
  1106.                 20175, _      '24  S)can
  1107.                 20170, _      '25  U)pload
  1108.                 20140, _      '26  V)iew ARC Contents
  1109.                  5500, _      '27  B)ank Time
  1110.                  9100, _      '28  C)lock (time & time on)
  1111.                  42850, _     '29  E)cho selection
  1112.                  42800, _     '30  F)ile transfer protocol
  1113.                  43000, _     '31  G)raphics
  1114.                  5200, _      '32  L)ines per page
  1115.                  10925, _     '33  M)essage margin
  1116.                  5110, _      '34  P)ersonal Info. Change
  1117.                  5400, _      '35  R)eview preferences
  1118.                  4850, _      '36  S)tatistics displayed
  1119.                  1500, _      '37  T)oggle
  1120.                  10090, _     '38  U)serlog displayed 12
  1121.                  30000, _     '39  A)rchive a Library disk 1
  1122.                  30100, _     '40  C)hange a Library disk
  1123.                  30200, _     '41  D)ownload Library files
  1124.                  10570, _     '42  G)oodbye
  1125.                  20155, _     '43  L)ist a Library directory
  1126.                  20175, _     '44  S)can a Library disk directory
  1127.                  20140, _     '45  V)iew arc contents 7
  1128.                  1325, _      '46  H)elp 1
  1129.                  1330, _      '47  ?)help
  1130.                  1250, _      '48  Q)uit
  1131.                  4240, _      '49  X)expert toggle on/off 4
  1132.                  10070, _     '50  1) List comments file 1
  1133.                  10090, _     '51  2) List callers file
  1134.                  10390, _     '52  3) Recover a message
  1135.                  10530, _     '53  4) Erase comments
  1136.                  11000, _     '54  5) User file maintenance
  1137.                   4130, _     '55  6) Toggle page bell on/off
  1138.                  10930        '56  7) Exit to DOS 2.x or above 7
  1139.      GOTO 1205
  1140. '
  1141. ' ***       NEWS file scan        ***
  1142. '
  1143. 1241 NewsDate# = VAL(MID$(BoardCheckDate$,4,2)) + _
  1144.         (100 * VAL(MID$(BoardCheckDate$,1,2))) + _
  1145.         (10000# * (1900 + VAL(MID$(BoardCheckDate$,7,2))))
  1146.      GOTO 1243
  1147. 1242 NewsDate# = 0
  1148. 1243 ZFileName$ = ZNewsFileName$
  1149.      CALL RBBSFind (ZFileName$,WasZ,WasY,ZMsgPtr,WasD)
  1150.      IF WasZ <> 0 THEN _
  1151.         RETURN
  1152.      FDate# = WasD + (100 * ZMsgPtr) + (10000# * (WasY + 1980))
  1153.      IF NewsDate# > FDate# THEN _
  1154.         RETURN
  1155.      IF TurboLogon THEN _
  1156.         CALL QuickTPut1("NEWS file updated since last call") : _
  1157.         RETURN
  1158.      ZStopInterrupts = ZFalse
  1159.      GOSUB 1790
  1160.      WasZ = 0
  1161.      RETURN                                                          ' LP01NEWS
  1162. '
  1163. ' ****           QUIT COMMAND (GLOBAL)              ***
  1164. '
  1165. 1250 IF ZExpertUser THEN _
  1166.         ZOutTxt$ = ZQuitPromptExpert$ _
  1167.      ELSE ZOutTxt$ = ZQuitPromptNovice$
  1168.      ZStackC = ZTrue
  1169.      GOSUB 12930
  1170.      IF ZWasQ = 0 THEN _
  1171.         ZUserIn$(ZAnsIndex) = "M"
  1172.      ZWasZ$ = ZUserIn$(ZAnsIndex)
  1173.      CALL AllCaps (ZWasZ$)
  1174.      IF ZWasZ$ = "C" THEN _
  1175.         ZWasZ$ = "M" : _
  1176.         GOTO 5323
  1177.      IF ZWasZ$ <> SPACE$(LEN(ZWasZ$)) THEN _
  1178.         ON INSTR(ZQuitList$,ZWasZ$) GOTO 1275,1280,1285,10570,1283
  1179.      GOTO 1250
  1180. 1275 ZMenuIndex = 3
  1181.      GOTO 1295
  1182. 1280 ZMenuIndex = 2
  1183.      GOTO 1295
  1184. 1283 ZMenuIndex = 6
  1185.      ZActiveFMSDir$ = ""
  1186.      GOTO 1295
  1187. 1285 ZMenuIndex = 4
  1188. 1295 CALL SetSection
  1189.      RETURN
  1190. 1300 CALL QuickTPut1 ("Message base " + ZConfName$)
  1191.      RETURN
  1192. '
  1193. ' **** COMMON LOCAL DISPLAY PRINT  ***
  1194. '
  1195. 1315 NumReturns = 1
  1196. 1320 CALL LPrnt(WasD$,NumReturns)
  1197.      RETURN
  1198. '
  1199. ' ******            HELP (GLOBAL)           ****
  1200. '
  1201. 1325 CALL ViewHelp (ZSubSection, MID$("MAINFILEUTILMAINLIBR",4 * ZMenuIndex - 7,4))
  1202.      IF ZSubParm = -1 THEN _
  1203.         RETURN 10595
  1204.      RETURN
  1205. 1330 IF ZExpertUser THEN _
  1206.         RETURN 1212
  1207.      GOTO 1325
  1208. '
  1209. ' *****  RECORD SECURITY VIOLATIONS   ****
  1210. '
  1211. 1380 CALL SecViolation
  1212.      IF NOT ZDenyAccess THEN _
  1213.         RETURN
  1214. 1386 CALL DenyAccess
  1215.      GOTO 10620
  1216. 1397 ZOutTxt$ = "Sorry, " + _
  1217.           ZFirstName$ + _
  1218.           ", " + _
  1219.           ZOutTxt$
  1220.      GOTO 12975
  1221. '
  1222. ' ***  A - answer questionnaire
  1223. '
  1224. 1400 WasA1$ = ZAnsMenu$
  1225.      CALL Talk (13,ZOutTxt$)
  1226.      ReturnToPrompt = (ZWasQ > 1)
  1227. 1401 ZStackC = ZTrue
  1228.      CALL SubMenu ("Which questionnaire(s), L)ist" + ZPressEnterExpert$, _
  1229.         WasA1$,ZQuesPath$,".DEF","",ZTrue,ZFalse,ZTrue,"",WasX,ZTrue)
  1230.      IF ZWasQ = 0 THEN _
  1231.         RETURN
  1232.      IF ZSubParm = -1 THEN _
  1233.         RETURN 10595
  1234.      QuestHold$ = ZWasZ$
  1235.      GOSUB 11520
  1236.      CLOSE 2
  1237.      CALL UpdtCalr (QuestHold$ + " questionnaire " + _
  1238.         MID$("answeredaborted",1 - 8 * ZQuestAborted,8),2)
  1239.      IF ReturnToPrompt THEN _
  1240.         RETURN
  1241.      GOTO 1401
  1242. '
  1243. ' *****    Toggle COMMAND (UTILITIES)     ****
  1244. '
  1245. 1500 CALL CmndToggle
  1246.      RETURN
  1247. '
  1248. ' ****  I - COMMAND FROM MAIN MENU (DISPLAY INITIAL WELCOME)  ***
  1249. '
  1250. 1760 ZFileName$ = ZPreLog$
  1251.      GOSUB 1790
  1252.      ZFileName$ = ZWelcomeFile$
  1253.      GOSUB 1790
  1254.      RETURN
  1255. 1790 CALL Graphic (ZFileName$)
  1256.      CALL BufFile (ZFileName$,WasX)
  1257.      CALL Carrier
  1258.      IF ZSubParm = -1 THEN _
  1259.         RETURN 10595
  1260.      RETURN
  1261. '
  1262. ' ***  C - COMMAND FROM MAIN MENU (LEAVE COMMENT FOR SYSOP)   **
  1263. '
  1264. 1800 OrigSubject$ = "COMMENT"
  1265. 1801 MsgTo$ = "SYSOP"
  1266.      Subject$ = OrigSubject$
  1267.      MsgFrom$ = ZActiveUserName$
  1268.      GOSUB 1893
  1269.      IF (ActiveMessages >= MaxMsgs OR _
  1270.         ((NOT ZMsgsCanGrow) AND _
  1271.         (ZNextMsgRec + 5 + ZMaxNodes > HighestMsgRecord)) OR _
  1272.         NOT ZCmntsAsMsgs ) THEN _
  1273.         ZOutTxt$ = "Want a Reply?  Use "+MID$(ZAllOpts$,5,1) + _
  1274.                    " instead.  Leave a comment (Y,[N])" : _
  1275.         GOSUB 12999 : _
  1276.         IF NOT ZYes THEN _
  1277.            CALL SkipLine (1) : _
  1278.            RETURN _
  1279.         ELSE ZSysopComment = ZTrue : _
  1280.              GOTO 2007
  1281.      ZSysopComment = ZFalse
  1282.      ZSysopMsg = ZTrue
  1283.      ZMsgHeader$ = "comment"
  1284.      GOTO 2010
  1285. 1850 WasBX = &H3
  1286.      ZWasEN$ = ZCmntsFile$
  1287.      GOSUB 12992
  1288.      CALL OpenWorkA (ZCmntsFile$)
  1289.      ZOutTxt$ = ZFirstName$ + _
  1290.           ", Thanks for comments!"
  1291.      GOSUB 12976
  1292.      CALL AMorPM
  1293.      CALL PrintWorkA (ZActiveUserName$+" "+ZCurDate$+" "+ZTime$+" Node "+ZNodeID$)
  1294.      FOR WasX = 1 TO ZLinesInMsg
  1295.         CALL PrintWorkA (ZOutTxt$(WasX))
  1296.      NEXT
  1297.      CALL PrintWorkA (ZCarriageReturn$)
  1298.      CLOSE 2
  1299.      IF ZErrCode <> 0 THEN _
  1300.         ZWasEL = 1850 : _
  1301.         GOTO 13000
  1302.      WasBX = &H3
  1303.      ZWasEN$ = ZCmntsFile$
  1304.      GOSUB 12993
  1305.      CALL UpdtCalr ("Left comment",1)
  1306.      REDIM ZOutTxt$(ZMsgDim)
  1307.      RETURN
  1308. '
  1309. ' ****  P - COMMAND FROM MAIN MENU (DISPLAY PERSONAL MAIL)  ****
  1310. '
  1311. 1893 ActionFlag = ZTrue
  1312.      GOTO 1897
  1313. 1895 IF TurboLogon THEN _
  1314.         RETURN
  1315.      ZOutTxt$ = "Check mail in " + ZConfName$ + " ([Y],N)"
  1316.      GOSUB 12999
  1317.      IF ZNo THEN _
  1318.         SkipMain = ZTrue : _
  1319.         RETURN
  1320.      ZUserIn$(0) = LEFT$("NEW ",-4*LogonMailNew)
  1321. 1897 IF ZActiveMessageFile$ = ZPrevBase$ THEN _
  1322.         ActionFlag = ZFalse : _
  1323.         RETURN
  1324. 1900 GOSUB 5344
  1325.      IF ZPrivateDoor THEN _
  1326.         ActionFlag = ZTrue
  1327.      ZPrevBase$ = ZActiveMessageFile$
  1328.      ShowActive = ZFalse
  1329.      IF NOT ActionFlag THEN _
  1330.         CALL QuickTPut ("Checking messages in " + ConfFileName$,0) : _
  1331.         ShowActive = ZTrue _
  1332.      ELSE CALL QuickTPut ("Loading messages",0)
  1333.      WasA1$ = ""
  1334.      MsgCt = 0
  1335.      MsgsFromUser = ZFalse
  1336.      ActiveMessages = 0
  1337.      MailReported = ActionFlag
  1338.      FirstOld = ZTrue
  1339.      GOSUB 23000
  1340.      MsgRec = FirstMsgRecord
  1341.      MaxMsgs = VAL(MID$(ZMsgRec$,89,7))
  1342.      NumDots = 0
  1343. 1905 GET 1,MsgRec
  1344.      CALL CheckInt (MID$(ZMsgRec$,117,4))
  1345.      IF ZErrCode <> 0 THEN _
  1346.         ZWasEL = 1905 : _
  1347.         GOTO 13000
  1348.      NumRecsInMsg = VAL(MID$(ZMsgRec$,117,4))
  1349.      IF NumRecsInMsg < 1 THEN _
  1350.         NumRecsInMsg = 1
  1351. 1906 IF ActionFlag OR (FirstOld AND NOT MailReported) THEN _
  1352.         CALL MarkTime (NumDots)
  1353.      CALL Carrier
  1354.      IF ZSubParm = -1 THEN _
  1355.         RETURN 10595
  1356. 1910 IF MsgRec >= ZNextMsgRec THEN _
  1357.         LowMsgNumber = ZMsgPtr(1,2) : _
  1358.         GOTO 1950
  1359. 1915 GOSUB 4660
  1360.      IF MID$(ZMsgRec$,116,1) <> ZActiveMessage$ THEN _
  1361.         GOTO 1946
  1362.      WasX$ = MID$(ZMsgRec$,121,2)
  1363.      IF WasX$ <> "  " THEN _
  1364.         IF CVI(WasX$) > ZUserSecLevel THEN _
  1365.            GOTO 1945
  1366.      IF ActionFlag THEN _
  1367.         GOTO 1935
  1368. '
  1369. ' ** ALLOW USERS WITH NAMES LONGER THAN 22 CHARS TO RECEIVE PRIVATE MAIL *
  1370. '
  1371. 1920 IF NOT UserInHeader THEN _
  1372.         GOTO 1945
  1373.      IF MsgToCaller THEN _
  1374.         GOTO 1925
  1375.      GOTO 1940
  1376. 1925 ZWasA = VAL(MID$(ZMsgRec$,2,4))
  1377.      IF LogonMailNew THEN _
  1378.         IF ZWasA <= ZLastMsgRead THEN _
  1379.            GOTO 1935
  1380.      IF NOT ShowActive THEN _
  1381.         GOTO 1930
  1382.      MailReported = ZTrue
  1383.      FirstNew = (ZWasA > ZLastMsgRead)
  1384.      IF FirstNew THEN _
  1385.         MsgCt = 0 : _
  1386.         CALL SkipLine (1) : _
  1387.         CALL QuickTPut1 ("New mail for you (* = Private)") _
  1388.      ELSE IF FirstOld THEN _
  1389.              CALL SkipLine (1) : _
  1390.              CALL QuickTPut1 ("Old mail for you (* = Private)") : _
  1391.              FirstOld = ZFalse
  1392.      ShowActive = NOT FirstNew
  1393. 1930 CALL QuickTPut (LEFT$(ZMsgRec$,5),0)
  1394.      MsgCt = MsgCt + 1
  1395.      IF MsgCt MOD 15 = 0 THEN _
  1396.         CALL SkipLine (1) : _
  1397.         CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  1398. 1935 IF NOT MsgFromCaller THEN _
  1399.         GOTO 1945
  1400. 1940 MsgsFromUser = MsgsFromUser + 1
  1401.      WasA1$ = WasA1$ + LEFT$(ZMsgRec$,5)
  1402. 1945 ActiveMessages = ActiveMessages + 1
  1403.      ZMsgPtr(ActiveMessages,1) = MsgRec
  1404.      ZMsgPtr(ActiveMessages,2) = VAL(MID$(ZMsgRec$,2,4))
  1405. 1946 MsgRec = MsgRec + NumRecsInMsg
  1406.      GOTO 1905
  1407. 1950 IF NOT MailReported THEN _
  1408.         ZOutTxt$ = "Sorry, " + _
  1409.              ZFirstName$ + _
  1410.              ", No " + ZUserIn$(0) + "mail for you" : _
  1411.         GOSUB 12975
  1412.      IF MsgsFromUser = 0 OR NOT ZMsgReminder THEN _
  1413.         GOTO 1961
  1414.      IF ActionFlag THEN _
  1415.         GOTO 1961
  1416.      ZOutTxt$ = "Mail you left"
  1417.      GOSUB 12976
  1418. 1960 WasK = 1
  1419.      FOR MsgCt = 1 TO MsgsFromUser
  1420.         ZOutTxt$ = MID$(WasA1$,WasK,5)
  1421.         WasK = WasK + 5
  1422.         GOSUB 12978
  1423.         IF MsgCt MOD 15 = 0 THEN _
  1424.            CALL SkipLine (1) : _
  1425.            CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  1426.      NEXT
  1427.      WasA1$ = ""
  1428.      CALL SkipLine (1)
  1429.      IF ZUserSecLevel >= ZOptSec(9) THEN _
  1430.         CALL QuickTPut1 ("Please K)ill your old messages")
  1431. 1961 ActionFlag = ZFalse
  1432.      CALL SkipLine (1)
  1433.      RETURN
  1434. '
  1435. ' ****  E - COMMAND FROM MAIN MENU (ENTER MESSAGE)  ***
  1436. '
  1437. 2000 QuotedReply = ZFalse
  1438.      MsgFrom$ = ZActiveUserName$
  1439.      ZSysopMsg = ZFalse
  1440.      GOSUB 1893
  1441. 2001 IF (LowMsgNumber > 0 AND ActiveMessages >= MaxMsgs) _
  1442.         OR HighMsgNumber >= 9999 THEN _
  1443.         IF ZActiveMessageFile$ = ZMainMsgFile$ AND _
  1444.            ActiveMessages = 1 THEN _
  1445.            GOTO 5300 _
  1446.         ELSE ZOutTxt$ = "No more messages allowed!  Try tomorrow" : _
  1447.              GOSUB 12975 : _
  1448.              GOTO 3650
  1449. 2006 IF NOT (ZReply OR MsgFwd) THEN _
  1450.         MsgPswd$ = ""
  1451.      ZSysopComment = ZFalse
  1452.      IF ZReply OR MsgFwd THEN SaveAnsIndex = ZAnsIndex
  1453.      IF MsgFwd OR NOT ZReply THEN _
  1454.         IF ZUserSecLevel >= ZOptSec(5) THEN MsgTo$ = ""
  1455. 2007 IF ZSysopComment THEN _
  1456.         ZWasZ$ = ZCmntsFile$ : _
  1457.         ZMsgHeader$ = "comment" _
  1458.      ELSE ZWasZ$ = ZActiveMessageFile$ : _
  1459.           ZMsgHeader$ = "message"
  1460. 2008 IF ZSysopComment OR ZMsgsCanGrow THEN _
  1461.         ZWasY$ = "on disk" : _
  1462.         CALL FindFree : _
  1463.         GOTO 2009
  1464.      IF ZNextMsgRec + 5 + ZMaxNodes < HighestMsgRecord THEN _
  1465.         GOTO 2010
  1466.      ZWasY$ = "in file"
  1467.      ZFreeSpace$ = "1"
  1468. 2009 IF VAL(ZFreeSpace$) >= 2000 THEN _
  1469.         GOTO 2010
  1470.      ZOutTxt$ = "No room " + ZWasY$ + " for " + ZMsgHeader$
  1471.      GOSUB 12979
  1472.      GOTO 3650
  1473. 2010 IF NOT QuotedReply THEN _
  1474.         ZLinesInMsg = 0 : _
  1475.         ZCommPortStack$ = "" : _
  1476.         WasL = 0 : _
  1477.         WasX = 0 : _
  1478.         REDIM ZOutTxt$(ZMsgDim)
  1479.      IF ZGetExtDesc THEN _
  1480.         GOTO 2100
  1481.      GOSUB 1893
  1482.      RcvrRecNum = 0
  1483. 2020 CALL SetWhoTo (-ZEnableCC*(ZUserSecLevel>=ZOptSec(5)),MsgTo$,MsgFrom$,RcvrRecNum,Found)
  1484.      IF MsgTo$ = "" THEN _
  1485.         RETURN
  1486.      IF ZSysopComment OR ZSysopMsg THEN _
  1487.         GOTO 2100
  1488.      IF ZReply OR MsgFwd THEN _
  1489.         Found = ZTrue : _
  1490.         CALL Trim (MsgTo$):  _
  1491.         GOTO 2035 _
  1492.      ELSE Subject$ = ""
  1493.      GOSUB 2065
  1494. 2035 IF QuotedReply THEN _
  1495.         RETURN
  1496.      GOTO 2100
  1497. '
  1498. ' *****  SET/CHANGE SUBJECT FOR A MESSAGE   ***
  1499. '
  1500. 2065 IF Subject$ <> "" THEN _
  1501.         ZOutTxt$ = "Change subject from " + _
  1502.              Subject$ + _
  1503.              " to" _
  1504.      ELSE ZOutTxt$ = "Subject"
  1505.      ZMacroMin = 99
  1506.      ZParseOff = ZTrue
  1507.      GOSUB 12932
  1508.      IF LEN(ZUserIn$) > 25 THEN _
  1509.         ZOutTxt$ = "25 chars max" : _
  1510.         GOSUB 12979 : _
  1511.         GOTO 2065
  1512.      IF ZWasQ = 0 THEN _
  1513.         IF Subject$ <> "" THEN _
  1514.            RETURN _
  1515.         ELSE GOSUB 2435 : _
  1516.              IF ZYes THEN _
  1517.                 RETURN 5160 _
  1518.              ELSE GOTO 2065
  1519.      Subject$ = ZUserIn$
  1520.      CALL AllCaps (Subject$)
  1521.      OrigSubject$ = Subject$
  1522.      RETURN
  1523. '
  1524. ' *****  ENTER MAIN BODY OF MESSAGE  ****
  1525. '
  1526. 2100 ZOutTxt$ = "Type " + _
  1527.           ZMsgHeader$ + _
  1528.           STR$(ZMaxMsgLines) + _
  1529.           " lines max" + _
  1530.           ZPressEnter$
  1531.      GOSUB 12975
  1532.      GOSUB 3200
  1533. 2125 ZLinesInMsg = ZLinesInMsg + 1
  1534. 2127 IF ZRemoteEcho OR ZLocalUser THEN _
  1535.         ZOutTxt$ = RIGHT$(STR$(ZLinesInMsg),2) + _
  1536.              ": " + _
  1537.              ZOutTxt$(ZLinesInMsg) _
  1538.      ELSE ZOutTxt$ = ZOutTxt$(ZLinesInMsg)
  1539.      GOSUB 12978
  1540.      CALL LineEdit(ZLinesInMsg,ZRightMargin + 1)
  1541.      IF ZWaitExpired THEN _
  1542.         GOTO 2300 _
  1543.      ELSE IF ZSubParm = -1 THEN _
  1544.              GOTO 10595
  1545.      CALL FindFKey
  1546.      IF ZSubParm < 0 THEN _
  1547.         GOTO 202
  1548.      IF ZOutTxt$(ZLinesInMsg) = "" THEN _
  1549.         ZLinesInMsg = ZLinesInMsg - 1 : _
  1550.         GOTO 2300
  1551. 2140 WasJ = ZLinesInMsg
  1552.      GOSUB 2200
  1553.      IF WasX THEN _
  1554.         GOTO 2300
  1555.      GOTO 2125
  1556. 2200 WasX = 0
  1557.      IF WasJ < (ZMaxMsgLines - 2) THEN _
  1558.         RETURN
  1559.      ZOutTxt$ = MID$("2 lines leftLast line   Full",12 * (WasJ-(ZMaxMsgLines - 2)) + 1,12)
  1560.      WasX = (WasJ > (ZMaxMsgLines - 1))
  1561. 2210 GOSUB 12979
  1562.      RETURN
  1563. '
  1564. ' *****  FINAL MESSAGE DISPOSITION   ****
  1565. '
  1566. 2300 CALL SkipLine (1)
  1567.      IF ZExpertUser THEN _
  1568.         GOTO 2315
  1569. 2302 ZOutTxt$ = "A)bort, " + LEFT$("B)atch import, ",-15 * (ZSysop OR ZLocalUser)) + _
  1570.                 "C)ontinue adding, D)elete lines, E)dit a line"
  1571.      CALL TopPrompt
  1572.      ZOutTxt$ = "I)nsert lines, L)ist, M)argin change, R)evise subj, S)ave msg, ?)help"
  1573.      CALL TopPrompt
  1574. 2315 ZOutTxt$ = "Edit Sub-function <A," + _
  1575.           LEFT$("B,",-2 * (ZSysop OR ZLocalUser)) + _
  1576.           "C,D,E,I,L,M,R,S,?>"
  1577.      GOSUB 12930
  1578.      IF ZWasQ = 0 THEN _
  1579.         GOTO 2315
  1580.      CALL AraAllCaps (ZUserIn$(),ZAnsIndex)
  1581.      ZWasZ$ = ZUserIn$(ZAnsIndex)
  1582. 2330 ON INSTR("ABCDEILMRS?",ZWasZ$) GOTO 2400,2335,2332,2500,2600,2800,3000,3100,2440,3400,2345
  1583.      GOTO 2300
  1584. 2332 IF ZLinesInMsg < 1 THEN _
  1585.         ZLinesInMsg = 1
  1586.      GOTO 2127
  1587. 2335 WasX = ZLinesInMsg
  1588.      CALL MsgImport (ZMaxMsgLines,ZRightMargin,ZLinesInMsg,ZOutTxt$())
  1589.      IF ZLinesInMsg > WasX THEN _
  1590.         GOTO 3000 _
  1591.      ELSE GOTO 2300
  1592. '
  1593. ' *****  DISPLAY MESSAGE SUBCOMMANDS HELP FILE   ****
  1594. '
  1595. 2345 ZFileName$ = ZHelp$(4)
  1596.      GOSUB 1790
  1597.      GOTO 2302
  1598. 2350 IF ZCurPUI$ = "" OR ZSubBoard THEN _
  1599.         ZCurPUI$ = ZMainPUI$
  1600.      CALL FindIt (ZCurPUI$)
  1601.      ZCustomPUI = ZOK
  1602.      IF NOT ZOK THEN _
  1603.         ZCurPUI$ = ""
  1604.      ZPrevPUI$ = ""
  1605.      RETURN
  1606. '
  1607. ' ****  ABORT MESSAGE   ***
  1608. '
  1609. 2400 GOSUB 2435
  1610.      IF NOT ZYes THEN _
  1611.         GOTO 2300
  1612. 2430 ZOutTxt$ = "Aborted"
  1613.      GOSUB 12975
  1614.      GOTO 3650
  1615. 2435 ZOutTxt$ = "Abort " + _
  1616.           ZMsgHeader$ + _
  1617.           " (Y,[N])"
  1618.      GOSUB 12930
  1619.      RETURN
  1620. '
  1621. ' *****  CHANGE SUBJECT OF A MESSAGE  ****
  1622. '
  1623. 2440 GOSUB 2065
  1624.      GOTO 2300
  1625. '
  1626. ' *****  (BLOCK) DELETE MESSAGE LINE(S)  *****
  1627. '
  1628. 2500 ZOutTxt$ = "Delete from"
  1629.      GOSUB 3300
  1630.      Mark1 = ZTestedIntValue
  1631. 2520 Temp$ = "Up to and including Line # (ENTER =" + STR$(Mark1) + ")"
  1632.      CALL ChangeInt (ZFalse,Temp$,0,Mark1,ZLinesInMsg)
  1633.      IF ZWasQ = 0 THEN _
  1634.         Mark2 = Mark1 _
  1635.      ELSE Mark2 = ZTestedIntValue
  1636.      CALL SkipLine(1)
  1637.      GOTO 2530
  1638. 2522 FOR WasX = Mark1 TO Mark2
  1639.         CALL AskMore ("",ZTrue,ZTrue,WasXX,ZFalse)
  1640.         IF ZNo OR ZRet THEN _
  1641.            WasX = Mark2 + 1 _
  1642.         ELSE ZOutTxt$ = ZOutTxt$(WasX) : _
  1643.            GOSUB 12977
  1644.      NEXT
  1645.      CALL SkipLine(1)
  1646. 2530 ZOutTxt$ = "Delete lines" + STR$(Mark1) + "-" + _
  1647.         MID$(STR$(Mark2),2) + " (Y,[N],L)ist)"
  1648.      GOSUB 12930
  1649.      Temp$ = ZUserIn$(ZAnsIndex)
  1650.      CALL AllCaps(Temp$)
  1651.      IF Temp$ = "L" THEN GOTO 2522
  1652.      IF NOT ZYes THEN _
  1653.         ZOutTxt$ = "NOT Deleted" : _
  1654.         GOSUB 12979 : _
  1655.         GOTO 2555
  1656. 2550 ZBlockSize = (Mark2 - Mark1) + 1
  1657.      EndOfBuffer = ZLinesInMsg + 1
  1658.      ZLinesInMsg = ZLinesInMsg - ZBlockSize
  1659.      FOR WasX = Mark1 TO ZLinesInMsg
  1660.         ZOutTxt$(WasX) = ZOutTxt$(WasX + ZBlockSize)
  1661.      NEXT
  1662.      FOR WasX = (ZLinesInMsg + 1) TO (EndOfBuffer)
  1663.         ZOutTxt$(WasX) = ""
  1664.      NEXT
  1665.      ZOutTxt$ = "Deleted" + STR$(ZBlockSize) + " line(s)"
  1666.      GOSUB 12979
  1667. 2555 Mark1 = 0
  1668.      Mark2 = 0
  1669.      GOTO 2300
  1670. '
  1671. ' ****  EDIT MESSAGE LINE  ***
  1672. '
  1673. 2600 ZOutTxt$ = "Edit"
  1674.      GOSUB 3300
  1675.      IF ZWasQ <> 0 THEN _
  1676.         CALL EditALine (ZTestedIntValue)
  1677.      IF ZSubParm < 0 THEN _
  1678.         GOTO 202
  1679.      GOTO 2300
  1680. 2800 IF ZLinesInMsg >= ZMaxMsgLines AND NOT ZSysop THEN _
  1681.         ZOutTxt$ = "Message full" : _
  1682.         GOSUB 12979 : _
  1683.         GOTO 2300
  1684. 2820 ZOutTxt$ = "Insert Before" : _
  1685.      GOSUB 3300
  1686. 2830 WasLL = ZLinesInMsg
  1687.      WasK = ZLinesInMsg - ZTestedIntValue
  1688.      FOR WasX = ZTestedIntValue TO ZLinesInMsg
  1689.         ZUserIn$(WasX + 1 - ZTestedIntValue) = ZOutTxt$(WasX)
  1690.         ZOutTxt$(WasX) = ""
  1691.      NEXT
  1692.      ZLinesInMsg = ZTestedIntValue
  1693. 2840 ZOutTxt$ = RIGHT$(STR$(ZLinesInMsg),2) + _
  1694.           ": " + ZOutTxt$(ZLinesInMsg)
  1695.      GOSUB 12978
  1696.      CALL LineEdit(ZLinesInMsg,ZRightMargin + 1)
  1697.      IF ZOutTxt$(ZLinesInMsg) = "" THEN _
  1698.         GOTO 2920
  1699. 2870 ZLinesInMsg = ZLinesInMsg + 1
  1700.      WasJ = ZLinesInMsg + WasK - 1
  1701.      GOSUB 2200
  1702.      IF NOT WasX THEN _
  1703.         GOTO 2840
  1704. 2920 FOR WasX = 1 TO WasK + 1
  1705.         ZOutTxt$(ZLinesInMsg + WasX - 1) = ZUserIn$(WasX)
  1706.      NEXT
  1707.      REDIM ZUserIn$(ZMsgDim)
  1708.      ZLinesInMsg = WasLL + ZLinesInMsg - ZTestedIntValue
  1709.      GOTO 2300
  1710. '
  1711. ' *****  LIST MESSAGE CONTENTS   ****
  1712. '
  1713. 3000 GOSUB 3010
  1714.      GOTO 2300
  1715. 3010 ZStopInterrupts = ZFalse
  1716.      CALL SkipLine (1)
  1717.      IF (ZWasQ = 1 OR MsgFwd) AND NOT ZGetExtDesc THEN _
  1718.         WasL = 1 : _
  1719.         ZOutTxt$ = ZFG3$ + "To: " + _
  1720.              MsgTo$ + _
  1721.              ZFG4$ + " Re: " + _
  1722.              Subject$ + ZEmphasizeOff$ : _
  1723.         GOSUB 12979 : _
  1724.         CALL QuickTPut (MID$("    ",1,-4 * (NOT ZRemoteEcho)),0) : _
  1725.         GOSUB 3200
  1726. 3020 IF ZGetExtDesc THEN WasL = 1
  1727.      FOR WasX = WasL TO ZLinesInMsg
  1728.         CALL AskMore ("",ZTrue,ZTrue,WasXX,ZFalse)
  1729.         IF ZNo OR ZRet THEN _
  1730.            WasX = ZLinesInMsg + 1 _
  1731.         ELSE ZOutTxt$ = RIGHT$(STR$(WasX),2) + _
  1732.                   ": " + _
  1733.                   ZOutTxt$(WasX) : _
  1734.              GOSUB 12979
  1735.      NEXT
  1736.      RETURN
  1737. '
  1738. ' *****  CHANGE MARGIN WIDTH   ****
  1739. '
  1740. 3100 CALL ChangeInt (ZTrue,"Right margin",ZRightMargin,8,72)
  1741.      IF ZWasQ <> 0 THEN _
  1742.         ZRightMargin = ZTestedIntValue
  1743. 3150 IF UtilMarginChange THEN _
  1744.         RETURN
  1745.      GOTO 2300
  1746. 3200 ZOutTxt$ = "[" + _
  1747.           STRING$(ZRightMargin - 2,45) + _
  1748.           "]"
  1749.      IF ZRemoteEcho OR ZLocalUser THEN _
  1750.         ZOutTxt$ = "    " + _
  1751.              ZOutTxt$
  1752.      GOSUB 12975
  1753.      RETURN
  1754. 3300 Temp$ = ZOutTxt$ + " Line #"
  1755.      Temp = MsgLockLines + 1
  1756.      CALL SkipLine (-(ZAnsIndex >= ZLastIndex))
  1757.      CALL ChangeInt (ZFalse,Temp$,0,Temp,ZLinesInMsg)
  1758.      IF ZSubParm = -1 THEN _
  1759.         RETURN 10595
  1760.      IF ZWasQ = 0 THEN _
  1761.         IF Mark1 = 0 THEN _
  1762.            RETURN 2300
  1763.      RETURN
  1764. '
  1765. ' ****  SAVE MESSAGE   ***
  1766. '
  1767. 3400 IF ZGetExtDesc THEN _
  1768.         ZSysopComment = ZFalse : _
  1769.         RETURN
  1770.      IF ZSysopComment THEN _
  1771.         ZSysopComment = ZFalse : _
  1772.         GOTO 1850
  1773. 3405 IF ZSysopMsg THEN _
  1774.         MsgPswd$ = "^READ^" _
  1775.      ELSE Temp$ = MsgPswd$ : _
  1776.           CALL MsgProt (MsgTo$,Found,MsgPswd$) : _
  1777.           IF MsgPswd$ = "" THEN _
  1778.              MsgPswd$ = Temp$ : _
  1779.              GOTO 2300
  1780.      SaveReplyStatus = ZReply
  1781.      ZReply = ZTrue
  1782.      ZSysopMsg = ZFalse
  1783.      ZReply = SaveReplyStatus
  1784.      GOSUB 4910
  1785.      MsgRecSave$ = ZMsgRec$
  1786.      MsgCorrected = ZFalse
  1787.      GOSUB 23100
  1788.      ZWasSL = 0
  1789.      ZWasN$ = ""
  1790.      ZLastIndex = 0
  1791.      HighMsgNumber = HighMsgNumber + 1
  1792. 3410 ActiveMessages = ActiveMessages + 1
  1793.      MsgNum$ = STR$(HighMsgNumber) + _
  1794.                        SPACE$(5 - LEN(STR$(HighMsgNumber)))
  1795.      IF MsgPswd$ = "^READ^" THEN _
  1796.         MID$(MsgNum$,1,1) = "*" : _
  1797.         SecForMsg = ZPrivateReadSec _
  1798.      ELSE SecForMsg = ZPublicReadSec
  1799. 3460 IF NOT MsgFwd THEN _
  1800.         MsgFrom$ = LEFT$(ZActiveUserName$ + SPACE$(31),31) _
  1801.      ELSE _
  1802.         MsgFrom$ = LEFT$(MsgFrom$ + SPACE$(31),31)
  1803.      MsgTo$ = LEFT$(MsgTo$ + SPACE$(31),31)
  1804.      MID$(MsgTo$,23,8) = TIME$
  1805.      MID$(MsgTo$,31,1) = CHR$(ZNumHeaders)
  1806.      Subject$ = LEFT$(OrigSubject$ + SPACE$(25),25)
  1807.      MsgPswd$ = LEFT$(MsgPswd$ + SPACE$(15),15)
  1808.      IF QuotedReply AND _
  1809.         ZLinesInMsg > ZMaxMsgLines THEN _
  1810.            ZLinesInMsg = ZMaxMsgLines
  1811.      FOR WasJ = 1 TO ZLinesInMsg
  1812.         ZOutTxt$(WasJ) = ZOutTxt$(WasJ) + _
  1813.                 CHR$(227)
  1814.         ZWasSL = ZWasSL + LEN(ZOutTxt$(WasJ))
  1815.      NEXT
  1816.      NumRecs = ZWasSL \ 128 + ZNumHeaders - (ZWasSL MOD 128 <> 0)
  1817.      ZWasN$ = STR$(NumRecs)
  1818. 3530 Temp = ZNextMsgRec
  1819.      ZNextMsgRec = Temp + VAL(ZWasN$)
  1820.      LSET ZMsgRec$ = MsgRecSave$
  1821.      GOSUB 24000
  1822.      GET 1,Temp
  1823.      ZMsgPtr(ActiveMessages,1) = Temp
  1824.      ZMsgPtr(ActiveMessages,2) = HighMsgNumber
  1825.      LSET ZMsgRec$ = MsgNum$ + _
  1826.                      MsgFrom$ + _
  1827.                      MsgTo$ + _
  1828.                      ZCurDate$ + _
  1829.                      Subject$ + _
  1830.                      MsgPswd$ + _
  1831.                      ZActiveMessage$ + _
  1832.                      ZWasN$ + _
  1833.                      SPACE$(4 - LEN(ZWasN$)) + _
  1834.                      MKI$(SecForMsg)
  1835. ' ---[ write out list of people msg is to ]---
  1836.      UserFileIndexSave = ZUserFileIndex
  1837.      UserRecordHold$ = ZUserRecord$
  1838.      CALL OpenWork (2,ZNodeWorkFile$)
  1839.      WHILE NOT EOF(2)
  1840.         CALL ReadParms (ZWorkAra$(),2,1)
  1841.         MID$(ZMsgRec$,37,22) = LEFT$(ZWorkAra$(1)+ SPACE$(22),22)
  1842.         RcvrRecNum = VAL(ZWorkAra$(2))
  1843.         PUT 1,Temp
  1844.         Temp = Temp + 1
  1845.         NumRecs = NumRecs - 1
  1846. ' ---[ notify receiver that has new mail waiting ]---
  1847.         CALL SetUserFlag (RcvrRecNum, 512, "mail")
  1848.      WEND
  1849.      ZWasN$ = ""
  1850.      ZOutTxt$ = "Adding new msg #" + _
  1851.           STR$(HighMsgNumber)
  1852.      IF NOT ZLocalUser THEN _
  1853.         CALL UpdtCalr (ZOutTxt$,1)
  1854.      GOSUB 12978
  1855.      NumDots = 0
  1856.      FOR WasJ = 1 TO ZLinesInMsg
  1857.         CALL MarkTime (NumDots)
  1858.         ZWasN$ = ZWasN$ + _
  1859.              ZOutTxt$(WasJ)
  1860.         IF LEN(ZWasN$) > 127 THEN _
  1861.            LSET ZMsgRec$ = ZWasN$ : _
  1862.            PUT 1 : _
  1863.            ZWasN$ = MID$(ZWasN$,129)
  1864. 3630 NEXT
  1865.      IF LEN(ZWasN$) > 0 THEN _
  1866.         LSET ZMsgRec$ = ZWasN$ : _
  1867.         PUT 1
  1868.      REDIM ZOutTxt$(ZMsgDim)
  1869.      IF MsgCorrected THEN _
  1870.         MsgCorrected = ZFalse : _
  1871.         ActionFlag = ZTrue : _
  1872.         CALL SkipLine (1) : _
  1873.         GOSUB 1900
  1874. 3640 CALL SkipLine (1)
  1875.      GET 1,1
  1876.      GOSUB 12985
  1877.      ZUserFileIndex = UserFileIndexSave
  1878.      LSET ZUserRecord$ = UserRecordHold$
  1879. 3650 QuotedReply = ZFalse
  1880.      MsgLockLines = 0
  1881.      IF ZReply OR MsgFwd THEN _
  1882.         ZReply = ZFalse : _
  1883.         ZAnsIndex = SaveAnsIndex : _
  1884.         GOTO 5344
  1885.      IF ZGetExtDesc THEN _
  1886.         ZLinesInMsg = 0
  1887.      RETURN
  1888. '
  1889. ' ****  K - COMMAND FROM MAIN MENU (KILL MESSAGE)  ***
  1890. '
  1891. 3900 ZKillMessage = ZFalse
  1892.      CALL SkipLine (1)
  1893. 3930 ZOutTxt$ = "Msg #(s) to Kill" + LEFT$(", M)arked",-9*(ZMarkedMsgs$ <> "")) + ZPressEnterExpert$
  1894.      GOSUB 12932
  1895.      IF ZWasQ = 0 THEN _
  1896.         RETURN
  1897.      GOSUB 1893
  1898.      ZWasZ$ = ZUserIn$(ZAnsIndex)                                    ' KGK020101
  1899.      CALL UnMarkItems (ZMarkedMsgs$,ZAnsIndex,ZLastIndex,Found,ZTrue)
  1900. 3935 CALL CheckInt (ZUserIn$(ZAnsIndex))
  1901.      IF ZErrCode <> 0 THEN _
  1902.         GOTO 3930
  1903.      MsgToKill = ZTestedIntValue
  1904. 3950 GOSUB 5344
  1905.      CALL KillMsg (MsgToKill,ActiveMessages)
  1906. 4040 IF ZKillMessage THEN _
  1907.         RETURN
  1908.      GOTO 3930
  1909. '
  1910. ' ****  Sysop Available toggle
  1911. '
  1912. 4130  ZSubParm = -8
  1913.       CALL FindFKey
  1914.       ZSubParm = 0
  1915.       RETURN
  1916. '
  1917. ' ****  X)pert Toggle
  1918. '
  1919. 4240 CALL Toggle(9)
  1920.      RETURN
  1921. '
  1922. ' ****  T)opic - QUICK SCAN MESSAGES  ***
  1923. '
  1924. 4320 QuickScanMsgs = ZTrue
  1925.      ReadMsgs = ZFalse
  1926.      ScanMsgs = ZFalse
  1927.      MsgStart = 76
  1928.      MsgEnd = 100
  1929.      SecIndex= 0
  1930.      GOTO 4350
  1931. '
  1932. ' ****  R - COMMAND FROM MAIN MENU (READ MESSAGES)  ****
  1933. '
  1934. 4330 IF LinkNext THEN _
  1935.         LinkNext = ZFalse : _
  1936.         GOSUB 1893 : _
  1937.         GOSUB 5344 : _
  1938.         NumMsgsSelected = 1 : _
  1939.         ZAnsIndex = 1 : _
  1940.         MsgIndex = 1 : _
  1941.         ZLastIndex = 1 : _
  1942.         CanKill = (ZSysop OR ZUserSecLevel >= ZSecKillAny) : _
  1943.         IF LinkForward THEN _
  1944.            CurMsg = ZLastMsgRead + 1 : _
  1945.            GOTO 4450 _
  1946.         ELSE CurMsg = HighMsgNumber : _
  1947.              GOTO 4490
  1948.      QuickScanMsgs = ZFalse
  1949.      ReadMsgs = ZTrue
  1950.      Forward = ZFalse
  1951.      ZGlobalRead = ZFalse
  1952.      HiLiteRec = -1
  1953.      ScanMsgs = ZFalse
  1954.      MsgStart = 6
  1955.      MsgEnd = 100
  1956.      IF ZLocalUserMode OR NOT ZLocalUser THEN _
  1957.         IF ReadMsgIn$ <> ZActiveMessageFile$ THEN _
  1958.            ReadMsgIn$ = ZActiveMessageFile$ : _
  1959.            CALL UpdtCalr ("Read Messages in " + ReadMsgIn$,1)
  1960.      GOSUB 1300
  1961.      GOTO 4350
  1962. '
  1963. ' ****  S - COMMAND FROM MAIN MENU (SCAN MESSAGE HEADERS)  ***
  1964. '
  1965. 4340 IF ZWasQ < 2 THEN _
  1966.         GOSUB 1300
  1967. 4345 QuickScanMsgs = ZFalse
  1968.      ReadMsgs = ZFalse
  1969.      ScanMsgs = ZTrue
  1970.      MsgStart = 6
  1971.      MsgEnd = 100
  1972.      SecIndex = 0
  1973. '
  1974. ' ** MESSAGE READ MAINLINE (QUICK SCAN, READ & SCAN) ALL USE THIS ROUTINE *
  1975. '
  1976. 4350 SearchHeader$ = ""
  1977.      SubInHeader$ = ""
  1978. 4352 SearchString$ = ""
  1979.      DontPrint = ZFalse
  1980.      JustReplied = ZFalse
  1981.      QuotedReply = ZFalse
  1982.      CanKill = (ZSysop OR ZUserSecLevel >= ZSecKillAny)
  1983.      GOSUB 1893
  1984.      GOSUB 5344
  1985.      ZWasZ$ = ""
  1986.      FOR WasI = 2 TO ZWasQ
  1987.         IF INSTR("Ss*",ZUserIn$(WasI)) > 0 THEN _
  1988.            ZUserIn$(WasI) = MID$(STR$(ZLastMsgRead+1),2) + "+"
  1989.         IF INSTR("Ll",ZUserIn$(WasI)) > 0 THEN _
  1990.            ZUserIn$(WasI) = MID$(STR$(HighMsgNumber),2) + "-"
  1991.         IF INSTR("Gg",ZUserIn$(WasI)) > 0 THEN _
  1992.            ZGlobalRead = ZTrue
  1993.      NEXT
  1994. 4360 ZWasLG$(11) = ZWasZ$
  1995.      NumMsgsSelected = ZLastIndex
  1996.      MsgIndex = ZAnsIndex
  1997.      ZLastIndex = 0
  1998.      AddressedToUser = ZFalse
  1999.      ToRequested = ZFalse
  2000.      FromRequested = ZFalse
  2001.      LinkNext = ZFalse
  2002. 4370 MsgIndex = MsgIndex  + 1
  2003. 4371 IF MsgIndex <= NumMsgsSelected THEN _
  2004.         IF LEN(ZUserIn$(MsgIndex)) = 1 AND _
  2005.            INSTR("Cc",ZUserIn$(MsgIndex)) > 0 THEN _
  2006.            GOTO 4370 _
  2007.         ELSE _
  2008.         CALL CheckInt (ZUserIn$(MsgIndex)) : _
  2009.         IF ZErrCode <> 0 THEN _
  2010.            ZWasEL = 4371 : _
  2011.            GOTO 13000 _
  2012.         ELSE CurMsg = ZTestedIntValue : _
  2013.              ZAnsIndex = MsgIndex : _
  2014.              GOTO 4415
  2015. 4380 WasA1$ = "Msg #" + _
  2016.            STR$(LowMsgNumber) + _
  2017.            "-" + _
  2018.            MID$(STR$(ZMsgPtr(ActiveMessages,2)),2) + _
  2019.            " (H)lp,S)ince,L)ast" + _
  2020.            LEFT$(",G)lobal",8*(ZLinkedConf$ ="" OR ZGlobalRead)+8)
  2021.      IF ZGlobalRead THEN _
  2022.         CALL QuickTPut1 ("Reading globally")
  2023.      IF AddressedToUser OR ToRequested OR FromRequested THEN _
  2024.         ZWasY$ = LEFT$("TO",-2*(ToRequested OR AddressedToUser)) + _
  2025.              LEFT$("/",-AddressedToUser) + _
  2026.              LEFT$("FROM",-4*(FromRequested OR AddressedToUser)) : _
  2027.         CALL QuickTPut1 ("Include only msgs "+ZWasY$+" you.  Read what msgs (? for help)") _
  2028.      ELSE WasA1$ = WasA1$ + ",T)o,F)rom,M)" : _
  2029.           IF ReadMsgs AND ZMarkedMsgs$ <> "" THEN _
  2030.              WasA1$ = WasA1$ + "arked" _
  2031.           ELSE WasA1$ = WasA1$ + "ine"
  2032.      IF SearchString$ = "" THEN _
  2033.         WasA1$ = WasA1$ + _
  2034.              ", text" _
  2035.      ELSE CALL QuickTPut1 ("Include only msgs with text " + SearchString$ + ".  Read what msgs (? for help)")
  2036. 4390 ZOutTxt$ = WasA1$ + ", [Q]uit)"
  2037.      ZMacroMin = 99
  2038.      ZTurboKey = 0
  2039. 4400 GOSUB 12932
  2040.      IF ZWasQ = 0 THEN _
  2041.         RETURN
  2042. 4402 IF LEN(ZUserIn$(ZAnsIndex)) = 1 THEN _
  2043.         WasY = INSTR("QqHh?",ZUserIn$(ZAnsIndex)) : _
  2044.         IF WasY > 2 THEN _
  2045.             ZFileName$ = ZHelpPath$ + "MR" + ZHelpExtension$ : _
  2046.             GOSUB 1790 : _
  2047.             GOTO 4390 _
  2048.         ELSE IF WasY > 0 THEN _
  2049.                 RETURN
  2050.      MsgIndex = 0
  2051.      NumMsgsSelected = ZWasQ
  2052.      GOTO 4370
  2053. 4415 Forward = ZFalse
  2054.      Reverse = ZFalse
  2055.      FOR WasI = ZAnsIndex to ZLastIndex
  2056.         IF INSTR("Gg",ZUserIn$(WasI)) > 0 THEN ZGlobalRead = ZTrue
  2057.      NEXT
  2058.      IF LEN(ZUserIn$(ZAnsIndex)) = 1 THEN _
  2059.         IF INSTR("Ss*",ZUserIn$(ZAnsIndex)) > 0 THEN _
  2060.            CurMsg = ZLastMsgRead + 1 : _
  2061.            Forward = ZTrue : _
  2062.            GOTO 4430 _
  2063.         ELSE IF INSTR("Ll",ZUserIn$(ZAnsIndex)) > 0 THEN _
  2064.                 CurMsg = HighMsgNumber : _
  2065.                 Reverse = ZTrue : _
  2066.                 GOTO 4490 _
  2067.         ELSE IF INSTR("Gg",ZUserIn$(ZAnsIndex)) > 0 THEN _
  2068.                 ZGlobalRead = ZTrue : _
  2069.                 GOTO 4370
  2070. 4416 IF INSTR("Mm",ZUserIn$(ZAnsIndex)) = 0 THEN _
  2071.         GOTO 4418
  2072.      IF ReadMsgs THEN _
  2073.         ZWasZ$ = "M" : _
  2074.         CALL UnMarkItems (ZMarkedMsgs$,MsgIndex,NumMsgsSelected,Found,ReadMsgs) : _
  2075.         MsgIndex = MsgIndex + Found _
  2076.      ELSE Found = ZFalse
  2077.      AddressedToUser = NOT Found
  2078.      GOTO 4370
  2079. 4418 ZWasA = INSTR("FfTt",ZUserIn$(ZAnsIndex))
  2080.      IF ZWasA > 0 THEN _
  2081.         ToRequested = (ZWasA > 2) : _
  2082.         FromRequested = (ZWasA < 3) : _
  2083.         GOTO 4370
  2084.      IF CurMsg = 0 THEN _
  2085.         IF SearchHeader$ <> "" THEN _
  2086.            GOTO 4370 _
  2087.         ELSE SearchString$ = ZUserIn$(ZAnsIndex) : _
  2088.              SearchCt = 0 : _
  2089.              CALL AllCaps (SearchString$) : _
  2090.              CALL Remove (SearchString$,CHR$(34) + CHR$(39)) : _
  2091.              SearchHeader$ = SearchString$ : _
  2092.              SubInHeader$ = SearchHeader$ : _
  2093.              GOTO 4370
  2094.      CALL SkipLine (1)
  2095. 4430 IF RIGHT$(ZUserIn$(ZAnsIndex),1) = "+" THEN _
  2096.         Forward = ZTrue
  2097.      IF RIGHT$(ZUserIn$(ZAnsIndex),1) = "-" THEN _
  2098.         Reverse = ZTrue : _
  2099.         GOTO 4490
  2100. 4450 ZMsgDimIndex = 1    ' search FORWARD/EXACT for current msg
  2101. 4452 IF ZMsgDimIndex > ActiveMessages THEN _
  2102.         GOTO 4515
  2103.      IF ReadMsgs AND _
  2104.         ZMsgPtr(ZMsgDimIndex,2) = CurMsg THEN _
  2105.         GOTO 4520
  2106. 4470 IF ((ReadMsgs AND Forward) OR _
  2107.         QuickScanMsgs OR ScanMsgs) AND _
  2108.         ZMsgPtr(ZMsgDimIndex,2) >= CurMsg THEN _
  2109.         GOTO 4520
  2110. 4480 ZMsgDimIndex = ZMsgDimIndex + 1
  2111.      GOTO 4452
  2112. 4490 ZMsgDimIndex = ActiveMessages  ' search REVERSE for current msg
  2113. 4492 IF ZMsgDimIndex < 1 THEN _
  2114.         GOTO 4515
  2115.      IF ZMsgPtr(ZMsgDimIndex,2) <= CurMsg THEN _
  2116.         GOTO 4540
  2117. 4510 ZMsgDimIndex = ZMsgDimIndex - 1
  2118.      GOTO 4492
  2119. 4515 IF Forward THEN _
  2120.         ZOutTxt$ = "No new messages" : _
  2121.         ZLastMsgRead = HighMsgNUmber : _
  2122.         ZMailWaiting = ZFalse _
  2123.      ELSE ZOutTxt$ = "No such msg #" + _
  2124.                STR$(CurMsg)
  2125.      IF SubInHeader$ = "" THEN _
  2126.         GOSUB 12979
  2127.      ZLastIndex = 0
  2128.      GOTO 4637
  2129. 4520 EndingMsgIndex = ZMsgDimIndex   ' read a single message
  2130.      IF ReadMsgs AND NOT Forward THEN _
  2131.         GOTO 4560
  2132. 4530 StartMsgIndex = ZMsgDimIndex
  2133.      EndingMsgIndex = ActiveMessages
  2134.      WasSO = 1
  2135.      GOTO 4550
  2136. 4540 StartMsgIndex = ZMsgDimIndex
  2137.      EndingMsgIndex = 1
  2138.      WasSO = -1
  2139. 4550 WasXXX = EndingMsgIndex + WasSO
  2140.      ZMsgDimIndex = StartMsgIndex
  2141. 4552 IF ZMsgDimIndex = WasXXX THEN _    ' top msg read loop end is 4635
  2142.         CALL Carrier : _
  2143.         GOTO 4637
  2144. 4560   CurHeader = ZMsgPtr(ZMsgDimIndex,1)
  2145.        IF CurHeader < 1 THEN _
  2146.           GOTO 4515
  2147.        CALL CheckKBStop
  2148.        IF ZRet THEN _
  2149.          GOTO 4637
  2150.        GET 1,CurHeader
  2151.        ZPswdFailed = ZFalse
  2152.        UserInHeader = ZFalse
  2153.        ZWasZ$ = MID$(ZMsgRec$,101,15)
  2154.        MsgPswd$ = ZWasZ$
  2155.        CALL Trim(MsgPswd$)
  2156. 4561   GOSUB 4660
  2157.        GOSUB 4655
  2158. 4562   IF NOT CanKill THEN _
  2159.           IF INSTR(ZMsgRec$,"^READ^") > 0 AND NOT UserInHeader THEN _
  2160.              ZPswdFailed = ZTrue : _
  2161.              IF Forward OR Reverse THEN _
  2162.                 GOTO 4635
  2163. 4563   CurMsg = VAL(MID$(ZMsgRec$,2,4))
  2164.        IF ToRequested THEN _
  2165.           IF NOT MsgToCaller THEN _
  2166.              GOTO 4629
  2167.        IF FromRequested THEN _
  2168.           IF NOT MsgFromCaller THEN _
  2169.              GOTO 4629
  2170.        IF AddressedToUser AND NOT UserInHeader THEN _
  2171.           GOTO 4629
  2172.        WasX$ = MID$(ZMsgRec$,121,2)
  2173.        IF WasX$ = "  " THEN _
  2174.           MsgSec = ZMinLogonSec _
  2175.        ELSE MsgSec = CVI(WasX$)
  2176.        IF ZUserSecLevel < MsgSec THEN IF NOT ZSysOp THEN _
  2177.           GOTO 4629
  2178. 4580   IF INSTR(ZMsgRec$,ZWasLG$(11)) = 0 THEN _
  2179.           GOTO 4635
  2180. 4581   IF MID$(ZMsgRec$,116,1) = ZDeletedMsg$ THEN _
  2181.           GOTO 4630
  2182.        JustSearching = ZFalse
  2183.        IF SearchHeader$ <> "" THEN _
  2184.           ZFF = INSTR(ZMsgRec$,SearchHeader$) : _
  2185.           IF ZFF >= MsgStart AND ZFF <= MsgEnd THEN _
  2186.              HiLitePos = ZFF : _
  2187.              SearchCt = 0 : _
  2188.              GOTO 4582 _
  2189.           ELSE IF ReadMsgs AND SearchString$ <> "" THEN _
  2190.                   JustSearching = ZTrue : _
  2191.                   GOTO 4582 _
  2192.                ELSE GOTO 4629
  2193. 4582   WasPG = ZFalse
  2194.        IF MID$(ZWasZ$,1,1) = "!" THEN _
  2195.           IF NOT CanKill THEN _
  2196.              WasPG = ZTrue : _
  2197.              ZPswdSave$ = MID$(ZWasZ$,2) + _
  2198.                               " " : _
  2199.              ZAttemptsAllowed = 0 : _
  2200.              ZSubParm = 1 : _
  2201.              CALL PassWrd
  2202. 4584   IF ZPswdFailed AND _
  2203.           (QuickScanMsgs OR (ScanMsgs AND NOT WasPG)) THEN _
  2204.           GOTO 4635
  2205. 4585   IF ZPswdFailed THEN _
  2206.           IF WasPG THEN _
  2207.              WasSJ$ = "<PASSWORD>" _
  2208.           ELSE WasSJ$ = "<PROTECTED>" _
  2209.        ELSE WasSJ$ = MID$(ZMsgRec$,76,25)
  2210. 4590   IF QuickScanMsgs THEN _
  2211.           ZOutTxt$ = LEFT$(ZMsgRec$,5) + _
  2212.                " " + _
  2213.                LEFT$(WasSJ$,19) + _
  2214.                " " : _
  2215.           CALL CheckColor (ZOutTxt$,SubInHeader$,ZEmphasizeOff$) : _
  2216.           GOSUB 12978 : _
  2217.           SecIndex = SecIndex + 1 : _
  2218.           IF SecIndex = 3 THEN _
  2219.              SecIndex = 0 : _
  2220.              CALL SkipLine (1) : _
  2221.              GOTO 4630  _
  2222.           ELSE GOTO 4630
  2223. 4600   IF ScanMsgs THEN _
  2224.           GOSUB 8020 : _
  2225.           GOTO 4630
  2226.        IF NOT JustSearching THEN _
  2227.           GOSUB 8000 : _
  2228.           IF QuotedReply THEN _
  2229.              QuotedReply = ZFalse : _
  2230.              GOTO 4602
  2231.        IF ZRet THEN _
  2232.           GOTO 4630
  2233.        CanChangeSec = (ZUserSecLevel => ZSecChangeMsg)
  2234.        ShowKill =  - ((ZUserSecLevel >= ZOptSec(9)) AND (UserInHeader OR CanKill))
  2235.        IF ZExpertUser THEN _
  2236.           WasA1$ = ",H" + _
  2237.                 MID$(",R",1,- (ZUserSecLevel >= ZOptSec(5)) * 2) + _
  2238.                 ",T,M,=,+,-" + _
  2239.                 MID$(",F",1,- (UserInHeader OR CanChangeSec) * 2) + _
  2240.                 MID$(",K",1,ShowKill * 2) + _
  2241.                 MID$(",U",1,- (ZUserSecLevel >= ZOptSec(54)) * 2) + _
  2242.                 MID$(",S",1, - CanChangeSec * 2) : _
  2243.           GOTO 4601
  2244.        GOSUB 4617
  2245. 4601   ZTurboKey = -ZTurboKeyUser
  2246. 4602   IF NOT ZPswdFailed THEN _
  2247.           GOTO 4603
  2248.        IF WasPG AND (NOT ZNonStop) THEN _
  2249.           ZAttemptsAllowed = 2 : _
  2250.           ZSubParm = 2 : _
  2251.           CALL PassWrd
  2252.        IF ZPswdFailed THEN _
  2253.           GOTO 4629
  2254.        CALL QuickTPut1 ("   Re:  " + MID$(ZMsgRec$,76,25))
  2255. 4603   GOSUB 9000
  2256.        JustReplied = ZFalse
  2257.        DontPrint = ZFalse
  2258.        IF JustSearching THEN _
  2259.           GOTO 4629
  2260.        IF ZAnsIndex > NumMsgsSelected THEN _
  2261.           GOTO 4650
  2262.        CALL SkipLine (1)
  2263.        GOSUB 41000
  2264.        ZKillMessage = ZFalse
  2265.        ZReply = ZFalse
  2266. 4604   ZTurboKey = -ZTurboKeyUser
  2267.        CALL AskMore (WasA1$,ZTrue,ZFalse,WasXX,ZFalse)
  2268.        IF ZNo THEN _
  2269.           IF WasXX >= 32000 THEN _
  2270.              WasXX = 0 : _
  2271.              ZAnsIndex = ZLastIndex + 1 : _
  2272.              RETURN _
  2273.           ELSE GOTO 4637
  2274.        IF ZNonStop THEN _
  2275.           GOTO 4629
  2276.        CALL AraAllCaps(ZUserIn$(),1)
  2277.        ZReply = (ZReply OR ZUserIn$(1) ="R")
  2278. 4605   ON INSTR(" FUST+-KRH?=M",LEFT$(ZUserIn$(1),1)) GOTO _
  2279.           4620,4606,4607,4608,4609,4610,4610,4611,4621,4612,4614,4615,4652
  2280.        GOTO 4620
  2281. 4606   IF NOT (UserInHeader OR CanChangeSec) THEN _   ' Forward
  2282.          GOTO 4620
  2283.        MsgFwd = ZTrue
  2284.        GOTO 4623
  2285. 4607   IF ZUserSecLevel < ZOptSec(54) THEN _    ' User edit
  2286.           GOTO 4620
  2287.        EditFromRead = 1
  2288.        ZReply=ZTrue
  2289.        CALL PutMsgAttr
  2290.        TempHashValue$ = MsgFrom$
  2291.        CALL Trim (TempHashValue$)
  2292.        IF TempHashValue$ = "SYSOP" THEN _
  2293.           TempHashValue$ = ZSecretName$
  2294.        GOTO 11000
  2295. 4608   IF CanChangeSec THEN _            ' Security to read
  2296.           CALL PutMsgAttr : _
  2297.           GOSUB 4665 : _
  2298.           ZReply = ZFalse : _
  2299.           QuotedReply = ZTrue : _
  2300.           CALL GetMsgAttr : _
  2301.           DontPrint = ZTrue : _
  2302.           ZUserIn$ = "=" : _
  2303.           JustReplied = ZTrue : _
  2304.           GOTO 4560
  2305.        GOTO 4620
  2306. 4609   CALL SetThread (CurMsg, OrigSubject$)     ' Thread
  2307.        IF ZWasQ > 0 THEN _
  2308.           SearchHeader$ = ZUserIn$(2) : _
  2309.           SubInHeader$ = SearchHeader$ : _
  2310.           CALL Trim (SubInHeader$) : _
  2311.           GOTO 4352
  2312.        GOTO 4620
  2313. 4610   ZWasA = INSTR(" +-",ZUserIn$(1))      ' +/- read direction
  2314.        CurMsg = CurMsg + 5 - 2 * ZWasA
  2315.        Forward = (ZWasA = 2)
  2316.        Reverse = (NOT Forward)
  2317.        SearchString$ = ""
  2318.        IF Reverse THEN _
  2319.           GOTO 4490 _
  2320.        ELSE GOTO 4450
  2321. 4611   IF (UserInHeader OR CanKill) THEN _     ' Kill
  2322.          IF ZUserSecLevel >= ZOptSec(9) THEN _
  2323.             CALL PutMsgAttr : _
  2324.             MsgToKill = CurMsg : _
  2325.             Temp = ZWasQ : _
  2326.             GOSUB 3950 : _
  2327.             CALL GetMsgAttr : _
  2328.             GOTO 4629 _
  2329.          ELSE ZViolation$ = "MORE KILL" : _
  2330.               GOSUB 1380 : _
  2331.               GOTO 4629
  2332.        GOTO 4620
  2333. 4612   ZFileName$ = ZHelp$(7)  ' H - help
  2334.        GOSUB 1790
  2335. 4614   GOSUB 4617
  2336.        GOTO 4604
  2337. 4615   CALL SkipLine (1) ' = read again
  2338.        GOTO 4560
  2339. 4617   WasA1$ = ",H)lp" + _
  2340.                 MID$(",R)ply",1, - (ZUserSecLevel >= ZOptSec(5)) * 6) + _
  2341.                 ",T)hrd,M)rk,=,+,-" + _
  2342.                 MID$(",F)wd",1, - (UserInHeader OR CanChangeSec) * 5) + _
  2343.                 MID$(",K)ill",1, ShowKill * 6) + _
  2344.                 MID$(",U)sr",1,- (ZUserSecLevel >= ZOptSec(54)) * 6) + _
  2345.                 MID$(",S)ec",1, - CanChangeSec * 5)
  2346.        RETURN
  2347. 4620   IF NOT ZReply THEN _
  2348.           GOTO 4629
  2349. 4621   IF ZUserSecLevel < ZOptSec(5) THEN _     ' Reply
  2350.           ZViolation$ = "MORE RE" : _
  2351.           GOSUB 1380 : _
  2352.           ZReply = ZFalse : _
  2353.           GOTO 4629
  2354.        IF LEFT$(OrigSubject$,3) <> "(R)" THEN _
  2355.           OrigSubject$ = "(R)" + _
  2356.                      LEFT$(OrigSubject$,22)
  2357. 4622   MsgTo$ = MsgFrom$
  2358.        CALL Trim (MsgTo$)
  2359.        MsgFrom$ = ZActiveUserName$
  2360. 4623   DontPrint = ZFalse
  2361.        CALL PutMsgAttr
  2362.        IF MsgFwd THEN GOTO 4624
  2363.        IF ZNoQuoting THEN GOTO 4627
  2364.        ZOutTxt$ = "Quote " + MsgTo$ + "'s message (Y,[N])"
  2365.        GOSUB 12999
  2366.        IF ZRet OR NOT ZYes THEN _
  2367.           GOTO 4627
  2368. 4624   QuotedReply = ZTrue
  2369.        ZLinesInMsg = ZLinesInMsg - 1
  2370.        IF HiLitedLine > 0 THEN _
  2371.           ZOutTxt$(HiLitedLine) = ZOutTxt$(0) : _
  2372.           HiLitedLine = 0
  2373.        IF MsgFwd THEN _
  2374.           TempRightMargin = ZRightMargin _
  2375.        ELSE _
  2376.           TempRightMargin = ZRightMargin - 2
  2377.        CALL WordWrap (TempRightMargin,ZLinesInMsg,ZOutTxt$())
  2378.        IF ZLinesInMsg > ZMsgDim THEN _
  2379.           ZLinesInMsg = ZMsgDim : _
  2380.           CALL QuickTPut1 ("Original msg truncated to " + _
  2381.                       STR$(ZMsgDim) + " lines for editing!")
  2382.        IF MsgFwd THEN GOTO 4625
  2383.        FOR WasX = 1 TO ZLinesInMsg
  2384.           IF LEFT$(ZOutTxt$(WasX),1) = ">" THEN _
  2385.              ZOutTxt$(WasX) = ">" + ZOutTxt$(WasX) _
  2386.           ELSE ZOutTxt$(WasX) = "> " + ZOutTxt$(WasX)
  2387.        NEXT
  2388. 4625   WasX$ = MsgTo$
  2389.        GOSUB 2001
  2390.        IF (ActiveMessages >= MaxMsgs) OR MsgTo$ = "" THEN _
  2391.           GOTO 4628
  2392.        IF MsgFwd THEN _
  2393.           MsgFwd$ = ZActiveUserName$ : _
  2394.           CALL Trim (MsgFwd$) : _
  2395.           CALL Trim (WasX$) : _
  2396.           MsgFwd$ = "Msg was to " + WasX$ + _
  2397.              ", forwarded by " + MsgFwd$
  2398.        IF (MsgFwd AND CanChangeSec AND NOT MsgFromCaller) THEN _
  2399.           CALL Trim (MsgFrom$) : _
  2400.           ZOutTxt$ = "Message was from " + _
  2401.              MsgFrom$ + _
  2402.              ", change to " + _
  2403.              ZActiveUserName$ + _
  2404.              " (Y,[N])" : _
  2405.           GOSUB 12999 : _
  2406.           IF ZYes THEN _
  2407.              MsgFrom$ = ZActiveUserName$ : _
  2408.              CALL Trim (MsgFrom$) : _
  2409.              GOTO 4626
  2410.        IF MsgFwd AND NOT MsgFromCaller THEN _
  2411.           FOR MsgFwdCount = ZLinesInMsg TO 1 STEP -1 : _
  2412.              ZOutTxt$(MsgFwdCount + 2) = ZOutTxt$(MsgFwdCount) : _
  2413.           NEXT MsgFwdCount : _
  2414.           ZOutTxt$(1) = MsgFwd$ : _
  2415.           ZOutTxt$(2) = "" : _
  2416.           ZLinesInMsg = ZLinesInMsg + 2 : _
  2417.           IF NOT CanChangeSec THEN _
  2418.              MsgLockLines = 1
  2419. 4626   ZWasZ$ = "L"
  2420.        WasL = 1
  2421.        IF ZLinesInMsg >= ZMaxMsgLines THEN _
  2422.           CALL QuickTPut ("Msg cannot exceed" + _
  2423.                       STR$(ZMaxMsgLines) + " lines! ",0)
  2424.        IF NOT MsgFwd THEN _
  2425.           CALL QuickTPut1 ("Please delete unneeded lines, then [C] continues reply")
  2426.        GOSUB 3200
  2427.        GOSUB 3020
  2428.        GOSUB 2300
  2429.        GOTO 4628
  2430. 4627   GOSUB 2000
  2431. 4628   ZReply = ZFalse
  2432.        JustReplied = ZTrue
  2433.        QuotedReply = ZTrue
  2434.        CALL GetMsgAttr
  2435.        DontPrint = ZTrue
  2436.        ZUserIn$ = "="
  2437.        QuotedReply = ZTrue
  2438.        MsgFwd = ZFalse
  2439.        GOTO 4560
  2440. 4629   QuotedReply = ZFalse
  2441.        JustReplied = ZFalse
  2442.        IF NOT Forward AND NOT Reverse THEN _
  2443.           GOTO 4370
  2444. 4630   CALL AskMore (",M)ark, #(s) to read",ZTrue,ZTrue,WasXX,ZFalse)
  2445.        IF ZWasQ = 0 OR ZYes THEN _
  2446.           GOTO 4631
  2447.        IF ZNo THEN _
  2448.           RETURN
  2449.        IF ZSubParm = -1 THEN _
  2450.           RETURN 10595
  2451.        IF ZRet THEN _
  2452.           RETURN
  2453.        ZWasZ$ = ZUserIn$(1)
  2454.        CALL AllCaps (ZWasZ$)
  2455.        IF ZWasZ$ = "M" THEN _
  2456.           ZLastIndex = ZWasQ : _
  2457.           ZAnsIndex = 1 : _
  2458.           CALL AskItems ("M",ZWasZ$,ZTrue,"msg",ZMarkedMsgs$)
  2459.        IF VAL(ZWasZ$) > 0 THEN _
  2460.           FOR WasI = ZWasQ TO 1 STEP -1 : _
  2461.              ZUserIn$(WasI + 1) = ZUserIn$(WasI) : _
  2462.           NEXT : _
  2463.           ZUserIn$(1) = MID$(ZAllOpts$,INSTR(ZOrigCommands$,"R"),1) : _
  2464.           ZLastIndex = ZWasQ + 1 : _
  2465.           ZAnsIndex = 1 : _
  2466.           RETURN 1235
  2467. 4631   CALL CheckCarrier
  2468.        IF ZSubParm THEN _
  2469.           RETURN 10595
  2470.        IF ZRet THEN _
  2471.           RETURN
  2472. 4635 IF WasSO = 0 THEN _      ' end msg read loop top is 4552
  2473.         WasSO = 1
  2474.      IF SearchString$ <> "" THEN _
  2475.         SearchCt = SearchCt + 1 : _
  2476.         IF SearchCt > 99 THEN _
  2477.            SearchCt = 0 : _
  2478.            ZOutTxt$ = "Searched for " + SearchString$ + " thru msg" + _
  2479.                       STR$(CurMsg) + "  Continue ([Y],N)" : _
  2480.            GOSUB 12932 : _
  2481.            IF ZNo THEN _
  2482.               RETURN
  2483.      ZMsgDimIndex = ZMsgDimIndex + WasSO
  2484.      GOTO 4552
  2485. 4637 ZLastIndex = 0
  2486.      CALL SkipLine (1)
  2487.      IF Forward OR Reverse THEN _
  2488.         CALL NextConf (ZGlobalRead) : _
  2489.         IF ZHomeConf$ <> "" THEN _
  2490.            LinkNext = ZTrue : _
  2491.            LinkForward = Forward : _
  2492.            ConfMailJoin = ZTrue : _
  2493.            RETURN 1205
  2494.      IF ReadMsgs THEN _
  2495.         SearchString$ = "" : _
  2496.         SearchHeader$ = "" : _
  2497.         SubInHeader$ = "" : _
  2498.         ToRequested = ZFalse : _
  2499.         FromRequested = ZFalse : _
  2500.         AddressedToUser = ZFalse : _
  2501.         GOTO 4370
  2502. 4650 CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
  2503.      CALL QuickTPut1 ("--End Msgs--")
  2504.      RETURN
  2505. 4652 '****     mark current message         ****
  2506.      ZMarkedMsgs$ = ZMarkedMsgs$ + STR$(CurMsg) + ZCarriageReturn$
  2507.      CALL ReportMarked (ZMarkedMsgs$,"msg")
  2508.      GOTO 4604
  2509. 4655 '****     update last message read     ****
  2510.      IF SearchHeader$ <> "" OR SearchString$ <> "" OR NOT ReadMsgs THEN _
  2511.         RETURN
  2512. 4656 IF ZMsgPtr(ZMsgDimIndex,2) > ZLastMsgRead THEN _
  2513.         ZMailWaiting = ZFalse : _
  2514.         ZLastMsgRead = ZMsgPtr(ZMsgDimIndex,2)
  2515.      RETURN
  2516. 4660 ZNumHeaders = ASC(MID$(ZMsgRec$,67,1))
  2517.      FirstActive = 0
  2518.      IF ZNumHeaders < 1 THEN _
  2519.         ZNumHeaders = 1
  2520.      CurrHeaderRecNum = LOC(1)
  2521.      WasI = 1
  2522. 4661 WasY = (ASC(MID$(ZMsgRec$,116,1)) = 225)
  2523.      IF FirstActive = 0 THEN _
  2524.         IF WasY THEN _
  2525.            FirstActive = LOC(1)
  2526.      GOSUB 4662
  2527.      GET 1
  2528.      CALL ChkIfMsgHeader
  2529.      IF NOT ZOK THEN _
  2530.         ZNumHeaders = WasI
  2531. '    IF MsgToCaller AND ((NOT WasY) OR (ZUserSecLevel < ZSecKillAny)) THEN _
  2532.      IF MsgToCaller AND (WasY OR (ZUserSecLevel < ZSecKillAny)) THEN _
  2533.         CurrHeaderRecNum = LOC(1) - 1 _
  2534.      ELSE WasI = WasI + 1 : _
  2535.           IF WasI <= ZNumHeaders THEN _
  2536.               GOTO 4661 _
  2537.           ELSE IF FirstActive > 0 THEN _
  2538.                   CurrHeaderRecNum = FirstActive
  2539.      GET 1, CurrHeaderRecNum
  2540.      UserInHeader = (MsgFromCaller OR MsgToCaller)
  2541.      RETURN
  2542. 4662 CALL ChkMsgName (MsgFromCaller,MsgToCaller)
  2543.      RETURN
  2544. '
  2545. ' ****  S - CHANGE MESSAGE SECURITY   ***
  2546. '
  2547. 4665 CALL Trim (MsgFrom$)
  2548.      ZOutTxt$ = "Change sender's name from " + _
  2549.         MsgFrom$ + _
  2550.         " to"
  2551.      GOSUB 12995
  2552.      IF ZWasQ = 0 THEN _
  2553.         GOTO 4666
  2554.      IF LEN(ZUserIn$) > 30 THEN _
  2555.         CALL QuickTPut1 ("30 chars max") : _
  2556.         GOTO 4665
  2557.      CALL AllCaps (ZUserIn$)
  2558.      MsgFrom$ = ZUserIn$
  2559. 4666 CALL Trim (MsgTo$)
  2560.      ZOutTxt$ = "Change receiver's name from " + _
  2561.         MsgTo$ + _
  2562.         " to"
  2563.      GOSUB 12995
  2564.      IF ZWasQ = 0 THEN _
  2565.         GOTO 4667
  2566.      IF LEN(ZUserIn$) > 30 THEN _
  2567.         CALL QuickTPut1 ("30 chars max") : _
  2568.         GOTO 4666
  2569.      CALL AllCaps (ZUserIn$)
  2570.      MsgTo$ = ZUserIn$
  2571.      TempMsgTo$ = ZUserIn$
  2572.      CALL SetWhoTo (ZFalse,MsgTo$,MsgFrom$,RcvrRecNum,Found)
  2573.      IF MsgTo$ = "" THEN MsgTo$ = TempMsgTo$
  2574. 4667 CALL Trim (Subject$)
  2575.      ZOutTxt$ = "Change subject from " + _
  2576.         Subject$ + _
  2577.         " to"
  2578.      GOSUB 12995
  2579.      IF ZWasQ = 0 THEN _
  2580.         GOTO 4668
  2581.      IF LEN(ZUserIn$) > 25 THEN _
  2582.         CALL QuickTPut1 ("25 chars max") : _
  2583.         GOTO 4667
  2584.      CALL AllCaps (ZUserIn$)
  2585.      Subject$ = ZUserIn$
  2586. 4668 CALL ChangeInt (ZTrue,"min sec to read",MsgSec,-32000,ZSysopSecLevel)
  2587.      IF ZWasQ <> 0 THEN _
  2588.         MsgSec = ZTestedIntValue
  2589. 4669 ZReply = ZTrue
  2590.      CALL MsgProt (MsgTo$,Found,MsgPswd$)
  2591.      ZReply = ZFalse
  2592. 4670 MsgTo$ = LEFT$(MsgTo$ + SPACE$(22),22)
  2593.      MsgFrom$ = LEFT$(MsgFrom$ + SPACE$(31),31)
  2594.      Subject$ = LEFT$(Subject$ + SPACE$(25),25)
  2595.      MsgPswd$ = LEFT$(MsgPswd$ + SPACE$(15),15)
  2596.      ZSubParm = 3
  2597.      CALL FileLock
  2598.      GET 1,CurHeader
  2599.      MID$(ZMsgRec$,37,22) = MsgTo$
  2600.      MID$(ZMsgRec$,6,31) = MsgFrom$
  2601.      MID$(ZMsgRec$,76,25) = Subject$
  2602.      MID$(ZMsgRec$,121,2) = MKI$(MsgSec)
  2603.      MID$(ZMsgRec$,101,15) = MsgPswd$
  2604.      IF LEFT$(MsgPswd$,6) = "^READ^" THEN _
  2605.         MID$(ZMsgRec$,1,1) = "*" _
  2606.      ELSE _
  2607.         MID$(ZMsgRec$,1,1) = " "
  2608.      PUT 1,CurHeader
  2609.      ZSubParm = 4
  2610.      CALL FileLock
  2611.      CALL QuickTPut1 ("Message header changed")
  2612.      CALL SkipLine (1)
  2613.      RETURN
  2614. '
  2615. ' ****  O - COMMAND FROM MAIN MENU (OPERATOR PAGE)   ***
  2616. '
  2617. 4700 IF NOT ZSysopAvail THEN _
  2618.         ZOutTxt$ = "Sorry, " + _
  2619.              ZSysopFirstName$ + _
  2620.              " is not available now" : _
  2621.         GOSUB 12979 : _
  2622.         GOTO 4755
  2623. 4705 CALL QuickTPut1 ("Chat with SysOp")
  2624.      WasJJ = VAL(MID$(TIME$,1,2))*100 + VAL(MID$(TIME$,4,2))
  2625.      IF (WasJJ > ZStartOfficeHours AND WasJJ < ZEndOfficeHours) OR ZSysopAnnoy THEN _
  2626.         GOTO 4710
  2627. 4708 ZOutTxt$ = "SysOp in from" + _
  2628.           STR$(ZStartOfficeHours) + _
  2629.           " to" + _
  2630.           STR$(ZEndOfficeHours) + ","
  2631.      GOSUB 12979
  2632.      GOTO 4755
  2633. 4710 ZOutTxt$ = "Page " + _
  2634.           ZSysopFirstName$ + _
  2635.           " (Y,[N])"
  2636.      CALL SkipLine (1)
  2637.      GOSUB 12999
  2638.      IF NOT ZYes THEN _
  2639.         RETURN
  2640.      PageCount = 0
  2641.      ZOutTxt$ = "Paging SysOp"
  2642.      GOSUB 12978
  2643.      PageTimeStart! = TIMER
  2644.      TempSnoop = ZSnoop
  2645.      ZSnoop = ZTrue
  2646.      CALL Line25
  2647. 4730 CALL DelayTime (1)
  2648. 4735 PageCount = PageCount + 1
  2649.      IF INKEY$ = ZEscape$ THEN _
  2650.         GOTO 4765
  2651. 4740 IF PageCount MOD 2 THEN _
  2652.         ZOutTxt$ = ZPagingPtrSupport$ + _
  2653.              ZBellRinger$ : _
  2654.         IF LEN(ZPagingPtrSupport$) = 3 THEN _
  2655.            CALL Printit (CHR$(7)) : _
  2656.            IF ZErrCode <> 0 THEN _
  2657.               ZWasEL = 4740 : _
  2658.               GOTO 13000
  2659. 4745 GOSUB 12978
  2660.      CALL CheckTime (PageTimeStart!, PageTimeNow!, 2)
  2661.      IF PageTimeNow! < 30 THEN GOTO 4730
  2662.      ZSnoop = TempSnoop
  2663. 4747 GOSUB 12979
  2664. 4750 CALL QuickTPut1 (ZSysopFirstName$ + " not responding")
  2665. 4755 CALL QuickTPut1 ("Leave a msg or comment")
  2666.      ZPageStatus$ = "PG!"
  2667.      CALL UpdtCalr ("Operator paged " + LEFT$(TIME$,5),2)
  2668.      RETURN
  2669. 4765 CALL UpdtCalr ("Paged & chatted with Sysop",1)
  2670.      CALL QuickTPut1 ("SysOp in!  " + _
  2671.           ZFirstName$ + ", this is " + _
  2672.           ZSysopFullName$ + " go ahead!")
  2673.      ZPageStatus$ = ""
  2674. 4770 CALL SysopChat
  2675.      IF ZSubParm < 0 THEN _
  2676.         GOTO 202
  2677.      RETURN
  2678. '
  2679. ' ****  S - COMMAND FROM UTILITY MENU (STATISTICS)  ***
  2680. '
  2681. 4850 GOSUB 1893
  2682.      CALL QuickTPut1 ("RBBS-PC " + ZVersionID$ + " Node " + ZNodeID$)
  2683.      ZOutTxt$ = ""
  2684.      IF NOT ZConfMode THEN _
  2685.         ZOutTxt$ = "Caller # " + _
  2686.              STR$(CallsToDate!) + _
  2687.              "  "
  2688. 4855 ZOutTxt$ = ZOutTxt$ + _
  2689.           "# active msgs:" + _
  2690.           STR$(ActiveMessages)
  2691.      ZOutTxt$ = ZOutTxt$ + _
  2692.           "  Next msg #" + _
  2693.           STR$(HighMsgNumber + 1)
  2694.      IF ZLastMsgRead > 0 THEN _
  2695.         ZOutTxt$ = ZOutTxt$ + _
  2696.              "  Last msg read:" + _
  2697.              STR$(ZLastMsgRead)
  2698. 4857 GOSUB 12976
  2699.      IF (NOT ZSysop) AND (ZUserSecLevel < ZSecKillAny) THEN _
  2700.         RETURN
  2701.      UserWork = (ZHighestUserRecord * .95) + 1
  2702.      IF ZMsgsCanGrow THEN _
  2703.         ZWasY$ = " open" _
  2704.      ELSE ZWasY$ = STR$(HighestMsgRecord + 1 - ZMaxNodes - ZNextMsgRec)
  2705.      ZOutTxt$ = "USERS: used" + _
  2706.           STR$(CurUserCount - 1) + _
  2707.           " avl" + _
  2708.           STR$(UserWork - CurUserCount) + _
  2709.           "  MSGS: used" + _
  2710.           STR$(ActiveMessages) + _
  2711.           " avl" + _
  2712.           STR$(MaxMsgs - ActiveMessages) + _
  2713.           "  MSG REC: used" + _
  2714.           STR$(ZNextMsgRec - 1) + _
  2715.           " avl" + ZWasY$
  2716.      GOSUB 12976
  2717.      ZWasZ$ = ZUpldDriveFile$
  2718.      CALL FindFree
  2719.      CALL QuickTPut1 ("Upload disk has" + ZFreeSpace$)
  2720.      RETURN
  2721. 4900 CALL UpdtCalr ("Entered " + ZConfName$,3)
  2722.      CALL QuickTPut1 ("Welcome to " + ZConfName$)
  2723. 4905 IF NOT TurboLogon THEN _
  2724.         GOSUB 1790
  2725. 4910 GOSUB 12986
  2726.      GOSUB 5344
  2727.      IF LOF(1) = 0 THEN _
  2728.         ZWasDF$ = ZActiveMessageFile$ : _
  2729.         CLOSE 1 : _
  2730.         KILL ZActiveMessageFile$ : _
  2731.         GOSUB 12987 : _
  2732.         RETURN 13600
  2733.      GOSUB 23000
  2734.      RETURN
  2735. '
  2736. ' P - COMMAND FROM UTILITY MENU (CITY/STATE / PASSWORD CHANGE)  ***
  2737. '
  2738. 5110 GOSUB 11185
  2739.      ZMacroMin = 99
  2740.      ZParseOff = ZTrue
  2741.      GOSUB 12960
  2742.      CALL NewPassword ("Enter new password" + ZPressEnter$,ZTrue)
  2743.      IF ZSubParm < 0 THEN _
  2744.         GOTO 202
  2745.      IF ZWasQ = 0 THEN _
  2746.         RETURN
  2747. 5120 ZOutTxt$ = "Re-enter new password"
  2748.      GOSUB 45010
  2749.      IF ZWasQ = 0 THEN _
  2750.         RETURN
  2751.      CALL AllCaps (ZUserIn$)
  2752.      IF ZWasZ$ <> ZUserIn$ THEN _
  2753.         ZOutTxt$ = "Passwords don't match!" : _
  2754.         GOSUB 12979 : _
  2755.         RETURN
  2756. 5125 IF ZMaxPswdChanges AND _
  2757.         ChangeThisSession > ZMaxPswdChanges AND _
  2758.         NOT ZSysop THEN _
  2759.             ZOutTxt$ = "No changes permitted" : _
  2760.             GOSUB 12975 : _
  2761.             RETURN _
  2762.      ELSE CALL SrchPasswrds (Found) : _
  2763.           IF NOT Found THEN _
  2764.              GOTO 5129 _
  2765.           ELSE ZOutTxt$ = "Temporary change" : _
  2766.                GOSUB 12975 : _
  2767.                ZPswd$ = ZTempPassword$ : _
  2768.                ZSecsPerSession! = ZTempTimeAllowed * 60 : _
  2769.                ZUserSecLevel = ZTempSecLevel : _
  2770.                GOSUB 41070 : _
  2771.                ZSysop = (ZUserSecLevel >= ZSysopSecLevel) : _
  2772.                CALL SetPrompt : _
  2773.                CALL XferType (2,ZTrue)
  2774.      IF ZActiveUserName$ = "SYSOP" THEN _
  2775.         ZUserIn$(1) = "********"
  2776. 5126 CALL UpdtCalr ("Used temp password " + ZUserIn$,2)
  2777.      RETURN
  2778. 5129 IF ZOrigUserFile$ <> ZActiveUserFile$ THEN _
  2779.         CALL QuickTPut1 ("Please Quit Conference to change personal info") : _
  2780.         RETURN
  2781.      GOSUB 12989
  2782.      CALL OpenUser (ZHighestUserRecord)
  2783.      GOSUB 9450
  2784. 5130 IF ZUserFileIndex < 1 OR _
  2785.         ZUserFileIndex > 32767 THEN _
  2786.         GOTO 5160
  2787.      GET 5,ZUserFileIndex
  2788.      CALL AllCaps (ZUserIn$)
  2789.      LSET ZPswd$ = ZUserIn$
  2790.      GOSUB 9440
  2791.      GOSUB 12991
  2792.      ZOutTxt$ = "Password changed"
  2793.      ZStopInterrupts = ZTrue
  2794.      GOSUB 12975
  2795.      IF ZMaxPswdChanges THEN _
  2796.         ChangeThisSession = ChangeThisSession + 1
  2797. 5131 CALL UpdtCalr ("New Password " + ZUserIn$(1),2)
  2798.      RETURN
  2799. '
  2800. ' ****  SEARCH "PASSWORDS" FILE FOR TEMPORARY PASSWORDS  ***
  2801. '
  2802. 5135 CALL SetPrivileges
  2803. 5160 ZErrCode = 0
  2804.      RETURN
  2805. 5200 CALL ChangeInt (ZTrue,"Page Length",ZPageLength,0,255)
  2806.      IF ZWasQ <> 0 THEN _
  2807.         ZPageLength = ZTestedIntValue
  2808.      RETURN
  2809. 5280 CALL BreakFileName (ZActiveMsgFile$,UserDrvPath$,ZWasDF$,ZWasY$,ZTrue)
  2810.      WasX$ = UserDrvPath$ + _
  2811.              ZConfName$ + _
  2812.              "U.DEF"
  2813.      CALL FindIt (WasX$)
  2814.      IF NOT ZOK THEN _
  2815.         CALL BreakFileName (ZActiveUserFile$,UserDrvPath$,ZWasDF$,ZWasY$,ZTrue) : _ KG040502
  2816.         WasX$ = UserDrvPath$ + _
  2817.                 ZConfName$ + _
  2818.                 "U.DEF"
  2819.      RETURN
  2820. 5290 CALL NextConf (ZTrue)
  2821.      IF ZHomeConf$ <> "" THEN _
  2822.         ConfMailJoin = ZTrue : _
  2823.         RETURN 1205
  2824.      IF ZLinkedConf$ = "" THEN _
  2825.         CALL QuickTPut1("No conferences linked")
  2826.      GOTO 5301
  2827. 5292 LinkNew = ZTrue
  2828. 5293 GOSUB 5800
  2829.      GOTO 5290
  2830. 5294 LinkPers = ZTrue
  2831.      GOTO 5293
  2832. 5296 IF ZSubBoard THEN _
  2833.         GOSUB 462
  2834.      RETURN
  2835. '
  2836. ' ****  J - COMMAND FROM MAIN MENU (JOIN CONFERENCE)  ***
  2837. '
  2838. 5300 WasA1$ = ZConfMenu$
  2839.      CALL BreakFileName (ZActiveMessageFile$,MsgDrvPath$,WasX$,ZWasY$,ZTrue)
  2840.      CALL Talk (12,ZOutTxt$)
  2841. 5301 ZStackC = ZTrue
  2842.      CALL SubMenu ("Join what, L)ist M)ain N)ext, all/mail S)ince P)ers, or name ([Q]uit)",_
  2843.          WasA1$,MsgDrvPath$,"M.DEF",",M,MAIN,N,S,P,Q,", _
  2844.          ZTrue,ZFalse,ZFalse,"C.DEF",WasX,ZFalse)
  2845.      IF ZWasQ = 0 THEN _
  2846.         RETURN
  2847.      IF ZSubParm = -1 THEN _
  2848.         RETURN 10595
  2849. 5323 IF ZWasZ$ = "MAIN" THEN _
  2850.         ZWasZ$ = "M"
  2851.      WasX = (ZWasZ$ = "M")
  2852.      IF ZWasZ$ = ConfNameSave$ OR (WasX AND ZConfName$ = "MAIN") THEN _
  2853.         CALL QuickTPut1 ("You are already in " + ZWasZ$) : _
  2854.         RETURN
  2855.      ON INSTR("MNSPQ",ZWasZ$) GOTO 5350,5290,5292,5294,10550
  2856.      IF NOT ZOK THEN _
  2857.         GOTO 5300
  2858.      CLOSE 2
  2859. '
  2860. ' ****  UPDATE PREVIOUS MESSAGE BASE CHECKPOINT RECORD  ***
  2861. '
  2862. 5324 PrevConfName$ = ZConfName$
  2863.      ZConfName$ = ZWasZ$
  2864.      ConfFileName$ = ZConfName$
  2865.      PrevMsg$ = ZActiveMessageFile$
  2866.      ZActiveMessageFile$ = ZFileName$
  2867.      GOSUB 5343
  2868. '
  2869. ' ****  UPDATE PREVIOUS USER RECORD  ***
  2870. '
  2871. 5325 GOSUB 5380
  2872. '
  2873. ' *****  CHECK WHETHER HAVE SUBBOARD (I.E. CONFIG.DEF EXISTS)  ****
  2874. '
  2875. 5327 UserRecordHold$ = ZUserRecord$
  2876.      ConfModeSave = ZConfMode
  2877.      ZConfMode = ZTrue
  2878.      PrevUser$ = ZActiveUserFile$
  2879.      PrevIndex = ZUserFileIndex
  2880.      PrevMainUser$ = ZMainUserFile$
  2881.      PrevUSL = ZUserSecLevel
  2882.      PrevDef$ = ZCurDef$
  2883. 5328 WasX$ = ZConfName$ + _
  2884.           "C.DEF"
  2885.      CALL FindIt (WasX$)
  2886.      ZSubBoard = ZOK
  2887.      IF NOT ZSubBoard THEN _
  2888.         CALL BreakFileName (ZMainMsgFile$,MsgDrvPath$,ZWasDF$,ZWasY$,ZTrue) : _
  2889.         WasX$ = MsgDrvPath$ + WasX$ : _
  2890.         CALL FindIt (WasX$) : _
  2891.         ZSubBoard = ZOK
  2892.      IF ZSubBoard THEN _
  2893.         IF LEN(ZConfName$) = 6 THEN _
  2894.            IF LEFT$(ZConfName$,4) = "RBBS" AND RIGHT$(ZConfName$,1) = "P" THEN _
  2895.               ZSubBoard = ZFalse
  2896.      IF NOT ZSubBoard THEN _
  2897.         GOSUB 5280 : _
  2898.         ZFileName$ = ZWelcomeFileDrvPath$ + _
  2899.                      ZConfName$ + _
  2900.                      "W.DEF" _
  2901.         ELSE CALL ReadDef (WasX$) : _
  2902.              IF ZErrCode > 0 THEN _
  2903.                 CALL UpdtCalr ("Error"+STR$(ZErrCode)+" reading config file "+WasX$,2) : _
  2904.                 ZErrCode = 0 : _
  2905.                 ZInConfMenu = ZFalse : _
  2906.                 ZOutTxt$ = "error reading subboard" : _
  2907.                 GOTO 5341 _
  2908.              ELSE WasX$ = ZMainUserFile$ : _
  2909.                   ZFileName$ = "" : _
  2910.                   CALL FindIt (ZMainMsgFile$) : _
  2911.                   IF NOT ZOK THEN _
  2912.                      ZOutTxt$ = "msg file missing for" : _
  2913.                      ZInConfMenu = ZFalse : _
  2914.                      GOTO 5341 _
  2915.                   ELSE ZActiveMessageFile$ = ZMainMsgFile$ : _
  2916.                        GOSUB 5343
  2917.      UpdateDate = ZTrue
  2918.      CALL FindIt (WasX$)
  2919.      IF ZOK THEN _
  2920.         GOTO 5330
  2921. '
  2922. ' *****  NO USER FILE - A PUBLIC CONFERENCE   ****
  2923. '
  2924.      ZMainUserFile$ = PrevMainUser$
  2925.      IF (ZUserSecLevel < AutoAddSec) THEN _
  2926.         GOTO 5340
  2927.      GOTO 5345
  2928.      'WasX$ = ZMainUserFile$
  2929.      'ZSysopPswd1$ = ""
  2930.      'ZSysopPswd2$ = ""
  2931. '
  2932. ' ****  CHECK CONFERENCE USER'S FILE  ***
  2933. '
  2934. 5330 ZActiveUserFile$ = WasX$
  2935.      IF ZMainUserFileIndex < 1 THEN _
  2936.         Found = ZFalse : _
  2937.         ZUserFileIndex = 0 : _
  2938.         GOTO 5335
  2939.      CALL WordInFile (ZConfMenu$,ZConfName$,ZInConfMenu)
  2940.      IF ZActiveUserName$ = "SYSOP" THEN _
  2941.         TempHashValue$ = ZOrigUserName$
  2942.      GOSUB 12598
  2943.      GOSUB 12984
  2944. 5335 IF Found THEN _
  2945.         GOSUB 9500 : _
  2946.         ZMainUserFileIndex = -(ZSubBoard * ZUserFileIndex)_
  2947.                                -((NOT ZSubBoard) * ZMainUserFileIndex) : _
  2948.         Temp = -(ZSubBoard * ZMinLogonSec) _
  2949.                -((NOT ZSubBoard) * AutoAddSec) : _
  2950.         GOSUB 5135 : _
  2951.         GOSUB 5296 : _
  2952.         WasI = (ZUserSecLevel < OrigMainSec) : _
  2953.         WasJ = (ZUserSecLevel < Temp) : _
  2954.         WasK = (WasI AND WasJ) : _
  2955.         IF WasK THEN _
  2956.            ZOutTxt$ = "you have been locked out of" : _
  2957.            GOTO 5341 _
  2958.         ELSE GOSUB 5375 : _
  2959.              GOTO 5345
  2960. '
  2961. ' **** USER NOT FOUND.  AUTO-ADD TO SUBBOARD IF SUFFICIENT SECURITY ***
  2962. '
  2963.      ZNewUser = ZTrue
  2964.      IF ZSubBoard THEN _
  2965.         AutoAddSec = ZMinLogonSec
  2966.      IF (ZOrigSec >= AutoAddSec) AND _
  2967.         (ZUserFileIndex > 0) AND (ZMainUserFileIndex > 0) THEN _
  2968.         LSET ZUserRecord$ = UserRecordHold$ : _
  2969.         CALL QuickTPut1 ("MEMBER privileges granted in " + ZConfName$) : _
  2970.         MID$(ZUserOption$,3,2) = MKI$(0) : _
  2971.         MID$(ZUserOption$,1,2) = MKI$(0) : _
  2972.         ZActiveUserName$ = LEFT$(UserRecordHold$,30) : _
  2973.         CALL Trim (ZActiveUserName$) : _
  2974.         Temp = -(ZSubBoard * ZDefaultSecLevel) _
  2975.                -((NOT ZSubBoard) * ZUserSecSave) : _
  2976.         CALL SetSysOp : _
  2977.         Temp = -(ZWasA * ZSysopSecLevel) - ((NOT ZWasA) * Temp) : _
  2978.         LSET ZSecLevel$ = MKI$(Temp) : _
  2979.         ZUserSecLevel = Temp : _
  2980.         GOSUB 5375 : _
  2981.         ZPageLength = ZPageLengthDef : _
  2982.         GOSUB 12986 : _
  2983.         GOSUB 12630 : _
  2984.         UpdateDate = ZTrue : _
  2985.         Found = ZTrue : _
  2986.         GOTO 5335
  2987.      IF ZOrigSec >= AutoAddSec THEN _
  2988.         CALL QuickTPut1 ("GUEST privileges granted in " + ZConfName$) : _
  2989.         ZActiveUserFile$ = PrevUser$ : _
  2990.         UpdateDate = ZFalse : _
  2991.         ZUserFileIndex = PrevIndex : _
  2992.         GOSUB 5382 : _
  2993.         ZUserFileIndex = 0 : _
  2994.         GOTO 5345
  2995.      ZNewUser = ZFalse
  2996. 5340 IF ZInConfMenu THEN _
  2997.         ZOutTxt$ = "you are not in conference" _
  2998.      ELSE ZOutTxt$ = "no such option"
  2999. 5341 ZOutTxt$ = ZOutTxt$ + " " + ZConfName$
  3000. '
  3001. ' ****  CANNOT JOIN THE REQUESTED CONFERENCE.  THEREFORE, GO BACK  ***
  3002. '
  3003.      GOSUB 1397
  3004.      ZConfName$ = PrevConfName$
  3005.      ConfFileName$ = ZConfName$
  3006.      IF ZSubBoard THEN _
  3007.         CALL ReadDef (PrevDef$)
  3008.      ZActiveMessageFile$ = PrevMsg$
  3009.      GOSUB 5343
  3010.      ZUserFileIndex = PrevIndex
  3011.      ZActiveUserFile$ = PrevUser$
  3012.      GOSUB 5382
  3013.      ZConfMode = ConfModeSave
  3014.      GOSUB 12987
  3015.      ZAnsIndex = 0
  3016.      ZLastIndex = 0
  3017.      GOTO 5301
  3018. '
  3019. ' ****  RESTORE A MESSAGE BASE   ***
  3020. '
  3021. 5343 GOSUB 5344
  3022.      GOSUB 23000
  3023.      RETURN
  3024. '
  3025. ' *****  OPEN AND SETUP MESSAGE BASE  *****
  3026. '
  3027. 5344 CALL OpenMsg
  3028.      IF ZErrCode = 64 THEN _
  3029.         ZErrCode = 0 : _
  3030.         GOTO 5350
  3031.      FIELD 1, 128 AS ZMsgRec$
  3032.      RETURN
  3033. '
  3034. ' *****  SUCCESSFUL CONFERENCE JOIN  ****
  3035. '
  3036. 5345 ZNewsFileName$ = ZWelcomeFileDrvPath$ + ZConfName$ + ".NWS"
  3037.      CALL DeLink (ZConfName$)
  3038.      ConfNameSave$ = ZConfName$
  3039.      ZConfName$ = ZConfName$ + " " + MID$("ConferenceSubboard",1-10*ZSubBoard,10)
  3040.      IF ZGlobalSysop THEN _
  3041.         ZActiveUserName$ = "SYSOP"
  3042.      ZMarkedMsgs$ = ""
  3043. 5347 GOSUB 4900
  3044. 5348 GOSUB 12987
  3045.      GOSUB 12990
  3046.      BoardCheckDate$ = LEFT$("00-00-00",-ZNewUser*8) + _
  3047.                        LEFT$(ZLastDateTimeOn$,-(NOT ZNewUser)*8)
  3048.      IF ZSubBoard THEN _
  3049.         ZHasDoored = ZFalse : _
  3050.         ZActiveFMSDir$ = "" : _
  3051.         ZTimeLoggedOn$ = TIME$ : _
  3052.         RETURN 108
  3053.      ZNewUser = ZFalse
  3054.      GOSUB 827
  3055.      IF UpdateDate THEN _
  3056.         ZTimeLoggedOn$ = TIME$ : _
  3057.         LSET ZLastDateTimeOn$ = ZCurDate$ + _
  3058.                                   " " + _
  3059.                                   ZTimeLoggedOn$ : _
  3060.         GOSUB 9440 : _
  3061.         GOSUB 12991
  3062.      IF PrevUSL <> ZUserSecLevel THEN _
  3063.         CALL SetPrompt
  3064.      GOSUB 1241
  3065.      RETURN 852
  3066. '
  3067. ' ****  JOIN M)AIN   ***
  3068. '
  3069. 5350 IF ZConfName$ <> "MAIN" THEN _
  3070.         CALL QuickTPut1 ("Rejoining " + OrigMsgName$)
  3071.      CALL DeLink (ZConfName$)
  3072.      ConfFileName$ = OrigMsgName$
  3073.      ZNewsFileName$ = OrigNewsFileName$
  3074.      TurboLogon = ZTrue
  3075.      ZMarkedMsgs$ = ""
  3076.      ZWasQ = 0
  3077.      ZNewUser = ZFalse
  3078.      ZInConfMenu = ZTrue
  3079.      IF ZActiveUserName$ = "SYSOP" THEN _
  3080.         ZActiveUserName$ = ZSecretName$ : _
  3081.         CALL Trim (ZActiveUserName$)
  3082.      ZConfigFileName$ = ZOrigCnfg$
  3083.      CALL ReadDef (ZConfigFileName$)
  3084.      IF ZOrigMsgFile$ <> ZActiveMessageFile$ THEN _
  3085.         ZActiveMessageFile$ = ZOrigMsgFile$ : _
  3086.         GOSUB 5343
  3087.      IF ZOrigUserFile$ <> ZActiveUserFile$ THEN _
  3088.         GOSUB 5380 : _
  3089.         ZActiveUserFile$ = ZOrigUserFile$ : _
  3090.         ZActiveUserName$ = ZOrigUserName$ : _
  3091.         GOSUB 12598 : _
  3092.         GOSUB 12990 : _
  3093.         IF Found THEN _
  3094.            GOSUB 9500 : _
  3095.            ZMainUserFileIndex = ZUserFileIndex : _
  3096.            CALL SetPrompt : _
  3097.            CALL XferType (2,ZTrue) _
  3098.         ELSE ZUserFileIndex = 0 : _
  3099.              ZMainUserFileIndex = 0
  3100.      CALL UpdtCalr ("Exited " + ZConfName$,3)
  3101.      ZConfName$ = "MAIN"
  3102.      ConfNameSave$ = ZConfName$
  3103.      GOSUB 2350
  3104.      ZUplds = ZGlobalUplds
  3105.      ZDnlds = ZGlobalDnlds
  3106.      ZDLToday! = ZGlobalDLToday!
  3107.      ZBytesToday! = ZGlobalBytesToday!
  3108.      ZDLBytes! = ZGlobalDLBytes!
  3109.      ZULBytes! = ZGlobalULBytes!
  3110.      ZBankTime = ZGlobalBankTime
  3111. 5360 ZConfMode = ZFalse
  3112.      BoardCheckDate$ = ZLastDateTimeOn$
  3113.      ZSubBoard = ZTrue
  3114.      GOSUB 12987
  3115.      RETURN 108
  3116. 5375 IF ((ZUserSecLevel < ZAutoUpgradeSec) AND ZSubBoard) OR _
  3117.         ((ZUserSecLevel < OrigUpgradeSec) AND NOT ZSubBoard) THEN _
  3118.            IF ZUserSecLevel <> ZOrigSec THEN _
  3119.               ZUserSecLevel = ZOrigSec : _
  3120.               LSET ZSecLevel$ = MKI$(ZUserSecLevel)
  3121.      RETURN
  3122. '
  3123. ' *****  UPDATE CURRENT USERS RECORD  ****
  3124. '
  3125. 5380 IF ZUserFileIndex < 1 THEN _
  3126.         RETURN
  3127.      IF ZAdjustedSecurity AND NOT ZSysop THEN _
  3128.         LSET ZSecLevel$ = MKI$(ZUserSecLevel) : _
  3129.         ZUserSecSave = ZUserSecLevel
  3130.      CALL UpdateU (ZFalse)
  3131.      RETURN
  3132. '
  3133. ' *****  RESTORE A USER RECORD  ****
  3134. '
  3135. 5382 IF ZUserFileIndex < 1 THEN _
  3136.         ZUserSecLevel = ZDefaultSecLevel : _
  3137.         RETURN
  3138.      CALL OpenUser (ZHighestUserRecord)
  3139.      GET 5,ZUserFileIndex
  3140.      GOSUB 9500
  3141.      RETURN
  3142. '
  3143. ' *****  R - COMMAND FROM UTILITY MENU (REVIEW PROFILE)  ****
  3144. '
  3145. 5400 CALL SkipLine(2)
  3146.      CALL QuickTPut1 ("Your PROFILE")
  3147. 5410 CALL Toggle(-9)
  3148.      GOSUB 43020
  3149.      ZFF = INSTR(ZDefaultXfer$,ZUserXferDefault$)
  3150.      CALL Toggle(-5)
  3151.      GOSUB 42810
  3152.      CALL Toggle(-3)
  3153.      CALL Toggle(-6)
  3154.      CALL Toggle(-7)
  3155.      CALL Toggle(-10)
  3156.      CALL Toggle(-2)
  3157.      CALL Toggle(-4)
  3158.      CALL Toggle(-8)
  3159.      CALL Toggle(-1)
  3160.      IF ZRestrictByDate AND ZDaysInRegPeriod > 0 THEN _
  3161.         IF ZUserSecLevel > ZTempExpiredSec THEN _
  3162.            CALL QuickTPut1 ("Registration expires " + ZExpirationDate$)
  3163.      RETURN
  3164. '
  3165. ' *****  B - COMMAND FROM UTILITY MENU (Bank Time)  ****
  3166. '
  3167. 5500 CALL BankTime
  3168.      RETURN
  3169. 5502 RETURN 10595  'Entry point when have double nested gosub
  3170. '
  3171. ' *****  V - COMMAND FROM MAIN MENU (VIEW CONFERENCES)  ****
  3172. '
  3173. 5800 CALL ConfMail (MailCheckConfirm,LinkNew,LinkPers)
  3174.      ConfMailJoin = (ZHomeConf$ <> "")
  3175.      RETURN
  3176. '
  3177. ' *  FORMAT MESSAGE HEADER INFORMATION FOR DISPLAY
  3178. '
  3179. 8000 IF ZRet THEN _
  3180.         RETURN
  3181. 8020 IF MID$(ZMsgRec$,37,5) = "ALL  " THEN _
  3182.         MsgTo$ = "ALL" : _
  3183.         GOTO 8040
  3184. 8030 MsgTo$ = MID$(ZMsgRec$,37,22)
  3185.      CALL Trim (MsgTo$)
  3186.      IF ZNumHeaders > 1 THEN _
  3187.         MsgTo$ = MsgTo$ + " et al."
  3188. 8040 IF LEN(MsgTo$) < 23 THEN _
  3189.         MsgTo$ = MsgTo$ + _
  3190.                       SPACE$(23 - LEN(MsgTo$))
  3191.      Subject$ = MID$(ZMsgRec$,76,25)
  3192.      CALL Trim (Subject$)
  3193.      CALL AllCaps (Subject$)
  3194.      OrigSubject$ = Subject$
  3195.      IF ZPswdFailed THEN _
  3196.         Subject$ = WasSJ$
  3197. 8050 MsgFrom$ = MID$(ZMsgRec$,6,31)
  3198.      CALL Trim (MsgFrom$)
  3199.      IF LEN(MsgFrom$) < 23 THEN _
  3200.         MsgFrom$ = MsgFrom$ + _
  3201.                         SPACE$(23 - LEN(MsgFrom$))
  3202.      IF ZUserSecLevel >= ZSecChangeMsg THEN _
  3203.         Year$ = "  Security:" + _
  3204.               STR$(MsgSec) _
  3205.         ELSE Year$ = ""
  3206.      IF MID$(ZMsgRec$,101,1) = "!" THEN _
  3207.         MID$(ZMsgRec$,1,1) = "!"
  3208.      ZOutTxt$ = ZFG1$ + "Msg #: " + _
  3209.           LEFT$(ZMsgRec$,5) + _
  3210.           Year$ + SPACE$ (22-LEN(Year$)) + ZConfName$
  3211.      Year$ = ZFG4$ + "   Sent: " + _
  3212.           MID$(ZMsgRec$,68,8) + _
  3213.           " " + _
  3214.           MID$(ZMsgRec$,59,5)
  3215.      IF NOT ZRet THEN _
  3216.         IF ReadMsgs THEN _
  3217.            CALL QuickTPut1 (ZOutTxt$): _
  3218.            WasX$ = MsgFrom$ : _
  3219.            CALL CheckColor (WasX$,SubInHeader$,ZFG2$) : _
  3220.            CALL QuickTPut1 (ZFG2$ + " From:  " + WasX$ + Year$) : _
  3221.            GOSUB 8076 : _
  3222.            WasX$ = MsgTo$ : _
  3223.            CALL CheckColor (WasX$,SubInHeader$,ZFG3$) : _
  3224.            CALL QuickTPut1 (ZFG3$ + "   To:  " + WasX$ + "  " + ZFG2$ + Year$) : _
  3225.            CALL CheckColor (Subject$,SubInHeader$,ZFG4$) : _
  3226.            ZOutTxt$ = ZFG4$ + "   Re:  " + _
  3227.                 Subject$ + ZEmphasizeOff$ _
  3228.         ELSE ZOutTxt$ = ZFG1$ + LEFT$(ZMsgRec$,5) + _
  3229.                   " " + _
  3230.                   MID$(ZMsgRec$,68,5) + _
  3231.                   " " + _
  3232.                   + ZFG2$ + LEFT$(MsgFrom$,18) + _
  3233.                   " -> " + _
  3234.                   + ZFG3$ + LEFT$(MsgTo$,19) + _
  3235.                   " " + _
  3236.                   + ZFG4$ + LEFT$(Subject$,24) + ZEmphasizeOff$ : _
  3237.              CALL CheckColor (ZOutTxt$,SubInHeader$,"") : _
  3238.              GOTO 8080
  3239.      IF QuickScanMsgs OR _
  3240.         ScanMsgs THEN _
  3241.            GOTO 8080 _
  3242.      ELSE GOTO 8077
  3243. 8076 IF MID$(ZMsgRec$,123,6) = STRING$(6,0) OR _
  3244.         MID$(ZMsgRec$,123,6) = SPACE$(6) THEN _
  3245.            Year$ = " Rcvd: -NO-" : _
  3246.            RETURN
  3247.      Year$ = " Rcvd: " + _
  3248.            RIGHT$(STR$(ASC(MID$(ZMsgRec$,123,1))),2) + _
  3249.            "-" + _
  3250.            RIGHT$(STR$(ASC(MID$(ZMsgRec$,124,1))),2) + _
  3251.            "-" + _
  3252.            RIGHT$(STR$(ASC(MID$(ZMsgRec$,125,1))),2) + _
  3253.            " " + _
  3254.            RIGHT$(STR$(ASC(MID$(ZMsgRec$,126,1))),2) + _
  3255.            ":" + _
  3256.            RIGHT$(STR$(ASC(MID$(ZMsgRec$,127,1))),2)
  3257.      FOR WasI = 8 TO 15
  3258.         IF MID$(Year$,WasI,1) = " " THEN _
  3259.            MID$(Year$,WasI,1) = "0"
  3260.      NEXT
  3261.      FOR WasI = 17 TO 21
  3262.         IF MID$(Year$,WasI,1) = " " THEN _
  3263.            MID$(Year$,WasI,1) = "0"
  3264.      NEXT
  3265.      RETURN
  3266. 8077 IF (NOT MsgToCaller) THEN _
  3267.         ZWasA = (MID$(ZMsgRec$,37,5) = "ALL  ") : _
  3268.         IF NOT ZWasA THEN _
  3269.            GOTO 8080
  3270.      IF MsgFromCaller AND NOT ZSysOp THEN _
  3271.         GOTO 8080
  3272.      Year$ = DATE$
  3273.      WasWK$ = TIME$
  3274.      MID$(ZMsgRec$,123,6) = CHR$(VAL(MID$(Year$,1,2))) + _
  3275.                                    CHR$(VAL(MID$(Year$,4,2))) + _
  3276.                                    CHR$(VAL(MID$(Year$,9,2))) + _
  3277.                                    CHR$(VAL(MID$(WasWK$,1,2))) + _
  3278.                                    CHR$(VAL(MID$(WasWK$,4,2))) + _
  3279.                                    CHR$(VAL(MID$(WasWK$,7,2)))
  3280.      GOSUB 12986
  3281.      PUT 1,CurrHeaderRecNum
  3282.      GOSUB 12987
  3283. 8080 GOSUB 12979
  3284.      ZOutTxt$ = ""
  3285.      RETURN
  3286. '
  3287. ' * UNCOMPRESS MESSAGE PRIOR TO DISPLAY
  3288. '
  3289. 9000 IF NOT JustSearching THEN _
  3290.         GOSUB 4656: _
  3291.         CALL SkipLine (1) : _
  3292.         ZLinesInMsg = 1 : _
  3293.         MsgDimXtra = 150 : _
  3294.         REDIM ZOutTxt$(MsgDimXtra) : _
  3295.         Remain$ = "" : _
  3296.         HiLitedLine = 0
  3297.      RecToRead = ZMsgPtr(ZMsgDimIndex,1) + ZNumHeaders - 1
  3298.      FOR WasX = ZNumHeaders + 1 TO VAL(MID$(ZMsgRec$,117,4))
  3299.         WasJ = 1
  3300.         RecToRead = RecToRead + 1
  3301.         GET 1, RecToRead
  3302.         IF JustSearching THEN _
  3303.            ZOutTxt$ = ZMsgRec$ : _
  3304.            CALL AllCaps (ZOutTxt$) : _
  3305.            HiLitePos = INSTR(ZOutTxt$,SearchString$) : _
  3306.            IF HiLitePos > 0 THEN _
  3307.               SearchCt = 0 : _
  3308.               HiLiteRec = LOC(1) : _
  3309.               WasX = 9999 : _
  3310.               GOTO 9090 _
  3311.            ELSE GOTO 9090
  3312. 9050    ZWasB = INSTR(WasJ,ZMsgRec$,CHR$(227))
  3313.         IF ZRet THEN _
  3314.            RETURN
  3315. 9060    ZWasC = ZWasB - WasJ
  3316.         IF ZWasC < 0 THEN _
  3317.            ZWasC = 128
  3318. 9070    ZOutTxt$ = MID$(ZMsgRec$,WasJ,ZWasC)
  3319.         IF HiLiteRec = LOC(1) THEN _
  3320.            IF HiLitePos >= WasJ AND HiLitePos < WasJ+ZWasC THEN _
  3321.               HiLiteRec = -1 : _
  3322.               Bracketed = ZTrue : _
  3323.               ZOutTxt$(0) = ZOutTxt$ : _
  3324.               CALL Bracket (ZOutTxt$,HiLitePos-WasJ+1,HiLitePos+LEN(SearchString$)-WasJ,ZEmphasizeOn$,ZEmphasizeOff$)
  3325.         IF ZWasB = 0 THEN _
  3326.            Remain$ = ZOutTxt$ : _
  3327.            GOTO 9090 _
  3328.         ELSE ZOutTxt$ = Remain$ + ZOutTxt$ : _
  3329.              Remain$ = "" : _
  3330.              WasJ = ZWasB + 1
  3331. 9085    IF LEFT$(ZOutTxt$,1) = ZStartOfHeader$ OR _
  3332.            LEFT$(ZOutTxt$,LEN(ZScreenOutMsg$)) = ZScreenOutMsg$ THEN _
  3333.            GOTO 9050
  3334.         ZOutTxt$(ZLinesInMsg) = ZOutTxt$
  3335.         IF Bracketed THEN _
  3336.            Bracketed = ZFalse : _
  3337.            HiLitedLine = ZLinesInMsg
  3338.         ZLinesInMsg = ZLinesInMsg + 1
  3339.         IF ZLinesInMsg > MsgDimXtra THEN _
  3340.            ZLinesInMsg = ZLinesInMsg - 1 : _
  3341.            CALL SkipLine (1) : _
  3342.            CALL QuickTPut1 ("Message too long.  Truncated to" + STR$(MsgDimXtra) + " lines!") : _
  3343.            ZOutTxt$ = "" : _
  3344.            RETURN
  3345.         IF NOT DontPrint THEN _
  3346.            GOSUB 12979 : _
  3347.            IF ZRet THEN _
  3348.               ZOutTxt$ = "" : _
  3349.               RETURN _
  3350.            ELSE CALL AskMore ("",ZTrue,ZTrue,ZAnsIndex,ZFalse) : _
  3351.                 IF ZNo THEN _
  3352.                    DontPrint = ZTrue
  3353.         GOTO 9050
  3354. 9090 NEXT
  3355.      IF DontPrint = ZTrue THEN _
  3356.         GOTO 5160
  3357.      IF JustSearching AND HiLitePos > 0 THEN _
  3358.         JustSearching = ZFalse : _
  3359.         GET 1,ZMsgPtr(ZMsgDimIndex,1) : _
  3360.         GOSUB 8000 : _
  3361.         GOTO 9000
  3362.      ZOutTxt$ = ""
  3363.      RETURN
  3364. '
  3365. ' *  C - COMMAND FROM UTILITY MENU (CLOCK - TIME ON SYSTEM)
  3366. '
  3367. 9100 CALL RptTime
  3368.      RETURN
  3369. '
  3370. ' * WRITE A RECORD TO THE RBBS-PC "USER" FILE
  3371. '
  3372. 9440 IF ZUserFileIndex > 0 AND ZUserFileIndex < 32768 THEN _
  3373.         PUT 5,ZUserFileIndex
  3374.      RETURN
  3375. '
  3376. ' * DEFINE USER FILE RECORD VARIABLES TO COMPENSATE FOR THE BUG IN QUICKBASIC
  3377. ' * THAT REQUIRES A FIELD STATMENT TO BE EXECUTED WITHIN EACH SEPARATELY
  3378. ' * COMPILED PROGRAM -- EVEN THOUGH A FIELD STATEMENT WAS EXECUTED WHEN THE
  3379. ' * FILE WAS OPENED IN ANOTHER SEPERATELY COMPILED SUBROUTINE
  3380. '
  3381. 9450 IF LOF(5) < 1 THEN _
  3382.         ZWasDF$ = ZActiveUserFile$ : _
  3383.         RETURN 13600
  3384.      FIELD 5,31 AS ZUserName$, _
  3385.              15 AS ZPswd$, _
  3386.               2 AS ZSecLevel$, _
  3387.              14 AS ZUserOption$,  _
  3388.              24 AS ZCityState$, _
  3389.               2 AS MachineType$, _
  3390.               1 AS ZBankTime$,_
  3391.               4 AS ZTodayDl$, _
  3392.               4 AS ZTodayBytes$, _
  3393.               4 AS ZDlBytes$, _
  3394.               4 AS ZULBytes$, _
  3395.              14 AS ZLastDateTimeOn$, _
  3396.               3 AS ZListNewDate$, _
  3397.               2 AS ZUserDnlds$, _
  3398.               2 AS ZUserUplds$, _
  3399.               2 AS ZElapsedTime$
  3400.      FIELD 5,128 AS ZUserRecord$
  3401.      RETURN
  3402. '
  3403. ' * GET USER DEFAULTS
  3404. '
  3405. 9500 GOSUB 9450
  3406.      CALL SetSysOp
  3407.      CALL SetUserPref
  3408.      RETURN
  3409. '
  3410. ' *  B - COMMAND FROM MAIN MENU (READ BULLETINS)
  3411. '
  3412. 9700 ReturnOn$ = ",*,S,N,"
  3413.      WasA1$ = ZBulletinMenu$
  3414. 9701 CALL SubMenu ("Read what bulletin(s), L)ist, S)ince, N)ews ([ENTER] = none)",_
  3415.                    WasA1$, ZBulletinPrefix$,"",ReturnOn$,_
  3416.                    ZFalse,ZFalse,ZFalse,"",WasX,ZTrue)
  3417.      IF ZWasQ = 0 THEN _
  3418.         RETURN
  3419.      CALL CheckCarrier
  3420.      IF ZSubParm = -1 THEN _
  3421.         RETURN 10595
  3422.      IF (ZWasZ$ = "*" OR ZWasZ$ = "S") THEN _
  3423.         ZPrevPrefix$ = "" : _
  3424.         GOTO 9760
  3425.      ZStopInterrupts = ZFalse
  3426.      IF ZWasZ$ = "N" THEN _
  3427.         GOSUB 1242 : _
  3428.         IF WasZ <> 0 THEN _
  3429.            CALL QuickTPut1 ("No NEWS available") : _
  3430.            GOTO 9701 _
  3431.         ELSE GOTO 9703
  3432.      CALL BufFile (ZFileName$,ZAnsIndex)
  3433. 9703 CALL UpdtCalr ("Read bulletin " + ZFileName$,1)
  3434.      GOTO 9701
  3435. '
  3436. ' *  CHECK AND REVIEW NEW BULLETINS SINCE Last LOGON
  3437. '
  3438. 9750 CALL CheckNewBul (BoardCheckDate$,NumNewBullets,NewBullets$)
  3439.      RETURN
  3440. 9760 ' ****  [entry when want review plus chance to read] *********
  3441.      GOSUB 9750
  3442.      IF NumNewBullets > 0 THEN _
  3443.         ZLastIndex = NumNewBullets + 1 : _
  3444.         ZOutTxt$ = "Read ALL new bulletins ([Y],N)" : _
  3445.         GOSUB 12999 : _
  3446.         IF NOT ZNo THEN _
  3447.            FOR Temp = 1 TO NumNewBullets : _
  3448.               ZUserIn$(Temp) = ZOutTxt$(Temp+1) : _
  3449.            NEXT : _
  3450.            ZAnsIndex = 0 : _
  3451.            ZLastIndex = NumNewBullets : _
  3452.            GOTO 9700
  3453.      ZLastIndex = 0
  3454.      IF ZAnsIndex < 1 THEN _
  3455.         RETURN
  3456.      GOTO 9701
  3457. '
  3458. ' *  W - COMMAND FROM MAIN MENU (WHO'S ON THE OTHER NODES)
  3459. '
  3460. 9800 CALL WhosOn (ZMaxNodes)
  3461.      GOSUB 5344
  3462.      RETURN
  3463. '
  3464. ' *  1 - COMMAND FROM SYSOP MENU (DISPLAY COMMENTS)
  3465. '
  3466. 10070 CALL Muzak (7)
  3467.       ZFileName$ = ZCmntsFile$
  3468.       IF NOT ZStopInterrupts THEN _
  3469.          ZOutTxt$ = "* Ctrl-K(^K) / ^X aborts. ^S suspends, ^Q resumes *" : _
  3470.          GOSUB 12976
  3471.       GOSUB 20150
  3472.       RETURN
  3473. '
  3474. ' *  U - COMMAND FROM UTILITY MENU (DISPLAY USERS)
  3475. ' *  2 - COMMAND FROM SYSOP MENU (DISPLAY USERS)
  3476. '
  3477. 10090 CALL Muzak (6)
  3478.       ZOutTxt$ = "List - U)sers, R)ecent callers"
  3479.       ZMacroMin = 2
  3480.       CALL SkipLine (1)
  3481.       GOSUB 12930
  3482.       IF ZWasQ = 0 THEN _
  3483.          RETURN
  3484.       CALL AraAllCaps (ZUserIn$(),ZAnsIndex)
  3485.       ON INSTR("UR",ZUserIn$(ZAnsIndex)) + 1 GOTO 10090,10096,10093
  3486. 10093 CALL DispCall
  3487.       RETURN
  3488. 10096 UserRecordHold$ = ZUserRecord$
  3489.       GOSUB 12700
  3490.       CALL OpenUser (ZHighestUserRecord)
  3491.       GOSUB 9450
  3492.       ZStopInterrupts = ZFalse
  3493.       WasI = 1
  3494.       ZWasZ$ = ZSecretName$
  3495. 10097 IF WasI > ZHighestUserRecord OR ZRet THEN _
  3496.          GOTO 10099
  3497.       GET 5,WasI
  3498.       WasX$ = MID$(ZUserRecord$,ZStartHash,ZLenHash)
  3499.       IF ASC(WasX$)=0 OR LEFT$(WasX$,3)="   " THEN _
  3500.          GOTO 10098
  3501.       IF INSTR(WasX$,ZWasZ$) > 0 OR ZSysopSecLevel <= CVI(MID$(ZUserRecord$,47,2)) THEN _
  3502.          IF NOT ZSysop THEN _
  3503.             GOTO 10098
  3504.       CALL AskMore ("",ZTrue,ZTrue,WasXX,ZFalse)
  3505.       IF ZNo OR ZSubParm = -1 THEN _
  3506.          GOTO 10099
  3507.       ZOutTxt$ = LEFT$(WasX$,36) + ZCityState$ + ZLastDateTimeOn$
  3508.       GOSUB 12979
  3509. 10098 WasI = WasI + 1
  3510.       GOTO 10097
  3511. 10099 ZOutTxt$ = ""
  3512.       LSET ZUserRecord$ = UserRecordHold$
  3513.       ZStopInterrupts = ZTrue
  3514.       RETURN
  3515. '
  3516. ' *  3 - COMMAND FROM SYSOP MENU (RECOVER MESSAGES)
  3517. '
  3518. 10390 MsgRecovered = ZFalse
  3519. 10391 CALL ChangeInt (ZFalse,"Recover Msg #",0,1,9999)
  3520.       IF ZWasQ = 0 THEN _
  3521.          RETURN
  3522.       MsgToRecover = ZTestedIntValue
  3523.       GOSUB 5344
  3524.       ActionFlag = ZFalse
  3525.       CALL RecoverMsg (MsgToRecover,FirstMsgRecord,ActionFlag)
  3526.       MsgRecovered = MsgRecovered OR ActionFlag
  3527.       GOTO 10391
  3528. 10392 IF MsgRecovered THEN _
  3529.          ActionFlag = ZTRUE : _
  3530.          GOTO 1900
  3531.       RETURN
  3532. '
  3533. ' *  4 - COMMAND FROM SYSOP MENU (DELETE COMMENTS)
  3534. '
  3535. 10530 ZOutTxt$ = "Delete comments (Y,[N])"
  3536.       GOSUB 12995
  3537.       IF ZYes THEN _
  3538.          CALL OpenOutW (ZCmntsFile$)
  3539.       CLOSE 2
  3540. 10550 RETURN
  3541. '
  3542. ' *  TIME LIMIT EXCEEDED EXIT
  3543. '
  3544. 10553 CALL UpdtCalr ("Time limit exceeded",1)
  3545.       CALL QuickTPut1 ("You have no time left")
  3546. '
  3547. ' *  Q - COMMAND FROM GLOBAL FUNCTIONS
  3548. '
  3549. 10560 GOSUB 9100
  3550.       IF ZUserSecLevel < ZSecExemptFromEpilog THEN _
  3551.            ZFileName$ = ZEpilog$ : _
  3552.            GOSUB 11520
  3553.       IF ZLocalUserMode OR NOT ZLocalUser THEN _
  3554.          CALL UpdtCalr ("Logged off",1)
  3555.       CALL Muzak (4)
  3556.       GOTO 10595
  3557. 10570 IF MinsRemaining > 1 AND (ZTurboKeyUser OR NOT ZExpertUser) THEN _
  3558.          ZOutTxt$ = "Log off (Y,[N])" : _
  3559.          GOSUB 12930 : _
  3560.          IF NOT ZYes THEN _
  3561.             RETURN
  3562.       GetOut = ZTrue
  3563.       GOTO 10560
  3564. 10590 CALL UpdtCalr ("Sleep Disconnect",1)
  3565.       ZSubBoard = ZFalse
  3566. 10595 CALL GetTime
  3567.       GOSUB 13700
  3568.       ZSubParm = 0
  3569.       CALL Carrier
  3570.       IF ZSubParm = -1 THEN _
  3571.          GOTO 10597
  3572.       IF ZConfName$ = OrigMsgName$ THEN _
  3573.          GetOut = ZTrue
  3574.       IF (ZSubBoard AND (NOT GetOut) AND (NOT ZSleepDisconnect)) THEN _
  3575.          GOSUB 5380 : _
  3576.          ZHomeConf$ = "M" : _
  3577.          CALL QuickTPut1 ("Time limit exceeded in " + ZConfName$) : _
  3578.          ZSubBoard = ZFalse : _
  3579.          GOTO 1205
  3580. 10597 CALL UpdateU (ZTrue)
  3581.       GOTO 13540
  3582. 10620 CALL UpdtCalr(ZWasLG$(ZLogonErrorIndex),2)
  3583.       IF ZExitToDoors THEN _
  3584.          CALL UpdateU (ZTrue)
  3585. 10621 IF ZActiveUserName$ = "" THEN _
  3586.          ZActiveUserName$ = "NAME UNAVAILABLE"
  3587.       ZWasZ$ = ZActiveUserName$ + _
  3588.            " on at " + _
  3589.            ZCurDate$ + _
  3590.            ", " + _
  3591.            ZTime$ + _
  3592.            "** LOGON DENIED **, " + _
  3593.            ZBaudParity$
  3594.       ZWasNG$ = ZWasZ$ + _
  3595.             SPACE$(128 - LEN(ZWasZ$))
  3596. 10698 CALL Muzak (5)
  3597.       IF ZFunctionKey = 22 THEN _
  3598.          GOTO 13545
  3599.       ZOutTxt$ = "Access denied!"
  3600.       GOSUB 12976
  3601.       CALL DelayTime (8 + ZBPS)
  3602.       GOTO 13545
  3603. '
  3604. ' *  M - COMMAND FROM UTILITY MENU (CHANGE MARGINS)
  3605. '
  3606. 10925 UtilMarginChange = ZTrue
  3607.       GOSUB 3100
  3608.       UtilMarginChange = ZFalse
  3609.       RETURN
  3610. '
  3611. ' *  7 - COMMAND FROM SYSOP MENU (EXIT TO DOS)
  3612. '
  3613. 10930 IF (ZRequiredRings = 0 AND NOT ZNoDoorProtect) THEN _
  3614.          CALL QuickTPut1 ("Remote DOS unavailable") : _
  3615.          RETURN
  3616. 10932 IF ZLocalUser AND NOT ZDebug THEN _
  3617.          CALL QuickTPut1 ("Only for remote SysOps") : _
  3618.          RETURN
  3619.       CALL DosExit
  3620.       ZSubParm = -9
  3621.       CALL FindFKey
  3622.       GOTO 202
  3623. '
  3624. ' *  D - COMMAND FROM MAIN MENU (EXIT TO DOORS)
  3625. '
  3626. 10970 IF NOT ZDoorsAvail OR _
  3627.          (ZRequiredRings = 0 AND NOT ZNoDoorProtect) THEN _
  3628.          CALL QuickTPut1 ("No doors available") : _
  3629.          RETURN
  3630.       IF ZTimeLock AND 1 AND NOT ZHasDoored THEN _
  3631.          CALL TimeLock : _
  3632.          IF NOT ZOK THEN _
  3633.             RETURN
  3634. 10974 WasA1$ = ZMenu$(5)
  3635.       CALL Talk (5,ZOutTxt$)
  3636.       ZStackC = ZTrue
  3637.       CALL SubMenu ("Open which door, L)ist" + ZPressEnterExpert$, _
  3638.                     WasA1$,"",".BAT","",_
  3639.                     ZTrue,ZFalse,ZFalse,"",InMenu,ZFalse)
  3640.       IF ZWasQ = 0 THEN _
  3641.          RETURN
  3642.       IF ZSubParm = -1 THEN _
  3643.          RETURN 10595
  3644. 10986 ZWasZ$ = ZFileName$
  3645.       CALL DoorExit (NOT InMenu)
  3646.       GOTO 10974
  3647. '
  3648. ' *  5 - COMMAND FROM SYSOP MENU (USER FILE MAINTENANCE)
  3649. '
  3650. 11000 WasTU = ZUserFileIndex
  3651.       CALL DefaultU
  3652.       UserRecordHold$ = ZUserRecord$
  3653.       RegDateHold$ = ZRegDate$
  3654.       UserSecLevelSave = ZUserSecLevel
  3655. 11001 ZStopInterrupts = ZTrue
  3656.       WasI = 1
  3657.       ScanUsers = ZFalse
  3658.       IF EditFromRead = 1 THEN GOTO 11341
  3659.       ZOutTxt$ = "A)dd, L)st, P)rt, M)od, S)can users"
  3660.       GOSUB 12930
  3661. 11003 IF ZWasQ = 0 THEN _
  3662.       IF EditFromRead > 0 THEN _
  3663.          GOTO 11325 _
  3664.       ELSE _
  3665.          ZUserFileIndex = WasTU : _
  3666.          GOTO 20093
  3667.       WasQQ = 0
  3668.       ZWasZ$ = LEFT$(ZUserIn$(ZAnsIndex),1)
  3669.       CALL AllCaps (ZWasZ$)
  3670.       IF ZWasZ$ = "A" THEN _
  3671.          GOTO 12300 _
  3672.       ELSE IF ZWasZ$ = "M" THEN _
  3673.               ZStopInterrupts = ZTrue _
  3674.            ELSE IF ZWasZ$ = "P" THEN _
  3675.                    WasQQ = ZTrue _
  3676.                 ELSE IF ZWasZ$ = "S" THEN _
  3677.                         ScanUsers = ZTrue : _
  3678.                         ZStopInterrupts = ZTrue _
  3679.                      ELSE IF ZWasZ$ <> "L" THEN _
  3680.                              GOTO 11001
  3681. 11005 CALL OpenUser (ZHighestUserRecord)
  3682.       GOSUB 9450
  3683.       WasZ = 1
  3684.       IF ScanUsers THEN _
  3685.          ZOutTxt$ = "Scan for N)ame, P)wd, C)" + ZUserLocation$ + ", L)evel" + _
  3686.               LEFT$(", H)ash id",-9*(ZStartHash > 1 AND ZLenHash > 0)) : _
  3687.          GOSUB 12930 : _
  3688.          ZOutTxt$ = "" : _
  3689.          ScanFunction$ = LEFT$(ZUserIn$(1),1) : _
  3690.          CALL AllCaps (ScanFunction$) : _
  3691.          ZCR = 0 : _
  3692.          GOSUB 12979 : _
  3693.          GOSUB 12966 : _
  3694.          GOTO 12962
  3695. 11010 FOR WasJ = WasZ TO ZHighestUserRecord
  3696.          GET 5,WasJ
  3697. 11015    CALL DispUserRec (WasQQ)
  3698.          IF NOT ZOK THEN _
  3699.             GOTO 11310
  3700.          IF ZRet <> 0 THEN _
  3701.            GOTO 11330
  3702. 11107   IF NOT ZStopInterrupts THEN _
  3703.            GOTO 11310
  3704. 11110   ZOutTxt$ = "D)el  F)ind  M)enu  N)ewPW  P)rnt  R)eset Grfx  C)" _
  3705.              + ZUserLocation$ + "  Q)uit"                            '  KG021602
  3706.         CALL TopPrompt
  3707.         ZOutTxt$ = "S)ecLvl  U)ser#  X)fer Cnts  T)ime Used  B)ank Acct"
  3708.         IF ZRestrictByDate THEN _
  3709.            ZOutTxt$ = ZOutTxt$ + _
  3710.                 " $)RegDate"
  3711.         GOSUB 12930
  3712.         IF NOT ScanUsers AND ZWasQ = 0 THEN _
  3713.            GOTO 11310
  3714. 11115   ZWasZ$ = LEFT$(ZUserIn$(ZAnsIndex),1)
  3715.         CALL AllCaps (ZWasZ$)
  3716.         WasX = INSTR("DNPQFSMR$UXTBC",ZWasZ$)
  3717.         IF ZWasZ$ = "" AND ScanUsers THEN _
  3718.            GOTO 12965
  3719.         ON WasX GOTO 11130,11160,11220,11320,11340,11390,11330, _
  3720.                      11400,11450,11127,11490,11420,11423,11190
  3721.         GOTO 11110
  3722. 11125   WasZ = VAL(ZUserIn$)
  3723.         IF WasZ < 1 OR WasZ > ZHighestUserRecord THEN _
  3724.            GOTO 11127
  3725.         GOTO 11010
  3726. 11127   ZOutTxt$ = "What record #"
  3727.         GOSUB 12932
  3728.         GOTO 11125
  3729. '
  3730. ' *  D - COMMAND FROM 5- USER MAINTENANCE OPTIONS (DELETE USER)
  3731. '
  3732. 11130   ZOutTxt$ = "Delete user (Y,[N])"
  3733.         GOSUB 12995
  3734.         IF ZYes THEN _
  3735.            LSET ZUserName$ = CHR$(0) + _
  3736.                              "deleted user" : _
  3737.            LSET ZSecLevel$ = MKI$(ZMinLogonSec - 1) : _
  3738.            LSET ZLastDateTimeOn$ = "01-01-80" + _
  3739.                                      " " + _
  3740.                                      ZTimeLoggedOn$
  3741.         GOTO 11290
  3742. '
  3743. ' *  N - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER PASSWORD)
  3744. '
  3745. 11160   GOSUB 12800
  3746.         GOTO 11290
  3747. '
  3748. ' *  P - COMMAND FROM 5- USER MAINTENANCE OPTIONS (PRINT USER FILE)
  3749. '
  3750. 11185   CALL QuickTPut1 (ZUserLocation$ + " now " + ZWasCI$)
  3751.         WasA1$ = "Enter new "
  3752.         RETURN
  3753. 11190 ' *** C - COMMAND FROM 5 - CHANGE CITY/STATE ***
  3754.         CityStateSave$ = ZWasCI$
  3755.         ZWasCI$ = ZCityState$
  3756.         CALL Trim (ZWasCI$)
  3757.         GOSUB 11185
  3758.         GOSUB 12960
  3759.         ZWasCI$ = CityStateSave$
  3760.         GOTO 11290
  3761. 11220   WasQQ = NOT WasQQ
  3762.         GOTO 11015
  3763. 11290   ZUserFileIndex = LOC(5)
  3764.         GOSUB 12989
  3765.         GOSUB 9440
  3766.         GOSUB 12991
  3767.         ZUserFileIndex = 0
  3768.         GOTO 11015
  3769. 11310   IF ScanUsers THEN _
  3770.            GOTO 12965
  3771. 11311 NEXT
  3772. '
  3773. ' *  Q - COMMAND FROM 5- USER MAINTENANCE OPTIONS (QUIT TO MAIN MENU)
  3774. '
  3775. 11320 ZUserFileIndex = WasTU
  3776.       LSET ZUserRecord$ = UserRecordHold$
  3777.       ZRegDate$ = RegDateHold$
  3778.       IF EditFromRead > 0 THEN _
  3779.          GOTO 11325
  3780.       RETURN 1200
  3781. 11325 ZReply = ZFalse
  3782.       JustReplied = ZTrue
  3783.       QuotedReply = ZTrue
  3784.       EditFromRead = 0
  3785.       CALL GetMsgAttr
  3786.       DontPrint = ZTrue
  3787.       ZUserIn$ = "="
  3788.       GOTO 4560
  3789. '
  3790. ' *  M - COMMAND FROM 5- USER MAINTENANCE OPTIONS (MAIN USER MAINT. MENU)
  3791. '
  3792. 11330 CLOSE 2
  3793.       IF EditFromRead > 0 THEN _
  3794.          EditFromRead = 2
  3795.       GOTO 11001
  3796. '
  3797. ' *  F - COMMAND FROM 5- USER MAINTENANCE OPTIONS (FIND USER)
  3798. '
  3799. 11340 ZOutTxt$ = ZPromptHash$ + _
  3800.            " to find"
  3801.       CALL SkipLine (1)
  3802.       ZParseOff = ZTrue
  3803.       GOSUB 12932
  3804.       IF ZWasQ = 0 THEN _
  3805.          GOTO 11340
  3806.       TempHashValue$ = ZUserIn$
  3807. 11341 IF LEN(TempHashValue$) < 3 OR LEN(TempHashValue$) > ZLenHash THEN _
  3808.          GOTO 11340
  3809.       CALL AllCaps (TempHashValue$)
  3810.       IF ZStartIndiv < 1 THEN _
  3811.          GOTO 11345
  3812. 11342 ZOutTxt$ = ZPromptIndiv$ + _
  3813.            " to find"
  3814.       GOSUB 12995
  3815.       IF ZWasQ = 0 THEN _
  3816.          GOTO 11342
  3817.       TempIndivValue$ = ZUserIn$
  3818.       IF LEN(TempIndivValue$) > ZLenIndiv THEN _
  3819.          GOTO 11342
  3820.       CALL AllCaps (TempIndivValue$)
  3821. 11345 GOSUB 12600
  3822.       GOSUB 12990
  3823.       GOSUB 12987
  3824.       ZUserFileIndex = 0
  3825.       IF Found THEN _
  3826.          GOTO 11015
  3827. 11380 ZOutTxt$ = TempHashValue$ + _
  3828.            " " + _
  3829.            TempIndivValue$ + _
  3830.            " not found"
  3831.       GOSUB 12977
  3832.       GOTO 11310
  3833. '
  3834. ' *  S - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER SECURITY)
  3835. '
  3836. 11390 GOSUB 11395
  3837.       IF ZWasQ > 0 THEN _
  3838.          LSET ZSecLevel$ = MKI$(WasOF)
  3839.       GOTO 11290
  3840. 11395 ZOutTxt$ = "New sec level" + ZPressEnter$
  3841.       GOSUB 12932
  3842.       ZWasZ$ = ZUserIn$(ZAnsIndex)
  3843.       WasOF = VAL(ZWasZ$)
  3844.       IF WasOF > ZUserSecLevel THEN _
  3845.          WasOF = ZUserSecLevel
  3846.       RETURN
  3847. '
  3848. ' *  R - COMMAND FROM 5- USER MAINTENANCE OPTIONS (RESET USER GRAPHICS)
  3849. '
  3850. 11400 ZWasA = CVI(MID$(ZUserOption$,9,2))
  3851.       ZWasA = ZWasA AND &HFAFF                ' TURN HIGHLIGHTING OFF
  3852.       LSET ZUserOption$ = LEFT$(ZUserOption$,5) + _
  3853.                            "0" + _
  3854.                            MID$(ZUserOption$,7,2) + _
  3855.                            MKI$(ZWasA) + _
  3856.                            MID$(ZUserOption$,11)
  3857.       GOTO 11290
  3858. 11420        ' * T - COMMAND FROM 5 - TIME USED
  3859.       Temp = CVI (ZElapsedTime$)
  3860.       CALL ChangeInt (ZTrue,"Time Used",Temp,-21900,2000)
  3861.       IF ZWasQ <> 0 THEN _
  3862.          LSET ZElapsedTime$ = MKI$(ZTestedIntValue)
  3863.       GOTO 11290
  3864. 11423        ' * B - COMMAND FROM 5 - BANKED TIME
  3865.       Temp = ASC(ZBankTime$)
  3866.       CALL ChangeInt (ZTrue,"Banked Time",Temp,0,255)
  3867.       IF ZWasQ <> 0 THEN _
  3868.          LSET ZBankTime$ = CHR$(ZTestedIntValue)
  3869.       GOTO 11290
  3870. '
  3871. ' *  $ - COMMAND FROM 5 - USER MAINTENANCE (CHANGE REGISTRATION DATE)
  3872. '
  3873. 11450 ZOutTxt$ = "Enter new registration date (MM-DD-YY)"
  3874.       GOSUB 12932
  3875.       IF ZWasQ = 0 THEN _
  3876.          GOTO 11015
  3877. 11455 WorkDate$ = ZUserIn$(ZAnsIndex)
  3878.       IF LEN(WorkDate$) < 8 THEN _
  3879.          GOTO 11450
  3880.       CALL ResetRegDate (WorkDate$)
  3881.       IF NOT ZOK THEN _
  3882.          GOTO 11450
  3883.       LSET ZUserOption$ = LEFT$(ZUserOption$,10) + _
  3884.                            ZRegDate$ + _
  3885.                            MID$(ZUserOption$,13)
  3886.       CALL SetRegDisplay
  3887.       ZRegDate$ = RegDateHold$
  3888.       GOTO 11290
  3889. '
  3890. ' *  X - COMMAND FROM 5 - USER MAINTENANCE (CHANGE XFER COUNTERS)             *
  3891. '
  3892. 11490 CALL CmndSysOpXfer
  3893.       GOTO 11290
  3894. '
  3895. ' *  ALLOW USERS TO ANSWER A "QUESTIONNAIRE" BASED ON THE RBBS-PC SCRIPT
  3896. '
  3897. 11520 CALL AskUsers
  3898.       IF NOT ZOK THEN _
  3899.          RETURN
  3900.       IF ZAdjustedSecurity THEN _
  3901.          GOSUB 12989 : _
  3902.          LSET ZSecLevel$ = MKI$(ZUserSecLevel) : _
  3903.          GOSUB 9440 : _
  3904.          GOSUB 12991 : _
  3905.          CALL SetPrompt : _
  3906.          CALL XferType (2,ZTrue) : _
  3907.          GOSUB 5135
  3908.       REDIM ZOutTxt$(ZMsgDim)
  3909.       IF ZSubParm = -1 THEN _
  3910.          RETURN 10595
  3911.       ZOK = ZTrue
  3912.       RETURN
  3913. '
  3914. ' *  A - COMMAND FROM 5- USER MAINTENANCE OPTIONS (ADD USER)
  3915. '
  3916. 12300 WasA1$ = ""
  3917.       Attempts = 0
  3918.       FirstNameSave$ = ZFirstName$
  3919.       LastNameSave$ = ZLastName$
  3920.       ActiveUserNameSave$ = ZActiveUserName$
  3921.       CityStateSave$ = ZWasCI$
  3922.       HashValueSave$ = HashValue$
  3923.       IndivValueSave$ = ZIndivValue$
  3924.       GOSUB 12500
  3925.       GOSUB 12840
  3926.       GOSUB 12850
  3927.       GOSUB 12598
  3928.       IF ZUserFileIndex = 0 THEN _
  3929.          GOSUB 12984 : _
  3930.          GOTO 12330
  3931.       IF Found THEN _
  3932.          WasD$ = "User already exists" : _
  3933.          GOSUB 1315 : _
  3934.          GOSUB 12984 : _
  3935.          GOTO 12330
  3936. 12310 GOSUB 12630
  3937.       GOSUB 12800
  3938. 12311 GOSUB 11395
  3939.       IF ZWasQ = 0 THEN GOTO 12311
  3940.       ZTempSecLevel = WasOF
  3941.       CALL SetNewUserDef
  3942.       LSET ZLastDateTimeOn$ = ZCurDate$ + _
  3943.                                 " " + _
  3944.                                 ZTimeLoggedOn$
  3945.       GOSUB 12960
  3946.       CALL AllCaps (ZUserIn$)
  3947.       LSET ZCityState$ = ZUserIn$
  3948.       LSET ZElapsedTime$ = MKI$(0)
  3949.       IF ZStartHash > 1 THEN _
  3950.          MID$(ZUserRecord$,ZStartHash,ZLenHash) = HashValue$
  3951.       IF ZStartIndiv > 1 THEN _
  3952.          MID$(ZUserRecord$,ZStartIndiv,ZLenIndiv) = ZIndivValue$
  3953.       GOSUB 9440
  3954. 12320 GOSUB 12991
  3955. 12330 ZUserSecLevel = UserSecLevelSave
  3956.       ZFirstName$ = FirstNameSave$
  3957.       ZLastName$ = LastNameSave$
  3958.       ZActiveUserName$ = ActiveUserNameSave$
  3959.       ZWasCI$ = CityStateSave$
  3960.       HashValue$ = HashValueSave$
  3961.       ZIndivValue$ = IndivValueSave$
  3962.       ZUserFileIndex = WasTU
  3963.       LSET ZUserRecord$ = UserRecordHold$
  3964.       GOTO 11001
  3965. '
  3966. ' *  GET USER First AND Last NAMES
  3967. '
  3968. 12500 IF Attempts > 5 THEN _
  3969.          ZFF = ZTrue : _
  3970.          RETURN
  3971. 12510 GOSUB 12700
  3972.       Attempts = Attempts + 1
  3973.       ZOutTxt$ = WasA1$ + _
  3974.            ZFirstNamePrompt$
  3975.       CALL SkipLine (1)
  3976.       ZLogonActive = ZTrue
  3977.       GOSUB 12555
  3978.       ZLogonActive = ZFalse
  3979.       CALL Trim (ZWasZ$)
  3980.       ZFirstName$ = ZWasZ$
  3981. 12530 ZOutTxt$ = WasA1$ + _
  3982.            ZLastNamePrompt$
  3983.       ZParseOff = ZTrue
  3984.       GOSUB 12555
  3985. 12540 CALL Trim (ZWasZ$)
  3986.       ZLastName$ = ZWasZ$
  3987.       IF LEN(ZLastName$) < 2 THEN _
  3988.          IF LEN(ZFirstName$) > 2 THEN _
  3989.             GOTO 12500
  3990.       IF (LEN(ZFirstName$) + LEN(ZLastName$)) > 30 THEN _
  3991.          GOTO 12500
  3992.       IF UserSecLevelSave < ZSysopSecLevel THEN _
  3993.          IF (LEN(ZFirstName$) < 2 OR LEN(ZLastName$) < 2) THEN _
  3994.             GOTO 12500 _
  3995.          ELSE IF LEFT$(ZFirstName$,1)=" " OR LEFT$(ZLastName$,1)=" " THEN _
  3996.                  GOTO 12500
  3997. 12550 ZActiveUserName$ = MID$(ZFirstName$ + " " + ZLastName$,1,31)
  3998.       IF HashIndiv > 1 THEN _
  3999.          IF ZWasQ < 3 THEN _
  4000.             GOSUB 12558 : _
  4001.             IF ZNo THEN _
  4002.                GOTO 12500
  4003.       ZWasZ$ = ZFirstName$
  4004.       RETURN
  4005. '
  4006. ' *  CHECK FOR NAMES NOT ALLOWED
  4007. '
  4008. 12555 GOSUB 12932
  4009.       IF ZWasQ = 0 THEN _
  4010.          RETURN 12500
  4011. 12556 ZWasZ$ = ZUserIn$(ZAnsIndex)
  4012. 12557 CALL AllCaps (ZWasZ$)
  4013.       CALL RemNonAlf (ZWasZ$,31,91)
  4014.       RETURN
  4015. 12558 ZOutTxt$ = "Are you '" + _
  4016.            ZActiveUserName$ + _
  4017.            "' ([Y],N)"
  4018.       GOSUB 12995
  4019.       RETURN
  4020. 12570 Found = ZFalse
  4021.       CALL OpenWork (2,ZTrashcanFile$)
  4022.       IF ZErrCode <> 0 THEN _
  4023.          ZErrCode = 0 : _
  4024.          RETURN
  4025. 12580 IF EOF(2) THEN _
  4026.          RETURN
  4027.       INPUT #2,InvalidName$
  4028.       IF ZWasZ$ <> InvalidName$ THEN _
  4029.          GOTO 12580
  4030.       Found = ZTrue
  4031.       RETURN
  4032. 12595 CALL QuickTPut1 ("Name not valid here. Call recorded")
  4033.       CALL UpdtCalr ("Name violation: "+ZActiveUserName$,1)
  4034.       GOTO 10621
  4035. '
  4036. ' *  COMMON SEARCH USER FILE ROUTINE
  4037. '
  4038. 12598 TempHashValue$ = HashValue$
  4039.       TempIndivValue$ = ZIndivValue$
  4040. 12600 GOSUB 4910
  4041.       GOSUB 12988
  4042.       IF ZInConfMenu THEN _
  4043.          IF NOT ZPrivateDoor THEN _
  4044.             CALL QuickTPut1 ("Checking Users...")
  4045. 12605 CALL OpenUser (ZHighestUserRecord)
  4046.       GOSUB 9450
  4047.       CALL FindUser (TempHashValue$,TempIndivValue$,ZStartHash,ZLenHash,_
  4048.                      ZStartIndiv,ZLenIndiv,ZHighestUserRecord,Found,_
  4049.                      ZUserFileIndex,ZWasSL)
  4050.      IF Found THEN _
  4051.         RETURN
  4052.      IF CurUserCount < (ZHighestUserRecord-1)*.95 THEN _
  4053.         RETURN
  4054.      ZOutTxt$ = "No room for new users in " + ZConfName$
  4055.      CALL UpdtCalr (ZOutTxt$,2)
  4056.      IF ZActiveUserFile$ <> ZMainUserFile$ THEN _
  4057.         ZUserFileIndex = 0 : _
  4058.         RETURN
  4059.       IF ZRememberNewUsers AND NOT ZSurviveNoUserRoom THEN _
  4060.          GOSUB 1397
  4061.       ZUserFileIndex = 0
  4062.       IF ZSurviveNoUserRoom THEN _
  4063.          ZRememberNewUsers = ZFalse
  4064.       RETURN
  4065. '
  4066. ' *  AUGMENT USER COUNT, LOCK 4 REC BLOCK IN USER, UNLOCK FILES
  4067. '
  4068. 12630 GOSUB 23000
  4069.       CurUserCount = CurUserCount + (ZWasSL = 0) * ZRememberNewUsers
  4070. 12632 GOSUB 24000
  4071.       GOSUB 12985
  4072.       IF ZRememberNewUsers THEN _
  4073.          GOSUB 12989
  4074.       GOSUB 12990
  4075.       RETURN
  4076. '
  4077. ' *  INFORM USER OF WHAT CONFERENCE USER FILE HE IS VIEWING
  4078. '
  4079. 12700 IF ZConfMode THEN _
  4080.          ZOutTxt$ = "Users of " + _
  4081.               ZConfName$ + _
  4082.               ":" : _
  4083.          GOSUB 12979
  4084.       RETURN
  4085. '
  4086. ' *  GET PASSWORD FROM NEWUSER
  4087. '
  4088. 12800 CALL NewPassword ("Enter PASSWORD you'll use to logon again",ZFalse)
  4089.       IF ZSubParm < 0 THEN _
  4090.          GOTO 202
  4091.       IF UserSecLevelSave < ZSysopSecLevel THEN _
  4092.          IF ZUserIn$ = SPACE$(LEN(ZUserIn$)) THEN _
  4093.             GOTO 12800
  4094.       LSET ZPswd$ = ZWasZ$
  4095.       RETURN
  4096. '
  4097. ' *  GET HASH VALUE FOR CURRENT USER TO LOOK UP IN THE USER'S FILE
  4098. '
  4099. 12840 IF ZStartHash = 1 THEN _
  4100.          HashValue$ = ZActiveUserName$ : _
  4101.          RETURN
  4102.       WasX$ = WasA1$ + _
  4103.            ZPromptHash$
  4104.       CALL UntilRight (WasX$,HashValue$,2,ZLenHash)
  4105.       RETURN
  4106. '
  4107. ' *  GET FIELD TO INDIVIDUATE ONE USER FROM ANOTHER (NAME FIELD IS DEFAULT)
  4108. '
  4109. 12850 IF ZStartIndiv < 1 OR ZLenIndiv < 1 THEN _
  4110.          RETURN
  4111.       IF ZStartIndiv = 1 THEN _
  4112.          ZIndivValue$ = ZActiveUserName$ : _
  4113.          RETURN
  4114.       IF ZExitToDoors THEN _
  4115.          RETURN
  4116.       WasX$ = WasA1$ + _
  4117.            ZPromptIndiv$
  4118.       CALL UntilRight (WasX$,ZIndivValue$,2,ZLenIndiv)
  4119.       RETURN
  4120. 12930 ZTurboKey = -ZTurboKeyUser
  4121. 12932 CALL PopCmdStack
  4122.       GOTO 12997
  4123. '
  4124. ' *  GET CITY AND STATE
  4125. '
  4126. 12960 ZOutTxt$ = WasA1$ + _
  4127.                  ZUserLocation$
  4128.       IF NOT ZNewUser THEN _
  4129.          ZOutTxt$ = ZOutTxt$ + ZPressEnter$
  4130.       ZParseOff = ZTrue
  4131.       GOSUB 12932
  4132.       IF ZWasQ = 0 OR ZUserIn$ = SPACE$(LEN(ZUserIn$)) THEN _
  4133.          IF ZNewUser THEN _
  4134.             GOTO 12960 _
  4135.          ELSE RETURN
  4136.       CALL AllCaps (ZUserIn$)
  4137.       CALL QuickTPut1 ("Set to "+ZUserIn$)
  4138.       LSET ZCityState$ = ZUserIn$
  4139.       ZWasCI$ = ZUserIn$
  4140.       RETURN
  4141. '
  4142. ' *  S - COMMAND FROM 5 - USER MAINTENANCE OPTIONS (SCAN USERS)
  4143. '
  4144. 12962 WasX = 0
  4145.       ZFF = ZFalse
  4146.       ZMacroMin = 99
  4147.       ZOutTxt$ = "String to search"
  4148.       GOSUB 12998
  4149.       IF ZWasQ = 0 THEN _
  4150.          GOTO 11001
  4151.       CALL AllCaps (ZUserIn$)
  4152.       WasWK$ = ZUserIn$
  4153.       IF ScanFunction$ = "L" THEN _
  4154.          WasWK$ = "," + _
  4155.                STR$(VAL(WasWK$)) + _
  4156.                ","
  4157. 12963 GET 5,WasI
  4158.       GOSUB 12966
  4159.       WasX = INSTR(ScanField$,WasWK$)
  4160.       IF WasX > 0 THEN _
  4161.          GOTO 11015
  4162. 12965 WasI = WasI + 1
  4163.       IF WasI > ZHighestUserRecord THEN _
  4164.          LSET ZUserRecord$ = UserRecordHold$ : _
  4165.          GOTO 11001
  4166.       WasX = 0
  4167.       GOTO 12963
  4168. 12966 ZFF = INSTR("NCPLH",ScanFunction$)
  4169. 12967 ON ZFF GOTO 12968,12969,12970,12972,12971
  4170.       GOTO 11001
  4171. '
  4172. ' *  N - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR NAME)
  4173. '
  4174. 12968 ScanField$ = ZUserName$
  4175.       RETURN
  4176. '
  4177. ' *  C - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR CITY/ST)
  4178. '
  4179. 12969 ScanField$ = ZCityState$
  4180.       RETURN
  4181. '
  4182. ' *  P - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR PASSWORD)
  4183. '
  4184. 12970 ScanField$ = ZPswd$
  4185.       RETURN
  4186. '
  4187. ' *  H - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR HASH ID)
  4188. '
  4189. 12971 IF ZStartHash > 0 AND ZLenHash > 0 THEN _
  4190.          ScanField$ = MID$(ZUserRecord$,ZStartHash,ZLenHash)
  4191.       RETURN
  4192. '
  4193. ' *  L - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR LEVEL)
  4194. '
  4195. 12972 ScanField$ = "," + _
  4196.                     STR$(CVI(ZSecLevel$)) + _
  4197.                     ","
  4198.       RETURN
  4199. '
  4200. ' * CALLS INTO SEPARATELY COMPILED SUBROUTINES (RBBS-SUB)
  4201. '
  4202. '
  4203. ' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL OUTPUT ROUTINE
  4204. '
  4205. 12975 ZSubParm = 1
  4206.       GOTO 12981
  4207. 12976 ZSubParm = 2
  4208.       GOTO 12981
  4209. 12977 ZSubParm = 3
  4210.       GOTO 12981
  4211. 12978 ZSubParm = 4     ' no cr/lf
  4212.       GOTO 12981
  4213. 12979 ZSubParm = 5     ' cr/lf
  4214.       GOTO 12981
  4215. 12980 ZSubParm = 6
  4216. 12981 CALL TPut
  4217. 12983 IF ZSubParm < 0 THEN _
  4218.          GOTO 202
  4219.       IF ZSubParm = 8 THEN _
  4220.          GOSUB 12995
  4221.       RETURN
  4222. '
  4223. ' * STANDARD ENTRY FOR RBBS-PC'S FILE LOCKING WHEN RUNNING MULTIPLE RBBS-PC'S
  4224. '
  4225. 12984 ZSubParm = 1  ' LOCK USERS & MESSAGES
  4226.       GOTO 12994
  4227. 12985 ZSubParm = 2  ' UNLOCK MESSAGES AND FLUSH
  4228.       Flushed = ZTrue
  4229.       GOTO 12994
  4230. 12986 ZSubParm = 3  ' LOCK MESSAGES
  4231.       GOTO 12994
  4232. 12987 ZSubParm = 4  ' UNLOCK MESSAGES
  4233.       GOTO 12994
  4234. 12988 ZSubParm = 5  ' LOCK USERS
  4235.       GOTO 12994
  4236. 12989 ZSubParm = 6  ' LOCK USER BLOCK
  4237.       GOTO 12994
  4238. 12990 ZSubParm = 7  ' UNLOCK USERS
  4239.       GOTO 12994
  4240. 12991 ZSubParm = 8  ' UNLOCK USER BLOCK
  4241.       GOTO 12994
  4242. 12992 ZSubParm = 9  ' LOCK COMMENTS/UPLOAD DIR
  4243.       GOTO 12994
  4244. 12993 ZSubParm = 10 ' UNLOCK COMMENTS/UPLOAD DIR
  4245. 12994 CALL FileLock
  4246.       IF Flushed THEN _
  4247.          FIELD 1,128 AS ZMsgRec$ : _
  4248.          Flushed = ZFalse
  4249.       IF ZSubParm = -1 THEN _
  4250.          ZSubParm = -9 : _
  4251.          CALL FindFKey : _
  4252.          GOTO 202
  4253.       RETURN
  4254. '
  4255. ' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL INPUT ROUTINE
  4256. '
  4257. 12995 GOSUB 12997
  4258.       ZSubParm = 1
  4259. 12996 CALL TGet
  4260. 12997 IF ZSubParm < 0 THEN _
  4261.          GOTO 202
  4262.       RETURN
  4263. 12998 ZOutTxt$ = ZOutTxt$ + _
  4264.            ZPressEnter$
  4265.       GOTO 12995
  4266. 12999 ZTurboKey = -ZTurboKeyUser
  4267.       GOTO 12995
  4268. '
  4269. ' *  MAIN SYSTEM ERROR TRAP - ALL ERRORS PASS THROUGH THIS ROUTINE
  4270. '
  4271. 13000 IF ZDebug THEN _
  4272.          ZOutTxt$ = "DEBUG Trap ERL=" + _
  4273.               STR$(ZWasEL) + _
  4274.               " ERR=" + _
  4275.               STR$(ZErrCode) : _
  4276.               CALL Printit(ZOutTxt$) : _
  4277.               WasD$ = ZOutTxt$ : _
  4278.               GOSUB 1315
  4279.       IF ZWasEL = 1905 AND ZErrCode = 63 THEN _
  4280.          CLOSE 1 : _
  4281.          KILL ZActiveMessageFile$ : _
  4282.          GOTO 5350
  4283.       IF ZWasEL = 4371 AND ZErrCode = 6 THEN _
  4284.          GOTO 1200
  4285.       IF ZWasEL =  4740 THEN _
  4286.          GOTO 4745
  4287. 13500 CALL LogError
  4288.       CALL QuickTPut1 (ZCallersRecord$)
  4289.       GOTO 1200
  4290. '
  4291. ' * COMMON EXIT FROM RBBS-PC (I.E. "ABANDON ALL HOPE OH YE WHO ENTER HERE")
  4292. '
  4293. 13538 CALL UpdtCalr ("No calls.  Recycling.",1)
  4294.       GOTO 13549
  4295. 13540 IF ZLocalUser AND ZSysop THEN _
  4296.          IF NOT ZLocalUserMode THEN _
  4297.             GOTO 13549
  4298. 13543 IF (NOT ZSysop) THEN _
  4299.          IF ((ZUserFileIndex = 0 AND ZRememberNewUsers) OR _
  4300.             ZNewUser = ZTrue) THEN _
  4301.             GOTO 13549
  4302. 13545 CALL UpdateC
  4303. 13549 GOSUB 13700
  4304.       IF ZLocalUser OR _
  4305.          ZModemOffHook THEN _
  4306.          GOTO 13555
  4307.       IF NOT ZFossil THEN _
  4308.          OUT ZModemCntlReg,INP(ZModemCntlReg) AND 254 : _
  4309.          CALL DelayTime (ZDTRDropDelay) : _
  4310.          OUT ZModemCntlReg,INP(ZModemCntlReg) OR 1 : _
  4311.          GOTO 13553
  4312. 13550 CALL FosStatus(ZComPort,Status)
  4313.       Status = Status AND &H4000
  4314.       IF Status <> &H4000 THEN _
  4315.          CALL DelayTime (8 + ZBPS)
  4316.       State=0
  4317.       CALL FosDTR(ZComPort,State)
  4318.       CALL DelayTime (ZDTRDropDelay)
  4319.       State=1
  4320.       CALL FosDTR(ZComPort,State)
  4321. 13553 CALL DelayTime (ZDTRDropDelay)
  4322.       CALL TakeOffHook
  4323. 13555 ZActiveMessageFile$ = ZOrigMsgFile$
  4324.       GOSUB 12986
  4325.       GOSUB 5344
  4326.       GET 1,ZNodeRecIndex
  4327.       MID$(ZMsgRec$,57,1) = "I"
  4328.       MID$(ZMsgRec$,40,2) = " 0"
  4329.       MID$(ZMsgRec$,72,2) = " 0"
  4330.       IF MID$(ZMsgRec$,101,2) = ZCarriageReturn$+ZCarriageReturn$ THEN _
  4331.          MID$(ZMsgRec$,101,2) = " 0"
  4332.       PUT 1,ZNodeRecIndex
  4333.       GOSUB 12985
  4334.       CLOSE 1,2,4,5
  4335.       IF NOT ZFossil THEN _
  4336.          CLOSE 3
  4337.       IF ZRecycleToDos THEN _
  4338.          GOTO 203
  4339.       RUN 100
  4340. 13600 CLS
  4341.       LOCATE ,,0
  4342.       CALL PScrn (ZWasDF$ + " file missing/invalid.  Run CONFIG")
  4343.       CALL DelayTime (3)
  4344.       GOTO 203
  4345. 13700 IF ZMsgFileLock THEN _
  4346.          GOSUB 12987
  4347. 13710 IF ZUserFileLock THEN _
  4348.          GOSUB 12990
  4349. 13720 IF ZUserBlockLock THEN _
  4350.          GOSUB 12991
  4351.       RETURN
  4352. '
  4353. ' *  C/R - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (QUIT TO MAIN MENU)
  4354. '
  4355. 20093 LSET ZUserRecord$ = UserRecordHold$
  4356.       GOSUB 9500
  4357. 20095 RETURN 1200
  4358. '
  4359. ' *  V - COMMAND FROM FILES MENU (VIEW ARC CONTENTS)
  4360. '
  4361. 20140 CALL GetArc
  4362.       IF ZSubParm = -1 THEN _
  4363.          GOTO 13540
  4364.       IF ZDenyAccess THEN _
  4365.          GOTO 1386
  4366.       RETURN
  4367. '
  4368. ' * GO TO THE FILE SYSTEM TO LIST THE SYSOP'S COMMENTS
  4369. '
  4370. 20150 ZFileSysParm = 1
  4371.       GOTO 20200
  4372. '
  4373. ' * GO TO THE FILE SYSTEM TO LIST THE FILE DIRECTORIES
  4374. '
  4375. 20155 ZFileSysParm = 2
  4376.       GOTO 20200
  4377. '
  4378. ' * GO TO THE FILE SYSTEM TO DOWNLOAD FILES
  4379. '
  4380. 20160 ZFileSysParm = 3
  4381.       GOTO 20200
  4382. '
  4383. ' * GO TO THE FILE SYSTEM WHEN RETURNING FROM EXTERNAL PROTOCOLS
  4384. '
  4385. 20165 ZFileSysParm = 4
  4386.       GOTO 20200
  4387. '
  4388. ' * GO TO THE FILE SYSTEM TO UPLOAD FILES
  4389. '
  4390. 20170 ZFileSysParm = 5
  4391.       GOTO 20200
  4392. '
  4393. ' * GO TO THE FILE SYSTEM TO SCAN FILE SYSTEM DIRECTORIES
  4394. '
  4395. 20175 ZFileSysParm = 6
  4396.       GOTO 20200
  4397. '
  4398. ' * GO TO THE FILE SYSTEM TO HANDLE "PERSONAL" FILES
  4399. '
  4400. 20180 ZFileSysParm = 7
  4401.       GOTO 20200
  4402. '
  4403. ' * GO TO THE FILE SYSTEM TO LIST "NEW" FILES
  4404. '
  4405. 20185 ZFileSysParm = 8
  4406.       GOTO 20200
  4407. '
  4408. ' * RETURN TO THE FILE SYSTEM AFTER HANDLING EXTENDED FILE DESCRIPTIONS
  4409. '
  4410. 20190 ZFileSysParm = 9
  4411. 20200 CALL FileSystem
  4412.       ON ZFileSysParm GOTO 20205, _
  4413.                                 20210, _
  4414.                                 20215, _
  4415.                                 20220, _
  4416.                                 20225, _
  4417.                                 20230, _
  4418.                                 20235
  4419. 20205 RETURN
  4420. 20210 RETURN 202
  4421. 20215 RETURN 1200
  4422. 20220 RETURN 1380
  4423. 20225 ZSysopComment = ZTrue
  4424.       ZMaxMsgLines = ZMaxExtendedLines
  4425.       GOSUB 2008
  4426.       GOTO 20190
  4427. 20230 RETURN 10553
  4428. 20235 RETURN 10595
  4429. '
  4430. ' *  GET MESSAGE HEADER RECORD DATA
  4431. '
  4432. 23000 GET 1,1
  4433.       HighMsgNumber = VAL(LEFT$(ZMsgRec$,8))
  4434.       AutoAddSec   = CVI(MID$(ZMsgRec$,9,2))
  4435.       CallsToDate! = VAL(MID$(ZMsgRec$,11,10))
  4436.       ZMsgSecCats$ = LEFT$("U",-(MID$(ZMsgRec$,21,1) <> "/")) + _
  4437.                      LEFT$("R",-(MID$(ZMsgRec$,22,1) <> "/")) + _
  4438.                      LEFT$("P",-(MID$(ZMsgRec$,23,1) <> "/")) + "EH"
  4439.       IF ZUserSecLevel >= ZSecKillAny THEN _
  4440.           ZMsgSecCats$ = "URPEH"
  4441.       IF ZMsgSecCats$ = "EH" THEN _
  4442.          ZMsgSecCats$ = "UEH"
  4443.       CurUserCount = VAL(MID$(ZMsgRec$,57,5))
  4444.       FirstMsgRecord = VAL(MID$(ZMsgRec$,68,7))
  4445.       ZNextMsgRec = VAL(MID$(ZMsgRec$,75,7))
  4446.       HighestMsgRecord = VAL(MID$(ZMsgRec$,82,7))
  4447.       IF ZActiveMessageFile$ = ZOrigMsgFile$ THEN _
  4448.          ZMaxNodes = VAL(MID$(ZMsgRec$,127))
  4449.       RETURN
  4450. 23100 GET 1,ZNextMsgRec
  4451.       IF MID$(ZMsgRec$,61,1) = ":" THEN _
  4452.          CALL CheckInt (MID$(ZMsgRec$,117,4)) : _
  4453.          IF ZErrCode = 0 AND (ZTestedIntValue > 1) AND (ZTestedIntValue < 100) THEN _
  4454.             WasY = ZTestedIntValue : _
  4455.             CALL CheckInt (MID$(ZMsgRec$,2,4)) : _
  4456.             IF ZErrCode = 0 AND ZTestedIntValue > HighMsgNumber THEN _
  4457.                HighMsgNumber = ZTestedIntValue : _
  4458.                ZNextMsgRec = ZNextMsgRec + WasY : _
  4459.                CALL QuickTPut1 ("Fixing Msg Header") : _
  4460.                MsgCorrected = ZTrue : _
  4461.                GOTO 23100
  4462.       RETURN
  4463. '
  4464. ' *  UPDATE MESSAGE HEADER RECORD DATA
  4465. '
  4466. 24000 MID$(ZMsgRec$,1,8) = STR$(HighMsgNumber)
  4467.       MID$(ZMsgRec$,11,10) = STR$(CallsToDate!)
  4468.       MID$(ZMsgRec$,57,5) = STR$(CurUserCount)
  4469.       MID$(ZMsgRec$,68,7) = STR$(FirstMsgRecord)
  4470.       MID$(ZMsgRec$,75,7) = STR$(ZNextMsgRec)
  4471.       MID$(ZMsgRec$,82,7) = STR$(HighestMsgRecord)
  4472.       PUT 1,1
  4473.       RETURN
  4474. '
  4475. ' * A - COMMAND FROM Library MENU (ARCHIVE A SELECTED Library DISK)
  4476. '
  4477. 30000 ZSubParm = 4
  4478.       CALL Library
  4479.       IF ZSubParm = -1 THEN _
  4480.          RETURN 10595
  4481.       RETURN
  4482. '
  4483. ' * C - COMMAND FROM Library MENU (CHANGE TO A Library DISK)
  4484. '
  4485. 30100 ZSubParm = 2
  4486.       CALL Library
  4487.       RETURN
  4488. '
  4489. ' * D - COMMAND FROM Library MENU (DOWNLOAD A DISK/FILE FROM Library)
  4490. '
  4491. 30200 IF ZTimeLock AND 2 AND NOT ZHasPrivDoor THEN _
  4492.          CALL TimeLock : _
  4493.          IF NOT ZOK THEN _
  4494.             RETURN
  4495.       IF ZLibDiskChar$ = "0000" THEN _
  4496.          CALL QuickTPut1 ("You must select a Library disk first!") : _
  4497.          RETURN
  4498.       ZSubParm = 3
  4499.       CALL Library
  4500.       GOTO 20160
  4501. '
  4502. ' * CALCULATE TIME REMAINING FOR USER
  4503. '
  4504. 41000 CALL CheckTimeRemain (MinsRemaining)
  4505.       IF ZSubParm = -1 THEN _
  4506.          RETURN 10553
  4507.       RETURN
  4508. '
  4509. ' * SHOW USER CURRENT ACCESS LEVEL
  4510. '
  4511. 41070 ZOutTxt$ = "Granted access level" + _
  4512.            STR$(ZUserSecLevel) + _
  4513.            MID$(" (SYSOP)",1,-8 * (ZUserSecLevel >= ZSysopSecLevel))
  4514.       GOSUB 12975
  4515.       RETURN
  4516. '
  4517. ' * NULLS SET FOR NEW USERS
  4518. '
  4519. 42700 CALL SkipLine (1)
  4520.       CALL QuickTPut1 ("TurboKey: act on 1 char command without waiting for [ENTER]")
  4521.       ZOutTxt$ = "Use TurboKey (Y,[N])"
  4522.       GOSUB 12999
  4523.       ZTurboKeyUser = NOT ZYes
  4524.       CALL Toggle (8)
  4525.       RETURN
  4526. '
  4527. ' *  F - COMMAND FROM UTILITY MENU (FILE Transfer DEFALUT MODE)
  4528. ' *  FILE Transfer DEFAULT SET FOR NEW USERS
  4529. '
  4530. 42800 ZFF = INSTR(ZDefaultXfer$,ZUserXferDefault$)
  4531.       IF ZFF = 0 THEN _
  4532.          ZFF = INSTR(ZInternalEquiv$,"N")
  4533.       CALL QuickTPut1 ("Current Protocol: "+MID$(ZDefaultXfer$,ZFF,1))
  4534. 42805 ZOutTxt$ = "Default "
  4535.       CALL XferType (3,ZExpertUser)
  4536.       IF ZSubParm = -1 THEN _
  4537.          RETURN 10595
  4538.       ZUserXferDefault$ = ZWasFT$
  4539. 42810 ZOutTxt$ = "Protocol: " + ZProtoPrompt$
  4540.       GOSUB 12979
  4541.       RETURN
  4542. '
  4543. ' *  C - COMMAND FROM UTILITY MENU (CHANGE CASE Toggle)
  4544. ' *  UPPER/LOWER CASE SET FOR NEW USERS
  4545. '
  4546. 42850 CALL ReportEcho
  4547. 42851 ZOutTxt$ = "Change to R)BBS, C)aller's software" + _
  4548.            MID$(", I)ntermediate host",1,-20 * (ZHostEchoOn$ <> "")) + _
  4549.            ZPressEnterExpert$
  4550.       GOSUB 12930
  4551.       IF ZWasQ = 0 THEN _
  4552.          RETURN
  4553. 42852 ZWasZ$ = LEFT$(ZUserIn$(ZAnsIndex),1)
  4554.       CALL AllCaps (ZWasZ$)
  4555.       IF INSTR("ICR",ZWasZ$) = 0 THEN _
  4556.          GOTO 42851
  4557.       ZEchoer$ = ZWasZ$
  4558.       CALL SetEcho (ZEchoer$)
  4559.       CALL ReportEcho
  4560.       RETURN
  4561. ' *  G - COMMAND FROM UTILITY MENU (GRAPHICS WANTED)
  4562. ' *  Graphic MENUS SELECTION SET FOR NEW USERS
  4563. '
  4564. 43000 GOSUB 43005
  4565.       GOTO 43022
  4566. 43005 CALL AskGraphics
  4567.       IF ZSubParm = -1 THEN _
  4568.          RETURN 10595
  4569.       IF ZWasQ = 0 THEN _
  4570.          RETURN
  4571. 43020 ZOutTxt$ = "Text Graphics: " + _
  4572.            MID$("None AsciiColor",ZWasGR * 5 + 1,5)
  4573.       GOSUB 12979
  4574.       RETURN
  4575. 43022 ZPrevPUI$ = ""
  4576.       IF ZEmphasizeOnDef$ = "" THEN _
  4577.          RETURN
  4578.       ZOutTxt$ = "Do you want colorized prompts ([Y],N)"
  4579.       GOSUB 12930
  4580.       ZHiLiteOff = NOT ZNo
  4581.       CALL Toggle(5)
  4582.       RETURN
  4583. 43025 CALL Graphic (ZFileName$)
  4584. '
  4585. ' *  DISPLAY NON-BREAKABLE TEXT FILES
  4586. '
  4587. 43027 ZStopInterrupts = ZTrue
  4588.       CALL BufFile (ZFileName$,WasX)
  4589.       CALL Carrier
  4590.       IF ZSubParm = -1 THEN _
  4591.          RETURN 10595
  4592.       ZStopInterrupts = ZFalse
  4593.       RETURN
  4594. '
  4595. ' * MAKE INPUT STRING HIDDEN (USE *'S TO ECHO INPUT)
  4596. '
  4597. 45010 ZHidden = ZTrue
  4598.       GOSUB 12995
  4599.       ZHidden = ZFalse
  4600.       RETURN
  4601.