'===========================================================================
' Subject: TEXT RITE (EDITOR)                 Date: 01-31-97 (09:45)       
'  Author: Christopher S. Wyatt               Code: QB, QBasic, PDS        
'  Origin: alt.lang.basic                   Packet: TEXT.ABC
'===========================================================================
'>Can someone please send me a simple text editor in plain Basic (QBasic or
'>QB45) code. It must have the ability to print on paper, on screen; load
'>files; save files; edit files;; all in a simple code. I am trying to learn
'>this language, but I need some good examples.
'>I will probably use this txt editor for my own purposes and not for any
'>distribution of any sort.

'I never finished this program -- I was adding a cut, copy paste
'feature -- but it is functional. I stopped programming when DOS
'started to ship with a REAL editor, not EDLIN. I used Text Rite for
'years, installing it on every machine I used.

'It runs under QBASIC, QuickBasic, and PowerBASIC. Note: For PB,
'you have to change calls to PCOPY... but that's easy, it's well
'documented in the manual. I've tested it, and it does work.

'If anyone would like to continue the Text Rite challenge (a
'good BASIC editor) let me know. I'd love to see this done, if
'just to prove BASIC isn't a toy.

'Again, I was going to add: CUT/COPY/PASTE, and MOUSE calls.
'I realized AFTER I wrote the code that the menu routines were
'sloppy; I have since re-written them to be more logical. My
'newer (two or three years old!) menu routines are a lot easier
'to read and modify. I switched to TYPEd variables to enable a help
'string for each menu item.

'It's old and ugly, but here goes nothing:

' Text Rite Version 2.24.00B  (15 Jul 1992)
' (c) 1984-1992 Student Oriented Software
' by C. S. Wyatt

' =====>  Variable Types  <=====
	DEFINT A-Z
	DECLARE SUB DelFile ()
	DECLARE SUB DelLine (row)
	DECLARE SUB DelText ()
	DECLARE SUB FileDir ()
	DECLARE SUB FindRepl (itemnum)
	DECLARE SUB InputBox (inprompt$, answerlen, col, row, hide, answer$)
	DECLARE SUB InputText (answer$, answerlen, col, row, hide)
	DECLARE SUB InsLine (row)
	DECLARE SUB ItemBox (box$(), col, row, itemnum)
	DECLARE SUB LoadMode ()
	DECLARE SUB MakeMenu ()
	DECLARE SUB MenuCall ()
	DECLARE SUB MenuBox ()
	DECLARE SUB MainScreen ()
	DECLARE SUB NewFile ()
	DECLARE SUB NewText (edline)
	DECLARE SUB PosText (itemnum)
	DECLARE SUB PrintMode (itemnum)
    DECLARE SUB PrintSetup (pglines, topmar, btmar, leftmar, startnum, nummode)
	DECLARE SUB SaveLine ()
	DECLARE SUB SaveMode ()
	DECLARE SUB TextWrap ()

' =====>  Screen Color Variables      <=====
    bcolor = 0:                              ' Background color (0-7)
    fcolor = 7:                              ' Foreground color (Text) (0-7)
    mcolor = 7:                              ' Menu bar color (0-7)
' =====>  Generic & Editor Variables  <=====
	a = 0:                                   ' Generic numeric value
	a$ = "":                                 ' Generic string
	linelen = 60:                            ' Line length
	newscrn = 0:                             ' Update text on ccreen
	insmode = 1:                             ' Insert Mode On
	scrnline = 3:                            ' Screen line marker
	scrncol = 1:                             ' Screen row marker
	edline = 1:                              ' Line being edited
' =====>  Editing Variables           <=====
	blockbeg = -1:                           ' Edit block (start)
	blockbch = -1:                           ' Edit block (start char)
	blockend = -1:                           ' Edit block (end)
	blockech = -1:                           ' Edit block (end char)
	blockmode = 0:                           ' Block mode toggle
	pasteallow = 0:                          ' Paste active toggle
	blockflag = 0:                           ' Block mode flag
' =====>  MakeMenu Variables          <=====
	CONST maxmenu = 10:                      ' Last declared menu (-1)
	CONST maxitem = 12:                      ' Maximum menu items (+2)
	menubar$ = "  ":                         ' Begin building menus
' =====>  I/O and Printer Variables   <=====
	filespec$ = "<NONE>":                    ' File selected
' =====>  Arrays and Such             <=====
	DIM SHARED menu$(maxmenu, maxitem):      ' Define menu array (11x10)
	'$DYNAMIC
	DIM SHARED ibox$(1):                     ' Array for item menus
	DIM SHARED scandir(1) AS STRING * 12:    ' Set # of files
	DIM SHARED doctxt(600) AS STRING:        ' Document Text
 
	CALL MakeMenu

IF COMMAND$ <> "" THEN
	 ON ERROR GOTO ErrorTrap
	 filespec$ = COMMAND$
	 scrncol = -1
	 CALL LoadMode
	 END IF

ProgramStart:
	ON ERROR GOTO ErrorTrap
	CALL MainScreen
	edline = 1
	CALL NewText(1)

MainLoop:
	DO WHILE 1
		 a$ = "": exkey = 0
		 COLOR bcolor + (8 * insmode), mcolor + (8 * insmode)
		 LOCATE scrnline, scrncol
		 PRINT CHR$(SCREEN(scrnline, scrncol));
		 VIEW PRINT
		 LOCATE 1, 65
		 PRINT USING "###:##"; edline; scrncol;
		 LOCATE 1, 75
		 IF blockmode = 1 THEN
				PRINT "BLK";
				ELSE
				IF insmode = 1 THEN PRINT "INS";  ELSE PRINT "   ";
				END IF
		 VIEW PRINT 3 TO 23
		 WHILE a$ = ""
			 a$ = INKEY$
			 COLOR mcolor + 8, bcolor
			 LOCATE 25, 45, 0: PRINT "Date: "; DATE$;
			 LOCATE 25, 65: PRINT "Time: "; TIME$;
			 COLOR fcolor, bcolor
			 IF blockmode = 1 THEN COLOR bcolor, fcolor
			 WEND
		 IF blockmode = 1 THEN
				blockend = edline:    ' Edit block (end)
				blockech = scrncol:   ' Edit block (end char)
				CALL NewText(edline + 3 - scrnline)
				END IF
		 LOCATE scrnline, scrncol
		 PRINT CHR$(SCREEN(scrnline, scrncol));
		 IF scrnline = 23 THEN
				CALL SaveLine
				CALL NewText(edline)
				scrnline = 3
				END IF
		 IF a$ = CHR$(27) THEN a$ = CHR$(27) + CHR$(33): ' ESC = ALT-F
		 IF LEN(a$) > 1 THEN
				exkey = ASC(RIGHT$(a$, 1))
			 IF exkey <> 75 AND exkey <> 77 AND exkey <> 82 THEN CALL SaveLine
				IF exkey = 18 THEN exkey = 60: ' ALT - E
				IF exkey = 33 THEN exkey = 65: ' ALT - F
				IF exkey = 24 THEN exkey = 64: ' ALT - O
				IF exkey = 25 THEN exkey = 61: ' ALT - P
				IF exkey = 20 THEN exkey = 63: ' ALT - T
				IF exkey > 58 AND exkey < 69 THEN
					 IF menu$(exkey - 59, 0) <> "" THEN
							menucalled = exkey - 59
							newscrn = 0
							blockflag = blockmode
							CALL MenuCall
							IF blockflag = 0 AND blockmode = 1 THEN
								 blockbeg = edline:    ' Edit block (start)
								 blockbch = scrncol:   ' Edit block (start char)
								 END IF
							IF newscrn = 1 THEN
								 CALL MainScreen
								 CALL NewText(edline)
								 END IF
							END IF
					 END IF
				IF exkey = 71 THEN
					 IF scrnline = 3 AND scrncol = 1 THEN
							edline = 1: scrnline = 3
							CALL NewText(edline)
							END IF
					 IF scrncol = 1 AND scrnline > 3 THEN
							a = scrnline - 3
							edline = edline - a
							IF edline < 1 THEN edline = 1
							scrnline = 3: scrncol = 1: ' Home
							CALL NewText(edline)
							END IF
					 IF scrncol > 1 THEN scrncol = 1
					 END IF
				IF exkey = 72 THEN
					 IF scrnline > 3 AND edline > 1 THEN
							scrnline = scrnline - 1
							edline = edline - 1
							ELSE
							IF edline > 1 THEN
								 edline = edline - 1
								 scrnline = 3
								 CALL NewText(edline)
								 END IF
							END IF
					 IF LEN(doctxt(edline)) < scrncol THEN exkey = 79
					 IF blockmode = 1 THEN
							blockend = edline:    ' Edit block (end)
							blockech = scrncol:   ' Edit block (end char)
							CALL NewText(edline + 3 - scrnline)
							END IF
					 END IF: ' Up
				IF exkey = 73 THEN
					 edline = edline - 19
					 scrnline = 3: scrncol = 1
					 IF edline < 1 THEN edline = 1
					 CALL NewText(edline)
					 END IF: ' PgUp
			 IF exkey = 75 AND scrncol > 1 THEN scrncol = scrncol - 1:  ' Left
				IF exkey = 77 AND scrncol < 78 THEN
				 IF SCREEN(scrnline, scrncol) <> 255 THEN scrncol = scrncol + 1
					 IF blockmode = 1 THEN
							blockend = edline:    ' Edit block (end)
							blockech = scrncol:   ' Edit block (end char)
							CALL NewText(edline + 3 - scrnline)
							END IF
					 END IF: ' Right
				IF exkey = 80 AND scrnline < 23 THEN
					 scrnline = scrnline + 1: edline = edline + 1: ' Down
					 IF blockmode = 1 THEN
							blockend = edline:    ' Edit block (end)
							blockech = scrncol:   ' Edit block (end char)
							CALL NewText(edline + 3 - scrnline)
							END IF
					 IF LEN(doctxt(edline)) < scrncol THEN exkey = 79
					 END IF
				IF exkey = 79 AND scrncol < 79 THEN
					 scrncol = LEN(RTRIM$(doctxt(edline))) + 1
					 IF scrncol > 1 THEN
					   IF SCREEN(scrnline, scrncol - 1) = 255 THEN scrncol = scrncol - 1
							END IF
					 END IF: ' End
				IF exkey = 81 THEN
					 scrnline = 3: scrncol = 1
					 edline = edline + 19
				 IF edline > UBOUND(doctxt, 1) THEN edline = UBOUND(doctxt, 1)
					 CALL NewText(edline)
					 END IF: ' PgDn
				IF exkey = 82 THEN insmode = (insmode XOR 1): ' Ins
				a$ = ""
				END IF
		 IF a$ <> "" THEN a = ASC(a$) ELSE a = 0
		 IF (a$ <> "" AND insmode = 1) OR exkey = 83 THEN
				b$ = ""
				FOR t = scrncol TO 80
						b$ = b$ + CHR$(SCREEN(scrnline, t))
						NEXT t
				b$ = RTRIM$(b$)
				IF b$ = "" THEN b$ = " "
				END IF
		 IF exkey = 83 THEN
				exkey = 0: ' Delete pressed
				CALL SaveLine
				IF LEN(RTRIM$(doctxt(edline))) = 0 AND scrncol = 1 THEN
					 CALL DelLine(1)
					 IF scrnline < 23 AND scrnline > 3 THEN
							FOR t = (scrnline - 1) TO 23
									LOCATE t, 1
									PRINT SPACE$(79);
									LOCATE t, 1
									b = edline + t - scrnline
									PRINT doctxt(b);
									NEXT t
							ELSE
							CALL NewText(edline)
							END IF
					 ELSE
					 IF scrncol < linelen THEN CALL DelText
					 END IF
				END IF
		 IF a = 8 THEN
				scrncol = scrncol + (scrncol > 1): ' Backspace
				LOCATE scrnline, scrncol
				PRINT b$; " ";
				a = 0: a$ = ""
				END IF
		 IF a = 9 THEN a$ = SPACE$(5 - (scrncol MOD 5)): ' Tab
		 IF scrncol > linelen THEN
				IF a$ = " " OR a$ = CHR$(13) THEN
					 a$ = CHR$(13)
					 LOCATE scrnline, scrncol
					 PRINT " ";
					 ELSE
					 CALL TextWrap
					 LOCATE scrnline, 1
					 PRINT a$;
					 CALL SaveLine
					 a$ = ""
					 END IF
				END IF
		 IF a = 13 THEN
				LOCATE scrnline, scrncol: ' Enter
				PRINT CHR$(255); SPACE$(78 - scrncol);
				scrncol = scrncol + 1
				CALL SaveLine
				IF insmode = 1 THEN
					 CALL InsLine(1)
					 IF scrnline < 21 AND scrnline > 3 THEN
							FOR t = (scrnline - 1) TO 23
									LOCATE t, 1
									PRINT SPACE$(79);
									LOCATE t, 1
									b = edline + t - scrnline
									PRINT doctxt(b);
									NEXT t
							ELSE
							CALL NewText(edline)
							END IF
					 END IF
				END IF
		 IF a$ <> "" THEN
				LOCATE scrnline, scrncol: PRINT a$;
				IF CSRLIN > scrnline THEN
					 CALL SaveLine
					 edline = edline + 1
					 END IF
				scrnline = CSRLIN
				scrncol = POS(0)
				IF insmode = 1 THEN PRINT b$; " ";
				END IF
		LOOP
	END

ErrorTrap:
	CLS
	COLOR fcolor + 16, bcolor
	PRINT TAB(34); "E R R O R !!"
	BEEP: BEEP: BEEP
	COLOR fcolor + 8
	a$ = "#" + STR$(ERR)
	IF ERR = 7 THEN a$ = "Out of Memory."
	IF ERR > 49 THEN a$ = "Check Diskette."
	IF ERR = 53 THEN a$ = "File not Found."
	IF ERR = 61 THEN a$ = "Disk is Full."
	IF ERR = 64 THEN a$ = "Illegal File Name."
	IF ERR > 70 THEN a$ = "Disk not Ready."
	IF ERR = 73 THEN a$ = "Feature Unavailable."
	PRINT : PRINT TAB(40 - LEN(a$) / 2); a$
	COLOR fcolor
	LOCATE 7, 30: PRINT "Hit any key, please."
	a$ = INPUT$(1)
	scrncol = 1
	RESUME ProgramStart

REM $STATIC
SUB DelFile
	SHARED filespec$

	b$ = filespec$
	CALL FileDir
	a$ = "N"
    CALL InputBox("Deleting " + filespec$ + "!  Are you sure??", 1, 35, 8, 0, a$)
	a$ = UCASE$(a$)
	IF a$ <> "Y" THEN
		 filespec$ = b$
		 EXIT SUB
		 END IF
	KILL filespec$
END SUB

SUB DelLine (row)
	SHARED doctxt() AS STRING, edline

	FOR t = (edline + row - 1) TO (UBOUND(doctxt, 1) - 1)
			SWAP doctxt(t), doctxt(t + 1)
			NEXT t
	FOR t = (UBOUND(doctxt, 1) - row + 1) TO UBOUND(doctxt, 1)
			doctxt(t) = ""
			NEXT t
END SUB

SUB DelText
SHARED doctxt() AS STRING, edline, b$, scrnline, scrncol, linelen

		IF LEN(b$) = 1 THEN b$ = " "
		IF LEN(b$) > 1 THEN b$ = RIGHT$(b$, LEN(b$) - 1)
		IF b$ = " " AND scrnline < 23 THEN
			 b = INSTR(linelen - (scrncol + 1), doctxt(edline + 1), " ")
			 IF b = 0 AND LEN(doctxt(edline + 1)) > 0 THEN
					b = LEN(doctxt(edline + 1))
					doctxt(edline + 1) = doctxt(edline + 1) + " "
					END IF
			 c$ = LEFT$(doctxt(edline + 1), b)
			 b$ = b$ + c$
		   doctxt(edline + 1) = RIGHT$(doctxt(edline + 1), LEN(doctxt(edline + 1)) - b)
			 LOCATE scrnline + 1, 1
			 PRINT SPACE$(79);
			 LOCATE scrnline + 1, 1
			 PRINT doctxt(edline + 1);
			 END IF
		LOCATE scrnline, scrncol
		PRINT b$; " ";
END SUB

SUB FileDir
	SHARED ibox$(), filespec$

ReadDir:
	LOCATE 1, 1, 0
	SHELL "dir > scanfile.dir"
	OPEN "scanfile.dir" FOR INPUT AS #1
		fcounter = 0
		WHILE NOT EOF(1)
			LINE INPUT #1, a$
			fcounter = fcounter + 1
			WEND
		CLOSE #1
	REDIM scandir(fcounter + 3) AS STRING * 12
	OPEN "scanfile.dir" FOR INPUT AS #1
		fcounter = 1
		WHILE NOT EOF(1)
			LINE INPUT #1, a$
		  IF LEFT$(a$, 1) <> " " AND LEN(a$) > 1 AND LEFT$(a$, 8) <> "SCANFILE" THEN
				IF MID$(a$, 14, 1) = "<" THEN a$ = LEFT$(a$, 9) + "<D>"
				a$ = MID$(a$, 1, 8) + "." + MID$(a$, 10, 3)
				scandir(fcounter) = a$
				fcounter = fcounter + 1
				END IF
			WEND
		limit = fcounter - 1
		DO
			 swaps = 0
			 FOR item = 0 TO (limit - 1)
					 IF scandir(item) > scandir(item + 1) THEN
							SWAP scandir(item), scandir(item + 1)
							swaps = item
							END IF
					 NEXT item
			 limit = swaps
			 LOOP WHILE swaps
		scandir(fcounter) = "    [A:]    "
		scandir(fcounter + 1) = "    [B:]    "
		scandir(fcounter + 2) = "    [C:]    "
		fcounter = fcounter + 2
		CLOSE #1
	REDIM ibox$(fcounter + 2)
	KILL "scanfile.dir"
	IF fcounter = 0 THEN EXIT SUB
 
	ibox$(0) = "Directory:"
	ibox$(1) = STR$(fcounter + 3)
	ibox$(2) = "12"
	FOR dircntr = 1 TO (fcounter)
		ibox$(dircntr + 2) = LEFT$(scandir(dircntr) + "            ", 12)
		NEXT dircntr
	item = 0
	CALL ItemBox(ibox$(), 27, 8, item)
	IF item > 0 THEN
		 IF RIGHT$(ibox$(item + 2), 3) = "<D>" THEN
				CHDIR RTRIM$(LEFT$(ibox$(item + 2), 8))
				GOTO ReadDir
				ELSE
				IF INSTR(ibox$(item + 2), ":]") = 7 THEN
					 LOCATE 1, 1
					 SHELL MID$(ibox$(item + 2), 6, 2)
					 GOTO ReadDir
					 END IF
				filespec$ = ibox$(item + 2)
				END IF
		 END IF
END SUB

SUB FindRepl (itemnum) STATIC
SHARED doctxt() AS STRING, edline, fcolor, bcolor, scrncol

	CALL InputBox("Search For?", 40, 20, 6, 0, ftext$)
	ftext$ = RTRIM$(ftext$)
	IF ftext$ = CHR$(27) THEN EXIT SUB
	IF itemnum = 1 THEN
		 CALL InputBox("Replace With?", 40, 22, 10, 0, rtext$)
		 rtext$ = RTRIM$(rtext$)
		 IF rtext$ = CHR$(27) THEN EXIT SUB
		 CALL InputBox("Confirm? (Y/N)", 1, 24, 14, 0, conftxt$)
		 conftxt$ = UCASE$(conftxt$)
		 IF conftext$ = CHR$(27) THEN EXIT SUB
		 END IF
	IF itemnum = 0 THEN
		 FOR counter = edline TO UBOUND(doctxt, 1)
				 a = INSTR(doctxt(counter), ftext$)
				 IF a > 0 AND (a <> scrncol AND counter <> edline) THEN
						edline = counter
						scrncol = a: BEEP
						EXIT FOR
						END IF
				 NEXT counter
		 IF scrncol = a THEN EXIT SUB
		 FOR counter = 1 TO edline - 1
				 a = INSTR(doctxt(counter), ftext$)
				 IF a > 0 THEN
						edline = counter
						scrncol = a: BEEP
						EXIT FOR
						END IF
				 NEXT counter
		 EXIT SUB
		 END IF
' =====>  Replace  <=====
	FOR counter = 1 TO UBOUND(doctxt, 1)
			a = INSTR(doctxt(counter), ftext$)
			IF a > 0 THEN
				 ans$ = "Y"
				 IF conftxt$ = "Y" THEN
						COLOR fcolor, bcolor
						CALL NewText(counter)
						LOCATE 3, a
						COLOR bcolor, fcolor
						PRINT ftext$;
						CALL InputBox("Replace? (Y/N)", 1, 24, 14, 0, ans$)
						ans$ = UCASE$(ans$)
						IF ans$ = CHR$(27) THEN EXIT SUB
						END IF
				 IF ans$ = "Y" THEN
						c$ = LEFT$(doctxt(counter), a - 1) + rtext$
				    b$ = RIGHT$(doctxt(counter), LEN(doctxt(counter)) + 1 - (a + LEN(ftext$)))
						doctxt(counter) = c$ + b$
						END IF
				 END IF
			NEXT counter
END SUB

SUB InputBox (inprompt$, answerlen, col, row, hide%, answer$)
	COLOR 0, 7, 0
	menuwidth = answerlen + 2
	IF LEN(inprompt$) > answerlen THEN menuwidth = LEN(inprompt$) + 2
	LOCATE row, col
	PRINT CHR$(218); STRING$(menuwidth, 196); CHR$(191);
	LOCATE row + 1, col
    PRINT CHR$(179); " "; LEFT$(inprompt$ + STRING$(80, 32), menuwidth - 1); CHR$(179);
	COLOR 8, 0, 0
	PRINT CHR$(SCREEN(CSRLIN, POS(0)))
	COLOR 0, 7, 0
	LOCATE row + 2, col
	PRINT CHR$(195); STRING$(menuwidth, 196); CHR$(180);
	COLOR 8, 0, 0
	PRINT CHR$(SCREEN(CSRLIN, POS(0)))
	COLOR 0, 7, 0
	LOCATE row + 3, col
	PRINT CHR$(179); STRING$(menuwidth, 32); CHR$(179);
	COLOR 8, 0, 0
	PRINT CHR$(SCREEN(CSRLIN, POS(0)))
	COLOR 0, 7, 0
	LOCATE row + 4, col
	PRINT CHR$(192); STRING$(menuwidth, 196); CHR$(217);
	COLOR 8, 0, 0
	PRINT CHR$(SCREEN(CSRLIN, POS(0)))
	LOCATE row + 5, col + 1
	FOR border = 1 TO menuwidth + 2
		PRINT CHR$(SCREEN(CSRLIN, POS(0)));
		NEXT border
	COLOR 4, 7
	row = row + 3
	col = col + 2
	answer$ = RTRIM$(answer$)
	CALL InputText(answer$, answerlen, col, row, hide%)
END SUB

SUB InputText (answer$, answerlen, col, row, hide%)
	LOCATE row, col, 1
	PRINT answer$;
	FOR letter = 1 TO answerlen
		 a$ = ""
		 WHILE a$ = ""
				a$ = INKEY$
				IF LEN(a$) > 1 THEN
					 IF RIGHT$(a$, 1) = CHR$(75) THEN a$ = CHR$(8)
					 END IF
				IF LEN(a$) > 1 THEN a$ = ""
				WEND
		 IF a$ = CHR$(9) THEN a$ = CHR$(13)
		 IF a$ = CHR$(27) THEN
				answer$ = CHR$(27)
				EXIT FOR
				END IF
		 IF a$ = CHR$(13) THEN EXIT FOR
		 IF letter = 1 THEN
				LOCATE row, col
				PRINT STRING$(answerlen, 32);
				answer$ = ""
				LOCATE row, col
				END IF
		 IF a$ <> CHR$(8) THEN
				IF hide% = 1 THEN
					 PRINT "*";
					 ELSE
					 PRINT a$;
					 END IF
				END IF
		 IF a$ <> CHR$(8) THEN answer$ = answer$ + a$
		 IF a$ = CHR$(8) AND letter > 1 THEN
				LOCATE CSRLIN, POS(0) - 1: PRINT " ";
				letter = letter - 2
				answer$ = LEFT$(answer$, letter)
				LOCATE row, col, 1
			 IF hide% = 0 THEN PRINT answer$;  ELSE PRINT STRING$(letter, "*");
				END IF
		 NEXT letter
	answer$ = LEFT$(answer$ + STRING$(answerlen, 32), answerlen)
END SUB

SUB InsLine (row)
	SHARED doctxt() AS STRING, edline, scrncol

	a$ = LEFT$(doctxt(edline), scrncol - 1)
	FOR t = UBOUND(doctxt, 1) TO (edline + row) STEP -1
			SWAP doctxt(t), doctxt(t - row)
			NEXT t
	FOR t = (edline) TO (edline + row)
			doctxt(t) = ""
			NEXT t
	doctxt(edline) = a$
END SUB

SUB ItemBox (box$(), col, row, itemnum)
	SHARED bcolor, mcolor

	'=====>  Item list for choice box      <=====
	' box$(0)     --->  Menu Name
	' box$(1)     --->  Last Item's *REAL* Number (item + 2)
	' box$(2)     --->  Menu Width (Same as LEN of longest item)
	' col          Horizontal location of box
	' row          vertical location of box
	' item         selected item in array

	lastitem = VAL(box$(1)) - 3
	IF itemnum > lastitem OR itemnum = 0 THEN itemnum = 1
	IF lastitem < 1 THEN EXIT SUB
	menuwidth = VAL(box$(2)) + 2

	COLOR bcolor + 8, mcolor, 0
	LOCATE row, col, 0
	PRINT CHR$(201); STRING$(menuwidth, 205); CHR$(187);
	LOCATE row + 1, col
    PRINT CHR$(186); LEFT$(" " + box$(0) + STRING$(menuwidth, 32), menuwidth); CHR$(186);
	COLOR 8, 0, 0
	PRINT CHR$(SCREEN(CSRLIN, POS(0)))
	COLOR bcolor + 8, mcolor, 0
	LOCATE row + 2, col
	PRINT CHR$(199); STRING$(menuwidth, 196); CHR$(182);
	COLOR 8, 0, 0
	PRINT CHR$(SCREEN(CSRLIN, POS(0)))
	COLOR bcolor + 8, mcolor, 0
	menu = itemnum
' =====>  List Files in Box  <=====
	FOR border = 1 TO 10
		LOCATE row + 2 + border, col, 0
		PRINT CHR$(186);
		IF menu > lastitem THEN
			 PRINT STRING$(menuwidth, 32);
			 ELSE
		   PRINT LEFT$(" " + box$(menu + 2) + STRING$(menuwidth, 32), menuwidth);
			 menu = menu + 1
			 END IF
		PRINT CHR$(186);
		COLOR 8, 0, 0
		PRINT CHR$(SCREEN(CSRLIN, POS(0)))
		COLOR bcolor + 8, mcolor, 0
		NEXT border
	LOCATE CSRLIN, col, 0
	PRINT CHR$(200); STRING$(menuwidth, 205); CHR$(188);
	COLOR 0, 8, 0
	PRINT CHR$(SCREEN(CSRLIN, POS(0)))
	LOCATE CSRLIN, col + 1
	FOR border = 1 TO menuwidth + 2
		PRINT CHR$(SCREEN(CSRLIN, POS(0)));
		NEXT border
	COLOR bcolor + 8, mcolor, 0
	menu = 1: item = itemnum
	LOCATE row + 3, col + 1
	COLOR 7, 0
    PRINT LEFT$(" " + box$(item + 2) + STRING$(menuwidth, 32), menuwidth);
	COLOR bcolor + 8, mcolor, 0
' =====>  Select Item  <=====
	a$ = "": a = 0
	WHILE (a$ <> CHR$(13))
		a$ = ""
		b = VAL(RIGHT$(TIME$, 4))
		IF b > 7 THEN b = 0
		WHILE a$ = ""
			COLOR mcolor, bcolor
			LOCATE 25, 45, 0: PRINT "Date: "; DATE$;
			LOCATE 25, 65: PRINT "Time: "; TIME$;
			a$ = INKEY$
			WEND
		IF a$ = CHR$(27) THEN
			 itemnum = 0
			 col = 27
			 EXIT SUB
			 END IF
		IF a$ = CHR$(13) THEN
			 col = 13
			 itemnum = item
			 EXIT SUB
			 END IF
		IF LEN(a$) > 1 THEN
			 a = ASC(RIGHT$(a$, 1))
			 IF a = 73 THEN menu = menu - 9: item = menu
			 IF a = 81 THEN menu = menu + 9: item = menu
			 IF a = 71 THEN menu = 1: item = 1
			 IF a = 72 THEN
					IF item = menu THEN menu = menu - 9
					item = item - 1
					END IF
			 IF a = 80 THEN
					IF item = menu + 9 THEN menu = menu + 9
					item = item + 1
					END IF
			 IF a = 79 THEN menu = lastitem + 1
			 END IF
		IF LEN(a$) = 1 THEN
			 a$ = UCASE$(a$)
			 a = item
			 FOR border = 3 TO (lastitem + 2)
					 IF a$ = LEFT$(box$(border), 1) THEN
							item = border - 2: menu = border - 2
							EXIT FOR
							END IF
					 NEXT border
			 END IF
		IF menu > lastitem THEN
			 menu = lastitem - 9
			 item = lastitem
			 END IF
		IF menu < 1 THEN menu = 1
		IF item < 1 THEN item = 1
		IF item > lastitem THEN item = lastitem
		COLOR bcolor + 8, mcolor, 0
		box = menu
		FOR border = 1 TO 10
				LOCATE row + 2 + border, col + 1, 0
				IF box > lastitem THEN
					 PRINT STRING$(menuwidth, 32);
					 ELSE
					 IF box = item THEN COLOR 7, 0, 0
					 PRINT " "; box$(box + 2); " ";
					 COLOR bcolor + 8, mcolor, 0
					 box = box + 1
					 END IF
				NEXT border
		WEND
		itemnum = item
END SUB

SUB LoadMode
	SHARED doctxt() AS STRING, filespec$, bcolor, fcolor, linelen
	SHARED scrncol, scrnline, edline

	FOR edline = 1 TO UBOUND(doctxt, 1)
			doctxt(edline) = ""
			NEXT edline
	IF scrncol = -1 THEN
		 scrncol = 1
		 GOTO LoadFile
		 END IF
	CALL FileDir
	a$ = "Y"
	CALL InputBox("Load " + filespec$ + "?", 1, 35, 8, 0, a$)
	IF a$ = CHR$(27) OR UCASE$(a$) = "N" THEN
		 edline = 1
		 EXIT SUB
		 END IF
LoadFile:
	OPEN "I", 1, filespec$
		edline = 1
		WHILE NOT EOF(1) AND edline < UBOUND(doctxt, 1)
				a$ = INPUT$(1, #1)
				IF a$ = CHR$(13) THEN a$ = " "
				IF a$ <> CHR$(10) THEN doctxt(edline) = doctxt(edline) + a$
				IF a$ = " " AND LEN(doctxt(edline)) > linelen THEN
					 doctxt(edline) = doctxt(edline) + a$
					 el = LEN(doctxt(edline))
					 IF el > linelen THEN el = linelen
					 b = 0
					 FOR t = el TO 1 STEP -1
							 IF MID$(doctxt(edline), t, 1) = " " THEN
									b = t
									EXIT FOR
									END IF
							 NEXT t
					 IF b <> 0 THEN
					   b$ = LTRIM$(RIGHT$(doctxt(edline), LEN(doctxt(edline)) - (b)))
							doctxt(edline) = LEFT$(doctxt(edline), b)
							edline = edline + 1
							doctxt(edline) = RTRIM$(b$) + " "
							ELSE
							edline = edline + 1
							END IF
					 END IF
				IF a$ = CHR$(10) THEN
					 doctxt(edline) = RTRIM$(doctxt(edline)) + CHR$(255)
					 edline = edline + 1
					 COLOR bcolor, fcolor
					 LOCATE 1, 65
					 PRINT USING "###"; edline;
					 END IF
				WEND
		CLOSE #1
	scrnline = 3: scrncol = 1: edline = 1
END SUB

SUB MainScreen
	SHARED fcolor, bcolor, mcolor, menubar$
	SHARED filespec$, linelen

	SCREEN 0, 0, 0, 0
	VIEW PRINT
	COLOR fcolor, bcolor
	WIDTH 80
	CLS
BoxDraw:
	COLOR bcolor + 8, mcolor
	LOCATE 1, 1: PRINT menubar$;
	COLOR mcolor, bcolor
	LOCATE 2, 1
	FOR t = 1 TO 80
		a$ = "-"
		IF t / 5 = INT(t / 5) THEN a$ = "|"
		IF t / 10 = INT(t / 10) THEN a$ = RIGHT$(STR$(t / 10), 1)
		IF t = INT(linelen / 2) THEN a$ = CHR$(23)
		PRINT a$;
		NEXT t
	COLOR bcolor, mcolor
	LOCATE 2, linelen: PRINT "]";
	LOCATE 24, 1:
	PRINT "  "; RIGHT$(SPACE$(12) + RTRIM$(filespec$), 12); TAB(30);
	PRINT "Text Rite 2.24(c) 1992, Student Oriented Software  ";
	COLOR mcolor + 8, bcolor
	LOCATE 25, 45, 0: PRINT "Date: "; DATE$;
	LOCATE 25, 65: PRINT "Time: "; TIME$;
	LOCATE 25, 3: COLOR bcolor, mcolor
	PRINT "ESC";
	COLOR mcolor, bcolor
	PRINT " - (Escape) to Exit any Menu";
	VIEW PRINT 3 TO 23
END SUB

SUB MakeMenu
	SHARED menu$(), menubar$

' CALLed by:  Menuz.bas

	'=====> Menu, options (10 Max)      <=====
	' menu$(x,0)   --->  Menu Name
	' menu$(x,1)   --->  Last Item's *REAL* Number (item + 2)
	' menu$(x,2)   --->  Menu Width (Same as LEN of longest item)
 
	' menu$(0, 0) = "F1-Help"
	' menu$(0, 3) = "Index"

	menu$(1, 0) = "F2-Edit"
	menu$(1, 3) = "Block Define"
	menu$(1, 4) = STRING$(13, 196)
	menu$(1, 5) = "Copy Block"
	menu$(1, 6) = "Paste Block"
	menu$(1, 7) = "Delete Block"
	menu$(1, 8) = STRING$(13, 196)
	menu$(1, 9) = "Find"
	menu$(1, 10) = "Replace"
	

	menu$(5, 0) = "F6-Print"
	menu$(5, 3) = "Print"
	menu$(5, 4) = "Setup"

	menu$(4, 0) = "F5-Format"
	menu$(4, 3) = "Center"
	menu$(4, 4) = "Left"
	menu$(4, 5) = "Right"
 
	menu$(2, 0) = "F3-Options"
	menu$(2, 3) = "Line Length"
	menu$(2, 4) = STRING$(16, 196)
	menu$(2, 5) = "Text Color"
	menu$(2, 6) = "Background Color"
	menu$(2, 7) = "Menu Color"
	menu$(2, 8) = STRING$(16, 196)
	menu$(2, 9) = "Defaults"
 
	menu$(6, 0) = "F7-File"
	menu$(6, 3) = "New"
	menu$(6, 4) = "Load"
	menu$(6, 5) = "Save"
	menu$(6, 6) = STRING$(6, 196)
	menu$(6, 7) = "Delete"
	menu$(6, 8) = STRING$(6, 196)
	menu$(6, 9) = "X Exit"
 
	menu$(10, 0) = "Colors"
	menu$(10, 3) = "0 Black"
	menu$(10, 4) = "1 Blue"
	menu$(10, 5) = "2 Green"
	menu$(10, 6) = "3 Cyan"
	menu$(10, 7) = "4 Red"
	menu$(10, 8) = "5 Purple"
	menu$(10, 9) = "6 Orange"
	menu$(10, 10) = "7 White"
 
	FOR menu = 0 TO maxmenu
		IF menu < 10 THEN menubar$ = menubar$ + menu$(menu, 0) + "  "
		menu$(menu, 2) = "0"
		FOR item = 3 TO maxitem
			IF menu$(menu, item) <> "" THEN
				 menu$(menu, 1) = STR$(item)
				 IF LEN(menu$(menu, item)) > VAL(menu$(menu, 2)) THEN
						menu$(menu, 2) = STR$(LEN(menu$(menu, item)))
						END IF
				 END IF
			NEXT item
		NEXT menu
	menubar$ = LEFT$(menubar$ + STRING$(70, 32), 80)
END SUB

SUB MenuBox : 'Draws Pull-Down menus using MENU$()
	SHARED menu$(), menucalled, col

	IF col = 0 AND menucalled = 0 THEN EXIT SUB
	COLOR 0, 7, 0
	FOR menu = 3 TO VAL(menu$(menucalled, 1))
		LOCATE menu - 1, col, 0
	   b$ = LEFT$(menu$(menucalled, menu) + STRING$(VAL(menu$(menucalled, 2)) + 1, 32), VAL(menu$(menucalled, 2)) + 1)
		PRINT CHR$(179); " ";
		IF LEFT$(b$, 1) <> CHR$(196) THEN COLOR 15, 0, 0
		PRINT LEFT$(b$, 1);
		COLOR 0, 7, 0
		PRINT RIGHT$(b$, LEN(b$) - 1); CHR$(179);
		COLOR 8, 0, 0
		PRINT CHR$(SCREEN(CSRLIN, POS(0)))
		COLOR 0, 7, 0
		NEXT menu
	LOCATE VAL(menu$(menucalled, 1)), col
	PRINT CHR$(192); STRING$(VAL(menu$(menucalled, 2)) + 2, 196); CHR$(217);
	COLOR 8, 0, 0
	PRINT CHR$(SCREEN(CSRLIN, POS(0)))
	LOCATE VAL(menu$(menucalled, 1)) + 1, col + 1
	FOR menu = 1 TO (VAL(menu$(menucalled, 2)) + 4)
		PRINT CHR$(SCREEN(CSRLIN, POS(0)));
		NEXT menu
END SUB

SUB MenuCall STATIC
	SHARED menubar$, menu$(), menucalled, item, col
	SHARED fcolor, bcolor, mcolor, linelen, newscrn
	SHARED scandir() AS STRING * 12
	SHARED ibox$(), filespec$, scrncol
	SHARED blockmode, pasteallow

	DO
		 IF menucalled < 10 THEN
			 PCOPY 0, 1:                        ' Copy non-menu screen into RAM
				col = INSTR(1, menubar$, menu$(menucalled, 0)) - 1
				END IF
	    SCREEN 0, 0, 1, 1:                    ' Menu's use Screen 1 to save
	    COLOR 7, 0, 0:                        '  original display (Screen 0)
		 item = 2
	    xitmenu = 0:                          ' Remain in menus until Exit
		 CALL MenuBox
		 IF menucalled = 0 AND col = 0 THEN
				SCREEN 0, 0, 0, 0
				COLOR fcolor, bcolor
				EXIT SUB
				END IF

SelectItem:
		 a = 0:                                  ' No key pressed yet
	    DO UNTIL (a = 13 OR a = 27 OR (LEN(a$) > 1 AND (a = 77 OR a = 75)))
				a$ = "": a = 0
				WHILE a$ = ""
					a$ = UCASE$(INKEY$)
					COLOR mcolor + 8, bcolor
					LOCATE 25, 45, 0: PRINT "Date: "; DATE$;
					LOCATE 25, 65: PRINT "Time: "; TIME$;
					WEND
				a = ASC(RIGHT$(a$, 1))
				IF LEN(a$) > 1 THEN
' =====>  Special Key Pressed <=====
					 IF a = 77 OR a = 75 THEN
							DO
								 IF a = 77 THEN
								menucalled = menucalled + 1 + ((menucalled > 8) * 10)
										ELSE
								menucalled = menucalled - 1 - ((menucalled < 1) * 10)
										END IF
								 LOOP WHILE menu$(menucalled, 0) = ""
							xitmenu = 0
							END IF
					 IF a = 80 OR a = 72 THEN
							item = item - (a = 80) + (a = 72)
							IF item < 3 THEN item = VAL(menu$(menucalled, 1))
							IF item > VAL(menu$(menucalled, 1)) THEN item = 3
							IF LEFT$(menu$(menucalled, item), 1) = CHR$(196) THEN
								 item = item - (a = 80) + (a = 72)
								 END IF
							CALL MenuBox
							LOCATE item - 1, col + 1, 0
					   b$ = LEFT$(" " + menu$(menucalled, item) + STRING$(VAL(menu$(menucalled, 2)) + 1, 32), VAL(menu$(menucalled, 2)) + 2)
					   IF menucalled <> 10 OR (menucalled = 10 AND (item = 10 OR item = 3)) THEN
								 COLOR 7, 0: PRINT b$; : COLOR 0, 7
								 ELSE
						   COLOR 0, VAL(menu$(menucalled, item)): PRINT b$: COLOR 0, 7
								 END IF
							END IF
					 END IF
		 ' =====>  Letter Pressed  <=====
		 IF (a <> 27 AND a <> 13) AND (LEN(a$) = 1) THEN
				a = item
				FOR menu = (item + 1) TO maxitem
					IF a$ = LEFT$(menu$(menucalled, menu), 1) THEN
						 item = menu
						 EXIT FOR
						 END IF
					NEXT menu
				IF a = item THEN
					 FOR menu = 3 TO item
						 IF a$ = LEFT$(menu$(menucalled, menu), 1) THEN
								item = menu
								EXIT FOR
								END IF
						 NEXT menu
					 END IF
				CALL MenuBox
				IF item > 2 THEN
					 LOCATE item - 1, col + 1, 0
				 b$ = LEFT$(" " + menu$(menucalled, item) + STRING$(VAL(menu$(menucalled, 2)) + 1, 32), VAL(menu$(menucalled, 2)) + 2)
				 IF menucalled <> 10 OR (menucalled = 10 AND (item = 10 OR item = 3)) THEN
							COLOR 7, 0: PRINT b$; : COLOR 0, 7
							ELSE
					   COLOR 0, VAL(menu$(menucalled, item)): PRINT b$: COLOR 0, 7
							END IF
					 END IF
				END IF
		 LOOP
' =====>  Item Selected  <=====
	    IF a = 27 THEN xitmenu = 1: ' ESC menu item selected, so menus will be left
		 IF a = 13 THEN
				xitmenu = 1
				IF item > 2 THEN choice$ = menu$(menucalled, item)
				IF menucalled = 10 THEN
					 IF choice$ = "0 Black" THEN a = 0
					 IF choice$ = "1 Blue" THEN a = 1
					 IF choice$ = "2 Green" THEN a = 2
					 IF choice$ = "3 Cyan" THEN a = 3
					 IF choice$ = "4 Red" THEN a = 4
					 IF choice$ = "5 Purple" THEN a = 5
					 IF choice$ = "6 Orange" THEN a = 6
					 IF choice$ = "7 White" THEN a = 7
					 IF rcolor = 1 AND (a <> bcolor) THEN fcolor = a
					 IF rcolor = 2 AND (a <> fcolor) THEN bcolor = a
					 IF rcolor = 4 AND (a <> bcolor) THEN mcolor = a
					 COLOR fcolor, bcolor
					 EXIT SUB
					 END IF
				IF menucalled = 1 THEN
					 IF choice$ = "Block Define" THEN
							blockmode = 1
							menu$(1, 3) = "Block End   "
							END IF
					 IF choice$ = "Block End   " THEN
							blockmode = 0
							menu$(1, 3) = "Block Define"
							END IF
					 IF choice$ = "Copy Block" THEN
							' Set the value docbuffer(0) = lines in buffer
							' then copy into docbuffer (1+) BlockBegin -> BlockEnd
							' (copy into buffer in case of delete)
							END IF
					 IF choice$ = "Delete Block" THEN
							' Use the DelLine sub to delete lines
							' from BlockBegin to BlockEnd,
							' storing text in docbuffer() same as Copy Block
							END IF
					 IF choice$ = "Paste Block" THEN
							' Use InsLine(0) to insert # lines in docbuffer(0)
							' copy text from docbuffer(1+) in blank lines
							END IF
					 IF choice$ = "Find" THEN
							CALL FindRepl(0)
							newscrn = 1
							END IF
					 IF choice$ = "Replace" THEN
							CALL FindRepl(1)
							newscrn = 1
							END IF
					 END IF
				IF menucalled = 5 THEN
					 IF choice$ = "Print" THEN CALL PrintMode(0)
					 IF choice$ = "Setup" THEN CALL PrintMode(1)
					 END IF
				IF menucalled = 4 THEN
					 IF choice$ = "Center" THEN CALL PosText(1)
					 IF choice$ = "Left" THEN CALL PosText(0)
					 IF choice$ = "Right" THEN CALL PosText(2)
					 END IF
				IF menucalled = 2 THEN
					 newscrn = 1
					 IF choice$ = "Line Length" THEN
							a$ = "60"
							CALL SaveMode
							CALL InputBox("New Line Length:", 3, 35, 8, 0, a$)
							linelen = VAL(a$)
							IF linelen < 15 OR linelen > 79 THEN linelen = 60
							IF RTRIM$(filespec$) <> "<NONE>" THEN
								 scrncol = -1
								 CALL LoadMode
								 END IF
							END IF
					 IF choice$ = "Defaults" THEN
							fcolor = 3: bcolor = 0: mcolor = 7
							linelen = 60
							END IF
					 IF INSTR(choice$, "Color") > 0 THEN
							IF INSTR(choice$, "Back") > 0 THEN rcolor = 2
							IF INSTR(choice$, "Text") > 0 THEN rcolor = 1
							IF INSTR(choice$, "Menu") > 0 THEN rcolor = 4
							menucalled = 10: 'Color Menu
					   col = INSTR(1, menubar$, menu$(2, 0)) + VAL(menu$(2, 2)) + 2
							CALL MenuBox
							xitmenu = 0: ' ====>  Remain in Menuing system <=====
							END IF
					 END IF
				IF menucalled = 6 THEN
					 IF choice$ = "New" THEN
							CALL NewFile
							newscrn = 1
							END IF
					 IF choice$ = "Load" THEN
							CALL LoadMode
							newscrn = 1
							END IF
					 IF choice$ = "Save" THEN
							CALL SaveMode
							END IF
					 IF choice$ = "Delete" THEN
							CALL DelFile
							END IF
					 IF choice$ = "X Exit" THEN
							VIEW PRINT: CLS
							END
							END IF
					 END IF
				END IF
' Exit Menus
		 SCREEN 0, 0, 0, 0
		 COLOR fcolor, bcolor
		 a$ = ""
	LOOP WHILE xitmenu = 0
END SUB

SUB NewFile
	SHARED doctxt() AS STRING, scrnline, scrncol, filespec$, edline

	filespec$ = "<New File>"
	FOR edline = 1 TO UBOUND(doctxt, 1)
			doctxt(edline) = ""
			NEXT edline
	edline = 1: scrnline = 3: scrncol = 1
END SUB

SUB NewText (edline)
	SHARED doctxt() AS STRING, fcolor, bcolor, mcolor
	SHARED blockbeg, blockbch, blockend, blockech
	SHARED blockmode

	COLOR fcolor, bcolor, mcolor
	CLS 2
	FOR t = edline TO edline + 20
		LOCATE t - edline + 3, 1
		IF t < UBOUND(doctxt, 1) THEN
			 COLOR fcolor, bcolor, mcolor
			 IF blockmode <> 0 THEN
					IF t = blockbeg OR t = blockend THEN
						 FOR a = 1 TO LEN(doctxt(t))
						 COLOR fcolor, bcolor
					IF (t = blockbeg AND t = blockend) AND (a >= blockbch AND a <= blockech) THEN
								COLOR bcolor, fcolor
								END IF
					IF (t = blockbeg AND a >= blockbch) AND t <> blockend THEN
								COLOR bcolor, fcolor
								END IF
					IF (t = blockend AND a <= blockech) AND t <> blockbeg THEN
								COLOR bcolor, fcolor
								END IF
						 PRINT MID$(doctxt(t), a, 1);
						 NEXT a
						 END IF
					IF t <> blockbeg AND t <> blockend THEN
					IF t > blockbeg AND t < blockend THEN COLOR bcolor, fcolor
						 PRINT doctxt(t);
						 END IF
					ELSE
					COLOR fcolor, bcolor
					PRINT doctxt(t);
					END IF
			 END IF
		NEXT t
END SUB

SUB PosText (itemnum)
	SHARED doctxt() AS STRING, edline, linelen, bcolor, fcolor, scrnline

	SCREEN 0, 0, 0, 0
	LOCATE scrnline, 1
	CALL SaveLine
	doctxt(edline) = LTRIM$(doctxt(edline))
	doctxt(edline) = RTRIM$(doctxt(edline))
	IF RIGHT$(doctxt(edline), 1) = CHR$(255) THEN
		 doctxt(edline) = LEFT$(doctxt(edline), LEN(doctxt(edline)) - 1)
		 END IF
	IF itemnum = 1 THEN
		 a$ = SPACE$((linelen / 2) - (LEN(doctxt(edline)) / 2) - 1)
		 doctxt(edline) = a$ + doctxt(edline)
		 END IF
	IF itemnum = 2 THEN
		 a$ = SPACE$(linelen - LEN(doctxt(edline)))
		 doctxt(edline) = a$ + doctxt(edline)
		 END IF
	doctxt(edline) = doctxt(edline) + CHR$(255)
	COLOR fcolor, bcolor
	LOCATE scrnline, 1
	PRINT SPACE$(79);
	LOCATE scrnline, 1
	PRINT doctxt(edline);
END SUB

SUB PrintMode (itemnum) STATIC
	SHARED doctxt() AS STRING, linelen, fcolor, bcolor
 
	IF pglines = 0 THEN pglines = 60
	IF topmar = 0 THEN topmar = 3
	IF btmar = 0 THEN btmar = 9
	IF startnum = 0 THEN startnum = 1
	IF leftmar = 0 THEN leftmar = 40 - (linelen / 2)
 
	IF itemnum = 1 THEN
	    CALL PrintSetup(pglines, topmar, btmar, leftmar, startnum, nummode)
		 EXIT SUB
		 END IF

	prnout = pglines - (topmar + btmar)
	pgnum = startnum - 1
	FOR edline = 1 TO UBOUND(doctxt, 1)
			IF RTRIM$(doctxt(edline)) <> "" THEN b = edline
			NEXT edline
	FOR counter = 1 TO topmar
			IF counter = 1 AND nummode > 1 AND nummode < 4 THEN
				 pgnum = pgnum + 1
				 IF nummode = 1 THEN LPRINT SPACE$(linelen); pgnum
				 IF nummode = 2 THEN LPRINT SPACE$(39); pgnum
				 IF nummode = 3 THEN LPRINT SPACE$(leftmar); pgnum
				 ELSE
				 LPRINT
				 END IF
			NEXT counter
	FOR edline = 1 TO b
			COLOR bcolor, fcolor
			LOCATE 1, 65
			PRINT USING "###"; edline;
		  LPRINT SPACE$(leftmar); LEFT$(doctxt(edline), LEN(doctxt(edline)) - 1)
			IF (edline / prnout) = INT(edline / prnout) THEN
				 IF btmar > 2 AND nummode > 3 THEN
						pgnum = pgnum + 1
						LPRINT
						IF nummode = 4 THEN LPRINT SPACE$(linelen); pgnum
						IF nummode = 5 THEN LPRINT SPACE$(39); pgnum
						END IF
				 LPRINT CHR$(12);
				 FOR counter = 1 TO topmar
						 IF counter = 1 AND nummode > 1 AND nummode < 4 THEN
								pgnum = pgnum + 1
								IF nummode = 1 THEN LPRINT SPACE$(linelen); pgnum
								IF nummode = 2 THEN LPRINT SPACE$(39); pgnum
								IF nummode = 3 THEN LPRINT SPACE$(leftmar); pgnum
								ELSE
								LPRINT
								END IF
						 NEXT counter
				 END IF
			NEXT edline
	IF nummode > 3 AND (edline / prnout <> INT(edline / prnout)) THEN
		 edline = edline - 1
		 WHILE (edline / prnout) <> INT(edline / prnout)
				 LPRINT
				 edline = edline + 1
				 WEND
		 IF btmar > 2 THEN
				pgnum = pgnum + 1
				LPRINT
				IF nummode = 4 THEN LPRINT SPACE$(linelen); pgnum
				IF nummode = 5 THEN LPRINT SPACE$(39); pgnum
				END IF
		 END IF
	LPRINT CHR$(12);
END SUB

SUB PrintSetup (pglines, topmar, btmar, leftmar, startnum, nummode)
SHARED ibox$()

		 REDIM ibox$(9)
		 ibox$(0) = "Printer Options"
		 ibox$(1) = "8"
		 ibox$(2) = "15"
		 ibox$(3) = "Lines Per Page "
		 ibox$(4) = "Top Margin     "
		 ibox$(5) = "Bottom Margin  "
		 ibox$(6) = "Left Margin    "
		 ibox$(7) = "Page Numbering "
		 item = 1
		 CALL ItemBox(ibox$(), 21, 2, item)
		 IF item = 0 THEN EXIT SUB
		 IF item = 1 THEN
				ibox$(0) = "Lines Per Page"
				ibox$(1) = "9"
				ibox$(2) = "31"
				ibox$(3) = "66  - Letter Regular/Portrait  "
				ibox$(4) = "88  - Letter Condensed/Portrait"
				ibox$(5) = "84  - Legal Regular/Portrait   "
				ibox$(6) = "112 - Legal Condensed/Portrait "
				ibox$(7) = "51  - Landscape Regular        "
				ibox$(8) = "68  - Landscape Condensed      "
				item = 1
				CALL ItemBox(ibox$(), 39, 4, item)
				IF item = 0 THEN EXIT SUB
				pglines = VAL(ibox$(item + 2))
				EXIT SUB
				END IF
		 IF item = 2 THEN
				ibox$(0) = "Top Margin"
				ibox$(1) = "10"
				ibox$(2) = "27"
				ibox$(3) = "0  - No Top Margin         "
				ibox$(4) = "2  - 1/3-inch  or  1/4-inch"
				ibox$(5) = "4  - 2/3-inch  or  1/2-inch"
				ibox$(6) = "6  -   1-inch  or  3/4-inch"
				ibox$(7) = "8  - 1.3-inch  or    1-inch"
				ibox$(8) = "10 - 1.6-inch  or 1.25-inch"
				ibox$(9) = "12 -   2-inch  or  1.5-inch"
				item = 1
				CALL ItemBox(ibox$(), 39, 4, item)
				IF item = 0 THEN EXIT SUB
				topmar = VAL(ibox$(item + 2))
				EXIT SUB
				END IF
		 IF item = 3 THEN
				ibox$(0) = "Bottom Margin"
				ibox$(1) = "10"
				ibox$(2) = "27"
				ibox$(3) = "0  - No Bottom Margin      "
				ibox$(4) = "2  - 1/3-inch  or  1/4-inch"
				ibox$(5) = "4  - 2/3-inch  or  1/2-inch"
				ibox$(6) = "6  -   1-inch  or  3/4-inch"
				ibox$(7) = "8  - 1.3-inch  or    1-inch"
				ibox$(8) = "10 - 1.6-inch  or 1.25-inch"
				ibox$(9) = "12 -   2-inch  or  1.5-inch"
				item = 1
				CALL ItemBox(ibox$(), 39, 4, item)
				IF item = 0 THEN EXIT SUB
				btmar = VAL(ibox$(item + 2))
				EXIT SUB
				END IF
		 IF item = 4 THEN
				mar$ = STR$(leftmar / 10)
				CALL InputBox("Left Margin?", 5, 24, 14, 0, mar$)
				IF INSTR(mar$, CHR$(27)) > 0 THEN EXIT SUB
				leftmar = VAL(mar$) * 10
				EXIT SUB
				END IF
		 IF item = 5 THEN
				ibox$(0) = "Page Numbering"
				ibox$(1) = "10"
				ibox$(2) = "27"
				ibox$(3) = "0  - No Page Numbering     "
				ibox$(4) = "1  - Top Right Corner      "
				ibox$(5) = "2  - Top Center            "
				ibox$(6) = "3  - Top Left Corner       "
				ibox$(7) = "4  - Bottom Right Corner   "
				ibox$(8) = "5  - Bottom Center         "
				ibox$(9) = "New Starting Page Number   "
				item = 1
				CALL ItemBox(ibox$(), 39, 4, item)
				IF item = 0 THEN EXIT SUB
				IF item = 7 THEN
					 ans$ = STR$(startnum)
					 CALL InputBox("Starting Page Number?", 5, 24, 14, 0, ans$)
					 IF INSTR(ans$, CHR$(27)) > 0 THEN EXIT SUB
					 startnum = VAL(ans$)
					 EXIT SUB
					 END IF
				nummode = VAL(ibox$(item + 2))
				EXIT SUB
				END IF
END SUB

SUB SaveLine
	SHARED scrnline, edline, doctxt() AS STRING
 
	IF edline = UBOUND(doctxt, 1) THEN BEEP: EXIT SUB
	doctxt(edline) = ""
	FOR t = 1 TO 80
			doctxt(edline) = doctxt(edline) + CHR$(SCREEN(scrnline, t))
			NEXT t
	doctxt(edline) = RTRIM$(doctxt(edline))
END SUB

SUB SaveMode
	SHARED doctxt() AS STRING, filespec$, bcolor, fcolor
 
	b$ = filespec$
	CALL InputBox("File Name?", 60, 10, 8, 0, filespec$)
	IF filespec$ = CHR$(27) OR RTRIM$(filespec$) = "<NONE>" THEN
		 filespec$ = b$
		 EXIT SUB
		 END IF
	FOR edline = 1 TO UBOUND(doctxt, 1)
			IF RTRIM$(doctxt(edline)) <> "" THEN b = edline
			NEXT edline
	OPEN filespec$ FOR OUTPUT AS #1
	FOR edline = 1 TO b
			COLOR bcolor, fcolor
			LOCATE 1, 65
			PRINT USING "###"; edline;
			b$ = RTRIM$(doctxt(edline))
			IF RIGHT$(b$, 1) = CHR$(255) THEN
				 b$ = LEFT$(b$, LEN(b$) - 1) + CHR$(13) + CHR$(10)
				 ELSE
				 b$ = b$ + " "
				 END IF
			PRINT #1, b$;
			NEXT edline
	CLOSE #1
	SCREEN 0, 0, 0, 1
	LOCATE 24, 3
	PRINT LEFT$(filespec$ + SPACE$(12), 12);
	SCREEN 0, 0, 1, 1
END SUB

SUB TextWrap
	SHARED a$, linelen, scrnline, scrncol, edline, doctxt() AS STRING

	c$ = a$: ' Store last character typed in holder
	a$ = ""
	x = 1

    WHILE SCREEN(scrnline, linelen - x) <> 32 AND SCREEN(scrnline, linelen - x) <> 45
		x = x + 1
		 IF x > linelen THEN
				BEEP: BEEP
				scrncol = scrncol - 1
				EXIT SUB
				END IF
		WEND
	el = linelen - x: ' Line Length
	b$ = ""
	FOR t = 1 TO el
			IF CHR$(SCREEN(scrnline, t)) <> CHR$(255) THEN
				 b$ = b$ + CHR$(SCREEN(scrnline, t))
				 END IF
			NEXT t
	FOR t = el + 1 TO 80
			IF CHR$(SCREEN(scrnline, t)) <> CHR$(255) THEN
				 a$ = a$ + CHR$(SCREEN(scrnline, t))
				 END IF
			NEXT t
	a$ = RTRIM$(a$)
	a$ = a$ + c$
	LOCATE CSRLIN, 1: PRINT SPACE$(79)
	LOCATE CSRLIN - 1, 1: PRINT b$; SPACE$(80 - el)
	CALL SaveLine
	IF edline < UBOUND(doctxt, 1) THEN
		 scrncol = LEN(a$) + 1
		 edline = edline + 1
		 a$ = a$ + " " + doctxt(edline)
		 END IF
	scrnline = scrnline + 1
	IF scrnline > 23 THEN scrnline = 23
END SUB
