IDENTIFICATION DIVISION.
PROGRAM-ID.    UIF310.
AUTHOR.        R. Poynter.
INSTALLATION.  FLEETWOOD ENTERPRISES, INC.
DATE-WRITTEN.  15-MAR-84.

******************************************************************************
*
* PROGRAM FUNCTIONS:  User Interface Screen Handler.  This subprogram will
*		      display all user menus.  It will validate user choices
*		      of both menus and transactions and perform security 
*		      checks on transactions. After validation of the
*		      user's input, it will either call itself to display
*		      another menu, or it will call the Transaction Processor
*		      once it determines that a valid transaction has been
*		      entered.  It will also determine what to do about errors
*		      returned from the Transaction Processor.
*
* PROGRAM OPTIONS:  None.
*
* PROGRAM MODIFICATIONS:
*
*	AUTHOR	T. MOORE
*	DATE	20-MAR-86
*	VERSION	1-G
*
*	PROGRAM CHANGES:
*		Do not call SCPER with the SUBMITTED message, call SCPEN
*		instead (in order to save type-ahead buffer)
*
******************************************************************************
/

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER.  VAX-11.
OBJECT-COMPUTER.  VAX-11.
SPECIAL-NAMES.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
	SELECT UIF-MASTER-FILE
		ASSIGN TO DISK
		ORGANIZATION IS INDEXED
		ACCESS MODE IS DYNAMIC.
	SELECT UIF-SECURITY-FILE
		ASSIGN TO DISK
		ORGANIZATION IS INDEXED
		ACCESS MODE IS RANDOM.
/

DATA DIVISION.
FILE SECTION.
FD  UIF-MASTER-FILE
	COPY "UIF-MASTER-FD" OF "LIB:UIFLIB.TLB".
	COPY "MASTER-RECORD" OF "LIB:UIFLIB.TLB".
/

FD  UIF-SECURITY-FILE
	COPY "UIF-SECURITY-FD" OF "LIB:UIFLIB.TLB".
	COPY "SECURITY-RECORD" OF "LIB:UIFLIB.TLB".
/

WORKING-STORAGE SECTION.

01	PROG-ID					PIC X(09)
	VALUE "UIF310-1G".

	COPY "SCOPE-STATUS-RECORD" OF "LIB:SCPLIB.TLB".
/

	COPY "FORM-UIF310SCR" OF "LIB:UIFLIB.TLB".
/

01	CLEAR-SCREEN			COMP	PIC S9(9)	VALUE 1.

01	DO-NOT-CLEAR-SCREEN		COMP	PIC S9(9)	VALUE ZERO.

01	ERROR-MSG				PIC X(80).

01	SCOPE-ERROR-NO-DISPLAY			PIC -Z(9)9(1).

01	TRANSACTION-SCOPE-ERROR-NO	COMP	PIC S9(5).

01	HOLD-MENU-TRANS				PIC X(9).

01	SUBROUTINE-RETURN-STATUS	COMP	PIC S9(9).
	88  ERROR-UNDEFINED-SYMBOL				VALUE 2.
	88  ERROR-UNDEFINED-SYMBOL-TYPE				VALUE 4.
	88  ERROR-NO-TRANSACTION-FILE				VALUE 6.
	88  ERROR-NO-SCOPE-FILE					VALUE 8.
	88  ERROR-SCOPE-ERROR					VALUE 10.
	88  ERROR-SCOPE-VALIDITY-CHECK				VALUE 12.
	88  ERROR-NO-SYMBOLS					VALUE 14.
	88  ERROR-NO-PROCESSING					VALUE 16.
	88  ERROR-NO-SYMBOL-FILE				VALUE 18.
	88  ERROR-IN-SPECIAL-PROCESS				VALUE 20.
	88  ERROR-MENU						VALUE 22.

01	SUBROUTINE-STATUS-DISPLAY		PIC -Z(9)9(1).

01	SWITCH-RECORD.
	05  INVALID-KEY-SW			PIC X(1)	VALUE "N".
	    88  NO-INVALID-KEY					VALUE "N".
	    88  INVALID-KEY					VALUE "Y".
	05  EXIT-SW				PIC X(1)	VALUE "N".
	    88  DONE						VALUE "Y".
	    88  TOP-LEVEL-MENU					VALUE "T".
	    88  FIRST-TIME					VALUE "F".
	    88  NOT-DONE					VALUE "N".
	05  TRANSACTION-SW			PIC X(1)	VALUE "N".
	    88  TRANSACTION					VALUE "T".
	    88  USER						VALUE "U".
	    88  NOT-TRANSACTION					VALUE "M".
	05  PREVIOUS-MENU-SW			PIC X(1)	VALUE "N".
	    88  PREVIOUS-MENU					VALUE "Y".
	    88  NOT-PREVIOUS-MENU				VALUE "N".
	05  CHOICE-VALID-SW			PIC X(1)	VALUE "N".
	    88  CHOICE-VALID					VALUE "Y".
	    88  CHOICE-NOT-VALID				VALUE "N".
	05  CAPTIVE-SW				PIC X(1)	VALUE "N".
	    88  NOT-CAPTIVE					VALUE "N".
	    88  CAPTIVE						VALUE "Y".

01	MENU-CHOICE				PIC X(9).
01	MENU-NUMBER REDEFINES MENU-CHOICE.
	05  MENU-NUMERIC			PIC 9(2).
	05  MENU-FILLER				PIC X(7).
01	MENU-ALTERNATE REDEFINES MENU-CHOICE.
	05  MENU-CHAR OCCURS 9 TIMES		PIC X(1).

01	DIGIT					PIC S9(4) 	COMP.

01	COUNTER					PIC 9(02).

01	CNT-CHARACTERS				PIC S9(9)	COMP.

*
*	This record MUST always look exactly like MASTER-RECORD.
*
01	WS-MASTER-RECORD.
	05  WS-MASTER-PRIMARY-KEY.
	    10  WS-MASTER-RECORD-NAME		PIC X(9).
	    10  WS-MASTER-RECORD-TYPE		PIC X.
	05  WS-MASTER-RECORD-ACCESS-COUNT
	    				COMP	PIC S9(4).
	05  WS-MASTER-TRANSACTION.
	    10  WS-MASTER-TRANSACTION-DESC	PIC X(60).
	    10  WS-MASTER-TRANSACTION-TYPE	PIC X(1).
	    10  WS-MASTER-TRANSACTION-FORM	PIC X(31).
	    10  WS-MASTER-TRANSACTION-SWITCH	PIC X(31).
	    10  FILLER				PIC X(139).
	05  WS-MASTER-MENU REDEFINES WS-MASTER-TRANSACTION.
	    10  WS-MASTER-MENU-TITLE		PIC X(20).
	    10  WS-MASTER-MENU-DESCRIPTION	PIC X(60).
	    10  WS-MASTER-MENU-NODE-CNT	COMP	PIC S9(4).
	    10  WS-MASTER-MENU-NODE		PIC X(9)	
		OCCURS 20 TIMES.

01	WS-USER-RECORD.
	05  WS-USERNAME				PIC X(12)	VALUE SPACES.
	05  WS-TOP-LEVEL-MENU-NAME		PIC X(09)	VALUE SPACES.

01	STACK-RECORD.
	05  MENU-STACK				PIC X(09)	
	    OCCURS 20 TIMES.

01	CALL-LEVEL				PIC 99		VALUE 0.

01	SUBPROCESS-RETURN-STATUS		PIC S9(9)	COMP.

01	WS-ERROR-TYPE				PIC X(01)	VALUE "S".
	88  NO-ERROR				VALUE IS "S".
	88  INFORMATION				VALUE IS "I".
	88  WARNING				VALUE IS "W".
	88  ERRORS				VALUE IS "E".
	88  FATAL				VALUE IS "F".

01	SW-FILES-ARE-OPEN			PIC X(1)	VALUE "N".
	88  FILES-ARE-OPEN			VALUE "Y".
	88  FILES-ARE-NOT-OPEN			VALUE "N".
/

LINKAGE SECTION.

01	LINK-MASTER-RECORD			PIC X(274).

01	USER-RECORD.
	05  USERNAME				PIC X(12).
	05  TOP-LEVEL-MENU-NAME			PIC X(09).

01	LINK-EXIT-SW				PIC X(01).
/
PROCEDURE DIVISION USING LINK-MASTER-RECORD, USER-RECORD, LINK-EXIT-SW.
*******************************************************************************
INITIALIZATION SECTION.
*******************************************************************************

000-INIT.
	MOVE LINK-EXIT-SW TO EXIT-SW.
	IF FIRST-TIME
	    PERFORM 200-OPEN-FILES THRU 200-OPEN-FILES-EXIT
	    SET NOT-PREVIOUS-MENU TO TRUE
	    MOVE EXIT-SW TO LINK-EXIT-SW
	    MOVE 0 TO CALL-LEVEL
	END-IF.
	SET NOT-DONE TO TRUE.
	SET NO-INVALID-KEY TO TRUE.
	INITIALIZE WS-MASTER-RECORD.
	INITIALIZE WS-USER-RECORD.
	MOVE LINK-MASTER-RECORD TO WS-MASTER-RECORD.
	MOVE USER-RECORD TO WS-USER-RECORD.
*
*	Increment stack pointer.
*
	ADD 1 TO CALL-LEVEL.
*
*	Test for stack overflow.
*
	IF CALL-LEVEL > 20
	    DISPLAY "UIF310 - F - INTERNAL STACK OVERFLOW.  CONTACT DP."
	    GO TO 900-EXIT
	END-IF.
*
*	Put current menu (transaction) onto stack.
*
	MOVE WS-MASTER-RECORD-NAME TO MENU-STACK(CALL-LEVEL).
/

*******************************************************************************
MAIN SECTION.
*******************************************************************************
100-START.
*
*	Is it a transaction?
*
	IF WS-MASTER-RECORD-TYPE = "T"
	    MOVE WS-MASTER-RECORD-NAME TO MASTER-RECORD-NAME
	    PERFORM 110-CALL-TRANSACTION-PROCESSOR THRU 110-EXIT
	    MOVE EXIT-SW TO LINK-EXIT-SW
	    GO TO 900-EXIT
	END-IF.

100-POP-OFF-STACK.
	PERFORM 300-SETUP-MENU-RECORD THRU 300-SETUP-MENU-RECORD-EXIT.
/

100-MAIN.
*
*	Display Menu screen and get the user's choice.
*
	PERFORM 400-DISPLAY-SCREEN THRU 400-DISPLAY-SCREEN-EXIT.
*
*	Was it valid?
*
	PERFORM 500-VALIDATE-CHOICE THRU 500-VALIDATE-CHOICE-EXIT.
*
*	Do it.
*
	EVALUATE TRUE
	    WHEN DONE
		MOVE EXIT-SW TO LINK-EXIT-SW
		GO TO 900-EXIT
	    WHEN CHOICE-NOT-VALID
		MOVE "Invalid choice" TO ERROR-MSG
		SET CHOICE-VALID TO TRUE
		GO TO 100-MAIN
	    WHEN TOP-LEVEL-MENU
		MOVE EXIT-SW TO LINK-EXIT-SW
		GO TO 900-EXIT
	    WHEN PREVIOUS-MENU
		GO TO 900-EXIT
	    WHEN TRANSACTION
		MOVE MENU-CHOICE TO MASTER-RECORD-NAME
		MOVE "T" TO MASTER-RECORD-TYPE
		PERFORM 615-READ-MASTER THRU 615-EXIT
		IF INVALID-KEY 
		    MOVE "Master file is corrupt" TO ERROR-MSG
		    GO TO 100-MAIN
		END-IF
		PERFORM 110-CALL-TRANSACTION-PROCESSOR THRU 110-EXIT
		GO TO 100-MAIN
	END-EVALUATE.
	MOVE WS-MASTER-MENU-NODE(MENU-NUMERIC) TO MASTER-PRIMARY-KEY.
	PERFORM 610-READ-NEXT-MASTER THRU 610-EXIT.
	MOVE MASTER-RECORD TO LINK-MASTER-RECORD.
	IF MASTER-RECORD-NAME NOT = WS-MASTER-MENU-NODE(MENU-NUMERIC)
	    SET INVALID-KEY TO TRUE
	END-IF.
	IF DONE OR INVALID-KEY
	    MOVE "Master file is corrupt" TO ERROR-MSG
	    GO TO 100-MAIN
	END-IF.
	MOVE EXIT-SW TO LINK-EXIT-SW.
	CALL "UIF310" USING LINK-MASTER-RECORD,
	    USER-RECORD,LINK-EXIT-SW.
/

105-RETURN.
*
*	Preserve control switch.
*
	MOVE LINK-EXIT-SW TO EXIT-SW.
*
*	Decrement stack pointer.
*
	SUBTRACT 1 FROM CALL-LEVEL.
*
*	Test return switches and status.
*
	IF DONE OR TOP-LEVEL-MENU
	    GO TO 900-EXIT
	END-IF.	
*
*	Everything was OK.  Check the switches and act accordingly.
*
	IF NOT-PREVIOUS-MENU
	    GO TO 100-MAIN
	END-IF.
	SET NOT-PREVIOUS-MENU TO TRUE.
	IF CALL-LEVEL < 2
	    GO TO 900-EXIT
	END-IF.	
*
*	No switches set, so put the user back into the menu he was in.
*
	PERFORM 150-GET-MENU THRU 150-GET-MENU-EXIT.
	IF INVALID-KEY
	    MOVE "Master file is corrupt" TO ERROR-MSG
	    GO TO 100-MAIN
	END-IF.
	GO TO 100-POP-OFF-STACK.
/

*******************************************************************************
SUBROUTINE SECTION.
*******************************************************************************
110-CALL-TRANSACTION-PROCESSOR.
*
*	Reset transaction switch to prevent looping.
*
	SET NOT-TRANSACTION TO TRUE.
	CALL "SCPEN" USING BY DESCRIPTOR "Processing, please wait...".
	PERFORM 800-CHECK-SCOPE-RETURN-FLAG THRU 800-EXIT.
	CALL "SCPRT" USING BY DESCRIPTOR DO-NOT-CLEAR-SCREEN.
	PERFORM 800-CHECK-SCOPE-RETURN-FLAG THRU 800-EXIT.
	CALL "UIF320" USING MASTER-RECORD-NAME, MASTER-TRANSACTION-TYPE,
	    MASTER-TRANSACTION-FORM, MASTER-TRANSACTION-SWITCH, 
	    TRANSACTION-SCOPE-ERROR-NO, SUBPROCESS-RETURN-STATUS
	    GIVING SUBROUTINE-RETURN-STATUS.
*
*	Make sure the screen is redisplayed.
*
	PERFORM 810-INITIALIZE-SCOPE THRU 810-EXIT.
*
*	Test for errors within UIF320.
*
	IF SUBROUTINE-RETURN-STATUS IS SUCCESS
	    IF BATCH-JOB 
		MOVE SPACES TO ERROR-MSG
		IF ERROR-MENU
		    STRING MASTER-RECORD-NAME DELIMITED BY SPACES,
			" not submitted!" DELIMITED BY SIZE
			INTO ERROR-MSG
		ELSE
		    STRING MASTER-RECORD-NAME DELIMITED BY SPACES, 
			" submitted " DELIMITED BY SIZE,
			MASTER-TRANSACTION-SWITCH DELIMITED BY SPACES
			INTO ERROR-MSG
		END-IF
	    END-IF
	    GO TO 110-EXIT
	END-IF.
	PERFORM 115-PROCESS-ERRORS THRU 115-EXIT.
110-EXIT.
	EXIT.
/

115-PROCESS-ERRORS.
*
*	Process the errors from the transaction.  See program documentation
*	for the meaning of each type of error.
*
	EVALUATE TRUE
	    WHEN ERROR-UNDEFINED-SYMBOL
		MOVE "Symbol in .JOB not found in symbol table" TO 
		    ERROR-MSG
	    WHEN ERROR-UNDEFINED-SYMBOL-TYPE
		MOVE "Illegal symbol type in symbol table (must be 9 or X)"
		    TO ERROR-MSG
	    WHEN ERROR-NO-TRANSACTION-FILE
		MOVE SPACES TO ERROR-MSG
		STRING MASTER-RECORD-NAME DELIMITED BY SPACE, 
		    " not implemented yet" DELIMITED BY SIZE INTO ERROR-MSG
	    WHEN ERROR-NO-SCOPE-FILE
		MOVE "SCOPE file (.REC) not found" TO ERROR-MSG
	    WHEN ERROR-SCOPE-ERROR
	        MOVE "SCOPE error found in UIF320" TO ERROR-MSG
	    WHEN ERROR-SCOPE-VALIDITY-CHECK
		MOVE "Validity checking enabled in form" TO ERROR-MSG
	    WHEN ERROR-NO-SYMBOLS
		MOVE "No symbols in symbol table" TO ERROR-MSG
	    WHEN ERROR-NO-PROCESSING
		MOVE "Illegal data items passed to UIF320" TO ERROR-MSG
	    WHEN ERROR-NO-SYMBOL-FILE
		MOVE "Symbol table file not found" TO ERROR-MSG
	    WHEN ERROR-IN-SPECIAL-PROCESS
		MOVE SPACES TO ERROR-MSG
		MOVE SUBROUTINE-RETURN-STATUS TO SUBROUTINE-STATUS-DISPLAY
		STRING "Error in special process: ", 
		    SUBROUTINE-STATUS-DISPLAY DELIMITED BY SIZE INTO ERROR-MSG
	    WHEN ERROR-MENU
		MOVE "Transaction has been aborted" TO ERROR-MSG
	    WHEN OTHER
		MOVE SPACES TO ERROR-MSG
		MOVE SUBROUTINE-RETURN-STATUS TO SUBROUTINE-STATUS-DISPLAY
		STRING "Undefined subroutine return status of ",
		    SUBROUTINE-STATUS-DISPLAY DELIMITED BY SIZE INTO ERROR-MSG
	END-EVALUATE.
115-EXIT.
	EXIT.
/

150-GET-MENU.
*
*	Pop current menu key off of stack.
*
	MOVE MENU-STACK(CALL-LEVEL) TO MASTER-PRIMARY-KEY.
*
*	Get the master record.
*
	PERFORM 610-READ-NEXT-MASTER THRU 610-EXIT.
	IF MENU-STACK(CALL-LEVEL) NOT = MASTER-RECORD-NAME
	    SET INVALID-KEY TO TRUE
	ELSE
	    MOVE MASTER-RECORD TO WS-MASTER-RECORD
	END-IF.
150-GET-MENU-EXIT.
	EXIT.

200-OPEN-FILES.
*
*	Open the TDMS channel and request library and UIF340.MAS.
*
	IF FILES-ARE-NOT-OPEN
	    OPEN INPUT UIF-SECURITY-FILE
	    OPEN INPUT UIF-MASTER-FILE
	    PERFORM 810-INITIALIZE-SCOPE THRU 810-EXIT
	    SET FILES-ARE-OPEN TO TRUE
	END-IF.
200-OPEN-FILES-EXIT.
	EXIT.

210-CLOSE-FILES.
*
*	Close UIF340.MAS and the SCOPE library, etc.
*
	IF FILES-ARE-OPEN
	    CLOSE UIF-MASTER-FILE
	    CLOSE UIF-SECURITY-FILE
	    CALL "SCPRT"
	    SET FILES-ARE-NOT-OPEN TO TRUE
	END-IF.
210-CLOSE-FILES-EXIT.
	EXIT.
/

300-SETUP-MENU-RECORD.
*
*	Setup the record to be mapped to the screen.
*
	MOVE HIGH-VALUES TO FORM-SCR.
	MOVE WS-MASTER-MENU-TITLE TO SCR-MENU-TITLE.
	MOVE PROG-ID TO SCR-MENU-PROG-ID.
	MOVE 0 TO COUNTER.
*
*	DIGIT is the number of lines we wish to display within the menu
*	where DIGIT <= 20.
*
	MOVE WS-MASTER-MENU-NODE-CNT TO DIGIT.
	PERFORM 310-FILL-MENU-LINE THRU 310-FILL-MENU-LINE-EXIT DIGIT TIMES.
300-SETUP-MENU-RECORD-EXIT.
	EXIT.

310-FILL-MENU-LINE.
	ADD 1 TO COUNTER.
	MOVE WS-MASTER-MENU-NODE(COUNTER) TO MASTER-PRIMARY-KEY.
	PERFORM 610-READ-NEXT-MASTER THRU 610-EXIT.
	IF INVALID-KEY OR WS-MASTER-MENU-NODE(COUNTER) NOT = MASTER-RECORD-NAME
	    MOVE "Master file is corrupt" TO ERROR-MSG
	    SET DONE TO TRUE
	    GO TO 310-FILL-MENU-LINE-EXIT
	END-IF.
	PERFORM 320-MOVE-COUNTER-TO-MENU-ITEM THRU 320-EXIT.
*
*	If the line to be displayed is a menu, we only put out a
*	description.  If it is a transaction, we put out the name
*	so that the user can go to it directly after he becomes
*	familiar with it.
*
	IF MASTER-RECORD-TYPE = "M"
	    PERFORM 330-MOVE-MENU-DESC-TO-DESC THRU 330-EXIT
	ELSE
	    PERFORM 335-MOVE-TRANS-DESC-TO-DESC THRU 335-EXIT
	    PERFORM 340-MOVE-TO-MENU-TRANS THRU 340-EXIT
	END-IF.
310-FILL-MENU-LINE-EXIT.
	EXIT.
/

320-MOVE-COUNTER-TO-MENU-ITEM.
	EVALUATE COUNTER
	    WHEN 1	MOVE COUNTER TO SCR-MENU-ITEM-1
	    WHEN 2	MOVE COUNTER TO SCR-MENU-ITEM-2
	    WHEN 3	MOVE COUNTER TO SCR-MENU-ITEM-3
	    WHEN 4	MOVE COUNTER TO SCR-MENU-ITEM-4
	    WHEN 5	MOVE COUNTER TO SCR-MENU-ITEM-5
	    WHEN 6	MOVE COUNTER TO SCR-MENU-ITEM-6
	    WHEN 7	MOVE COUNTER TO SCR-MENU-ITEM-7
	    WHEN 8	MOVE COUNTER TO SCR-MENU-ITEM-8
	    WHEN 9	MOVE COUNTER TO SCR-MENU-ITEM-9
	    WHEN 10	MOVE COUNTER TO SCR-MENU-ITEM-10
	    WHEN 11	MOVE COUNTER TO SCR-MENU-ITEM-11
	    WHEN 12	MOVE COUNTER TO SCR-MENU-ITEM-12
	    WHEN 13	MOVE COUNTER TO SCR-MENU-ITEM-13
	    WHEN 14	MOVE COUNTER TO SCR-MENU-ITEM-14
	    WHEN 15	MOVE COUNTER TO SCR-MENU-ITEM-15
	    WHEN 16	MOVE COUNTER TO SCR-MENU-ITEM-16
	    WHEN 17	MOVE COUNTER TO SCR-MENU-ITEM-17
	    WHEN 18	MOVE COUNTER TO SCR-MENU-ITEM-18
	    WHEN 19	MOVE COUNTER TO SCR-MENU-ITEM-19
	    WHEN 20	MOVE COUNTER TO SCR-MENU-ITEM-20
	END-EVALUATE.
320-EXIT.

330-MOVE-MENU-DESC-TO-DESC.
	EVALUATE COUNTER
	    WHEN 1	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-1
	    WHEN 2	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-2
	    WHEN 3	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-3
	    WHEN 4	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-4
	    WHEN 5	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-5
	    WHEN 6	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-6
	    WHEN 7	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-7
	    WHEN 8	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-8
	    WHEN 9	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-9
	    WHEN 10	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-10
	    WHEN 11	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-11
	    WHEN 12	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-12
	    WHEN 13	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-13
	    WHEN 14	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-14
	    WHEN 15	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-15
	    WHEN 16	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-16
	    WHEN 17	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-17
	    WHEN 18	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-18
	    WHEN 19	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-19
	    WHEN 20	MOVE MASTER-MENU-DESCRIPTION TO SCR-MENU-DESC-20
	END-EVALUATE.
330-EXIT.
	EXIT.
/

335-MOVE-TRANS-DESC-TO-DESC.
	EVALUATE COUNTER
	    WHEN 1	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-1
	    WHEN 2	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-2
	    WHEN 3	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-3
	    WHEN 4	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-4
	    WHEN 5	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-5
	    WHEN 6	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-6
	    WHEN 7	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-7
	    WHEN 8	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-8
	    WHEN 9	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-9
	    WHEN 10	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-10
	    WHEN 11	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-11
	    WHEN 12	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-12
	    WHEN 13	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-13
	    WHEN 14	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-14
	    WHEN 15	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-15
	    WHEN 16	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-16
	    WHEN 17	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-17
	    WHEN 18	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-18
	    WHEN 19	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-19
	    WHEN 20	MOVE MASTER-TRANSACTION-DESCRIPTION TO SCR-MENU-DESC-20
	END-EVALUATE.
335-EXIT.
	EXIT.

340-MOVE-TO-MENU-TRANS.
	EVALUATE COUNTER
	    WHEN 1	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-1
	    WHEN 2	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-2
	    WHEN 3	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-3
	    WHEN 4	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-4
	    WHEN 5	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-5
	    WHEN 6	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-6
	    WHEN 7	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-7
	    WHEN 8	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-8
	    WHEN 9	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-9
	    WHEN 10	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-10
	    WHEN 11	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-11
	    WHEN 12	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-12
	    WHEN 13	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-13
	    WHEN 14	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-14
	    WHEN 15	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-15
	    WHEN 16	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-16
	    WHEN 17	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-17
	    WHEN 18	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-18
	    WHEN 19	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-19
	    WHEN 20	MOVE MASTER-RECORD-NAME TO SCR-MENU-TRANS-20
	END-EVALUATE.
340-EXIT.
	EXIT.
/

400-DISPLAY-SCREEN.
*
*	Display the menu screen and any errors.
*
	MOVE 1 TO SCOPE-NEXT-FIELD.
	MOVE ZERO TO SCOPE-END-FIELD.
	CALL "SCPWR" USING BY DESCRIPTOR FORM-SCR.
	PERFORM 800-CHECK-SCOPE-RETURN-FLAG THRU 800-EXIT.
	IF ERROR-MSG NOT = SPACES
	    CALL "SCPEN" USING BY DESCRIPTOR ERROR-MSG
	    PERFORM 800-CHECK-SCOPE-RETURN-FLAG THRU 800-EXIT
	    MOVE SPACES TO ERROR-MSG
	END-IF.
	MOVE FNO-SCR-MENU-CHOICE TO SCOPE-NEXT-FIELD.
	CALL "SCPRF" USING BY DESCRIPTOR FORM-SCR.
	PERFORM 800-CHECK-SCOPE-RETURN-FLAG THRU 800-EXIT.
	MOVE SCR-MENU-CHOICE TO MENU-CHOICE.
400-DISPLAY-SCREEN-EXIT.
	EXIT.

500-VALIDATE-CHOICE.
*
*	Test the user's selection and set the appropriate switches.
*	Assume he doesn't know what he is doing.
*
	SET CHOICE-NOT-VALID TO TRUE.
	SET NOT-DONE TO TRUE.
*
*	Did he pick a number off of the menu?
*
	IF MENU-CHAR(1) IS NUMERIC AND MENU-FILLER = SPACES
	    PERFORM 510-TEST-NUMERIC THRU 510-TEST-NUMERIC-EXIT
	    GO TO 500-VALIDATE-CHOICE-EXIT
	END-IF.
*
*	No.  Did he pick a control function?
*
	IF (MENU-CHAR(1) = "G" OR "M" OR "E") AND (MENU-CHAR(2) = SPACES)
	    PERFORM 520-SET-SWITCHES THRU 520-SET-SWITCHES-EXIT
	    GO TO 500-VALIDATE-CHOICE-EXIT
	END-IF.
*
*	No.  Did he pick a transaction?
*
	PERFORM 530-TEST-TRANSACTION THRU 530-TEST-TRANSACTION-EXIT.
500-VALIDATE-CHOICE-EXIT.
	EXIT.
/

510-TEST-NUMERIC.
*
*	Prevent data conversion errors.
*
	IF MENU-CHAR(2) IS NOT NUMERIC
	    MOVE MENU-CHAR (1) TO MENU-CHAR (2)
	    MOVE 0 TO MENU-CHAR (1)
	END-IF.
*
*	Test to see if his entry is in range.
*
	IF MENU-NUMERIC = ZERO OR > DIGIT
		GO TO 510-TEST-NUMERIC-EXIT
	END-IF.
	SET CHOICE-VALID TO TRUE.
*
*	Yes.  Did he choose a transaction?
*
	PERFORM 515-MOVE-MENU-TRANS THRU 515-EXIT.
	IF HOLD-MENU-TRANS NOT =  HIGH-VALUES
		MOVE HOLD-MENU-TRANS TO MENU-CHOICE
		PERFORM 530-TEST-TRANSACTION THRU 530-TEST-TRANSACTION-EXIT
	END-IF.
510-TEST-NUMERIC-EXIT.
	EXIT.

515-MOVE-MENU-TRANS.
	EVALUATE MENU-NUMERIC
	    WHEN 1	MOVE SCR-MENU-TRANS-1 TO HOLD-MENU-TRANS
	    WHEN 2	MOVE SCR-MENU-TRANS-2 TO HOLD-MENU-TRANS
	    WHEN 3	MOVE SCR-MENU-TRANS-3 TO HOLD-MENU-TRANS
	    WHEN 4	MOVE SCR-MENU-TRANS-4 TO HOLD-MENU-TRANS
	    WHEN 5	MOVE SCR-MENU-TRANS-5 TO HOLD-MENU-TRANS
	    WHEN 6	MOVE SCR-MENU-TRANS-6 TO HOLD-MENU-TRANS
	    WHEN 7	MOVE SCR-MENU-TRANS-7 TO HOLD-MENU-TRANS
	    WHEN 8	MOVE SCR-MENU-TRANS-8 TO HOLD-MENU-TRANS
	    WHEN 9	MOVE SCR-MENU-TRANS-9 TO HOLD-MENU-TRANS
	    WHEN 10	MOVE SCR-MENU-TRANS-10 TO HOLD-MENU-TRANS
	    WHEN 11	MOVE SCR-MENU-TRANS-11 TO HOLD-MENU-TRANS
	    WHEN 12	MOVE SCR-MENU-TRANS-12 TO HOLD-MENU-TRANS
	    WHEN 13	MOVE SCR-MENU-TRANS-13 TO HOLD-MENU-TRANS
	    WHEN 14	MOVE SCR-MENU-TRANS-14 TO HOLD-MENU-TRANS
	    WHEN 15	MOVE SCR-MENU-TRANS-15 TO HOLD-MENU-TRANS
	    WHEN 16	MOVE SCR-MENU-TRANS-16 TO HOLD-MENU-TRANS
	    WHEN 17	MOVE SCR-MENU-TRANS-17 TO HOLD-MENU-TRANS
	    WHEN 18	MOVE SCR-MENU-TRANS-18 TO HOLD-MENU-TRANS
	    WHEN 19	MOVE SCR-MENU-TRANS-19 TO HOLD-MENU-TRANS
	    WHEN 20	MOVE SCR-MENU-TRANS-20 TO HOLD-MENU-TRANS
	END-EVALUATE.
515-EXIT.
	EXIT.
/

520-SET-SWITCHES.
	SET CHOICE-VALID TO TRUE.
	EVALUATE MENU-CHAR(1)
	    WHEN "G"
		SET PREVIOUS-MENU TO TRUE
	    WHEN "M"
		SET TOP-LEVEL-MENU TO TRUE
	    WHEN "E"
		SET DONE TO TRUE
	    WHEN OTHER
		MOVE "Internal error in 520-SET-SWITCHES" TO ERROR-MSG
	END-EVALUATE.
*
*	Preserve the switch across recursive calls.
*
	MOVE EXIT-SW TO LINK-EXIT-SW.
520-SET-SWITCHES-EXIT.
	EXIT.

530-TEST-TRANSACTION.
	MOVE WS-USERNAME TO SECURITY-GENERIC-USERNAME.
	MOVE MENU-CHOICE TO SECURITY-TRANSACTION-NAME.
	READ UIF-SECURITY-FILE RECORD INVALID KEY 
*
*	    If the user/transaction combination isn't present, transparent
*	    security screens him out even if the transaction is a valid one.
*
	    SET CHOICE-NOT-VALID TO TRUE
	    GO TO 530-TEST-TRANSACTION-EXIT
	END-READ.
	SET CHOICE-VALID TO TRUE.
	SET TRANSACTION TO TRUE.
530-TEST-TRANSACTION-EXIT.
	EXIT.

610-READ-NEXT-MASTER.
	SET NO-INVALID-KEY TO TRUE.
	START UIF-MASTER-FILE KEY NOT < MASTER-PRIMARY-KEY INVALID KEY
	    SET INVALID-KEY TO TRUE
	END-START.
	IF NO-INVALID-KEY
	    READ UIF-MASTER-FILE NEXT RECORD AT END
		SET INVALID-KEY TO TRUE
	    END-READ
	END-IF.
610-EXIT.
	EXIT.
/

615-READ-MASTER.
	SET NO-INVALID-KEY TO TRUE.
	READ UIF-MASTER-FILE INVALID KEY
	    SET INVALID-KEY TO TRUE
	END-READ.
615-EXIT.
	EXIT.

800-CHECK-SCOPE-RETURN-FLAG.
	IF SCOPE-ERROR
	    MOVE SCOPE-ERROR-NO TO SCOPE-ERROR-NO-DISPLAY
	    CALL "SCPRT"
	    DISPLAY " "
	    DISPLAY "***** Fatal Scope Error #", SCOPE-ERROR-NO-DISPLAY, 
		 " *****"
	    DISPLAY " "
	    GO TO 920-FATAL-ERROR
	END-IF.
800-EXIT.
	EXIT.

810-INITIALIZE-SCOPE.
	CALL "SCPIN" USING BY DESCRIPTOR SCOPE-STATUS-RECORD.
	PERFORM 800-CHECK-SCOPE-RETURN-FLAG THRU 800-EXIT.
	MOVE "UIF310SCR" TO SCOPE-FORM-NAME.
	MOVE SPACES TO SCOPE-BUFFER-NAME.
810-EXIT.
	EXIT.
/

*******************************************************************************
CLOSING SECTION.
*******************************************************************************
900-EXIT.
	IF CALL-LEVEL NOT > 1
	    PERFORM 210-CLOSE-FILES THRU 210-CLOSE-FILES-EXIT 
	END-IF.
	EXIT PROGRAM.	

920-FATAL-ERROR.
	STOP RUN.
