Newer
Older

nightfox
committed
// this.tradListTopMsgIdx appropriately.
else if (retvalObj.userInput == "N")
{
if (this.reverseListOrder)

nightfox
committed
this.tradListTopMsgIdx -= this.tradMsgListNumLines;
else
this.tradListTopMsgIdx += this.tradMsgListNumLines;
}
// First page
else if (retvalObj.userInput == "F")
{
if (this.reverseListOrder)

nightfox
committed
this.tradListTopMsgIdx = this.NumMessages() - 1;
else
this.tradListTopMsgIdx = 0;
}
// Last page
else if (retvalObj.userInput == "L")
{
if (this.reverseListOrder)

nightfox
committed
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
{
this.tradListTopMsgIdx = (this.NumMessages() % this.tradMsgListNumLines) - 1;
// If this.tradListTopMsgIdx is now invalid (below 0), then adjust it
// to properly display the last page of messages.
if (this.tradListTopMsgIdx < 0)
this.tradListTopMsgIdx = this.tradMsgListNumLines - 1;
}
else
{
var totalNumMessages = this.NumMessages();
this.tradListTopMsgIdx = totalNumMessages - (totalNumMessages % this.tradMsgListNumLines);
if (this.tradListTopMsgIdx >= totalNumMessages)
this.tradListTopMsgIdx = totalNumMessages - this.tradMsgListNumLines;
}
}
// D: Delete a message
else if (retvalObj.userInput == "D")
{
if (this.CanDelete() || this.CanDeleteLastMsg())
{
var msgNum = this.PromptForMsgNum({ x: curpos.x, y: curpos.y+1 }, this.text.deleteMsgNumPromptText, false, ERROR_PAUSE_WAIT_MS, false);
// If the user enters a valid message number, then call the
// DeleteMessage() method, which will prompt the user for
// confirmation and delete the message if confirmed.
if (msgNum > 0)
this.PromptAndDeleteMessage(msgNum-1);

nightfox
committed
// Refresh the top header on the screen for continuing to list
// messages.
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
}
}
// E: Edit a message
else if (retvalObj.userInput == "E")
{
if (this.CanEdit())
{
var msgNum = this.PromptForMsgNum({ x: curpos.x, y: curpos.y+1 }, this.text.editMsgNumPromptText, false, ERROR_PAUSE_WAIT_MS, false);
// If the user entered a valid message number, then let the
// user edit the message.
if (msgNum > 0)
{
// See if the current message header has our "isBogus" property and it's true.
// Only let the user edit the message if it's not a bogus message header.
// The message header could have the "isBogus" property, for instance, if
// it's a vote message (introduced in Synchronet 3.17).
var tmpMsgHdr = this.GetMsgHdrByIdx(msgNum-1);
var hdrIsBogus = (tmpMsgHdr.hasOwnProperty("isBogus") ? tmpMsgHdr.isBogus : false);
if (!hdrIsBogus)
var returnObj = this.EditExistingMsg(msgNum-1);
else
{
console.print("\1n\r\n\1h\1yThat message isn't editable.\n");
console.crlf();
console.pause();
}
}

nightfox
committed
// Refresh the top header on the screen for continuing to list
// messages.
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
}
}
// G: Go to a specific message by # (place that message on the top)
else if (retvalObj.userInput == "G")
{
var msgNum = this.PromptForMsgNum(curpos, "\1n" + this.text.goToMsgNumPromptText, false, ERROR_PAUSE_WAIT_MS, false);
if (msgNum > 0)
this.tradListTopMsgIdx = msgNum - 1;

nightfox
committed
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
// Refresh the top header on the screen for continuing to list
// messages.
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
}
// ?: Display help
else if (retvalObj.userInput == "?")
{
console.clear("\1n");
this.DisplayMsgListHelp(allowChgSubBoard, true);
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
}
// C: Change to another message area (sub-board)
else if (retvalObj.userInput == "C")
{
if (allowChgSubBoard && (this.subBoardCode != "mail"))
{
// Store the current sub-board code so we can see if it changed
var oldSubCode = bbs.cursub_code;
// Let the user choose another message area. If they chose
// a different message area, then set up the message base
// object accordingly.
this.SelectMsgArea();
if (bbs.cursub_code != oldSubCode)
{
var chgSubRetval = this.ChangeSubBoard(bbs.cursub_code);
continueOn = chgSubRetval.succeeded;
}
// Update the traditional list variables and refresh the screen
if (continueOn)
{
this.SetUpTraditionalMsgListVars();
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
}
}
}
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
// S: Select message(s)
else if (retvalObj.userInput == "S")
{
// Input the message number list from the user
console.print("\1n\1cNumber(s) of message(s) to select, (\1hA\1n\1c=All, \1hN\1n\1c=None, \1hENTER\1n\1c=cancel)\1g\1h: \1c");
var userNumberList = console.getstr(128, K_UPPER);
// If the user entered A or N, then select/un-select all messages.
// Otherwise, select only the messages that the user entered.
if ((userNumberList == "A") || (userNumberList == "N"))
{
var messageSelectToggle = (userNumberList == "A");
var totalNumMessages = this.NumMessages();
for (var msgIdx = 0; msgIdx < totalNumMessages; ++msgIdx)
this.ToggleSelectedMessage(this.subBoardCode, msgIdx, messageSelectToggle);
}
else
{
if (userNumberList.length > 0)
{
var numArray = parseNumberList(userNumberList);
for (var numIdx = 0; numIdx < numArray.length; ++numIdx)
this.ToggleSelectedMessage(this.subBoardCode, numArray[numIdx]-1);
}
}
// Refresh the top header on the screen for continuing to list
// messages.
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
}
// Ctrl-D: Batch delete (for selected messages)
else if (retvalObj.userInput == CTRL_D)
{
console.print("\1n");
console.crlf();
if (this.NumSelectedMessages() > 0)
{
// The PromptAndDeleteSelectedMessages() method will prompt the user for confirmation
// to delete the message and then delete it if confirmed.
this.PromptAndDeleteSelectedMessages();
// In case all messages were deleted, if that's the case, show
// an appropriate message and don't continue listing messages.
//if (this.NumMessages(true) == 0)
if (!this.NonDeletedMessagesExist())
{
continueOn = false;
// Note: The following doesn't seem to be necessary, since
// the ReadOrListSubBoard() method will show a message saying
// there are no messages to read and then will quit out.
//this.msgbase.close();
//this.msgbase = null;
//console.clear("\1n");
//console.center("\1n\1h\1yThere are no messages to display.");
//console.crlf();
//console.pause();
}
else
{
// There are still messages to list, so refresh the top
// header on the screen for continuing to list messages.
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
}
}
else
{
// There are no selected messages
console.print("\1n\1h\1yThere are no selected messages.");
mswait(ERROR_PAUSE_WAIT_MS);
// Refresh the top header on the screen for continuing to list messages.
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
}
}

nightfox
committed
else
{
// If a message has been selected, exit out of this input loop
// so we can return from this method - The calling method will
// call the enhanced reader method.
if (retObj.selectedMsgOffset >= 0)

nightfox
committed
continueOn = false;
}
}
}

nightfox
committed
return retObj;
}
// For the DigDistMsgReader class: Performs the message listing, given a
// sub-board code. This verison uses a lightbar interface for message
// navigation. Note: This function requires this.msgbase to be valid and
// open.
//
// Parameters:

nightfox
committed
// pAllowChgSubBoard: Optional - A boolean to specify whether or not to allow
// changing to another sub-board. Defaults to true.
//
// Return value: An object containing the following properties:
// lastUserInput: The user's last keypress/input
// selectedMsgOffset: The index of the message selected to read,
// if one was selected. If none was selected,
// this will be -1.
function DigDistMsgReader_ListMessages_Lightbar(pAllowChgSubBoard)
{

nightfox
committed
var retObj = new Object();
retObj.lastUserInput = "";
retObj.selectedMsgOffset = -1;
// This method is only supported if the user's terminal supports
// ANSI.
if (!canDoHighASCIIAndANSI()) // Could also be !console.term_supports(USER_ANSI)
{
console.print("\r\n\1h\1ySorry, an ANSI terminal is required for this operation.\1n\1w\r\n");
console.pause();
return retObj;
}
// Reset this.readAMessage and deniedReadingMessage to false, in case the
// message listing has previously ended with them set to true.
this.readAMessage = false;
this.deniedReadingMessage = false;

nightfox
committed
// this.msgbase must be valid before continuing.
if ((typeof(this.msgbase) == "undefined") || (this.msgbase == null))
{

nightfox
committed
console.center("\1n\1h\1yError: \1wUnable to list messages because the sub-board is not open.\r\n\1p");
return retObj;
}
else if (!this.msgbase.is_open)
{

nightfox
committed
console.center("\1n\1h\1yError: \1wUnable to list messages because the sub-board is not open.\r\n\1p");
return retObj;
}

nightfox
committed
var allowChgSubBoard = (typeof(pAllowChgSubBoard) == "boolean" ? pAllowChgSubBoard : true);

nightfox
committed
// This function will be used for displaying the help line at
// the bottom of the screen.
function DisplayHelpLine(pHelpLineText)
{
console.gotoxy(1, console.screen_rows);
console.print(pHelpLineText);
console.cleartoeol("\1n");
}

nightfox
committed
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
// Clear the screen and write the header at the top
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
DisplayHelpLine(this.msgListLightbarModeHelpLine);
// If the lightbar message list index & cursor position variables haven't been
// set yet, then set them.
if ((this.lightbarListTopMsgIdx == -1) || (this.lightbarListSelectedMsgIdx == -1) ||
(this.lightbarListCurPos == null))
{
this.SetUpLightbarMsgListVars();
}
// List a screenful of message headers
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
var lastPage = this.ListScreenfulOfMessages(this.lightbarListTopMsgIdx, this.lightbarMsgListNumLines);
// Move the cursor to where it needs to be
console.gotoxy(this.lightbarListCurPos);
// User input loop
var bottomMsgIndex = 0;
var userInput = "";
var msgHeader = null;
var continueOn = true;
while (continueOn)
{
bbs.command_str = ""; // To prevent weirdness
retObj.selectedMsgOffset = -1;
// Calculate the message number (0-based) of the message
// appearing on the bottom of the screen.
if (this.reverseListOrder)
{

nightfox
committed
bottomMsgIndex = this.lightbarListTopMsgIdx - this.lightbarMsgListNumLines + 1;
if (bottomMsgIndex < 0)
bottomMsgIndex = 0;
}
else
{

nightfox
committed
var totalNumMessages = this.NumMessages();
bottomMsgIndex = this.lightbarListTopMsgIdx + this.lightbarMsgListNumLines - 1;
if (bottomMsgIndex >= totalNumMessages)
bottomMsgIndex = totalNumMessages - 1;
}

nightfox
committed
// Write the current message information with highlighting colors
msgHeader = this.GetMsgHdrByIdx(this.lightbarListSelectedMsgIdx);
this.PrintMessageInfo(msgHeader, true, this.lightbarListSelectedMsgIdx+1);
console.gotoxy(this.lightbarListCurPos); // Make sure the cursor is still in the right place

nightfox
committed
// Get a key from the user (upper-case) and take appropriate action.
userInput = getKeyWithESCChars(K_UPPER|K_NOCRLF|K_NOECHO|K_NOSPIN);
retObj.lastUserInput = userInput;
// Q: Quit
if (userInput == "Q")
{
// Quit
continueOn = false;
break;
}
// ?: Show help
else if (userInput == "?")
{
// Display help
console.clear("\1n");
this.DisplayMsgListHelp(allowChgSubBoard, true);

nightfox
committed
// Re-draw the message list on the screen
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
DisplayHelpLine(this.msgListLightbarModeHelpLine);
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
lastPage = this.ListScreenfulOfMessages(this.lightbarListTopMsgIdx, this.lightbarMsgListNumLines);
console.gotoxy(this.lightbarListCurPos); // Put the cursor back where it should be
}
// Up arrow: Highlight the previous message
else if (userInput == KEY_UP)
{
// Make sure this.lightbarListSelectedMsgIdx is within bounds before moving down.
if (this.reverseListOrder)

nightfox
committed
{
if (this.lightbarListSelectedMsgIdx >= this.NumMessages() - 1)
continue;
}
else
{
if (this.lightbarListSelectedMsgIdx <= 0)
continue;
}

nightfox
committed
// Print the current message information with regular colors
this.PrintMessageInfo(msgHeader, false, this.lightbarListSelectedMsgIdx+1);
if (this.reverseListOrder)

nightfox
committed
++this.lightbarListSelectedMsgIdx;
else
--this.lightbarListSelectedMsgIdx;

nightfox
committed
// If the current screen row is above the first line allowed, then
// move the cursor up one row.
if (this.lightbarListCurPos.y > this.lightbarMsgListStartScreenRow)
{
console.gotoxy(1, this.lightbarListCurPos.y-1);
this.lightbarListCurPos.x = 1;
--this.lightbarListCurPos.y;
}
else
{
// Go onto the previous page, with the cursor highlighting
// the last message on the page.
if (this.reverseListOrder)

nightfox
committed
this.lightbarListTopMsgIdx = this.lightbarListSelectedMsgIdx + this.lightbarMsgListNumLines - 1;
else
this.lightbarListTopMsgIdx = this.lightbarListSelectedMsgIdx - this.lightbarMsgListNumLines + 1;

nightfox
committed
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
lastPage = this.ListScreenfulOfMessages(this.lightbarListTopMsgIdx, this.lightbarMsgListNumLines);
console.gotoxy(1, this.lightbarMsgListStartScreenRow+this.lightbarMsgListNumLines-1);
this.lightbarListCurPos.x = 1;
this.lightbarListCurPos.y = this.lightbarMsgListStartScreenRow+this.lightbarMsgListNumLines-1;
}
}
// Down arrow: Highlight the next message
else if (userInput == KEY_DOWN)
{
// Make sure this.lightbarListSelectedMsgIdx is within bounds before moving down.
if (this.reverseListOrder)

nightfox
committed
{
if (this.lightbarListSelectedMsgIdx <= 0)
continue;
}
else
{
if (this.lightbarListSelectedMsgIdx >= this.NumMessages() - 1)
continue;
}

nightfox
committed
// Print the current message information with regular colors
this.PrintMessageInfo(msgHeader, false, this.lightbarListSelectedMsgIdx+1);
if (this.reverseListOrder)

nightfox
committed
--this.lightbarListSelectedMsgIdx;
else
++this.lightbarListSelectedMsgIdx;

nightfox
committed
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
// If the current screen row is below the last line allowed, then
// move the cursor down one row.
if (this.lightbarListCurPos.y < this.lightbarMsgListStartScreenRow+this.lightbarMsgListNumLines-1)
{
console.gotoxy(1, this.lightbarListCurPos.y+1);
this.lightbarListCurPos.x = 1;
++this.lightbarListCurPos.y;
}
else
{
// Go onto the next page, with the cursor highlighting
// the first message on the page.
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
this.lightbarListTopMsgIdx = this.lightbarListSelectedMsgIdx;
lastPage = this.ListScreenfulOfMessages(this.lightbarListTopMsgIdx, this.lightbarMsgListNumLines);
// If we were on the last page, then clear the screen from
// the current line to the end of the screen.
if (lastPage)
{
this.lightbarListCurPos = console.getxy();
clearToEOS(this.lightbarListCurPos.y);
// Make sure the help line is still there
DisplayHelpLine(this.msgListLightbarModeHelpLine);
}

nightfox
committed
// Move the cursor to the top of the list
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
this.lightbarListCurPos.x = 1;
this.lightbarListCurPos.y = this.lightbarMsgListStartScreenRow;
}
}
// HOME key: Go to the first message on the screen
else if (userInput == KEY_HOME)
{
// Print the current message information with regular colors
this.PrintMessageInfo(msgHeader, false, this.lightbarListSelectedMsgIdx+1);
// Go to the first message of the current page
if (this.reverseListOrder)

nightfox
committed
this.lightbarListSelectedMsgIdx += (this.lightbarListCurPos.y - this.lightbarMsgListStartScreenRow);
else
this.lightbarListSelectedMsgIdx -= (this.lightbarListCurPos.y - this.lightbarMsgListStartScreenRow);
// Move the cursor to the first message line
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
this.lightbarListCurPos.x = 1;
this.lightbarListCurPos.y = this.lightbarMsgListStartScreenRow;
}
// END key: Go to the last message on the screen
else if (userInput == KEY_END)
{
// Print the current message information with regular colors
this.PrintMessageInfo(msgHeader, false, this.lightbarListSelectedMsgIdx+1);
// Update the selected message #
this.lightbarListSelectedMsgIdx = bottomMsgIndex;
// Go to the last message of the current page
if (this.reverseListOrder)

nightfox
committed
this.lightbarListCurPos.y = this.lightbarMsgListStartScreenRow + this.lightbarListTopMsgIdx - bottomMsgIndex;
else
this.lightbarListCurPos.y = this.lightbarMsgListStartScreenRow + bottomMsgIndex - this.lightbarListTopMsgIdx;
console.gotoxy(this.lightbarListCurPos);
}
// Enter key: Select a message to read
else if (userInput == KEY_ENTER)
{
// See if the current message header has our "isBogus" property and it's true.
// Only let the user read the message if it's not a bogus message header.
// The message header could have the "isBogus" property, for instance, if
// it's a vote message (introduced in Synchronet 3.17).
var hdrIsBogus = (msgHeader.hasOwnProperty("isBogus") ? msgHeader.isBogus : false);
if (!hdrIsBogus)

nightfox
committed
{
var originalCurpos = console.getxy();
// Allow the user to read the current message.
var readMsg = true;
if (this.promptToReadMessage)
{
// Confirm with the user whether to read the message.
var sReadMsgConfirmText = this.colors["readMsgConfirmColor"]
+ "Read message "
+ this.colors["readMsgConfirmNumberColor"]
+ +(this.GetMsgIdx(msgHeader.number) + 1)
+ this.colors["readMsgConfirmColor"]
+ ": Are you sure";
console.gotoxy(1, console.screen_rows);
console.print("\1n");
console.clearline();
readMsg = console.yesno(sReadMsgConfirmText);
}
var repliedToMessage = false;
if (readMsg)
{
// If there is a search specified and the search result objects are
// set up for the current sub-board, then the selected message offset
// should be the search result array index. Otherwise (if not
// searching), the message offset should be the actual message offset
// in the message base.
if (this.SearchingAndResultObjsDefinedForCurSub())
retObj.selectedMsgOffset = this.lightbarListSelectedMsgIdx;
else
{
//retObj.selectedMsgOffset = msgHeader.offset;
retObj.selectedMsgOffset = this.GetMsgIdx(msgHeader.number);

nightfox
committed
if (retObj.selectedMsgOffset < 0)
retObj.selectedMsgOffset = 0;
}
// Return from here so that the calling function can switch into
// reader mode.
continueOn = false;
return retObj;
}
else
this.deniedReadingMessage = true;
// Ask the user if they want to continue reading messages
if (this.promptToContinueListingMessages)

nightfox
committed
{
continueOn = console.yesno(this.colors["afterReadMsg_ListMorePromptColor"] +
"Continue listing messages");
}
// If the user chose to continue reading messages, then refresh
// the screen. Even if the user chooses not to read the message,
// the screen needs to be re-drawn so it appears properly.
if (continueOn)
{
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
DisplayHelpLine(this.msgListLightbarModeHelpLine);
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
// If we're dispaying in reverse order and the user replied
// to the message, then we'll have to re-arrange the screen
// a bit to make way for the new message that will appear
// in the list.
if (this.reverseListOrder && repliedToMessage)

nightfox
committed
{
// Make way for the new message, which will appear at the
// top.
++this.lightbarListTopMsgIdx;
// If the cursor is below the bottommost line displaying
// messages, then advance the cursor down one position.
// Otherwise, increment this.lightbarListSelectedMsgIdx (since a new message
// will appear at the top, the previous selected message
// will be pushed to the next page).
if (this.lightbarListCurPos.y < console.screen_rows - 1)
{
++originalCurpos.y;
++this.lightbarListCurPos.y;
}
else
++this.lightbarListSelectedMsgIdx;

nightfox
committed
}
lastPage = this.ListScreenfulOfMessages(this.lightbarListTopMsgIdx, this.lightbarMsgListNumLines);
console.gotoxy(originalCurpos); // Put the cursor back where it should be

nightfox
committed
}
}
}
// PageDown: Next page
else if (userInput == KEY_PAGE_DOWN)
{
// Next page
if (!lastPage)
{
if (this.reverseListOrder)

nightfox
committed
this.lightbarListTopMsgIdx -= this.lightbarMsgListNumLines;
else
this.lightbarListTopMsgIdx += this.lightbarMsgListNumLines;
this.lightbarListSelectedMsgIdx = this.lightbarListTopMsgIdx;
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
this.lightbarListCurPos.x = 1;
this.lightbarListCurPos.y = this.lightbarMsgListStartScreenRow;
lastPage = this.ListScreenfulOfMessages(this.lightbarListTopMsgIdx, this.lightbarMsgListNumLines);
// If we were on the last page, then clear the screen from
// the current line to the end of the screen.
if (lastPage)
{
this.lightbarListCurPos = console.getxy();
clearToEOS(this.lightbarListCurPos.y);
// Make sure the help line is still there
DisplayHelpLine(this.msgListLightbarModeHelpLine);
}

nightfox
committed
// Move the cursor back to the first message info line
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
this.lightbarListCurPos.x = 1;
this.lightbarListCurPos.y = this.lightbarMsgListStartScreenRow;
}
else {
// The user is on the last page - Go to the last message on the page.
if (this.lightbarListSelectedMsgIdx != bottomMsgIndex)
{
// Print the current message information with regular colors
this.PrintMessageInfo(msgHeader, false, this.lightbarListSelectedMsgIdx+1);
// Update the selected message #
this.lightbarListSelectedMsgIdx = bottomMsgIndex;
this.lightbarListCurPos.x = 1;
if (this.reverseListOrder)
this.lightbarListCurPos.y = this.lightbarMsgListStartScreenRow + this.lightbarListTopMsgIdx - bottomMsgIndex;
else
this.lightbarListCurPos.y = this.lightbarMsgListStartScreenRow + bottomMsgIndex - this.lightbarListTopMsgIdx;
console.gotoxy(this.lightbarListCurPos);
}
}

nightfox
committed
}
// PageUp: Previous page
else if (userInput == KEY_PAGE_UP)
{
var canGoToPrevious = false;
if (this.reverseListOrder)

nightfox
committed
canGoToPrevious = (this.lightbarListTopMsgIdx < this.NumMessages() - 1);
else
canGoToPrevious = (this.lightbarListTopMsgIdx > 0);
if (canGoToPrevious)

nightfox
committed
{
if (this.reverseListOrder)

nightfox
committed
this.lightbarListTopMsgIdx += this.lightbarMsgListNumLines;
else
this.lightbarListTopMsgIdx -= this.lightbarMsgListNumLines;
this.lightbarListSelectedMsgIdx = this.lightbarListTopMsgIdx;
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
lastPage = this.ListScreenfulOfMessages(this.lightbarListTopMsgIdx, this.lightbarMsgListNumLines);
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
this.lightbarListCurPos.x = 1;
this.lightbarListCurPos.y = this.lightbarMsgListStartScreenRow;
}
else
{
// The user is on the first page - Go to the first message on the page.
if (this.lightbarListSelectedMsgIdx != 0)
{
// Print the current message information with regular colors
this.PrintMessageInfo(msgHeader, false, this.lightbarListSelectedMsgIdx+1);
// Go to the first message of the current page
if (this.reverseListOrder)
this.lightbarListSelectedMsgIdx += (this.lightbarListCurPos.y - this.lightbarMsgListStartScreenRow);
else
this.lightbarListSelectedMsgIdx -= (this.lightbarListCurPos.y - this.lightbarMsgListStartScreenRow);
// Move the cursor to the first message line
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
this.lightbarListCurPos.x = 1;
this.lightbarListCurPos.y = this.lightbarMsgListStartScreenRow;
}
}

nightfox
committed
}
// F: First page
else if (userInput == "F")
{
var canGoToFirst = false;
if (this.reverseListOrder)

nightfox
committed
canGoToFirst = (this.lightbarListTopMsgIdx < this.NumMessages() - 1);
else
canGoToFirst = (this.lightbarListTopMsgIdx > 0);
if (canGoToFirst)
{
if (this.reverseListOrder)

nightfox
committed
this.lightbarListTopMsgIdx = this.NumMessages() - 1;
else
this.lightbarListTopMsgIdx = 0;
this.lightbarListSelectedMsgIdx = this.lightbarListTopMsgIdx;
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
lastPage = this.ListScreenfulOfMessages(this.lightbarListTopMsgIdx, this.lightbarMsgListNumLines);
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
this.lightbarListCurPos.x = 1;
this.lightbarListCurPos.y = this.lightbarMsgListStartScreenRow;
}
}
// L: Last page
else if (userInput == "L")
{
if (!lastPage)
{
// Set the top message index. If this.lightbarListTopMsgIdx is beyond the last
// message in the sub-board, then move back a full page of messages.
if (this.reverseListOrder)

nightfox
committed
{
this.lightbarListTopMsgIdx = (this.NumMessages() % this.lightbarMsgListNumLines) - 1;
// If this.lightbarListTopMsgIdx is now invalid (below 0), then adjust it
// to properly display the last page of messages.
if (this.lightbarListTopMsgIdx < 0)
this.lightbarListTopMsgIdx = this.lightbarMsgListNumLines - 1;
}
else
{
var totalNumMessages = this.NumMessages();
this.lightbarListTopMsgIdx = totalNumMessages - (totalNumMessages % this.lightbarMsgListNumLines);
if (this.lightbarListTopMsgIdx >= totalNumMessages)
this.lightbarListTopMsgIdx = totalNumMessages - this.lightbarMsgListNumLines;
}

nightfox
committed
this.lightbarListSelectedMsgIdx = this.lightbarListTopMsgIdx;
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
lastPage = this.ListScreenfulOfMessages(this.lightbarListTopMsgIdx, this.lightbarMsgListNumLines);
// If we were on the last page, then clear the screen from
// the current line to the end of the screen.
if (lastPage)
{
this.lightbarListCurPos = console.getxy();
clearToEOS(this.lightbarListCurPos.y);
// Make sure the help line is still there
DisplayHelpLine(this.msgListLightbarModeHelpLine);
}

nightfox
committed
// Move the cursor back to the first message info line
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
this.lightbarListCurPos.x = 1;
this.lightbarListCurPos.y = this.lightbarMsgListStartScreenRow;
}
}
// Numeric digit: The start of a number of a message to read
else if (userInput.match(/[0-9]/))
{
var originalCurpos = console.getxy();

nightfox
committed
// Put the user's input back in the input buffer to
// be used for getting the rest of the message number.
console.ungetstr(userInput);
// Move the cursor to the bottom of the screen and
// prompt the user for the message number.
console.gotoxy(1, console.screen_rows);
userInput = this.PromptForMsgNum({ x: 1, y: console.screen_rows }, this.text.readMsgNumPromptText, true, ERROR_PAUSE_WAIT_MS, false);
if (userInput > 0)
{
// See if the current message header has our "isBogus" property and it's true.
// Only let the user read the message if it's not a bogus message header.
// The message header could have the "isBogus" property, for instance, if
// it's a vote message (introduced in Synchronet 3.17).
//GetMsgHdrByIdx(pMsgIdx, pExpandFields)
var tmpMsgHdr = this.GetMsgHdrByIdx(+(userInput-1), false);
var hdrIsBogus = (tmpMsgHdr.hasOwnProperty("isBogus") ? tmpMsgHdr.isBogus : false);
if (!hdrIsBogus)

nightfox
committed
{
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
// Confirm with the user whether to read the message
var readMsg = true;
if (this.promptToReadMessage)
{
var sReadMsgConfirmText = this.colors["readMsgConfirmColor"]
+ "Read message "
+ this.colors["readMsgConfirmNumberColor"]
+ userInput + this.colors["readMsgConfirmColor"]
+ ": Are you sure";
readMsg = console.yesno(sReadMsgConfirmText);
}
if (readMsg)
{
// Update the message list screen variables
this.CalcMsgListScreenIdxVarsFromMsgNum(+userInput);
retObj.selectedMsgOffset = userInput - 1;
// Return from here so that the calling function can switch
// into reader mode.
return retObj;
}
else
this.deniedReadingMessage = true;
// Prompt the user whether or not to continue listing
// messages.
if (this.promptToContinueListingMessages)
{
continueOn = console.yesno(this.colors["afterReadMsg_ListMorePromptColor"] +
"Continue listing messages");
}

nightfox
committed
}
else
{
writeWithPause(1, console.screen_rows, "\1n\1h\1yThat's not a readable message.",
ERROR_PAUSE_WAIT_MS, "\1n", true);

nightfox
committed
}
}

nightfox
committed
// If the user chose to continue listing messages, then re-draw
// the screen.
if (continueOn)
{
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
DisplayHelpLine(this.msgListLightbarModeHelpLine);
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
lastPage = this.ListScreenfulOfMessages(this.lightbarListTopMsgIdx, this.lightbarMsgListNumLines);
console.gotoxy(originalCurpos); // Put the cursor back where it should be
}
}
// DEL key: Delete a message
else if (userInput == KEY_DEL)
{
if (this.CanDelete() || this.CanDeleteLastMsg())
{
var originalCurpos = console.getxy();

nightfox
committed
console.gotoxy(1, console.screen_rows);
console.print("\1n");
console.clearline();
// The PromptAndDeleteMessage() method will prompt the user for confirmation
// to delete the message and then delete it if confirmed.
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
this.PromptAndDeleteMessage(this.lightbarListSelectedMsgIdx, { x: 1, y: console.screen_rows});
// In case all messages were deleted, if that's the case, show
// an appropriate message and don't continue listing messages.
//if (this.NumMessages(true) == 0)
if (!this.NonDeletedMessagesExist())
{
continueOn = false;
// Note: The following doesn't seem to be necessary, since
// the ReadOrListSubBoard() method will show a message saying
// there are no messages to read and then will quit out.
/*
this.msgbase.close();
this.msgbase = null;
console.clear("\1n");
console.center("\1n\1h\1yThere are no messages to display.");
console.crlf();
console.pause();
*/
}
else
{
// There are still some messages to show, so refresh the screen.
// Refresh the screen
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
DisplayHelpLine(this.msgListLightbarModeHelpLine);
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
lastPage = this.ListScreenfulOfMessages(this.lightbarListTopMsgIdx, this.lightbarMsgListNumLines);
console.gotoxy(originalCurpos); // Put the cursor back where it should be
}

nightfox
committed
}
}
// E: Edit a message
else if (userInput == "E")
{
if (this.CanEdit())
{
// See if the current message header has our "isBogus" property and it's true.
// Only let the user edit the message if it's not a bogus message header.
// The message header could have the "isBogus" property, for instance, if
// it's a vote message (introduced in Synchronet 3.17).
var hdrIsBogus = (msgHeader.hasOwnProperty("isBogus") ? msgHeader.isBogus : false);
if (!hdrIsBogus)
{
var originalCurpos = console.getxy();
// Ask the user if they really want to edit the message
console.gotoxy(1, console.screen_rows);
console.print("\1n");
console.clearline();
// Let the user edit the message
//var returnObj = this.EditExistingMsg(msgHeader.offset);
var returnObj = this.EditExistingMsg(this.lightbarListSelectedMsgIdx);
// Refresh the screen
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
DisplayHelpLine(this.msgListLightbarModeHelpLine);
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
lastPage = this.ListScreenfulOfMessages(this.lightbarListTopMsgIdx, this.lightbarMsgListNumLines);
console.gotoxy(originalCurpos); // Put the cursor back where it should be
}

nightfox
committed
}
}
// G: Go to a specific message by # (highlight or place that message on the top)
else if (userInput == "G")
{
var originalCurpos = console.getxy();
// Move the cursor to the bottom of the screen and
// prompt the user for a message number.
console.gotoxy(1, console.screen_rows);
userInput = this.PromptForMsgNum({ x: 1, y: console.screen_rows }, "\n" + this.text.goToMsgNumPromptText, true, ERROR_PAUSE_WAIT_MS, false);
if (userInput > 0)
{
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
// Make sure the message number is for a valid message (i.e., it
// could be an invalid message number if there is a search, where
// not all message numbers are consecutive).
if (this.GetMsgHdrByMsgNum(userInput) != null)
{
// If the message is on the current page, then just go to and
// highlight it. Otherwise, set the user's selected message on the
// top of the page. We also have to make sure that this.lightbarListCurPos.y and
// originalCurpos.y are set correctly. Also, account for search
// results if there are any (we'll need to have the correct array
// index for the search results).
var chosenMsgIndex = userInput - 1;
if ((chosenMsgIndex <= bottomMsgIndex) && (chosenMsgIndex >= this.lightbarListTopMsgIdx))
{
this.lightbarListSelectedMsgIdx = chosenMsgIndex;
originalCurpos.y = this.lightbarListCurPos.y = this.lightbarListSelectedMsgIdx - this.lightbarListTopMsgIdx + this.lightbarMsgListStartScreenRow;
}
else
{
this.lightbarListTopMsgIdx = this.lightbarListSelectedMsgIdx = chosenMsgIndex;
originalCurpos.y = this.lightbarListCurPos.y = this.lightbarMsgListStartScreenRow;
}
}
else
{
// The user entered an invalid message number
console.print("\1n" + this.text.invalidMsgNumText.replace("%d", userInput) + "\1n");
console.inkey(K_NONE, ERROR_PAUSE_WAIT_MS);
}

nightfox
committed
}

nightfox
committed
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
// Clear & re-draw the screen, to fix any possible alignment problems
// caused by newline output after the user inputs their choice.
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
DisplayHelpLine(this.msgListLightbarModeHelpLine);
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
lastPage = this.ListScreenfulOfMessages(this.lightbarListTopMsgIdx, this.lightbarMsgListNumLines);
console.gotoxy(originalCurpos); // Put the cursor back where it should be
}
// C: Change to another message area (sub-board)
else if (userInput == "C")
{
if (allowChgSubBoard && (this.subBoardCode != "mail"))
{
// Store the current sub-board code so we can see if it changed
var oldSubCode = bbs.cursub_code;
// Let the user choose another message area. If they chose
// a different message area, then set up the message base
// object accordingly.
this.SelectMsgArea();
if (bbs.cursub_code != oldSubCode)
{
var chgSubRetval = this.ChangeSubBoard(bbs.cursub_code);
continueOn = chgSubRetval.succeeded;
}
// Update the lightbar list variables and refresh the screen
if (continueOn)
{
this.SetUpLightbarMsgListVars();
console.clear("\1n");
this.WriteMsgListScreenTopHeader();
DisplayHelpLine(this.msgListLightbarModeHelpLine);
// List a screenful of message headers
console.gotoxy(1, this.lightbarMsgListStartScreenRow);
var lastPage = this.ListScreenfulOfMessages(this.lightbarListTopMsgIdx, this.lightbarMsgListNumLines);
// Move the cursor to where it needs to be
console.gotoxy(this.lightbarListCurPos);
}
}
}
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
// Spacebar: Select a message for batch operations (such as batch
// delete, etc.)
else if (userInput == " ")
this.ToggleSelectedMessage(this.subBoardCode, this.lightbarListSelectedMsgIdx);
// Ctrl-A: Select/de-select all messages
else if (userInput == CTRL_A)
{
var originalCurpos = console.getxy();
console.gotoxy(1, console.screen_rows);
console.print("\1n");
console.clearline();
console.gotoxy(1, console.screen_rows);
// Prompt the user to select All, None (un-select all), or Cancel
console.print("\1n\1gSelect \1c(\1hA\1n\1c)\1gll, \1c(\1hN\1n\1c)\1gone, or \1c(\1hC\1n\1c)\1gancel: \1h\1g");
var userChoice = getAllowedKeyWithMode("ANC", K_UPPER | K_NOCRLF);
if ((userChoice == "A") || (userChoice == "N"))
{
// Toggle all the messages
var messageSelectToggle = (userChoice == "A");
var totalNumMessages = this.NumMessages();
var messageIndex = 0;
for (messageIndex = 0; messageIndex < totalNumMessages; ++messageIndex)
this.ToggleSelectedMessage(this.subBoardCode, messageIndex, messageSelectToggle);
// Refresh the selected message checkmarks on the screen - Add the
// checkmarks for messages that are selected, and write a blank space
// (no checkmark) for messages that are not selected.
var currentRow = this.lightbarMsgListStartScreenRow;
var messageIndexEnd = this.lightbarListTopMsgIdx + this.lightbarMsgListNumLines;
for (messageIndex = this.lightbarListTopMsgIdx; messageIndex < messageIndexEnd; ++messageIndex)
{
// Skip the current selected message because that one's checkmark
// will be refreshed. Also skip this one if the message has been
// marked as deleted already.
if (!this.MessageIsDeleted(messageIndex) && (messageIndex != this.lightbarListSelectedMsgIdx))
{
console.gotoxy(this.MSGNUM_LEN+1, currentRow);
console.print("\1n");