{$IFDEF WIN32} {$I DEFINES.INC} {$ENDIF} {$A+,B-,D+,E-,F+,I-,L+,N-,O+,R-,S+,V-} UNIT SysOp6; INTERFACE PROCEDURE EventEditor; IMPLEMENTATION USES Common, TimeFunc; PROCEDURE EventEditor; VAR TempEvent: EventRecordType; Cmd: Char; RecNumToList: Integer; SaveTempPause: Boolean; FUNCTION DaysEventActive(EventDays: EventDaysType; C1,C2: Char): AStr; CONST Days: Str7 = 'SMTWTFS'; VAR TempStr: AStr; Counter: Byte; BEGIN TempStr := ''; FOR Counter := 0 TO 6 DO IF (Counter IN EventDays) THEN TempStr := TempStr + '^'+C1+Days[Counter + 1] ELSE TempStr := TempStr + '^'+C2+'-'; DaysEventActive := TempStr; END; FUNCTION NextDay(Date: Str10): LongInt; VAR Day, Month, Year: Word; BEGIN Month := StrToInt(Copy(Date,1,2)); Day := StrToInt(Copy(Date,4,2)); Year := StrToInt(Copy(Date,7,4)); IF (Day = 31) AND (Month = 12) THEN BEGIN Inc(Year); Month := 1; Day := 1; END ELSE BEGIN IF (Day < Days(Month,Year)) THEN Inc(Day) ELSE IF (Month < 12) THEN BEGIN Inc(Month); Day := 1; END; END; NextDay := Date2PD(ZeroPad(IntToStr(Month))+'/'+ZeroPad(IntToStr(Day))+'/'+IntToStr(Year)); END; FUNCTION ShowTime(W: Word): Str5; BEGIN ShowTime := ZeroPad(IntToStr(W DIV 60))+':'+ZeroPad(IntToStr(W MOD 60)); END; PROCEDURE ToggleEFlag(EFlagT: EventFlagType; VAR EFlags: EFlagSet); BEGIN IF (EFlagT IN EFlags) THEN Exclude(EFlags,EFlagT) ELSE Include(EFlags,EFlagT); END; PROCEDURE ToggleEFlags(C: Char; VAR EFlags: EFlagSet; VAR Changed: Boolean); VAR SaveEFlags: EFlagSet; BEGIN SaveEFlags := EFlags; CASE C OF 'A' : ToggleEFlag(EventIsExternal,EFlags); 'B' : ToggleEFlag(EventIsActive,EFlags); 'C' : ToggleEFlag(EventIsShell,EFlags); 'D' : ToggleEFlag(EventIsOffhook,EFlags); 'E' : ToggleEFlag(EventIsMonthly,EFlags); 'F' : ToggleEFlag(EventIsPermission,EFlags); 'G' : ToggleEFlag(EventIsLogon,EFlags); 'H' : ToggleEFlag(EventIsChat,EFlags); 'I' : ToggleEFlag(EventIsPackMsgAreas,EFlags); 'J' : ToggleEFlag(EventIsSortFiles,EFlags); 'K' : ToggleEFlag(EventIsSoft,EFlags); 'L' : ToggleEFlag(EventIsMissed,EFlags); 'M' : ToggleEFlag(BaudIsActive,EFlags); 'N' : ToggleEFlag(AcsIsActive,EFlags); 'O' : ToggleEFlag(TimeIsActive,EFlags); 'P' : ToggleEFlag(ARisActive,EFlags); 'Q' : ToggleEFlag(SetARisActive,EFlags); 'R' : ToggleEFlag(ClearARisActive,EFlags); 'S' : ToggleEFlag(InRatioIsActive,EFlags); END; IF (EFlags <> SaveEFlags) THEN Changed := TRUE; END; PROCEDURE InitEventVars(VAR Event: EventRecordType); BEGIN FillChar(Event,SizeOf(Event),0); WITH Event DO BEGIN EventDescription := '<< New Event >>'; EventDayOfMonth := 0; EventDays := []; EventStartTime := 0; EventFinishTime := 0; EventQualMsg := ''; EventNotQualMsg := ''; EventPreTime := 0; EventNode := 0; EventLastDate := 0; EventErrorLevel := 0; EventShellPath := ''; LoBaud := 300; HiBaud := 19200; EventACS := 's10'; MaxTimeAllowed := 60; SetARflag := '@'; ClearARflag := '@'; EFlags := [EventIsExternal,EventIsShell]; END; END; PROCEDURE DeleteEvent(TempEvent1: EventRecordType; RecNumToDelete: SmallInt); VAR RecNum: Integer; BEGIN IF (NumEvents = 0) THEN Messages(4,0,'events') ELSE BEGIN RecNumToDelete := -1; InputIntegerWOC('%LFEvent to delete?',RecNumToDelete,[NumbersOnly],1,NumEvents); IF (RecNumToDelete >= 1) AND (RecNumToDelete <= NumEvents) THEN BEGIN Reset(EventFile); Seek(EventFile,(RecNumToDelete - 1)); Read(EventFile,TempEvent1); Close(EventFile); LastError := IOResult; Print('%LFEvent: ^5'+TempEvent1.EventDescription); IF PYNQ('%LFAre you sure you want to delete it? ',0,FALSE) THEN BEGIN Print('%LF[> Deleting event record ...'); Dec(RecNumToDelete); Reset(EventFile); IF (RecNumToDelete >= 0) AND (RecNumToDelete <= (FileSize(EventFile) - 2)) THEN FOR RecNum := RecNumToDelete TO (FileSize(EventFile) - 2) DO BEGIN Seek(EventFile,(RecNum + 1)); Read(EventFile,Event); Seek(EventFile,RecNum); Write(EventFile,Event); END; Seek(EventFile,(FileSize(EventFile) - 1)); Truncate(EventFile); Close(EventFile); LastError := IOResult; Dec(NumEvents); SysOpLog('* Deleted event: ^5'+TempEvent1.EventDescription); END; END; END; END; PROCEDURE CheckEvent(Event: EventRecordType; StartErrMsg,EndErrMsg: Byte; VAR Ok: Boolean); VAR Counter: Byte; BEGIN FOR Counter := StartErrMsg TO EndErrMsg DO CASE Counter OF 1 : ; END; END; PROCEDURE EditEvent(TempEvent1: EventRecordType; VAR Event: EventRecordType; VAR Cmd1: Char; VAR RecNumToEdit: SmallInt; VAR Changed: Boolean; Editing: Boolean); CONST BaudRates: ARRAY [1..20] OF LongInt = (300,600,1200,2400,4800,7200,9600, 12000,14400,16800,19200,21600,24000, 26400,28800,31200,33600,38400,57600, 115200); VAR OneKCmds, TempStr: AStr; Counter: Byte; BEGIN WITH Event DO REPEAT IF (Cmd1 <> '?') THEN BEGIN Abort := FALSE; Next := FALSE; CLS; IF (Editing) THEN PrintACR('^5Editing event #'+IntToStr(RecNumToEdit)+' of '+IntToStr(NumEvents)) ELSE PrintACR('^5Inserting event #'+IntToStr(RecNumToEdit)+' of '+IntToStr(NumEvents + 1)); NL; PrintACR('^1A. Event type : ^5'+AOnOff(EventIsExternal IN EFlags,'External','Internal')); PrintACR('^1B. Description : ^5'+EventDescription); PrintACR('^1C. Active : ^5'+AOnOff(EventIsActive IN EFlags,'Active','Inactive')); IF (EventIsExternal IN EFlags) THEN BEGIN PrintACR('^1D. Execution hard/soft : ^5'+AOnOff(EventIsSoft IN EFlags,'Soft','Hard')); TempStr := '^1E. Event type : ^5'; IF (EventIsErrorLevel IN EFlags) THEN TempStr := TempStr + 'Error level = '+IntToStr(EventErrorLevel) ELSE IF (EventIsShell IN EFlags) THEN TempStr := TempStr + 'Shell file = "'+EventShellPath+'"' ELSE IF (EventIsSortFiles IN EFlags) THEN TempStr := TempStr + 'Sort Files' ELSE IF (EventIsPackMsgAreas IN EFlags) THEN TempStr := TempStr + 'Pack Message Areas' ELSE IF (EventIsFilesBBS IN EFlags) THEN TempStr := TempStr + 'Check Files.BBS'; PrintACR(TempStr); PrintACR('^1G. Scheduled day(s) : ^5'+AOnOff(EventIsMonthly IN EFlags, 'Monthly ^1-^5 Day ^1=^5 '+IntToStr(EventDayOfMonth), 'Weekly ^1-^5 Days ^1=^5 '+DaysEventActive(EventDays,'5','1'))); PrintACR('^1H. Start time : ^5'+ShowTime(EventStartTime)); PrintACR('^1I. Phone status : ^5'+AOnOff(EventIsOffHook IN EFlags, 'Off-hook ('+IntToStr(EventPreTime)+' minutes before the Event)', 'Remain on-hook')); PrintACR('^1K. Executed today : ^5'+ShowYesNo(PD2Date(EventLastDate) = DateStr)+' ' +AOnOff(EventIsActive IN EFlags, '(Next scheduled date: '+PD2Date(EventLastDate)+')', '(Not scheduled for execution)')); END ELSE BEGIN PrintACR('^1D. Scheduled day(s) : ^5'+AOnOff(EventIsMonthly IN EFlags, 'Monthly ^1-^5 Day ^1=^5 '+IntToStr(EventDayOfMonth), 'Weekly ^1-^5 Days ^1=^5 '+DaysEventActive(EventDays,'5','1'))); PrintACR('^1E. Time active : ^5'+ShowTime(EventStartTime)+' to '+ ShowTime(EventFinishTime)); PrintACR('^1G. Permission/restriction: ^5'+AOnOff(EventIsPermission IN EFlags, 'Permission','Restriction')); PrintACR('^1H. Event type : ^5'+AOnOff(EventIsChat IN EFlags,'Chat','Logon')); PrintACR('^1I. Affected message : "^5'+eventqualmsg+'^1"'); PrintACR('^1K. Unaffected message : "^5'+eventnotqualmsg+'^1"'); END; PrintACR('^1M. Run if missed : ^5'+ShowYesNo(EventIsMissed IN EFlags)); PrintACR('^1N. Node number : ^5'+IntToStr(EventNode)); IF (NOT (EventIsExternal IN EFlags)) THEN BEGIN NL; PrintACR(' ^4<<<^5 Qualifiers ^4>>>'); NL; PrintACR('^11. Baud rate range : ^5'+AOnOff(BaudIsActive IN EFlags, IntToStr(LoBaud)+' to '+IntToStr(HiBaud), '<>')); PrintACR('^12. ACS : ^5'+AOnOff(ACSIsActive IN EFlags,EventACS,'<>')); IF (EventIsPermission IN EFlags) THEN PrintACR('^13. Maximum time : ^5'+AOnOff(TimeIsActive IN EFlags, IntToStr(MaxTimeAllowed), '<>')); IF (EventIsPermission IN EFlags) THEN BEGIN PrintACR('^14. Set AR flag : ^5'+AOnOff(SetArIsActive IN EFlags, SetArFlag, '<>')); PrintACR('^15. Clear AR flag : ^5'+AOnOff(ClearArIsActive IN EFlags, ClearArFlag, '<>')); END; PrintACR('^16. UL/DL ratio check: ^5'+AOnOff(InRatioIsActive IN EFlags, 'Active', '<>')); END; END; IF (EventIsExternal IN EFlags) THEN OneKCmds := '' ELSE BEGIN IF (EventIsPermission IN EFlags) THEN OneKCmds := '123456' ELSE OneKCmds := '126'; END; LOneK('%LFModify '+AOnOff(EventIsExternal IN EFlags,'external','internal')+' event [^5?^4=^5Help^4]: ', Cmd1,'QABCDEGHIKMN'+OneKCmds+'[]FJL?'^M,TRUE,TRUE); CASE Cmd1 OF 'A' : ToggleEFlagS('A',EFlags,Changed); { External/Internal } 'B' : InputWN1('%LFNew description: ',EventDescription,30,[InterActiveEdit],Changed); 'C' : ToggleEFlags('B',EFlags,Changed); { Active/InActive } 'D' : IF (EventIsExternal IN EFlags) THEN ToggleEFlags('K',EFlags,Changed) { Soft/Hard } ELSE { Dialy/Monthly } BEGIN LOneK('%LFSchedule? [^5D^4=^5Daily^4,^5M^4=^5Monthly^4,^5^4=^5Quit^4]: ',Cmd1,^M'DM',TRUE,TRUE); CASE Cmd1 OF 'D' : BEGIN IF (EventIsMonthly IN EFlags) THEN BEGIN Exclude(EFlags,EventIsMonthly); EventDayOfMonth := 0; Changed := TRUE; END; REPEAT Print('%LF^5Active Days: ^3'+DaysEventActive(EventDays,'5','4')+'^1'); NL; LCmds(11,3,'1Sunday',''); LCmds(11,3,'2Monday',''); LCmds(11,3,'3Tuesday',''); LCmds(11,3,'4Wednesday',''); LCmds(11,3,'5Thursday',''); LCmds(11,3,'6Friday',''); LCmds(11,3,'7Saturday',''); LOneK('%LFToggle which day? [^51^4-^57^4,^5^4=^5Quit^4]: ',Cmd1,^M'1234567',TRUE,TRUE); IF (Cmd1 <> ^M) THEN BEGIN IF ((StrToInt(Cmd1) - 1) IN EventDays) THEN Exclude(EventDays,(StrToInt(Cmd1) - 1)) ELSE Include(EventDays,(StrToInt(Cmd1) - 1)); Changed := TRUE; END; UNTIL (Cmd1 = ^M) OR (HangUp); Cmd1 := #0; END; 'M' : BEGIN IF (NOT (EventIsMonthly IN EFlags)) THEN BEGIN Include(EFlags,EventIsMonthly); EventDays := []; Changed := TRUE; END; InputByteWC('%LFDay of the month',EventDayOfMonth,[],1,31,Changed); END; END; Cmd1 := #0; END; 'E' : IF (EventIsExternal IN EFlags) THEN BEGIN Print('%LF^5External event type'); NL; LCmds(18,3,'1Errorlevel',''); LCmds(18,3,'2Shell',''); LCmds(18,3,'3Sort Files',''); LCmds(18,3,'4Pack Message Areas',''); LCmds(18,3,'5Files.BBS',''); LOneK('%LFWhich external event? [^51^4-^55^4,^5^4=^5Quit^4]: ',Cmd1,^M'12345',TRUE,TRUE); IF (Cmd1 <> ^M) THEN BEGIN CASE Cmd1 OF '1' : BEGIN IF (EventIsShell IN EFlags) THEN BEGIN Exclude(EFlags,EventIsShell); EventShellPath := ''; END; IF (EventIsSortFiles IN EFlags) THEN Exclude(EFlags,EventIsSortFiles); IF (EventIsPackMsgAreas IN EFlags) THEN Exclude(EFlags,EventIsPackMsgAreas); IF (EventIsFilesBBS IN EFlags) THEN Exclude(EFlags,EventIsFilesBBS); Include(EFlags,EventIsErrorLevel); InputByteWC('%LFError Level',EventErrorLevel,[],0,255,Changed); END; '2' : BEGIN IF (EventIsErrorLevel IN EFlags) THEN BEGIN Exclude(EFlags,EventIsErrorLevel); EventErrorLevel := 0; END; IF (EventIsSortFiles IN EFlags) THEN Exclude(EFlags,EventIsSortFiles); IF (EventIsPackMsgAreas IN EFlags) THEN Exclude(EFlags,EventIsPackMsgAreas); IF (EventIsFilesBBS IN EFlags) THEN Exclude(EFlags,EventIsFilesBBS); Include(EFlags,EventIsShell); InputWN1('%LFShell file: ',EventShellPath,8,[UpperOnly],Changed); END; '3' : BEGIN IF (EventIsShell IN EFlags) THEN BEGIN Exclude(EFlags,EventIsShell); EventShellPath := ''; END; IF (EventIsErrorLevel IN EFlags) THEN BEGIN Exclude(EFlags,EventIsErrorLevel); EventErrorLevel := 0; END; IF (EventIsPackMsgAreas IN EFlags) THEN Exclude(EFlags,EventIsPackMsgAreas); IF (EventIsFilesBBS IN EFlags) THEN Exclude(EFlags,EventIsFilesBBS); Include(EFlags,EventIsSortFiles); END; '4' : BEGIN IF (EventIsShell IN EFlags) THEN BEGIN Exclude(EFlags,EventIsShell); EventShellPath := ''; END; IF (EventIsErrorLevel IN EFlags) THEN BEGIN Exclude(EFlags,EventIsErrorLevel); EventErrorLevel := 0; END; IF (EventIsSortFiles IN EFlags) THEN Exclude(EFlags,EventIsSortFiles); IF (EventIsFilesBBS IN EFlags) THEN Exclude(EFlags,EventIsFilesBBS); Include(EFlags,EventIsPackMsgAreas); END; '5' : BEGIN IF (EventIsShell IN EFlags) THEN BEGIN Exclude(EFlags,EventIsShell); EventShellPath := ''; END; IF (EventIsErrorLevel IN EFlags) THEN BEGIN Exclude(EFlags,EventIsErrorLevel); EventErrorLevel := 0; END; IF (EventIsSortFiles IN EFlags) THEN Exclude(EFlags,EventIsSortFiles); IF (EventIsPackMsgAreas IN EFlags) THEN Exclude(EFlags,EventIsPackMsgAreas); Include(EFlags,EventIsFilesBBS); END; END; Changed := TRUE; END; Cmd1 := #0; END ELSE BEGIN Prt('%LFNew event start time? (24 Hour Format) Hour: (0-23), Minute: (0-59): '); InputFormatted('',TempStr,'##:##',TRUE); IF (TempStr <> '') AND (Length(TempStr) = 5) AND (Pos(':',TempStr) = 3) THEN BEGIN IF (StrToInt(Copy(TempStr,1,2)) IN [0..23]) AND (StrToInt(Copy(TempStr,4,2)) IN [0..59]) THEN BEGIN EventStartTime := ((StrToInt(Copy(TempStr,1,2)) * 60) + StrToInt(Copy(TempStr,4,2))); Changed := TRUE; END ELSE BEGIN Print('%LF^5Invalid time - Format is HH:MM (24 hour military)'); PauseScr(FALSE); END; END; Prt('%LFNew event finish time? (24 Hour Format) Hour: (0-23), Minute: (0-59): '); InputFormatted('',TempStr,'##:##',TRUE); IF (TempStr <> '') AND (Length(TempStr) = 5) AND (Pos(':',TempStr) = 3) THEN BEGIN IF (StrToInt(Copy(TempStr,1,2)) IN [0..23]) AND (StrToInt(Copy(TempStr,4,2)) IN [0..59]) THEN BEGIN EventFinishTime := ((StrToInt(Copy(TempStr,1,2)) * 60) + StrToInt(Copy(TempStr,4,2))); Changed := TRUE; END ELSE BEGIN Print('%LF^5Invalid time - Format is HH:MM (24 hour military)'); PauseScr(FALSE); END; END; END; 'G' : IF (EventIsExternal IN EFlags) THEN BEGIN LOneK('%LFSchedule? [^5D^4=^5Daily^4,^5M^4=^5Monthly^4,^5^4=^5Quit^4]: ',Cmd1,^M'DM',TRUE,TRUE); CASE Cmd1 OF 'D' : BEGIN IF (EventIsMonthly IN EFlags) THEN BEGIN Exclude(EFlags,EventIsMonthly); EventDayOfMonth := 0; Changed := TRUE; END; REPEAT Print('%LF^5Active Days: ^3'+DaysEventActive(EventDays,'5','4')+'^1'); NL; LCmds(11,3,'1Sunday',''); LCmds(11,3,'2Monday',''); LCmds(11,3,'3Tuesday',''); LCmds(11,3,'4Wednesday',''); LCmds(11,3,'5Thursday',''); LCmds(11,3,'6Friday',''); LCmds(11,3,'7Saturday',''); LOneK('%LFToggle which day? [^51^4-^57^4,^5^4=^5Quit^4]: ',Cmd1,^M'1234567',TRUE,TRUE); IF (Cmd1 <> ^M) THEN BEGIN IF (StrToInt(Cmd1) - 1 IN EventDays) THEN Exclude(EventDays,StrToInt(Cmd1) - 1) ELSE Include(EventDays,StrToInt(Cmd1) - 1); Changed := TRUE; END; UNTIL (Cmd1 = ^M) OR (HangUp); Cmd1 := #0; END; 'M' : BEGIN IF (NOT (EventIsMonthly IN EFlags)) THEN BEGIN Include(EFlags,EventIsMonthly); EventDays := []; Changed := TRUE; END; InputByteWC('%LFDay of the month',EventDayOfMonth,[],1,31,Changed); END; END; Cmd1 := #0; END ELSE BEGIN ToggleEFlag(EventIsPermission,EFlags); Changed := TRUE; END; 'H' : IF (EventIsExternal IN EFlags) THEN BEGIN Prt('%LFNew event start time? (24 Hour Format) Hour: (0-23), Minute: (0-59): '); InputFormatted('',TempStr,'##:##',TRUE); IF (TempStr <> '') AND (Length(TempStr) = 5) AND (Pos(':',TempStr) = 3) THEN BEGIN IF (StrToInt(Copy(TempStr,1,2)) IN [0..23]) AND (StrToInt(Copy(TempStr,4,2)) IN [0..59]) THEN BEGIN EventStartTime := ((StrToInt(Copy(TempStr,1,2)) * 60) + StrToInt(Copy(TempStr,4,2))); Changed := TRUE; END ELSE BEGIN Print('%LF^5Invalid time - Format is HH:MM (24 hour military)'); PauseScr(FALSE); END; END; END ELSE BEGIN Print('%LF^5Internal event type:'); NL; LCmds(7,3,'1Logon',''); LCmds(7,3,'2Chat',''); LOneK('%LFWhich internal event? [^51^4-^52^4,^5^4=^5Quit^4]: ',Cmd1,^M'12',TRUE,TRUE); IF (Cmd1 <> ^M) THEN BEGIN CASE Cmd1 OF '1' : BEGIN IF (EventIsChat IN EFlags) THEN Exclude(EFlags,EventIsChat); Include(EFlags,EventIsLogon); END; '2' : BEGIN IF (EventIsLogon IN EFlags) THEN Exclude(EFlags,EventIsLogon); Include(EFlags,EventIsChat); END; END; Changed := TRUE; END; Cmd1 := #0; END; 'I' : IF (EventIsExternal IN EFlags) THEN BEGIN IF (EventIsOffHook IN EFlags) THEN BEGIN Exclude(EFlags,EventIsOffHook); EventPreTime := 0; Changed := TRUE; END ELSE BEGIN Include(EFlags,EventIsOffHook); InputByteWC('%LFMinutes before event to take phone offhook',EventPreTime,[],0,255,Changed); END; END ELSE InputWN1('%LF^1Message/@File if the user is effected by the event:%LF^4: ',EventQualMsg,64,[],Changed); 'K' : IF (EventIsExternal IN EFlags) THEN BEGIN IF (PD2Date(EventLastDate) = DateStr) THEN EventLastDate := NextDay(PD2Date(EventLastDate)) ELSE EventLastDate := Date2PD(DateStr); Changed := TRUE; END ELSE InputWN1('%LF^1Message/@File if the user IS NOT effected by the event:%LF^4: ', EventNotQualMsg,64,[],Changed); 'M' : BEGIN IF PYNQ('%LFRun this event later if the event time is missed? ',0,FALSE) THEN Include(EFlags,EventIsMissed) ELSE Exclude(EFlags,EventIsMissed); Changed := TRUE; END; 'N' : InputByteWC('%LFNode number to execute event from (0=All)',EventNode, [DisplayValue,NumbersOnly],0,MaxNodes,Changed); '1' : IF (NOT (EventIsExternal IN EFlags)) THEN IF (BaudIsActive IN EFlags) THEN BEGIN Exclude(EFlags,BaudIsActive); LoBaud := 300; HiBaud := 115200; Changed := TRUE; END ELSE BEGIN Include(EFlags,BaudIsActive); Print('%LF^5Baud lower limit:^1%LF'); Counter := 1; WHILE (Counter <= 20) AND (NOT Abort) AND (NOT HangUp) DO BEGIN PrintACR(Char(Counter + 64)+'. '+IntToStr(BaudRates[Counter])); Inc(Counter); END; LOneK('%LFWhich? (^5A^4-^5T^4): ',Cmd1,'ABCDEFGHIJKLMNOPQRST',TRUE,TRUE); LoBaud := BaudRates[Ord(Cmd1) - 64]; Print('%LF^5Baud upper limit:^1%LF'); Counter := 1; WHILE (Counter <= 20) AND (NOT Abort) AND (NOT HangUp) DO BEGIN PrintACR(Char(Counter + 64)+'. '+IntToStr(BaudRates[Counter])); Inc(Counter); END; LOneK('%LFWhich? (^5A^4-^5T^4): ',Cmd1,'ABCDEFGHIJKLMNOPQRST',TRUE,TRUE); HiBaud := BaudRates[Ord(Cmd1) - 64]; Changed := TRUE; Cmd1 := #0; END; '2' : IF (NOT (EventIsExternal IN EFlags)) THEN IF (ACSIsActive IN EFlags) THEN BEGIN Exclude(EFlags,ACSIsActive); EventACS := 's10'; Changed := TRUE; END ELSE BEGIN Include(EFlags,ACSIsActive); InputWN1('%LFSL ACS: ',EventACS,(SizeOf(EventACS) - 1),[InterActiveEdit],Changed); END; '3' : IF (NOT (EventIsExternal IN EFlags)) THEN IF (EventIsPermission IN EFlags) THEN BEGIN IF (TimeIsActive IN EFlags) THEN BEGIN Exclude(EFlags,TimeIsActive); MaxTimeAllowed := 60; Changed := TRUE; END ELSE BEGIN Include(EFlags,TimeIsActive); InputWordWoc('%LFMaximum time allowed on-line (minutes)',MaxTimeAllowed, [DisplayValue,NumbersOnly],0,65535); END; END; '4' : IF NOT (EventIsExternal IN EFlags) THEN IF (EventIsPermission IN EFlags) THEN BEGIN IF (SetArIsActive IN EFlags) THEN BEGIN Exclude(EFlags,SetArIsActive); SetArFlag := '@'; Changed := TRUE; END ELSE BEGIN Include(EFlags,SetArIsActive); LOneK('%LFAR flag to set (^5A^4-^5Z^4): ',Cmd1,'ABCDEFGHIJKLMNOPQRSTUVWXYZ',TRUE,TRUE); SetArFlag := Cmd1; Cmd1 := #0; END; END; '5' : IF NOT (EventIsExternal IN EFlags) THEN IF (EventIsPermission IN EFlags) THEN BEGIN IF (ClearArIsActive IN EFlags) THEN BEGIN Exclude(EFlags,ClearArIsActive); ClearArFlag := '@'; Changed := TRUE; END ELSE BEGIN Include(EFlags,ClearArIsActive); LOneK('%LFAR flag to clear (^5A^4-^5Z^4): ',Cmd1,'ABCDEFGHIJKLMNOPQRSTUVWXYZ',TRUE,TRUE); ClearArFlag := Cmd1; Cmd1 := #0; END; END; '6' : IF (NOT (EventIsExternal IN EFlags)) THEN ToggleEFlags('S',EFlags,Changed); '[' : IF (RecNumToEdit > 1) THEN Dec(RecNumToEdit) ELSE BEGIN Messages(2,0,''); Cmd1 := #0; END; ']' : IF (RecNumToEdit < NumEvents) THEN Inc(RecNumToEdit) ELSE BEGIN Messages(3,0,''); Cmd1 := #0; END; 'F' : IF (RecNumToEdit <> 1) THEN RecNumToEdit := 1 ELSE BEGIN Messages(2,0,''); Cmd1 := #0; END; 'J' : BEGIN InputIntegerWOC('%LFJump to entry?',RecNumToEdit,[NumbersOnly],1,NumEvents); IF (RecNumToEdit < 1) OR (RecNumToEdit > NumEvents) THEN Cmd1 := #0; END; 'L' : IF (RecNumToEdit <> NumEvents) THEN RecNumToEdit := NumEvents ELSE BEGIN Messages(3,0,''); Cmd1 := #0; END; '?' : BEGIN Print('%LF^1<^3CR^1>Redisplay screen'); Print('^3 0) OR (HangUp); END; PROCEDURE InsertEvent(TempEvent1: EventRecordType; Cmd1: Char; RecNumToInsertBefore: SmallInt); VAR RecNum, RecNumToEdit: SmallInt; Ok, Changed: Boolean; BEGIN IF (NumEvents = MaxEvents) THEN Messages(5,MaxEvents,'events') ELSE BEGIN RecNumToInsertBefore := -1; InputIntegerWOC('%LFEvent to insert before?',RecNumToInsertBefore,[NumbersOnly],1,(NumEvents + 1)); IF (RecNumToInsertBefore >= 1) AND (RecNumToInsertBefore <= (NumEvents + 1)) THEN BEGIN Reset(EventFile); InitEventVars(TempEvent1); IF (RecNumToInsertBefore = 1) THEN RecNumToEdit := 1 ELSE IF (RecNumToInsertBefore = (NumEvents + 1)) THEN RecNumToEdit := (NumEvents + 1) ELSE RecNumToEdit := RecNumToInsertBefore; REPEAT OK := TRUE; EditEvent(TempEvent1,TempEvent1,Cmd1,RecNumToEdit,Changed,FALSE); CheckEvent(TempEvent1,1,1,Ok); IF (NOT OK) THEN IF (NOT PYNQ('%LFContinue inserting event? ',0,TRUE)) THEN Abort := TRUE; UNTIL (OK) OR (Abort) OR (HangUp); IF (NOT Abort) AND (PYNQ('%LFIs this what you want? ',0,FALSE)) THEN BEGIN Print('%LF[> Inserting event record ...'); Seek(EventFile,FileSize(EventFile)); Write(EventFile,Event); Dec(RecNumToInsertBefore); FOR RecNum := ((FileSize(EventFile) - 1) - 1) DOWNTO RecNumToInsertBefore DO BEGIN Seek(EventFile,RecNum); Read(EventFile,Event); Seek(EventFile,(RecNum + 1)); Write(EventFile,Event); END; FOR RecNum := RecNumToInsertBefore TO ((RecNumToInsertBefore + 1) - 1) DO BEGIN Seek(EventFile,RecNum); Write(EventFile,TempEvent1); Inc(NumEvents); SysOpLog('* Inserted event: ^5'+TempEvent1.EventDescription); END; END; Close(EventFile); LastError := IOResult; END; END; END; PROCEDURE ModifyEvent(TempEvent1: EventRecordType; Cmd1: Char; RecNumToEdit: SmallInt); VAR SaveRecNumToEdit: Integer; Ok, Changed: Boolean; BEGIN IF (NumEvents = 0) THEN Messages(4,0,'events') ELSE BEGIN RecNumToEdit := -1; InputIntegerWOC('%LFModify which event?',RecNumToEdit,[NumbersOnly],1,NumEvents); IF (RecNumToEdit >= 1) AND (RecNumToEdit <= NumEvents) THEN BEGIN SaveRecNumToEdit := -1; Cmd1 := #0; Reset(EventFile); WHILE (Cmd1 <> 'Q') AND (NOT HangUp) DO BEGIN IF (SaveRecNumToEdit <> RecNumToEdit) THEN BEGIN Seek(EventFile,(RecNumToEdit - 1)); Read(EventFile,Event); SaveRecNumToEdit := RecNumToEdit; Changed := FALSE; END; REPEAT Ok := TRUE; EditEvent(TempEvent1,Event,Cmd1,RecNumToEdit,Changed,TRUE); CheckEvent(Event,1,1,Ok); IF (NOT OK) THEN BEGIN PauseScr(FALSE); IF (RecNumToEdit <> SaveRecNumToEdit) THEN RecNumToEdit := SaveRecNumToEdit; END; UNTIL (Ok) OR (HangUp); IF (Changed) THEN BEGIN Seek(EventFile,(SaveRecNumToEdit - 1)); Write(EventFile,Event); Changed := FALSE; SysOpLog('* Modified event: ^5'+Event.EventDescription); END; END; Close(EventFile); LastError := IOResult; END; END; END; PROCEDURE PositionEvent(TempEvent1: EventRecordType; RecNumToPosition: SmallInt); VAR RecNumToPositionBefore, RecNum1, RecNum2: SmallInt; BEGIN IF (NumEvents = 0) THEN Messages(4,0,'events') ELSE IF (NumEvents = 1) THEN Messages(6,0,'events') ELSE BEGIN InputIntegerWOC('%LFPosition which event?',RecNumToPosition,[NumbersOnly],1,NumEvents); IF (RecNumToPosition >= 1) AND (RecNumToPosition <= NumEvents) THEN BEGIN Print('%LFAccording to the current numbering system.'); InputIntegerWOC('%LFPosition before which event?',RecNumToPositionBefore,[Numbersonly],1,(NumEvents + 1)); IF (RecNumToPositionBefore >= 1) AND (RecNumToPositionBefore <= (NumEvents + 1)) AND (RecNumToPositionBefore <> RecNumToPosition) AND (RecNumToPositionBefore <> (RecNumToPosition + 1)) THEN BEGIN Print('%LF[> Positioning event.'); Reset(EventFile); IF (RecNumToPositionBefore > RecNumToPosition) THEN Dec(RecNumToPositionBefore); Dec(RecNumToPosition); Dec(RecNumToPositionBefore); Seek(EventFile,RecNumToPosition); Read(EventFile,TempEvent1); RecNum1 := RecNumToPosition; IF (RecNumToPosition > RecNumToPositionBefore) THEN RecNum2 := -1 ELSE RecNum2 := 1; WHILE (RecNum1 <> RecNumToPositionBefore) DO BEGIN IF ((RecNum1 + RecNum2) < FileSize(EventFile)) THEN BEGIN Seek(EventFile,(RecNum1 + RecNum2)); Read(EventFile,Event); Seek(EventFile,RecNum1); Write(EventFile,Event); END; Inc(RecNum1,RecNum2); END; Seek(EventFile,RecNumToPositionBefore); Write(EventFile,TempEvent1); Close(EventFile); LastError := IOResult; END; END; END; END; PROCEDURE ListEvents(VAR RecNumToList1: Integer); VAR NumDone: Integer; BEGIN IF (RecNumToList1 < 1) OR (RecNumToList1 > NumFileAreas) THEN RecNumToList1 := 1; Abort := FALSE; Next := FALSE; CLS; PrintACR('^0 ##^4:^3Description ^4:^3Typ^4:^3Bsy^4:^3Time ^4:^3Len^4:^3Days ^4:^3Execinfo'); PrintACR('^4 ==:==============================:===:===:=====:===:=======:============'); Reset(EventFile); NumDone := 0; WHILE (NumDone < (PageLength - 5)) AND (RecNumToList1 >= 1) AND (RecNumToList1 <= NumEvents) AND (NOT Abort) AND (NOT HangUp) DO BEGIN Seek(EventFile,(RecNumToList1 - 1)); Read(EventFile,Event); WITH Event DO PrintACR(AOnOff(EventIsActive IN EFlags,'^5+','^1-')+ '^0'+PadRightInt(RecNumToList1,2)+ ' ^3'+PadLeftStr(EventDescription,30)+ (* ' '+SchedT(FALSE,EType)+ *) ' ^5'+PadLeftInt(EventPreTime,3)+ ' '+Copy(CTim(EventStartTime),4,5)); (* ' '+PadLeftInt(DurationOrLastDay,3)+ ' '+DActiv(FALSE,ExecDays,Monthly)+ ' ^3'+PadLeftStr(lExecData,9)); *) Inc(RecNumToList1); Inc(NumDone); END; Close(EventFile); LastError := IOResult; IF (NumEvents = 0) THEN Print('*** No events defined ***'); END; BEGIN IF (MemEventArray[Numevents] <> NIL) THEN FOR RecNumToList := 1 TO NumEvents DO IF (MemEventArray[RecNumToList] <> NIL) THEN Dispose(MemEventArray[RecNumToList]); SaveTempPause := TempPause; TempPause := FALSE; RecNumToList := 1; Cmd := #0; REPEAT IF (Cmd <> '?') THEN ListEvents(RecNumToList); LOneK('%LFEvent editor [^5?^4=^5Help^4]: ',Cmd,'QDIMP?'^M,TRUE,TRUE); CASE Cmd OF ^M : IF (RecNumToList < 1) OR (RecNumToList > NumEvents) THEN RecNumToList := 1; 'D' : DeleteEvent(TempEvent,RecNumToList); 'I' : InsertEvent(TempEvent,Cmd,RecNumToList); 'M' : ModifyEvent(TempEvent,Cmd,RecNumToList); 'P' : PositionEvent(TempEvent,RecNumToList); '?' : BEGIN Print('%LF^1<^3CR^1>Next screen or redisplay current screen'); Print('^1(^3?^1)Help/First event'); LCmds(13,3,'Delete event','Insert event'); LCmds(13,3,'Modify event','Position event'); LCmds(13,3,'Quit',''); END; END; IF (Cmd <> ^M) THEN RecNumToList := 1; UNTIL (Cmd = 'Q') OR (HangUp); TempPause := SaveTempPause; NumEvents := 0; Reset(EventFile); WHILE NOT EOF(EventFile) DO BEGIN Inc(NumEvents); New(MemEventArray[NumEvents]); Read(EventFile,MemEventArray[NumEvents]^); END; Close(EventFile); LastError := IOResult; END; END.