747 lines
26 KiB
Plaintext
747 lines
26 KiB
Plaintext
{$IFDEF WIN32}
|
|
{$I DEFINES.INC}
|
|
{$ENDIF}
|
|
|
|
{$A+,B-,D+,E-,F+,I-,L+,N-,O+,R-,S+,V-}
|
|
|
|
UNIT SysOp10;
|
|
|
|
INTERFACE
|
|
|
|
PROCEDURE VotingEditor;
|
|
|
|
IMPLEMENTATION
|
|
|
|
USES
|
|
Common,
|
|
MiscUser;
|
|
|
|
PROCEDURE VotingEditor;
|
|
VAR
|
|
TempTopic: VotingRecordType;
|
|
Cmd: Char;
|
|
RecNumToList: Byte;
|
|
SaveTempPause: Boolean;
|
|
|
|
PROCEDURE InitTopicVars(VAR Topic: VotingRecordType);
|
|
VAR
|
|
User: UserRecordType;
|
|
Counter: Byte;
|
|
BEGIN
|
|
LoadURec(User,UserNum);
|
|
FillChar(Topic,SizeOf(Topic),0);
|
|
WITH Topic DO
|
|
BEGIN
|
|
Question1 := '<< New Voting Topic >>';
|
|
Question2 := '';
|
|
ACS := 'VV';
|
|
ChoiceNumber := 0;
|
|
NumVotedQuestion := 0;
|
|
CreatedBy := Caps(User.Name);
|
|
AddAnswersACS := General.AddChoice;
|
|
FOR Counter := 1 TO MaxChoices DO
|
|
WITH Answers[Counter] DO
|
|
BEGIN
|
|
Answer1 := '<< New Topic Choice >>';
|
|
Answer2 := '';
|
|
NumVotedAnswer := 0;
|
|
END;
|
|
END;
|
|
END;
|
|
|
|
PROCEDURE DeleteChoice(VAR Topic: VotingRecordType; RecNumToDelete: Byte; VAR Changed: Boolean);
|
|
VAR
|
|
User: UserRecordType;
|
|
RecNum,
|
|
RecNum1: Byte;
|
|
UNum: Integer;
|
|
BEGIN
|
|
IF (Topic.ChoiceNumber < 1) THEN
|
|
Messages(4,0,'topic choices')
|
|
ELSE
|
|
BEGIN
|
|
RecNum := 0;
|
|
InputByteWOC('%LFDelete which choice',RecNum,[Numbersonly],1,Topic.ChoiceNumber);
|
|
IF (RecNum >= 1) AND (RecNum <= Topic.ChoiceNumber) THEN
|
|
BEGIN
|
|
Dec(Topic.ChoiceNumber);
|
|
Dec(Topic.NumVotedQuestion,Topic.Answers[RecNum].NumVotedAnswer);
|
|
IF (RecNum < MaxChoices) THEN
|
|
FOR RecNum1 := RecNum TO Topic.ChoiceNumber DO
|
|
BEGIN
|
|
Topic.Answers[RecNum1].Answer1 := Topic.Answers[RecNum1 + 1].Answer1;
|
|
Topic.Answers[RecNum1].Answer2 := Topic.Answers[RecNum1 + 1].Answer2;
|
|
Topic.Answers[RecNum1].NumVotedAnswer := Topic.Answers[RecNum1 + 1].NumVotedAnswer;
|
|
END;
|
|
Reset(UserFile);
|
|
FOR UNum := 1 TO (FileSize(UserFile) - 1) DO
|
|
BEGIN
|
|
Seek(UserFile,Unum);
|
|
Read(UserFile,User);
|
|
IF (User.Vote[RecNumToDelete] = RecNum) THEN
|
|
User.Vote[RecNumToDelete] := 0
|
|
ELSE IF (User.Vote[RecNumToDelete] > RecNum) THEN
|
|
Dec(User.Vote[RecNumToDelete]);
|
|
Seek(UserFile,UNum);
|
|
Write(UserFile,User);
|
|
END;
|
|
Close(UserFile);
|
|
IF (ThisUser.Vote[RecNumToDelete] = RecNum) THEN
|
|
ThisUser.Vote[RecNumToDelete] := 0;
|
|
Changed := TRUE;
|
|
END;
|
|
END;
|
|
END;
|
|
|
|
PROCEDURE InsertChoice(VAR Topic: VotingRecordType; RecNumToEdit: Byte; VAR Changed: Boolean);
|
|
BEGIN
|
|
IF (Topic.ChoiceNumber >= MaxChoices) THEN
|
|
Messages(5,MaxChoices,'topic choices')
|
|
ELSE IF PYNQ('%LFAdd topic choice #'+IntToStr(Topic.ChoiceNumber + 1)+'? ',0,FALSE) THEN
|
|
BEGIN
|
|
InputWNWC('%LFChoice: ',Topic.Answers[Topic.ChoiceNumber + 1].Answer1,65,Changed);
|
|
IF (Topic.Answers[Topic.ChoiceNumber + 1].Answer1 <> '') THEN
|
|
BEGIN
|
|
Topic.Answers[Topic.ChoiceNumber + 1].NumVotedAnswer := 0;
|
|
InputWNWC(PadLeftStr('',6)+': ',Topic.Answers[Topic.ChoiceNumber + 1].Answer2,65,Changed);
|
|
Inc(Topic.ChoiceNumber);
|
|
END;
|
|
Changed := TRUE;
|
|
END;
|
|
END;
|
|
|
|
PROCEDURE CheckChoice(Topic: VotingRecordType; RecNum1: Byte; StartErrMsg,EndErrMsg: Byte; VAR Ok: Boolean);
|
|
VAR
|
|
Counter: Byte;
|
|
BEGIN
|
|
FOR Counter := StartErrMsg TO EndErrMsg DO
|
|
CASE Counter OF
|
|
1 : IF (Topic.Answers[RecNum1].Answer1 = '') OR (Topic.Answers[RecNum1].Answer1 = '<< New Topic Choice >>') THEN
|
|
BEGIN
|
|
Print('%LF^7The answer is invalid!^1');
|
|
OK := FALSE;
|
|
END;
|
|
END;
|
|
END;
|
|
|
|
PROCEDURE ModifyChoice(TempTopic1: VotingRecordType; VAR Topic: VotingRecordType; RecNumToEdit: Byte; VAR Changed: Boolean);
|
|
VAR
|
|
Cmd1: Char;
|
|
RecNum: Byte;
|
|
Ok: Boolean;
|
|
BEGIN
|
|
IF (Topic.ChoiceNumber < 1) THEN
|
|
Messages(4,0,'topic choices')
|
|
ELSE
|
|
BEGIN
|
|
RecNum := 0;
|
|
InputByteWOC('%LFModify which choice',RecNum,[Numbersonly],1,Topic.ChoiceNumber);
|
|
IF (RecNum >= 1) AND (RecNum <= Topic.ChoiceNumber) THEN
|
|
BEGIN
|
|
REPEAT
|
|
IF (Cmd1 <> '?') THEN
|
|
BEGIN
|
|
Abort := FALSE;
|
|
Next := FALSE;
|
|
Print('%CL^5Topic choice #'+IntToStr(RecNum)+' of '+IntToStr(Topic.ChoiceNumber));
|
|
NL;
|
|
PrintACR('^11. Choice: ^5'+Topic.Answers[RecNum].Answer1);
|
|
IF (Topic.Answers[RecNum].Answer2 <> '') THEN
|
|
PrintACR('^1 : ^5'+Topic.Answers[RecNum].Answer2);
|
|
PrintACR('^12. Voters: ^5'+IntToStr(Topic.Answers[RecNum].NumVotedAnswer));
|
|
END;
|
|
LOneK('%LFModify menu [^5?^4=^5Help^4]: ',Cmd1,'Q12[]FJL?'^M,TRUE,TRUE);
|
|
CASE Cmd1 OF
|
|
'1' : BEGIN
|
|
REPEAT
|
|
TempTopic1.Answers[RecNum].Answer1 := Topic.Answers[RecNum].Answer1;
|
|
Ok := TRUE;
|
|
InputWNWC('%LFNew choice: ',Topic.Answers[RecNum].Answer1,
|
|
(SizeOf(Topic.Answers[RecNum].Answer1) - 1),Changed);
|
|
CheckChoice(Topic,RecNum,1,1,Ok);
|
|
IF (NOT Ok) THEN
|
|
Topic.Answers[RecNum].Answer1 := TempTopic1.Answers[RecNum].Answer1;
|
|
UNTIL (Ok) OR (HangUp);
|
|
IF (Topic.Answers[RecNum].Answer1 <> '') THEN
|
|
InputWNWC(PadLeftStr('',10)+': ',Topic.Answers[Recnum].Answer2,
|
|
(SizeOf(Topic.Answers[RecNum].Answer2) - 1),Changed);
|
|
END;
|
|
'2' : InputIntegerWC('%LFNew number of voters',Topic.Answers[RecNum].NumVotedAnswer,[DisplayValue,NumbersOnly],0,
|
|
(MaxUsers - 1),Changed);
|
|
'[' : IF (RecNum > 1) THEN
|
|
Dec(RecNum)
|
|
ELSE
|
|
BEGIN
|
|
Messages(2,0,'');
|
|
Cmd1 := #0;
|
|
END;
|
|
']' : IF (RecNum < Topic.ChoiceNumber) THEN
|
|
Inc(RecNum)
|
|
ELSE
|
|
BEGIN
|
|
Messages(3,0,'');
|
|
Cmd1 := #0;
|
|
END;
|
|
'F' : IF (RecNum <> 1) THEN
|
|
RecNum := 1
|
|
ELSE
|
|
BEGIN
|
|
Messages(2,0,'');
|
|
Cmd1 := #0;
|
|
END;
|
|
'J' : BEGIN
|
|
InputByteWOC('%LFJump to entry',RecNum,[Numbersonly],1,Topic.ChoiceNumber);
|
|
IF (RecNum < 1) OR (RecNum > Topic.ChoiceNumber) THEN
|
|
Cmd1 := #0;
|
|
END;
|
|
'L' : IF (RecNum <> Topic.ChoiceNumber) THEN
|
|
RecNum := Topic.ChoiceNumber
|
|
ELSE
|
|
BEGIN
|
|
Messages(3,0,'');
|
|
Cmd1 := #0;
|
|
END;
|
|
'?' : BEGIN
|
|
Print('%LF^1<^3CR^1>Redisplay screen');
|
|
Print('^31-2^1:Modify item');
|
|
LCmds(20,3,'[Back entry',']Forward entry');
|
|
LCmds(20,3,'First entry in list','Jump to entry');
|
|
LCmds(20,3,'Last entry in list','Quit and save');
|
|
END;
|
|
END;
|
|
UNTIL (Cmd1 = 'Q') OR (HangUp);
|
|
END;
|
|
END;
|
|
END;
|
|
|
|
PROCEDURE ListChoices(VAR Topic: VotingRecordType; VAR RecNumToList1: Byte);
|
|
VAR
|
|
NumDone: Byte;
|
|
BEGIN
|
|
IF (RecNumToList1 < 1) OR (RecNumToList1 > Topic.ChoiceNumber) THEN
|
|
RecNumToList1 := 1;
|
|
Abort := FALSE;
|
|
Next := FALSE;
|
|
CLS;
|
|
PrintACR('^0##^4:^3Answer^4:^3Choice');
|
|
PrintACR('^4==:======:=====================================================================');
|
|
NumDone := 0;
|
|
WHILE (NumDone < (PageLength - 5)) AND (RecNumToList1 >= 1) AND (RecNumToList1 <= Topic.ChoiceNumber)
|
|
AND (NOT Abort) AND (NOT HangUp) DO
|
|
BEGIN
|
|
PrintACR('^0'+PadRightInt(RecNumToList1,2)+
|
|
' ^3'+PadRightInt(Topic.Answers[RecNumToList1].NumVotedAnswer,6)+
|
|
' ^5'+Topic.Answers[RecNumToList1].Answer1);
|
|
WKey;
|
|
Inc(RecNumToList1);
|
|
Inc(NumDone);
|
|
END;
|
|
IF (Topic.ChoiceNumber = 0) THEN
|
|
Print('*** No voting choices defined ***');
|
|
END;
|
|
|
|
PROCEDURE ChoiceEditor(TempTopic1: VotingRecordType; VAR Topic: VotingRecordType; Cmd1: Char;
|
|
RecNumToEdit: Byte; VAR Changed: Boolean);
|
|
VAR
|
|
RecNumToList1: Byte;
|
|
BEGIN
|
|
SaveTempPause := TempPause;
|
|
TempPause := FALSE;
|
|
RecNumToList1 := 1;
|
|
Cmd1 := #0;
|
|
REPEAT
|
|
IF (Cmd1 <> '?') THEN
|
|
ListChoices(Topic,RecNumToList1);
|
|
LOneK('%LFTopic choice editor [^5?^4=^5Help^4]: ',Cmd1,'QDIM?'^M,TRUE,TRUE);
|
|
CASE Cmd1 OF
|
|
^M : IF (RecNumToList1 < 1) OR (RecNumToList1 > Topic.ChoiceNumber) THEN
|
|
RecNumToList1 := 1;
|
|
'D' : DeleteChoice(Topic,RecNumToEdit,Changed);
|
|
'I' : InsertChoice(Topic,RecNumToEdit,Changed);
|
|
'M' : ModifyChoice(TempTopic1,Topic,RecNumToEdit,Changed);
|
|
'?' : BEGIN
|
|
Print('%LF^1<^3CR^1>Next screen or redisplay current screen');
|
|
Print('^1(^3?^1)Help/First topic choice');
|
|
LCmds(20,3,'Delete topic choice','Insert topic choice');
|
|
LCmds(20,3,'Modify topic choice','Quit');
|
|
END;
|
|
END;
|
|
IF (Cmd1 <> ^M) THEN
|
|
RecNumToList1 := 1;
|
|
UNTIL (Cmd1 = 'Q') OR (HangUp);
|
|
TempPause := SaveTempPause;
|
|
END;
|
|
|
|
PROCEDURE DeleteTopic(TempTopic1: VotingRecordType; RecNumToDelete: Byte);
|
|
VAR
|
|
User: UserRecordType;
|
|
RecNum: Integer;
|
|
BEGIN
|
|
IF (NumVotes = 0) THEN
|
|
Messages(4,0,'voting topics')
|
|
ELSE
|
|
BEGIN
|
|
RecNumToDelete := 0;
|
|
InputByteWOC('%LFVoting topic to delete',RecNumToDelete,[NumbersOnly],1,NumVotes);
|
|
IF (RecNumToDelete >= 1) AND (RecNumToDelete <= NumVotes) THEN
|
|
BEGIN
|
|
Reset(VotingFile);
|
|
Seek(VotingFile,(RecNumToDelete - 1));
|
|
Read(VotingFile,TempTopic1);
|
|
Close(VotingFile);
|
|
LastError := IOResult;
|
|
Print('%LF^1Voting topic: ^5'+TempTopic1.Question1);
|
|
IF (TempTopic1.Question2 <> '') THEN
|
|
Print('^1'+PadLeftStr('',12)+': ^5'+TempTopic1.Question2);
|
|
IF PYNQ('%LFAre you sure you want to delete it? ',0,FALSE) THEN
|
|
BEGIN
|
|
Print('%LF[> Deleting voting topic record ...');
|
|
Dec(RecNumToDelete);
|
|
Reset(VotingFile);
|
|
IF (RecNumToDelete >= 0) AND (RecNumToDelete <= (FileSize(VotingFile) - 2)) THEN
|
|
FOR RecNum := RecNumToDelete TO (FileSize(VotingFile) - 2) DO
|
|
BEGIN
|
|
Seek(VotingFile,(RecNum + 1));
|
|
Read(VotingFile,Topic);
|
|
Seek(VotingFile,RecNum);
|
|
Write(VotingFile,Topic);
|
|
END;
|
|
Seek(VotingFile,(FileSize(VotingFile) - 1));
|
|
Truncate(VotingFile);
|
|
Close(VotingFile);
|
|
LastError := IOResult;
|
|
SysOpLog('* Deleted topic: ^5'+TempTopic1.Question1);
|
|
IF (Topic.Question2 <> '') THEN
|
|
SysOpLog(PadLeftStr('',15)+': ^5'+TempTopic1.Question2);
|
|
Reset(UserFile);
|
|
FOR RecNum := 1 TO (FileSize(UserFile) - 1) DO
|
|
BEGIN
|
|
Seek(UserFile,RecNum);
|
|
Read(UserFile,User);
|
|
Move(User.Vote[RecNumToDelete + 1],User.Vote[RecNumToDelete],(MaxVotes - RecNumToDelete));
|
|
User.Vote[25] := 0;
|
|
Seek(UserFile,RecNum);
|
|
Write(UserFile,User);
|
|
END;
|
|
Close(UserFile);
|
|
LastError := IOResult;
|
|
Move(ThisUser.Vote[RecNumToDelete + 1],ThisUser.Vote[RecNumToDelete],(MaxVotes - RecNumToDelete));
|
|
ThisUser.Vote[25] := 0;
|
|
Dec(NumVotes);
|
|
END;
|
|
END;
|
|
END;
|
|
END;
|
|
|
|
PROCEDURE CheckTopic(Topic: VotingRecordType; StartErrMsg,EndErrMsg: Byte; VAR Ok: Boolean);
|
|
VAR
|
|
Counter,
|
|
Counter1: Byte;
|
|
BEGIN
|
|
FOR Counter := StartErrMsg TO EndErrMsg DO
|
|
CASE Counter OF
|
|
1 : IF (Topic.Question1 = '') OR (Topic.Question1 = '<< New Voting Topic >>') THEN
|
|
BEGIN
|
|
Print('%LF^7The question is invalid!^1');
|
|
OK := FALSE;
|
|
END;
|
|
2 : IF (Topic.ChoiceNumber = 0) THEN
|
|
BEGIN
|
|
Print('%LF^7You must setup choices for your topic!^1');
|
|
OK := FALSE;
|
|
END;
|
|
END;
|
|
END;
|
|
|
|
PROCEDURE EditTopic(TempTopic1: VotingRecordType; VAR Topic: VotingRecordType; VAR Cmd1: Char;
|
|
VAR RecNumToEdit: Byte; VAR Changed: Boolean; Editing: Boolean);
|
|
VAR
|
|
User: UserRecordType;
|
|
CmdStr: AStr;
|
|
Unum: Integer;
|
|
Ok: Boolean;
|
|
BEGIN
|
|
WITH Topic DO
|
|
REPEAT
|
|
IF (Cmd1 <> '?') THEN
|
|
BEGIN
|
|
Abort := FALSE;
|
|
Next := FALSE;
|
|
CLS;
|
|
IF (Editing) THEN
|
|
PrintACR('^5Editing voting topic #'+IntToStr(RecNumToEdit)+' of '+IntToStr(NumVotes))
|
|
ELSE
|
|
PrintACR('^5Inserting voting topic #'+IntToStr(RecNumToEdit)+' of '+IntToStr(NumVotes + 1));
|
|
NL;
|
|
PrintACR('^11. Topic : ^5'+Question1);
|
|
IF (Question2 <> '') THEN
|
|
PrintACR('^1'+PadLeftStr('',16)+': ^5'+Question2);
|
|
PrintACR('^12. Creator : ^5'+CreatedBy);
|
|
PrintACR('^13. ACS to vote : ^5'+AOnOff(ACS = '','*None*',ACS));
|
|
PrintACR('^14. ACS to add : ^5'+AOnOff(AddAnswersACS = '','*None*',AddAnswersACS));
|
|
PrintACR('^15. Total votes : ^5'+IntToStr(NumVotedQuestion));
|
|
Print('%LF^1[Choices on this topic: ^5'+IntToStr(ChoiceNumber)+'^1]');
|
|
END;
|
|
IF (NOT Editing) THEN
|
|
CmdStr := '12345C'
|
|
ELSE
|
|
CmdStr := '12345C[]FJL';
|
|
LOneK('%LFModify menu [^5C^4=^5Choice Editor^4,^5?^4=^5Help^4]: ',Cmd1,'Q?'+CmdStr+^M,TRUE,TRUE);
|
|
CASE Cmd1 OF
|
|
'1' : BEGIN
|
|
REPEAT
|
|
TempTopic1.Question1 := Question1;
|
|
Ok := TRUE;
|
|
InputWNWC('%LFNew topic: ',Question1,(SizeOf(Question1) - 1),Changed);
|
|
CheckTopic(Topic,1,1,Ok);
|
|
IF (NOT Ok) THEN
|
|
Question1 := TempTopic1.Question1;
|
|
UNTIL (Ok) OR (HangUp);
|
|
IF (Question1 <> '') THEN
|
|
InputWNWC(PadLeftStr('',9)+': ',Question2,(SizeOf(Question2) - 1),Changed);
|
|
END;
|
|
'2' : BEGIN
|
|
Print('%LF^5New creator of this topic (1-'+IntToStr(MaxUsers - 1)+')?^1');
|
|
Print('%LFEnter User Number, Name, or Partial Search String.');
|
|
Prt(': ');
|
|
lFindUserWS(Unum);
|
|
IF (Unum < 1) THEN
|
|
PauseScr(FALSE)
|
|
ELSE
|
|
BEGIN
|
|
LoadURec(User,UNum);
|
|
IF (CreatedBy <> Caps(User.Name)) THEN
|
|
IF (PYNQ('%LFSet the new creator name to '+Caps(User.Name)+'? ',0,FALSE)) THEN
|
|
BEGIN
|
|
CreatedBy := Caps(User.Name);
|
|
Changed := TRUE;
|
|
END;
|
|
END;
|
|
END;
|
|
'3' : InputWN1('%LFNew voting ACS: ',ACS,(SizeOf(ACS) - 1),[InterActiveEdit],Changed);
|
|
'4' : IF PYNQ('%LFAllow other users to add choices? ',0,FALSE) THEN
|
|
AddAnswersACS := ACS
|
|
ELSE
|
|
AddAnswersACS := General.AddChoice;
|
|
'5' : InputIntegerWOC('%LFNew number of voters',NumVotedQuestion,[DisplayValue,NumbersOnly],0,(MaxUsers - 1));
|
|
'C' : ChoiceEditor(TempTopic1,Topic,Cmd1,RecNumToEdit,Changed);
|
|
'[' : IF (RecNumToEdit > 1) THEN
|
|
Dec(RecNumToEdit)
|
|
ELSE
|
|
BEGIN
|
|
Messages(2,0,'');
|
|
Cmd1 := #0;
|
|
END;
|
|
']' : IF (RecNumToEdit < NumVotes) 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
|
|
InputByteWOC('%LFJump to entry',RecNumToEdit,[NumbersOnly],1,NumVotes);
|
|
IF (RecNumToEdit < 1) OR (RecNumToEdit > NumVotes) THEN
|
|
Cmd1 := #0;
|
|
END;
|
|
'L' : IF (RecNumToEdit <> NumVotes) THEN
|
|
RecNumToEdit := NumVotes
|
|
ELSE
|
|
BEGIN
|
|
Messages(3,0,'');
|
|
Cmd1 := #0;
|
|
END;
|
|
'?' : BEGIN
|
|
Print('%LF^1<^3CR^1>Redisplay current screen');
|
|
Print('^31^1-^35^1,^3C^1:Modify item');
|
|
IF (NOT Editing) THEN
|
|
LCmds(20,3,'Quit and save','')
|
|
ELSE
|
|
BEGIN
|
|
LCmds(20,3,'[Back entry',']Forward entry');
|
|
LCmds(20,3,'First entry in list','Jump to entry');
|
|
LCmds(20,3,'Last entry in list','Quit and save');
|
|
END;
|
|
END;
|
|
END;
|
|
UNTIL (Pos(Cmd1,'Q[]FJL') <> 0) OR (HangUp);
|
|
END;
|
|
|
|
PROCEDURE InsertTopic(TempTopic1: VotingRecordType; Cmd1: Char; RecNumToInsertBefore: Byte);
|
|
VAR
|
|
RecNumToEdit: Byte;
|
|
Ok,
|
|
Changed: Boolean;
|
|
BEGIN
|
|
IF (NumVotes = MaxVotes) THEN
|
|
Messages(5,MaxVotes,'voting topics')
|
|
ELSE IF (PYNQ('%LFAdd voting topic #'+IntToStr(NumVotes + 1)+'? ',0,FALSE)) THEN
|
|
BEGIN
|
|
Reset(VotingFile);
|
|
InitTopicVars(TempTopic1);
|
|
RecNumToInsertBefore := (FileSize(VotingFile) + 1);
|
|
IF (RecNumToInsertBefore = 1) THEN
|
|
RecNumToedit := 1
|
|
ELSE IF (RecNumToInsertBefore = (NumVotes + 1)) THEN
|
|
RecNumToEdit := (NumVotes + 1)
|
|
ELSE
|
|
RecNumToEdit := RecNumToInsertBefore;
|
|
REPEAT
|
|
OK := TRUE;
|
|
EditTopic(TempTopic1,TempTopic1,Cmd1,RecNumToEdit,Changed,FALSE);
|
|
CheckTopic(TempTopic1,1,2,Ok);
|
|
IF (NOT OK) THEN
|
|
IF (NOT PYNQ('%LFContinue inserting topic? ',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 voting topic record ...');
|
|
Seek(VotingFile,FileSize(VotingFile));
|
|
Write(VotingFile,TempTopic1);
|
|
Close(VotingFile);
|
|
LastError := IOResult;
|
|
Inc(NumVotes);
|
|
SysOpLog('* Inserted topic: ^5'+TempTopic1.Question1);
|
|
IF (TempTopic1.Question2 <> '') THEN
|
|
SysOpLog(PadLeftStr('',16)+': ^5'+TempTopic1.Question2);
|
|
END;
|
|
END;
|
|
END;
|
|
|
|
PROCEDURE ModifyTopic(TempTopic1: VotingRecordType; Cmd1: Char; RecNumToEdit: Byte);
|
|
VAR
|
|
SaveRecNumToEdit: Byte;
|
|
Ok,
|
|
Changed: Boolean;
|
|
BEGIN
|
|
IF (NumVotes = 0) THEN
|
|
Messages(4,0,'voting topics')
|
|
ELSE
|
|
BEGIN
|
|
RecNumToEdit := 0;
|
|
InputByteWOC('%LFModify which topic',RecNumToEdit,[NumbersOnly],1,NumVotes);
|
|
IF (RecNumToEdit >= 1) AND (RecNumToEdit <= NumVotes) THEN
|
|
BEGIN
|
|
SaveRecNumToEdit := 0;
|
|
Cmd1 := #0;
|
|
Reset(VotingFile);
|
|
WHILE (Cmd1 <> 'Q') AND (NOT HangUp) DO
|
|
BEGIN
|
|
IF (SaveRecNumToEdit <> RecNumToEdit) THEN
|
|
BEGIN
|
|
Seek(VotingFile,(RecNumToEdit - 1));
|
|
Read(VotingFile,Topic);
|
|
SaveRecNumToEdit := RecNumToEdit;
|
|
Changed := FALSE;
|
|
END;
|
|
REPEAT
|
|
Ok := TRUE;
|
|
EditTopic(TempTopic1,Topic,Cmd1,RecNumToEdit,Changed,TRUE);
|
|
CheckTopic(Topic,1,2,Ok);
|
|
IF (NOT OK) THEN
|
|
BEGIN
|
|
PauseScr(FALSE);
|
|
IF (RecNumToEdit <> SaveRecNumToEdit) THEN
|
|
RecNumToEdit := SaveRecNumToEdit;
|
|
END;
|
|
UNTIL (Ok) OR (HangUp);
|
|
IF (Changed) THEN
|
|
BEGIN
|
|
Seek(VotingFile,(SaveRecNumToEdit - 1));
|
|
Write(VotingFile,Topic);
|
|
Changed := FALSE;
|
|
SysOpLog('* Modified topic: ^5'+Topic.Question1);
|
|
IF (Topic.Question2 <> '') THEN
|
|
SysOpLog(PadLeftStr('',16)+': ^5'+Topic.Question2);
|
|
END;
|
|
END;
|
|
Close(VotingFile);
|
|
LastError := IOResult;
|
|
END;
|
|
END;
|
|
END;
|
|
|
|
PROCEDURE ResetTopic(RecNumToReset: Byte);
|
|
VAR
|
|
User: UserRecordType;
|
|
RecNum: Byte;
|
|
UNum: Integer;
|
|
BEGIN
|
|
IF (NumVotes = 0) THEN
|
|
Messages(4,0,'voting topics')
|
|
ELSE
|
|
BEGIN
|
|
RecNumToReset := 0;
|
|
InputByteWOC('%LFReset which topic',RecNumToReset,[NumbersOnly],1,NumVotes);
|
|
IF (RecNumToReset >= 1) AND (RecNumToReset <= NumVotes) THEN
|
|
BEGIN
|
|
Reset(VotingFile);
|
|
Seek(VotingFile,(RecNumToReset - 1));
|
|
Read(VotingFile,Topic);
|
|
Close(VotingFile);
|
|
Print('%LF^1Voting topic: ^5'+Topic.Question1);
|
|
IF (Topic.Question2 <> '') THEN
|
|
Print('^1'+PadLeftStr('',12)+': ^5'+Topic.Question2);
|
|
IF PYNQ('%LFAre you sure you want to reset it? ',0,FALSE) THEN
|
|
BEGIN
|
|
Print('%LF[> Resetting voting topic record ...');
|
|
Reset(VotingFile);
|
|
Seek(VotingFile,(RecNumToReset - 1));
|
|
Read(VotingFile,Topic);
|
|
Topic.NumVotedQuestion := 0;
|
|
FOR RecNum := 1 TO Topic.ChoiceNumber DO
|
|
Topic.Answers[RecNum].NumVotedAnswer := 0;
|
|
Seek(VotingFile,(RecNumToReset - 1));
|
|
Write(VotingFile,Topic);
|
|
Close(VotingFile);
|
|
Reset(UserFile);
|
|
FOR UNum := 1 TO (FileSize(UserFile) - 1) DO
|
|
BEGIN
|
|
Seek(UserFile,Unum);
|
|
Read(UserFile,User);
|
|
User.Vote[RecNumToReset] := 0;
|
|
Seek(UserFile,UNum);
|
|
Write(UserFile,User);
|
|
END;
|
|
Close(UserFile);
|
|
ThisUser.Vote[RecNumToReset] := 0;
|
|
SysOpLog('* Reset topic: ^5'+Topic.Question1);
|
|
IF (Topic.Question2 <> '') THEN
|
|
SysOpLog(PadLeftStr('',13)+': ^5'+Topic.Question2);
|
|
END;
|
|
END;
|
|
END;
|
|
END;
|
|
|
|
PROCEDURE RecalculateTopics;
|
|
VAR
|
|
User: UserRecordType;
|
|
RecNum,
|
|
RecNum1: Byte;
|
|
UNum: Integer;
|
|
BEGIN
|
|
IF (NumVotes = 0) THEN
|
|
Messages(4,0,'voting topics')
|
|
ELSE IF (PYNQ('%LFRecalculate all voting topics? ',0,FALSE)) THEN
|
|
BEGIN
|
|
Print('%LF[> Recalculating all voting topics ...');
|
|
Reset(VotingFile);
|
|
FOR RecNum := 1 TO NumVotes DO
|
|
BEGIN
|
|
Reset(VotingFile);
|
|
Seek(VotingFile,(RecNum - 1));
|
|
Read(VotingFile,Topic);
|
|
Topic.NumVotedQuestion := 0;
|
|
FOR RecNum1 := 1 TO Topic.ChoiceNumber DO
|
|
Topic.Answers[RecNum1].NumVotedAnswer := 0;
|
|
Seek(VotingFile,(RecNum - 1));
|
|
Write(VotingFile,Topic);
|
|
END;
|
|
Close(VotingFile);
|
|
Reset(VotingFile);
|
|
Reset(UserFile);
|
|
FOR UNum := 1 TO (FileSize(UserFile) - 1) DO
|
|
BEGIN
|
|
Seek(UserFile,Unum);
|
|
Read(UserFile,User);
|
|
IF (Deleted IN User.SFlags) THEN
|
|
BEGIN
|
|
FOR RecNum := 1 TO MaxVotes DO
|
|
User.Vote[RecNum] := 0;
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
FOR RecNum := 1 TO NumVotes DO
|
|
IF (User.Vote[RecNum] <> 0) THEN
|
|
BEGIN
|
|
Seek(VotingFile,(RecNum - 1));
|
|
Read(VotingFile,Topic);
|
|
Inc(Topic.NumVotedQuestion);
|
|
Inc(Topic.Answers[User.Vote[RecNum]].NumVotedAnswer);
|
|
Seek(VotingFile,(RecNum - 1));
|
|
Write(VotingFile,Topic);
|
|
END;
|
|
END;
|
|
Seek(UserFile,Unum);
|
|
Write(UserFile,User);
|
|
END;
|
|
Close(UserFile);
|
|
Close(VotingFile);
|
|
SysOpLog('* Recalculated all voting topics.');
|
|
END;
|
|
END;
|
|
|
|
PROCEDURE ListTopics(VAR RecNumToList1: Byte);
|
|
VAR
|
|
NumDone: Byte;
|
|
BEGIN
|
|
IF (RecNumToList1 < 1) OR (RecNumToList1 > NumVotes) THEN
|
|
RecNumToList1 := 1;
|
|
Abort := FALSE;
|
|
Next := FALSE;
|
|
CLS;
|
|
PrintACR('^0##^4:^3Votes^4:^3Topic');
|
|
PrintACR('^4==:=====:======================================================================');
|
|
Reset(VotingFile);
|
|
NumDone := 0;
|
|
WHILE (NumDone < (PageLength - 5)) AND (RecNumToList1 >= 1) AND (RecNumToList1 <= NumVotes)
|
|
AND (NOT Abort) AND (NOT HangUp) DO
|
|
BEGIN
|
|
Seek(VotingFile,(RecNumToList1 - 1));
|
|
Read(VotingFile,Topic);
|
|
WITH Topic DO
|
|
PrintACR('^0'+PadRightInt(RecNumToList1,2)+
|
|
'^3'+PadRightInt(NumVotedQuestion,6)+
|
|
'^5 '+Question1);
|
|
WKey;
|
|
Inc(RecNumToList1);
|
|
Inc(NumDone);
|
|
END;
|
|
Close(VotingFile);
|
|
LastError := IOResult;
|
|
IF (NumVotes = 0) THEN
|
|
Print('*** No voting topics defined ***');
|
|
END;
|
|
|
|
BEGIN
|
|
SaveTempPause := TempPause;
|
|
TempPause := FALSE;
|
|
RecNumToList := 1;
|
|
Cmd := #0;
|
|
REPEAT
|
|
IF (Cmd <> '?') THEN
|
|
ListTopics(RecNumToList);
|
|
LOneK('%LFVoting topic editor [^5?^4=^5Help^4]: ',Cmd,'QDIMRS?'^M,TRUE,TRUE);
|
|
CASE Cmd OF
|
|
^M : IF (RecNumToList < 1) OR (RecNumToList > NumVotes) THEN
|
|
RecNumToList := 1;
|
|
'D' : DeleteTopic(TempTopic,RecNumToList);
|
|
'I' : InsertTopic(TempTopic,Cmd,RecNumToList);
|
|
'M' : ModifyTopic(TempTopic,Cmd,RecNumToList);
|
|
'R' : ResetTopic(RecNumToList);
|
|
'S' : RecalculateTopics;
|
|
'?' : BEGIN
|
|
Print('%LF^1<^3CR^1>Next screen or redisplay current screen');
|
|
Print('^1(^3?^1)Help/First voting topic');
|
|
LCmds(20,3,'Delete voting topic','Insert voting topic');
|
|
LCmds(20,3,'Modify voting topic','Quit');
|
|
LCmds(20,3,'Reset voting topic','SRecalculate voting topics');
|
|
END;
|
|
END;
|
|
IF (Cmd <> ^M) THEN
|
|
RecNumToList := 1;
|
|
UNTIL (Cmd = 'Q') OR (HangUp);
|
|
TempPause := SaveTempPause;
|
|
LastError := IOResult;
|
|
END;
|
|
|
|
END.
|