Function RDS_Events(CtrlEntId, Event, @PARAMS)
/***********************************************************************************************************************

    This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
    permission from Infineon.

    Name        :   RDS_Events

    Description :   This function acts as a commuter module for all events related to this window.

    Notes       :   Commuter Modules are automatically called from the Promoted_Events function which is called by the
                    application-specific promoted event handler. This makes it possible to add QuickEvents that need to
                    execute Basic+ logic without having use the Form Designer to make the association, although this is
                    limited to the events which are currently promoted.

                    If the form needs to call the commuter module directly then the QuickEvent parameters should be
                    formatted like this:

                        '@SELF','@EVENT',['@PARAM1','@PARAMx']

    Parameters  :
        CtrlEntId   [in] -- The fully qualified name of the control calling the promoted event
        Event       [in] -- The event being executed. See the Notes section regarding "PRE" events
        Param1-15   [in] -- Additional event parameter holders
        EventFlow  [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
                            EVENT_SETUP insert

    History     :   (Date, Initials, Notes)
        07/26/18    djs     Created initial commuter module.
        08/06/18    djs     Added ROTR Sign-off requirements to the SIGN.CLICK event.
        09/14/23	djm		Add blocker for Wafers In after load signature is complete.
        06/13/24	djm		Add new stage-specific supplement system.

***********************************************************************************************************************/

#pragma precomp SRP_PreCompiler
#Window RDS

$insert APP_INSERTS
$insert EVENT_SETUP
$insert MSG_EQUATES
$insert RDS_EQUATES
$insert LSL_USERS_EQUATES
$insert PROD_SPEC_EQUATES
$insert WO_MAT_EQUATES
$insert SURFACE_SCAN_EQUATES
$insert REACTOR_EQUATES
$insert PRS_STAGE_EQUATES
$insert COMPANY_EQUATES
$insert WO_MAT_QA_EQUATES
$insert REACT_STATUS_EQUATES
$insert SUPPL_INFO_ARRAY_EQU
$insert CLEAN_INSP_EQUATES
$insert OVERRIDE_LOG_EQUATES
$insert REACT_LL_EQUATES
$Insert REACT_MODE_NG_EQUATES
$Insert REACTOR_MODES_EQUATES

Equ COL$LOG_FILE        to 1
Equ COL$LOG_DTM         to 2
Equ COL$ACTION          to 3
Equ COL$WH_CD           to 4
Equ COL$LOC_CD          to 5
Equ COL$WO_NOS          to 6
Equ COL$CASS_NOS        to 7
Equ COL$USER_ID         to 8
Equ COL$TAGS            to 9
Equ COL$TOOL_ID         to 10

Equ COL$MET_TEST        to 1    ; // QA Metrology control on RDS_UNLOAD & RDS_POST_EPI windows
Equ COL$MET_TEST_DESC   to 2
Equ COL$MET_SLOT        to 3
Equ COL$MET_SLOT_DESC   to 4
Equ COL$MET_WFR_QTY     to 5
Equ COL$MET_MIN         to 6
Equ COL$MET_MAX         to 7
Equ COL$MET_RESULT      to 8
Equ COL$MET_STD_MAX     to 9
Equ COL$MET_STD_RESULT  to 10
Equ COL$MET_SIG         to 11
Equ COL$MET_SIG_DTM     to 12

Equ MSG_WIDTH$			to 600

EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)

Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
Declare subroutine Dialog_Box, Qa_Services, Obj_React_Ll, Start_Window, obj_React_Status, Reactor_Services, Rds_Services
Declare subroutine Lot_Services
Declare function   Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, Get_Property, obj_React_Status, Get_Status
Declare function   QA_Services, Database_Services, Rds_Services, Obj_Calendar, Override_Log_Services, Max, Supplement_Services
Declare function   Datetime

SubclassInfo    = Form_Services('FindSubclassControl')
Subclass        = SubclassInfo<1>

// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
If Event EQ 'OLE' then
	Transfer Event to OIEvent
	Transfer Param1 to Event
	Transfer Param2 to Param1
	Transfer Param3 to Param2
	*    Transfer Param4 to Param3
	*    Transfer Param5 to Param4
	*    Transfer Param6 to Param5
	*    Transfer Param7 to Param6
	*    Transfer Param8 to Param7
end

GoToEvent Event for CtrlEntID

Return EventFlow else EVENT_CONTINUE$


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Events
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Event WINDOW.CREATE(CreateParam)
	
	GoSub Setup_OLE_Controls
	
	SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$)
	
end event


Event WINDOW.READ()
	GoSub OLE_LL_Status
	LoadSig = Get_Property(@WINDOW:'.OP_IN', 'DEFPROP')
	Reactor = Get_Property(@WINDOW:'.REACTOR','DEFPROP')
	PickPlaceFlag = XLATE('REACTOR',Reactor,REACTOR_PICK_PLACE$,'X')        
	IF PickPlaceFlag AND LoadSig EQ '' THEN
		Set_Property(@WINDOW:'.ASM_LOAD_LOCK','ENABLED',1)         
	END ELSE
		Set_Property(@WINDOW:'.ASM_LOAD_LOCK','ENABLED',0)
	END
	// Disable Wafers In edit line control if the RDS has been loaded and signed.
    RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
    If RDSNo NE '' then
        WaferLoadSig = Xlate('RDS', RDSNo, 'OPERATOR_IN', 'X')
        If WaferLoadSig NE '' then
            Set_Property(@Window:'.WAFERS_IN', 'ENABLED', False$)
            Set_Property(@Window:'.WAFERS_IN', 'BACKCOLOR', READONLY_GREEN$)
        end else
        	Set_Property(@Window:'.WAFERS_IN', 'ENABLED', True$)
            Set_Property(@Window:'.WAFERS_IN', 'BACKCOLOR', '')
        end
    end
end event


Event WINDOW.CLOSE(CancelFlag)
	
end event


Event WINDOW.CLEAR(bSaveKey, bSuppressWarning, bMaintainFocus, CtrlIDFocus)
	
end event


Event SUPPL_BUTTON.CLICK()
	
	RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
	Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: 'LOAD' :@FM: FALSE$)
	
end event


Event PUB_SIGN.CLICK()
	
	RDSNo		= Get_Property(@WINDOW:'.RDS_NO','TEXT')
	ReactorType = Get_Property(@WINDOW:'.REACTOR_TYPE','TEXT')
	LoadLockVal = Get_Property(@WINDOW:'.LOAD_LOCK_SIDE_HIDDEN','TEXT')
	TWAllSigned = Get_Property(@WINDOW:'.TW_ALL_SIGNED','INVALUE')
	WONo		= Get_Property(@WINDOW:'.WO','TEXT')
	RunOrderNo 	= Get_Property(@WINDOW:'.RUN_ORDER_NUM','TEXT')
	Reactor		= Get_Property(@WINDOW:'.REACTOR','TEXT')
	WOStep		= Get_Property(@WINDOW:'.WO_STEP','DEFPROP')
	CassNo		= Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
	LSIDArray	= Get_Property(@WINDOW:'.RDS_LS_ID','ARRAY')
	Preauthenticated = FALSE$
	SignEventType = Get_Property(CtrlEntID, 'TEXT')
	
	Begin Case
		
		Case SignEventType EQ 'Sign'            
			
			RDSNo  = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
			WfrQty = Get_Property(@WINDOW:'.WAFERS_IN','TEXT')
			LLSide = Get_Property(@Window:'.LOAD_LOCK_SIDE', 'DEFPROP')
			
			Reactor     = Get_Property(@Window:'.REACTOR', 'TEXT')
			ReactorRec  = Database_Services('ReadDataRow', 'REACTOR', Reactor)
			ReactorType = ReactorRec<REACTOR_REACT_TYPE$>
			ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', 'X')
			
			// Don't allow tracking in on down reactor
			ReactorCurrModeKey = Xlate('REACTOR_CHILD_KEY_IDS_NG', Reactor, 1, 'X')
			ReactCurrModeRec = Database_Services('ReadDataRow','REACT_MODE_NG', ReactorCurrModeKey, '','','')
			CurrReactMode = ReactCurrModeRec<REACT_MODE_NG_MODE$>
			CurrE10State = Xlate('REACTOR_MODES', CurrReactMode, REACTOR_MODES_E10_STATE$, 'X')
			
			Override = False$
			UserVerification = ''
			OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH':@VM:'ROTR_OVERRIDE'
			
			ReactorIsDown = CurrE10State _NEC 'PRODUCTIVE'
			If	(ReactorIsDown EQ True$) then
				// Allow override during prove in
				If ReactorType EQ 'EPP' then
				    If RDS_Services('IsEpiProTestRun', RDSNo) then Override = True$
				end
				
				If Override EQ False$ then 
				    UserMsg = "Reactor down. Override required from a lead or supervisor."
				    UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
				    Override = UserVerification<1>
				end
			end
			
			If (ReactorIsDown NE True$) OR (Override EQ True$) then
				If (ReactorType EQ 'ASM+' OR ReactorType EQ 'HTR' OR ReactorType EQ 'ASM') AND (ROTREnabled EQ True$) then
					ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>        
					If ROTRStatus EQ 'F' then
						FailReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
						Message    = 'Unable to load reactor.' : CRLF$ : FailReason
						RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
						If RotrOverrideCount EQ '' then RotrOverrideCount = 0
						Message := CRLF$ : RotrOverrideCount : ' override(s) were performed since the ROTR block was originally set.'
						Message    := CRLF$ : 'A lead or supervisor must override to clear ROTR status.'
						
						Response = Msg(@Window, '', 'RDS_ROTR_OVERRIDE', '', Message)
						
						Begin Case
							Case Response EQ 1
								Response = True$        ; // User Clicked Override
							Case Response EQ 2
								Response = False$       ; // User Clicked Cancel
							Case Response EQ char(27)
								Response = False$       ; // User Pressed Escape Key
						End Case            
						
						If Response EQ True$ then
							If UserVerification EQ '' then
								UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups)
							end
							Valid = UserVerification<1>
							If Valid EQ True$ then
								// Prompt user for a comment
								ResponseComment = Dialog_Box('NDW_ADD_COMMENT', @WINDOW)
								
								IF ResponseComment<2> NE '' THEN
									// Clear ROTR reactor load block.
									overrideLogTable = 'RDS':@VM:'REACTOR'
									overrideLogKey = RDSNo:@VM:Reactor
									overrideLogUser = Response<2>
									overrideLogComment = ResponseComment<2>
									overrideLogCategory = 'ROTR_BLOCK'
									overrideLogCause = FailReason
									orKey = Override_Log_Services('Create', overrideLogTable, overrideLogKey, overrideLogUser, overrideLogComment, overrideLogCategory, overrideLogCause)
									
									//Add override key to RDS
									RDSRec = Xlate('RDS', RDSNo, '', 'X')
									RDSRec = Insert(RDSRec, RDS_OVERRIDE_KEYS$, 1, 0, orKey)
									
									ReactorRec<REACTOR_ROTR_STATUS$>        = 'P'
									
									rotrStatusReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
									ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$> = rotrStatusReason
									ReactorRec<REACTOR_ROTR_STATUS_REASON$> = ''
									
									ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$> = RDSNo
									
									rotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
									ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = rotrOverrideCount + 1
									
									Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
									Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
									
								end else
									//No Comment added. Block Load Signaure
									Msg(@Window, 'A comment is required to perform an ROTR Block Override', '', '', '')
									return
								end
							end else
								// ROTR override not verified. Block load signature.
								return
							end
						end else
							// Block load signature
							return
						end                                          
					end
				end
				
				SupplAckReq = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD')
				IF (SupplAckReq NE FALSE$) then
					Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: 'LOAD' :@FM: FALSE$)
					If Response EQ False$ then
						return
					end else
						PreAuthenticated = TRUE$
					end
				end
				
				
				RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X')
				If RDSLayerAckReq EQ True$ then
					ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
					ErrMsg(ErrorMessage)
					LayerKeys = Xlate('RDS', RDSNo, 'RDS_LAYER_KEYS', 'X')
					// Just display the first layer
					RDSLSID = LayerKeys<0, 1>
					Dialog_Box('RDS_LAYER', @Window, RDSLSID)
					
					RDSLayerAck = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK', 'X')
					If ( (RDSLayerAck EQ False$) or (RDSLayerAck EQ '') ) then
						ErrorMessage = 'RDS layer parameters were not acknowledged. Sign load stage event aborting.'
						ErrMsg(ErrorMessage)
						return
					end
				end
				
				FWIInstAckReq  = Xlate('RDS', RDSNo, 'FWI_INST_ACK_REQ', 'X')
				If (FWIInstAckReq EQ True$) then
					Response = RDS_Services('RDSVerifyInst', RDSNo, 'FWI')
					If Response EQ False$ then return
				end
				
				LoadInstAckReq  = Xlate('RDS', RDSNo, 'LOAD_INST_ACK_REQ', 'X')
				If (LoadInstAckReq EQ True$) then
					Response = RDS_Services('RDSVerifyInst', RDSNo, 'LOAD')
					If Response EQ False$ then return  
				end
				
				SupplAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ', 'X')
				IF (SupplAckReq EQ True$) then
					Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo)
					If Response EQ False$ then return
				end
				
				ReadyToSign = QA_Services('LoadSignatureReady', RDSNo, @User4, WfrQty, LLSide)
				If ReadyToSign EQ True$ then
					If PreAuthenticated EQ FALSE$ then
						initParams = ''
						initParams<4> = 'Sign Load'
						Response    = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
						Valid       = Response<1>
						If (Valid EQ True$) then
						    if XLATE('APP_INFO', 'NEW_TW_SYSTEM_ACTIVE_SWITCH', 1, 'X') EQ True$ then
                                UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Log Test Wafer Usage':@FM:'Are any test wafers loaded?')
                                If UsingTestWafers then
                                   TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM :  Reactor)
                                   If TWLogResult then
                                       QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
                                   end else
                                       ContinueLoad = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
                                       If ContinueLoad then
                                           QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
                                       end
                                   end
                                end else
                                    QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
                                end    
						    end else
						        QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
						    end
							
						end
					end else
						UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Log Test Wafer Usage':@FM:'Are any test wafers loaded?')
                        If UsingTestWafers then
                           TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM :  Reactor)
                           If TWLogResult then
                               QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
                           end else
                               ContinueLoad = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
                               If ContinueLoad then
                                   QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
                               end
                           end
                        end else
                            QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
                        end
					end
				end
				If Error_Services('HasError') then
					ErrorMsg = Error_Services('GetMessage')
					ErrMsg(ErrorMsg)
				end
			end else
				Msg(@Window, "Reactor load signature not allowed on a down reactor.")
			end
			
			GoSub OLE_LL_Status
			Set_Property(@Window, 'SAVEWARN', False$)
			Send_Event(@Window, 'READ')
			
		Case SignEventType EQ 'Unsign'
			
			// 1. Check if on hold. If so, then block event and inform user
			WOMatKey = WONo:'*':CassNo
			WOMatCurrStatus = obj_WO_Mat('CurrStatus',WOMatKey)
			IF WOMatCurrStatus = 'HOLD' THEN
				ErrorMessage  = 'Process Error':@SVM:'Cassette is on Hold and may not have the signature removed.':CRLF$:CRLF$
				ErrMsg(ErrorMessage)
				RETURN 0
			END                      
			// 2.
			//   a. For Non-EPP - Check if LWII, LWIS, or FQA has been signed. If so, then block event and inform user           
			//   b. For EPP - Check Clean_Insp actions to see if an inspection or surfscan has been completed
			//           Also check the FQA signature (MO_QA)
			UnloadSig   = Xlate('RDS', RDSNo, 'OPERATOR_OUT', 'X')
			ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE','X')
			CISigs      = Xlate('RDS', RDSNo, 'LWI_CI_SIG', 'X')
			Convert @VM to '' in CISigs
			IF ReactorType NE 'EPP' THEN               
				FQASig = Xlate('RDS', RDSNo, 'SUP_VER_SIG', 'X')                
			END ELSE
				WMOutKey = Xlate('RDS', RDSNo, 'WM_OUT_KEY', 'X')
				FQASig   = Xlate('WM_OUT', WMOutKey, 'SUP_VER_SIG', 'X')
			END
			If ( (UnloadSig NE '') or (CISigs NE '') or (FQASig NE '') ) then
				// UNLOAD, LWII, LWIS, or FQA already signed. Block unload unsign event.
				ErrorMessage  = 'Process Error':@SVM:'UNLOAD, LWII, LWIS, or FQA already signed. Cannot unsign unload event.' |
				: CRLF$ : CRLF$
				ErrMsg(ErrorMessage)
				Return 0
			end
			
			// 3. Lead/Supervisor/Engineer/EngTech override
			Response     = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH')
			Valid        = Response<1>
			OverrideUser = Response<2>
			
			If Valid then
				
				Lot_Services('CreateLotEvent', RDSNo, 'RDS', Datetime(), 'UNSIGN_LOAD', 'Load stage unsigned', Reactor, '', '', '', @User4)

				// 4. Remove WO_MAT Unload signature, date, and time
				WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
				SigProf  = WOMatRec<WO_MAT_SIG_PROFILE$>
				Sigs     = WOMatRec<WO_MAT_SIGNATURE$>
				SigDTMs  = WOMatRec<WO_MAT_SIG_DTM$>
				Locate '1LOAD' in SigProf using @VM setting vPos then
					Sigs<1, vPos>    = ''
					SigDTMs<1, vPos> = ''
					WOMatRec<WO_MAT_SIGNATURE$> = Sigs
					WOMatRec<WO_MAT_SIG_DTM$>   = SigDTMs
					obj_React_Status('HandleLoadUnsign',Reactor:@RM:WONo:@RM:CassNo:@RM:RDSNo:@RM:OverrideUser)
				end
				
				// 5. Remove '1LOAD' material log entry (i.e. WO_MAT<INV...> columns)
				InvActions = WOMatRec<WO_MAT_INV_ACTION$>
				Locate '1LOAD' in InvActions using @VM setting vPos then
					WOMatRec<WO_MAT_INV_WH$>         = Delete(WOMatRec<WO_MAT_INV_WH$>, 0, vPos, 0)
					WOMatRec<WO_MAT_INV_LOCATION$>   = Delete(WOMatRec<WO_MAT_INV_LOCATION$>, 0, vPos, 0)
					WOMatRec<WO_MAT_INV_ACTION$>     = Delete(WOMatRec<WO_MAT_INV_ACTION$>, 0, vPos, 0)
					WOMatRec<WO_MAT_INV_DTM$>        = Delete(WOMatRec<WO_MAT_INV_DTM$>, 0, vPos, 0)
					WOMatRec<WO_MAT_INV_USER$>       = Delete(WOMatRec<WO_MAT_INV_USER$>, 0, vPos, 0)
					WOMatRec<WO_MAT_INV_TAG$>        = Delete(WOMatRec<WO_MAT_INV_TAG$>, 0, vPos, 0)
					WOMatRec<WO_MAT_INV_TOOL_ID$>    = Delete(WOMatRec<WO_MAT_INV_TOOL_ID$>, 0, vPos, 0)
					WOMatRec<WO_MAT_INV_LOC$>        = Delete(WOMatRec<WO_MAT_INV_LOC$>, 0, vPos, 0)
					WOMatRec<WO_MAT_INV_SCAN_ENTRY$> = Delete(WOMatRec<WO_MAT_INV_SCAN_ENTRY$>, 0, vPos, 0)
				end
				Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
				
				// 6. Remove RDS Unload signature, date, and time
				// NOTE: This needs to occur before item #5 to avoid RDS_ACTIONS restoring the load signature
				Set_Property(@Window:'.OP_IN', 'TEXT', '')
				Set_Property(@Window:'.OP_IN_NAME', 'TEXT', '')
				Set_Property(@Window:'.OP_IN_DATE', 'TEXT', '')
				Set_Property(@Window:'.OP_IN_TIME', 'TEXT', '')
				IOOptions = Get_Property(@Window, 'IOOPTIONS')
				IOOptions<6> = True$
				Set_Property(@Window, 'IOOPTIONS', IOOptions)
				Send_Event(@Window, 'WRITE')
				IOOptions<6> = False$
				Set_Property(@Window, 'IOOPTIONS', IOOptions)				
				
				Reactor     = Get_Property(@Window:'.REACTOR', 'TEXT')
				Rds_Services('AddComment', RDSNo, 'Load Stage Unsigned from Reactor ' : Reactor)
				ReactorRec  = Database_Services('ReadDataRow', 'REACTOR', Reactor)
				PreviousRotrOverrideRds = ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$>
				
				// Check if ROTR override was preformed when signing this load
				If (PreviousRotrOverrideRds EQ RDSNo) then
					// Reset the override flag
					ReactorRec<REACTOR_ROTR_STATUS$> = 'F'
					PreviousRotrStatusReason = ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$>
					ReactorRec<REACTOR_ROTR_STATUS_REASON$> = PreviousRotrStatusReason
					RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
					ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = Max(0, (RotrOverrideCount - 1))
				end
				Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
				If ReactorType EQ 'EPP' then
				    Reactor_Services('DecrementWfrMetrics', RDSNo)
				end
				Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
				
			end else
				Return 0               
			end          
			
	End Case
	Post_Event(@Window, 'READ')
	
end event


Event LL_L_STATUS.OnClick()
	
	MsgStruct = "" 
	MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
	
	ReactNo				= Get_Property(@Window:'.REACTOR','DEFPROP')
	ActiveReactLLKey	= XLATE('REACTOR', ReactNo, REACTOR_ACTIVE_LL_DISABLED$,'X')
	ReactLL				= XLATE('REACT_LL', ActiveReactLLKey, REACT_LL_DISABLED$, 'X')
	StatusSide = 'L'
	
	GoSub ChangeLLStatus
	Set_Property(@Window, 'SAVEWARN', False$)
	Gosub OLE_LL_Status
	
end event


Event LL_R_STATUS.OnClick()
	
	MsgStruct = "" 
	MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
	
	ReactNo				= Get_Property(@Window:'.REACTOR','DEFPROP')
	ActiveReactLLKey	= XLATE('REACTOR', ReactNo, REACTOR_ACTIVE_LL_DISABLED$,'X')
	ReactLL				= XLATE('REACT_LL', ActiveReactLLKey, REACT_LL_DISABLED$, 'X')
	StatusSide = 'R'
	
	GoSub ChangeLLStatus
	
	Set_Property(@Window, 'SAVEWARN', False$)
	Gosub OLE_LL_Status
	
end event


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Setup_OLE_Controls:
	
return

ChangeLLStatus:
	If ReactNo EQ '' then
		return
	end
	If ActiveReactLLKey EQ '' then
		return
	end
	If ReactLL EQ '' OR ReactLL NE StatusSide then
		return
	end
	RDSNo = Get_Property(@Window:'.RDS_NO', 'DEFPROP')
	CurrUser = @USER4
	CurrDTM = obj_Calendar('CurrDTM')
	
	ActiveStartDTM = OCONV(ActiveReactLLKey[-1,'B*'],'DT4/^HS')
	
	orlParms  = ReactNo:@RM
	orlParms := ActiveReactLLKey:@RM
	orlParms := @USER4:@RM		;* Current user
	orlParms := ReactLL:@RM		;* 'L' or 'R' for LL side
	orlParms := CurrDTM
	
	OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH'
	Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups)
	
	Valid    = Response<1>
	IF Valid then
		Obj_React_Ll('SetQual', orlParms)
		Message = 'Qual-Mode sucessfully toggled!'
		Msg(@Window, Message)
		overrideLogTable = 'RDS':@VM:'REACTOR'
		overrideLogKey = RDSNo:@VM:ReactNo
		overrideLogUser = Response<2>
		overrideLogComment = 'Performed Load-Lock qual override'
		overirdeLogCategory = 'LOAD_LOCK'
		orKey = Override_Log_Services('Create', overrideLogTable, overrideLogKey, overrideLogUser, overrideLogComment, overrideLogCategory)
	end else
		Message = 'User is not authorized to put load-lock into qual mode.'
		Msg(@Window, MsgStruct, 'PROCESS_ERROR', '', Message)
	end       
	
	
return

OLE_LL_Status:
	IF @Window EQ 'RDS' then
		
		RedNormal =  "Vertical(Gradient(Red L=90, Red L=80, 30%), Gradient(Red L=75, Red L=80), Border(Red))"
		RedHover  =  "Vertical(Gradient(Red L=90, Red L=80, 90%), Gradient(Red L=75, Red L=80), Border(Red))"
		RedPushed =  "Vertical(Gradient(Red L=90, Red L=80, 5%), Gradient(Red L=75, Red L=80), Border(Red))"
		
		OrangeNormal = "Vertical(Gradient(Orange L=90, Orange L=80, 30%), Gradient(Orange L=75, Orange L=80), Border(Orange))"
		OrangeHover  = "Vertical(Gradient(Orange L=90, Orange L=80, 90%), Gradient(Orange L=75, Orange L=80), Border(Orange))"
		OrangePushed = "Vertical(Gradient(Orange L=90, Orange L=80, 5%), Gradient(Orange L=75, Orange L=80), Border(Orange))"
		
		GreenNormal =  "Vertical(Gradient(Green L=90, Green L=80, 30%), Gradient(Green L=75, Green L=80), Border(Green))"
		//GreenHover  =  "Vertical(Gradient(Green L=90, Green L=80, 90%), Gradient(Green L=75, Green L=80), Border(Green))"
		
		bgUp = ''
		bgUp<1> = GreenNormal
		bgUp<2> = GreenNormal
		bgUp<3> = GreenNormal
		bgUp<4> = GreenNormal
		bgUp<5> = GreenNormal
		
		bgDown = ''
		bgDown<1> = RedNormal
		bgDown<2> = RedHover
		bgDown<3> = RedPushed
		bgDown<4> = RedHover
		bgDown<5> = RedNormal
		
		bgQual = ''
		bgQual<1> = OrangeNormal
		bgQual<2> = OrangeHover
		bgQual<3> = OrangePushed
		bgQual<4> = OrangeHover
		bgQual<5> = OrangeNormal
		
		Reactor = Get_Property(@WINDOW:'.REACTOR','DEFPROP')
		LoadSig = Get_Property(@Window:'.OP_IN', 'DEFPROP')
		
		Set_Property(@Window:".LL_L_STATUS", "OLE.Caption", 'EN')
		Set_Property(@Window:".LL_R_STATUS", "OLE.Caption", 'EN')
		Set_Property(@Window:".LL_L_STATUS", "OLE.Background", bgUp)
		Set_Property(@Window:".LL_R_STATUS", "OLE.Background", bgUp)
		Set_Property(@Window:".LL_L_STATUS", "ENABLED", 0)
		Set_Property(@Window:".LL_R_STATUS", "ENABLED", 0)
		
		
		IF Reactor NE '' then
			
			LLDisabled = XLATE('REACTOR', Reactor, REACTOR_ACTIVE_LL_DISABLED$, 'X')
			IF LLDisabled NE '' then
				ReactLLRec = Database_Services('ReadDataRow', 'REACT_LL', LLDisabled)
				SideDisabled = ReactLLRec<REACT_LL_DISABLED$>
				QualMode = ReactLLRec<REACT_LL_QUAL_MODE$>
				//LL Left Status
				Ctrl = @Window : '.LL_L_STATUS'
				Set_Property(Ctrl, 'OLE.STYLE', 'STD')
				Set_Property(Ctrl, 'OLE.Font', 'Segoe UI' : @SVM : '9')
				
				
				IF SideDisabled EQ 'L' then
					If LoadSig EQ '' then
						Set_Property(@Window:".LL_L_STATUS", "ENABLED", 1)
					end
					IF QualMode then
						Set_Property(Ctrl, "OLE.Caption", 'QUAL')
						Set_Property(Ctrl, "OLE.Background", bgQual)
						Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnClick', 1)
						
					end else
						Set_Property(Ctrl, "OLE.Caption", 'DIS')
						Set_Property(Ctrl, "OLE.Background", bgDown)
						Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnClick', 1)
						
					end
				end
				//LL Right Status
				Ctrl = @Window : '.LL_R_STATUS'
				Set_Property(Ctrl, 'OLE.STYLE', 'STD')
				Set_Property(Ctrl, 'OLE.Font', 'Segoe UI' : @SVM : '9')
				Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnClick', 1)
				
				IF SideDisabled EQ 'R'  then
					If LoadSig EQ '' then
						Set_Property(@Window:".LL_R_STATUS", "ENABLED", 1)
					end
					
					IF QualMode then
						Set_Property(Ctrl, "OLE.Caption", 'QUAL')
						Set_Property(Ctrl, "OLE.Background", bgQual)
						Send_Message(Ctrl, 'OLE.OnClick', 1)
						
					end else
						Set_Property(Ctrl, "OLE.Caption", 'DIS')
						Set_Property(Ctrl, "OLE.Background", bgDown)
						Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnClick', 1)
					end
				end
			end
		end
	end
	
return





