COMPILE FUNCTION Comm_RDS_Layer(Instruction, Parm1, Parm2)
#pragma precomp SRP_PreCompiler

/*
	Commuter module for RDS_Layer Window
	
	02/09/2006 - John C. Henry, J.C. Henry & Co., Inc.
*/

DECLARE SUBROUTINE Set_Property, End_Dialog, Send_Event, Set_Status, Center_Window,Print_Vend_CofA
DECLARE SUBROUTINE ErrMsg, Send_Message, Set_Property, Send_Event, Btree.Extract, obj_AppWindow
DECLARE SUBROUTINE Post_Event, Forward_Event, Security_Err_Msg, obj_RDS_Layer, Msg

DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Utility, Center_Window, Popup, Collect.Ixvals
DECLARE FUNCTION Send_Message, Security_Check

$INSERT RDS_LAYER_EQUATES
$INSERT RDS_EQU
$INSERT REACT_RUN_EQUATES
$INSERT RECIPE_PARMS_EQU
$INSERT PROD_SPEC_EQU
$INSERT WO_STEP_EQU
$INSERT POPUP_EQUATES
$INSERT LOGICAL
$INSERT DICT_EQUATES
$INSERT APPCOLORS
$INSERT SECURITY_RIGHTS_EQU


EQU COL$MET_NO		TO 1
EQU COL$ZONE		TO 2
EQU COL$THICK_AVG	TO 3
EQU COL$THICK_STDV	TO 4
EQU COL$RES_AVG		TO 5
EQU COL$RES_STDV	TO 6
EQU COL$RES_UNITS	TO 7
EQU COL$OUT_OF_SPEC	TO 8


EQU CRLF$	TO \0D0A\

EQU HIDDEN$	TO 32

EQU COL$TEST_NO		TO 1

ErrTitle = 'Error in Comm_RDS_Layer'
ErrorMsg = ''

Result = ''

BEGIN CASE
    CASE Instruction = 'Create' 				; GOSUB Create
    CASE Instruction = 'Read'					; GOSUB Read
    CASE Instruction = 'Clear'					; GOSUB Clear
    CASE Instruction = 'Refresh'				; GOSUB Refresh
    CASE Instruction = 'Write'					; GOSUB Write
    CASE Instruction = 'Delete'					; GOSUB Delete
    CASE Instruction = 'Close'					; GOSUB Close
    CASE Instruction = 'Page'					; GOSUB Page
    CASE Instruction = 'RParmsDeleteRow'		; GOSUB RParmsDeleteRow
    CASE Instruction = 'RParmsInsertRow'		; GOSUB RParmsInsertRow
    CASE Instruction = 'RParmsPC'				; GOSUB RParmsPC
    CASE Instruction = 'NewTest'				; GOSUB NewTest
    CASE Instruction = 'TestKeyDC'				; GOSUB TestKeyDC
    CASE Instruction = 'OverRideRecipeLimits'	; GOSUB OverRideRecipeLimits
    CASE Instruction = 'OverRideDC'				; GOSUB OverRideDC
    CASE Instruction = 'OverRidePC'				; GOSUB OverRidePC
    CASE Instruction = 'UpdateLimits'			; GOSUB UpdateLimits
        
    CASE 1
        ErrorMsg = 'Unknown Instruction passed to routine.'
        ErrMsg(ErrorMsg)
END CASE

RETURN Result


* * * * * * *
Create:
* * * * * * *
    
    obj_Appwindow('Create',@WINDOW)
    
    IF Parm1 NE '' THEN
        obj_AppWindow('LoadFormKeys',@WINDOW:@RM:Parm1)
    END
    
    GOSUB Refresh
    
RETURN


* * * * * * * 
Clear:
* * * * * * * 
    
    Send_Event(@WINDOW,'PAGE',1)
    
    GOSUB Refresh
    
RETURN


* * * * * * *
Page:
* * * * * * *
    
    Page = Parm1
    
    IF Page = '' THEN
        Page = Get_Property(@WINDOW:'.TAB_MAIN','VALUE')
    END ELSE
        Set_Property(@WINDOW:'.TAB_MAIN','VALUE',Page)
    END
    
    Set_Property(@WINDOW,'VPOSITION', Page)
    
RETURN


* * * * * * *
Read:
* * * * * * * 
    
    CurrRecord = Get_Property(@WINDOW,'RECORD')
    Set_Property(@WINDOW,'@ORG_RECORD',CurrRecord)
    
    * * * * * * *
Refresh:
* * * * * * *
    
    LSId = Get_Property(@WINDOW:'.LS_ID','TEXT')
    
    BEGIN CASE
        CASE LSId = 'L1'
            Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',RCV_BLUE$)
            
        CASE LSId = 'L2'
            Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',PRE_BLUE$)
            
        CASE LSId = '2'
            Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',INP_BLUE$)
            
        CASE 1
            Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',KEY_YELLOW$)
            
    END CASE
    
    Set_Property(@WINDOW:'.OVERRIDE_LIMITS_GROUP','ENABLED',0)
    
    RDSNo	= Get_Property( @WINDOW:'.RDS_NO', 'DEFPROP' )
    RDSRec	= XLATE('RDS',RDSNo,'','X')
    
    LayerSetID	= Get_Property(@WINDOW:'.LS_ID','DEFPROP')
    
    PSNId		= RDSRec< RDS_PROD_SPEC_ID$ >
    RecipeNo	= Get_Property(@WINDOW:'.RECIPE_NO','DEFPROP')
    
    RecipeParms = Get_Property(@WINDOW:'.RECIPE_PARMS','ARRAY')						;* Entered by user
    RecipeLimits = Get_Property(@WINDOW:'.RECIPE_LIMITS','LIST')<1>
    
    CONVERT @VM TO @FM IN RecipeLimits
    
    ColCnt = COUNT(RecipeLimits,@FM) + (RecipeLimits NE '')							;* This is 16 columns as of the development of this window
    
    RecipeParms = Get_Property(@WINDOW:'.RECIPE_PARMS','ARRAY')
    
    ParameterStyles	= Send_Message( @WINDOW:'.RECIPE_PARMS', "COLSTYLE", 0, '' )
    LimitStyles		= Send_Message( @WINDOW:'.RECIPE_LIMITS', "COLSTYLE", 0, '' )
    
    CONVERT @VM TO '' IN RecipeParms
    
    ColNames	= Get_Property( @WINDOW:'.RECIPE_PARMS', 'COLUMN' )
    
    OutOfSpecCols = ''
    FOR Col = 1 TO ColCnt
        IF RecipeLimits<Col> = '' AND RecipeParms<Col> = '' THEN
            ParameterStyles<Col>	= BitOr( ParameterStyles<Col>, HIDDEN$ )				;* Column not used -> Hide
            LimitStyles<Col>		= BitOr( LimitStyles<Col>, HIDDEN$ )
        END ELSE
            ParameterStyles<Col>	= BitAnd( ParameterStyles<Col>, BitNot(HIDDEN$) )		;* Column used -> Show
            LimitStyles<Col>		= BitAnd( LimitStyles<Col>, BitNot(HIDDEN$) )
            
            LimitData	= RecipeLimits<Col>
            ParamData	= RecipeParms<Col>
            
            ColName		= ColNames<1,1,Col>
            Conversion	= XLATE('DICT.RDS_LAYER',ColName,DICT_CONV$,'X')
            
            SWAP ' ~ ' WITH @VM IN LimitData
            
            IF Conversion NE '' THEN
                ParamData = ICONV(ParamData,Conversion)
                LimitData = ICONV(LimitData,Conversion)
            END
            
            Minimum = LimitData<1,1>
            Maximum = LimitData<1,2>
            
            IF ParamData NE '' THEN
                IF ParamData < Minimum OR ParamData > Maximum THEN
                    Send_Message(@WINDOW:'.RECIPE_PARMS','COLOR_BY_POS',Col,1,RED$)
                    OutOfSpecCols = INSERT(OutOfSpecCols,Col,0,0,1)
                END ELSE
                    Send_Message(@WINDOW:'.RECIPE_PARMS','COLOR_BY_POS',Col,1,WHITE$)
                END
            END ELSE
                Send_Message(@WINDOW:'.RECIPE_PARMS','COLOR_BY_POS',Col,1,WHITE$)
            END
            
        END
        
    NEXT Col
    
    LOCATE '1' IN OutOfSpecCols USING @FM SETTING Pos THEN
        Set_Property(@WINDOW:'.OUT_OF_SPEC','CHECK',1)
    END ELSE
        Set_Property(@WINDOW:'.OUT_OF_SPEC','CHECK',0)
    END
    
    Parameter_Styles	= Send_Message( @WINDOW:'.RECIPE_PARMS', "COLSTYLE", 0, ParameterStyles  )
    LimitStyles			= Send_Message( @WINDOW:'.RECIPE_LIMITS', "COLSTYLE", 0, LimitStyles  )	   
    
    Set_Property( @WINDOW:'.RECIPE_INFO', "AUTOSIZECOL", 16 )
    Set_Property( @WINDOW:'.RECIPE_LIMITS', "AUTOSIZECOL", 16 )
    
    * QBF buttons
    
    Ctrls  = @WINDOW:'.QBF_FIRST_FIX':@RM		; Props  = 'ENABLED':@RM
    Ctrls := @WINDOW:'.QBF_PREV_FIX':@RM		; Props := 'ENABLED':@RM
    Ctrls := @WINDOW:'.QBF_ABS_FIX':@RM			; Props := 'ENABLED':@RM
    Ctrls := @WINDOW:'.QBF_NEXT_FIX':@RM		; Props := 'ENABLED':@RM
    Ctrls := @WINDOW:'.QBF_LAST_FIX':@RM		; Props := 'ENABLED':@RM
    Ctrls := @WINDOW:'.QBF_STOP_FIX'			; Props := 'ENABLED'
    
    IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
        Vals = 0:@RM:0:@RM:0:@RM:0:@RM:0:@RM:0
    END ELSE
        Vals = 1:@RM:1:@RM:1:@RM:1:@RM:1:@RM:1
    END
    
    Set_Property(Ctrls,Props,Vals)
    
    * Turn edit table symbolic column backgrounds to green
    
    ETSymbolics = Get_Property(@WINDOW,'@ET_SYMBOLICS')		;* Loaded during 'Create' in obj_Appwindow
    
    ETCtrls	= ETSymbolics<1>
    ETCols	= ETSymbolics<2>
    
    FOR I = 1 TO COUNT(ETCtrls,@VM) + (ETCtrls NE '')
        ETCtrl	= ETCtrls<1,I>
        ETList = Get_Property(ETCtrl,'LIST')
        FOR Line = 1 TO COUNT(ETList,@FM) + (ETList NE '')
            IF ETList<Line,1> NE '' THEN
                FOR N = 1 TO COUNT(ETCols<1,I>,@SVM) + (ETCols<1,I> NE '')
                    stat = Send_Message(ETCtrl,'COLOR_BY_POS',ETCols<1,I,N>,Line,GREEN$)
                NEXT N
            END
        NEXT I
    NEXT I
    
    
    TestList = Get_Property(@WINDOW:'.RDS_TEST_KEYS','LIST')
    
    FOR I = 1 TO COUNT(TestList,@FM) + (TestList NE '')
        IF ICONV(TestList<I,COL$OUT_OF_SPEC>,'B') = 1 THEN
            Send_Message(@WINDOW:'.RDS_TEST_KEYS','COLOR_BY_POS',0,I,RED$)
        END ELSE
            Send_Message(@WINDOW:'.RDS_TEST_KEYS','COLOR_BY_POS',0,I,WHITE$)
        END
    NEXT I
    
    RPCopy = RecipeParms
    Convert @FM to '' in RPCopy
    If RPCopy EQ '' then
        Set_Property(@Window : '.BTN_SET_CURR_RUN_PARMS', 'ENABLED', False$)
    end else
        Set_Property(@Window : '.BTN_SET_CURR_RUN_PARMS', 'ENABLED', True$)
    end
    
RETURN


* * * * * * *
Write:
* * * * * * *
    
    SkipScriptEvent = Get_Property(@Window, '@SKIPSCRIPT')
    If (SkipScriptEvent EQ False$) or (SkipScriptEvent EQ '') then
        RDSLayerKey = Get_Property(@WINDOW,'ID')
        
        CurrRecord = Get_Property(@WINDOW,'RECORD')
        OrgRecord = Get_Property(@WINDOW,'@ORG_RECORD')
        
        IF CurrRecord NE OrgRecord THEN
            CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
            NewLine = @USER4:@VM:CurrDTM
            Send_Message(@WINDOW:'.MODIFY_USER','INSERT',1,NewLine)
        END
        
        Post_Event(@WINDOW,'CLOSE')
    end
    Result = 1
    
RETURN 


* * * * * * *
Delete:
* * * * * * * 
    
    ErrMsg('Records may not be modified or deleted.')
    
    Result = 0	;* No Deletes
    
RETURN


* * * * * * *
Close:
* * * * * * *
    
    obj_Appwindow('DetailReturn')
    
RETURN


* * * * * * *
RParmsDeleteRow:
* * * * * * *
    
    DeletedRowIndex = Parm1
    DeletedRowText = Parm2
    
    CurrCtrl = @WINDOW:'.RECIPE_PARMS'
    
    Dummy = Send_Message(CurrCtrl, "INSERT",DeletedRowIndex, DeletedRowText)
    
    Set_Property(CurrCtrl,'SELPOS',1:@FM:1)
    
    ErrMsg('Rows may not be inserted or deleted.')
    
RETURN


* * * * * * *
RParmsInsertRow:
* * * * * * *
    
    RowIndex = Parm1
    
    CurrCtrl = @WINDOW:'.RECIPE_PARMS'
    
    ErrMsg('Rows may not be inserted or deleted.')
    
RETURN


* * * * * * *
RParmsPC:
* * * * * * *
    
    CurrCtrl = @WINDOW:'.RECIPE_PARMS'
    
    PrevSelPos	= Get_Property(CurrCtrl,"PREVSELPOS")
    PrevCol 	= PrevSelPos<1>
    PrevRow 	= PrevSelPos<2>
    
    CurrSelPos	= Get_Property(CurrCtrl,"SELPOS")
    CurrCol 	= CurrSelPos<1>
    CurrRow 	= CurrSelPos<2>
    
    ColStyles	= Send_Message( @WINDOW:'.RECIPE_PARMS', 'COLSTYLE', 0, '' )
    ColNames	= Get_Property( @WINDOW:'.RECIPE_PARMS', 'COLUMN' )
    
    IF CurrRow > 1 THEN
        Set_Property(CurrCtrl,'SELPOS',CurrCol:@FM:1)						;* Can't move off of the first row
    END
    
    ListData = Get_Property(CurrCtrl,'LIST')
    
    IF ListData<1,PrevCol> NE '' THEN
        VisibleColumn = NOT(BitAnd( ColStyles<PrevCol>, HIDDEN$ ))			;* Gives @VM list of flags for visible columns in the edit table
        IF VisibleColumn THEN
            LimitData	= Get_Property(@WINDOW:'.RECIPE_LIMITS','LIST')<1,PrevCol>
            ParamData	= ListData<1,PrevCol>
            
            ColName		= ColNames<1,1,PrevCol>
            Conversion	= XLATE('DICT.RDS_LAYER',ColName,DICT_CONV$,'X')
            
            CONVERT '~' TO @VM IN LimitData
            
            IF Conversion NE '' THEN
                ParamData = ICONV(ParamData,Conversion)
                LimitData = ICONV(LimitData,Conversion)
            END
            
            Minimum = LimitData<1,1>
            Maximum = LimitData<1,2>
            
            IF ParamData < Minimum OR ParamData > Maximum THEN
                *ErrMsg('Data Entered for ':QUOTE(ColName):' is out of specified limits!')
            END
            
            
            IF ColName = 'EPI_TIME' THEN
                LSId = Get_Property(@WINDOW:'.LS_ID','DEFPROP')
                RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
                
                ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
                
                WONo	= ReactRunRec<REACT_RUN_WO_NO$>
                WOStep	= ReactRunRec<REACT_RUN_WO_STEP$>
                
                PSNo = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_PROD_SPEC_ID$,'X')
                
                DepTimeRatio = XLATE('PROD_SPEC',PSNo,PROD_SPEC_DEP_TIME_RATIO$,'X')
                
                
                IF DepTimeRatio = 1 THEN
                    IF LSId = 'L1' THEN
                        LS1DepTime = ParamData
                        LS2DepTime = XLATE('RDS_LAYER',RDSNo:'*L2',RDS_LAYER_EPI_TIME$,'X')
                    END
                    IF LSId = 'L2' THEN
                        LS1DepTime = XLATE('RDS_LAYER',RDSNo:'*L1',RDS_LAYER_EPI_TIME$,'X')
                        LS2DepTime = ParamData
                    END
                    
                    IF LS1DepTime NE '' AND LS2DepTime NE '' THEN
                        
                        LS1DepTime = OCONV(LS1DepTime,'MD1')
                        LS2DepTime = OCONV(LS2DepTime,'MD1')
                        TotDepTime = LS1DepTime + LS2DepTime
                        LS1Ratio = OCONV(ICONV(LS1DepTime/TotDepTime,'MD6'),'MD6')
                        
                        IF LS1Ratio <= 0.112 OR LS1Ratio >= 0.114 THEN
                            Msg(@WINDOW,'','DEP_TIME_RATIO','',LS1DepTime:@FM:LS2DepTime:@FM:LS1Ratio)
                        END
                    END
                    
                END ;* End of check for DepTimeRatio flag
            END	;* End of check for column = 'EPI_TIME"
            
        END	;* End of Check for Visible Column
        
    END
    
    GOSUB Refresh
    
RETURN


* * * * * * *
NewTest:
* * * * * * *
    
RETURN


* * * * * * * 
TestKeyDC:
* * * * * * *
    
    CurrCtrl = @WINDOW:'.RDS_TEST_KEYS'
    
    CurrPos		= Get_Property(CurrCtrl,"SELPOS")
    CurrCol 	= CurrPos<1>
    CurrRow 	= CurrPos<2>
    
    RDSTestNo	= Get_Property(CurrCtrl,'CELLPOS',COL$TEST_NO:@FM:CurrRow)
    RDSLsID		= Get_Property(@WINDOW,'ID')
    
    IF RDSTestNo NE '' AND RDSLsID NE '' THEN
        
        CardWindow	= 'RDS_TEST'
        CardKey		= RDSTestNo					;* Null values for CardKey creates new card
        NewCardCtrl	= ''						;* Name of button control to create new Card on Card window
        RecalcCtrl	= CurrCtrl					;* Symbolic Control to recalculate upon return
        RecalcPos	= ''						;* Position in edit list or edit table for recalc
        RetCtrl		= CurrCtrl					;* This can be called from both a window and a process
        RetPos		= CurrPos					;* Position in edit list or edit table to return to
        
        oAParms = CardWindow:@RM:CardKey:@RM:NewCardCtrl:@RM:RecalcCtrl:@RM:RecalcPos:@RM:RetCtrl:@RM:RetPos
        
        obj_AppWindow('ViewNewCard',oAParms)
        
        IF Get_Status(errCode) THEN
            ErrMsg(errCode)
        END	
        
    END
    
RETURN


* * * * * * *
OverRideRecipeLimits:
* * * * * * *
    
    IF Security_Check( 'Recipe', Write$ ) THEN
        Set_Property(@WINDOW:'.OVERRIDE_LIMITS_GROUP','ENABLED',1)
    END ELSE
        Security_Err_Msg( 'Recipe', Write$ )
    END
    
RETURN


* * * * * * *
UpdateLimits:
* * * * * * *
    
    IF Security_Check( 'Recipe', Write$ ) THEN
        RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
        LSId = Get_Property(@WINDOW:'.LS_ID','DEFPROP')
        
        IF RDSNo = '' OR LSId = '' THEN RETURN
        
        Send_Event(@WINDOW,'WRITE')
        
        obj_RDS_Layer('UpdateLimits',RDSNo:@RM:LSId)
        
        IF Get_Status(errCode) THEN ErrMsg(errCode)
        
        obj_AppWindow('LoadFormKeys',@WINDOW:@RM:RDSNo:'*':LSId)
        
    END ELSE
        Security_Err_Msg( 'Recipe', Write$ )
    END
    
    
RETURN


* * * * * * *
OverRideDC:
* * * * * * * 
RETURN


* * * * * * *
OverRidePC:
* * * * * * *
RETURN

