This file lists all of the changes made for each release of the Digital
Distortion Message Reader.

Revision History (change log)
=============================
Version  Date         Description
-------  ----         -----------
1.97j    2026-03-14   Bug fixex: Messages appearing more than once in a newscan
                      or new-to-you scan (with help from Cursor AI). Message
                      scan pointer(s) going back to the beginning or early in a
                      sub-board (should at least be improved, if not totally
                      fixed).
                      Bug fix: msg_area.sub object undefined when viewing sub-
                      board information (shouldn't happen, but a check was added
                      just in case). Reported by Keyop.
1.97i    2026-02-23   Improved message text translating (UTF-8, HTML, and nbsp),
                      as well as not word-wrapping message tails.
1.97h    2026-02-07   Small refactoring in the ReplyToMsg() function related to
                      the MsgBase object; no functional change
1.97g    2026-01-31   Bug fix: this.msgAreaList_lastImportedMsg_showImportTime
                      was being used in some functions where it didn't exist
                      anymore
1.97f    2025-10-28   When reading a message, the sub-board information can now
                      be displayed by pressing S.
1.97e    2025-09-07   Fix: When listing messages in lightbar mode in reverse
                      order, deleting (with DEL) and toggling messages (with
                      the spacebar) now work on the correct message.
1.97d    2025-09-02   Replaced arrow keys in the key help lines since some
                      terminals can't display them.
                      Fix for "go to message" in lightbar mode (correctly
                      finding the message)
1.97c    2025-07-23   Fix: When listing personal email in reverse, get the
                      correct message to read.
1.97b    2025-07-19   Fix: When listing messages in reverse, get the correct
                      message to read.
1.97a    2025-06-20   Fix: After displaying the indexed mode menu, don't display
                      the "Loading.." status again, which happened after closing
                      the user settings dialog
1.97     2025-06-18   Now uses DDMsgAreaChooser for changing to another message
                      sub-board. Built-in functionality for that has been
                      removed.
                      New configuration option: DDMsgAreaChooser - Specifies the
                      full path & filename of DDMsgAreaChooser.js; this can be
                      blank if it's in the stock location at
                      sbbs/xtrn/DDAreaChoosers.
                      Configuration options removed: areaChooserHdrFilenameBase,
                      areaChooserHdrMaxLines
1.96s    2025-05-15   Fix: After replying to a netmail, pressing Q at the pause
                      prompt would cause the email header not to be displayed
                      when showing the message again, due to console.aborted
1.96r    2025-05-10   Another UTF-8 update to ensure messages with UTF-8 are
                      printed correctly
1.96q    2025-04-20   If DDMsgReader.cfg doesn't exist, DDMsgReader will read
                      DDMsgReader.example.cfg (in the same directory as
                      DDMsgreader.js) if it exists. To make your own
                      configuration changes, copy DDMsgReader.example.cfg to
                      DDMsgReader.cfg in the same directory or to sbbs/mods.
                      ddmr_cfg.js will by default save to DDMsgReader.cfg in the
                      same directory; you can give the -save_to_mods argument on
                      the command line to have it save to sbbs/mods instead.
1.96p    2025-04-19   When viewing tally/vote information for a message (a sysop
                      feature), DDMsgReader can now optionally show users'
                      specific answers (in addition to just showing who voted on
                      the message/poll), via the new configuration option
                      showUserResponsesInTallyInfo
1.96o    2025-04-15   Fix: For the sysop reading personal email addressed to
                      "sysop", mark the email as read
1.96N    2025-04-13   Changes (fixes) for the bottom-row key help lines due to
                      Synchronet fix related to @-code parsing (Git commit
                      fccf1a5718fdcb9864bcbccf2eb6de7ee50d3dd3). Hopefully the
                      mouse clicks are still correct.
1.96M    2025-03-28   When reading messages, only mark it as read if it's to the
                      current user, including when reading sent email.
1.96L    2025-02-18   After replying to a message, when it shows the status &
                      pauses for input, a Q or Ctrl-C will now exit, and not be
                      ignored.
1.96k    2025-02-08   Input timeout alert improvement - Rather than just
                      blanking out the AreYouThere text (which still allows the
                      alert sound), now also writes a text string at the bottom
                      row when the input timeout warning occurs. The string is
                      configurable via the new areYouThere string in the theme
                      file.
1.96j    2025-01-25   User timeout 'AreYouThere' message and disconnection are
                      more consistent with Synchronet's behavior. However, if
                      the scrollable reader or lightbar list interface is being
                      used, the 'AreYouThere' text will be set to a blank string
                      for the duration of this script's run due to how the text
                      can interfere with the screen and scrolling. The
                      'AreYouThere' sound will still occur though, and the user
                      will be disconnected if they don't respond.
1.96i    2024-12-22   When doing an indexed newscan, display the progress
                      percentage when doing the newscan
1.96h    2024-12-18   Bug fix: When reading messages with the scrolling
                      interface, it now exits from user input timeout as it
                      should.
1.96g    2024-12-04   Bug fix: For indexed newscan without snap-to-new, go back
                      to remembering the user's previously selected sub-board
1.96f    2024-12-04   New user option & behavior: When selecting/toggling
                      messages in the message list, the user can now optionally
                      have the cursor go to the next message.
1.96e    2024-11-27   When showing a poll result message, for the user who
                      posted the poll, show the answers from the people who
                      voted on it. This is to basically mimic the fact that
                      Synchronet shows who voted on your poll and what they
                      answered, but in the poll message itself.
1.96d    2024-11-25   Bug fix: For the indexed-mode newscan, when showing only
                      sub-boards that have new messages, ensure the selected
                      item index is correct when re-populating the menu so that
                      it doesn't skip a sub-board.
1.96c    2024-11-20   Bug fix: When showing a poll vote from the user, it should
                      show people who've voted - ensure it only counts vote
                      responses
1.96b    2024-11-03   Bug fix: When displaying the new scrollable area change
                      help window, if there's an area change header in use,
                      refresh it and the header lines, since the scrollable help
                      window would display over them.
1.96a    2024-11-02   When changing to another sub-board, the user can now cycle
                      through the sort options with the [ and ] keys. Also,
                      updated the change sub-board help to show in a scrollable
                      window for users with ANSI terminals, rather than simply
                      displaying the help with a pause at the end. Other help
                      screens could potentially be shown this way too.
                      New theme configuration options: helpWinBorderColor and
                      scrollingWinHelpTextColor
1.96     2024-10-26   New feature: sub-board sorting for changing sub-boards
                      (and users can change their sorting option).

                      The new configuration option subBoardChangeSorting
                      specifies the sub-board sorting (None, Alphabetical,
                      LatestMsgDateOldestFirst, or LatestMsgDateNewestFirst).
                      This is a default for a user option that users can change
                      for themselves.

                      New: Toggleable behavior for whether to show sub-boards
                      with new messages in the indexed newscan. Users can change
                      this option for themselves.

                      The new configuration option
                      indexedModeNewscanOnlyShowSubsWithNewMsgs sets the default
                      setting for this behavior (true or false).

                      Internal: Updated for bbs.msg_number and bbs.smb_curmsg
                      being writeable in Synchronet 3.20 - If these can be
                      changed, there's no need to write the drop file
                      DDML_SyncSMBInfo.txt containing information about the
                      message being replied to etc. for message editors to use
1.95h    2024-09-03   Fix for saving an ANSI message to the local BBS PC
1.95g    2024-08-12   Updates to help with the newscan issues placing the user
                      at the first message, etc.
1.95f    2024-08-08   New config option: msgSaveDir, which specifies the
                      directory on the BBS PC to save messages to. Can be empty,
                      to use a full path inputted by the user.
1.95e    2024-08-04   Fix: Indexed newscan mode for new users now shows the
                      number of new messages in sub-boards like it's supposed
                      to.
1.95d    2024-03-31   Fix for checkmark refresh when selecting all/none in the
                      message list
1.95c    2024-02-15   The filename of quotes.txt is now in the correct case for
                      the user's editor.
                      More checks in the while loops to see if the user is still
                      online.
                      "terminalSupportsUTF8 not defined" error eliminated.
1.95b    2024-02-04   Bug fix: Use the P_UTF8 mode bit when printing UTF-8
                      message header info (such as 'from' and 'to').
                      A dd_lightbar_menu.js update goes along with this.
1.95a    2024-01-23   Bug fix: Was aborting when sub-board code isn't available
                      when editing personal email
1.95     2024-01-20   Removed user option to display indexed mode menu in
                      newscan after all new messages are read.
                      Command-line option -indexedMode can now be specified with
                      -search=new_msg_scan to make it display the indexed mode
                      menu, regardless of the user setting to use the indexed
                      mode menu for a newscan.
                      New command-line option: -newscanIndexMenuAfterReadAllNew
                      This specifies to continue to display the indexed mode
                      menu after the user has read all new messages during a
                      newscan.
                      The following command-line can be used to do a newscan
                      for all sub-boards and continue displaying the index mode
                      menu after the user has read all new messages:
                      DDMsgReader.js -search=new_msg_scan -indexedMode -indexModeScope=all -newscanIndexMenuAfterReadAllNew
                      New indexed mode newscan behavior: R (mark all read) moves
                      to the next sub-board.
                      Ctrl-S in the indexed mode menu re-scans sub-boards (to
                      detect more new messages, etc.)
                      New DDMsgReader.cfg option for user config default:
                      indexedModeMenuSnapToNextWithNewAftarMarkAllRead
1.94     2024-01-07   Fix: For indexed read mode (not doing a newscan), when
                      choosing a sub-board to read, the correct (first unread)
                      message is displayed. Also, the user's scan pointer is
                      also updated to the last_read pointer.
                      New operator option for read mode: Add author email to
                      email.can
                      New command-line option: -indexModeScope, which can
                      specify the indexed reader scope (group/all) without
                      prompting the user.
                      User configuration options for newscan & email only shown
                      when doing those actions
1.93     2024-01-01   New user-toggleable behavior: Show indexed menu after
                      reading all new messages
                      Also, indexed reader mode (started with the -indexedMode
                      command-line option) now lists ALL sub-boards, rather
                      than only sub-boards the user has enabled for newscan.
                      It also prompts the user to list sub-boards in the current
                      group or all.
1.92     2023-12-29   Indexed newscan: By default, if there are no new messages,
                      it now shows "No new messages." (578 QWKNoNewMessages from
                      text.dat). There's a new user setting to toggle whether to
                      use the indexed newscan menu even if there are no new
                      messages.
                      New configuration file option:
                      displayIndexedModeMenuIfNoNewMessages, which is a default
                      for a user setting to toggle whether or not to use the
                      Indexed newscan menu even when there are no new messages.
1.91     2023-12-26   New sysop features while reading a message: Show message
                      hex (with the X key) and save message hex to a file (with
                      Ctrl-X)
1.90b    2023-12-15   New configurable colors in the theme file for the indexed
                      newscan menu header text (indexMenuHeader), "NEW"
                      indicator text (indexMenuNewIndicator), and highlighted
                      "NEW" indicator text (indexMenuNewIndicatorHighlight)
1.90a    2023-12-12   New configurable colors in the theme file for the indexed
                      mode newscan menu: indexMenuSeparatorLine (sub-board
                      separator line) and indexMenuSeparatorText (sub-board
                      separator text)
1.90     2023-12-04   New: operator menu for read mode, with the option to add
                      the author to the twit list, etc.
                      Fix: When refreshing a rectangular area of a message, if
                      it's a poll message, the background color for the voted
                      responses was used for the non-selected responses.
                      Removed the setting useScrollingInterfaceForANSIMessages.
1.89     2023-11-30   New: User option to toggle whether to display the email
                      'replied' indicator (defaults to true).
                      Fix for setting colors for the key help lines so that the
                      background won't get un-done if the other help line colors
                      have a N (normal) attribute.
1.88     2023-11-24   New user setting/configuration option to prompt the user
                      whether or not to delete a personal email after replying
                      to it (defaults to false).
                      New: Displays whether a personal email has been replied
                      to.
                      Fix: Now displaying message vote score in the default
                      header again.
                      Fix: When viewing message headers (for the sysop), now
                      correctly shows the message attributes.
1.87     2023-11-18   Possible speed improvement when loading messages.
                      New: User setting to only show new messages in a newscan
                      (defaults to true/enabled)
                      In the message list, there is now an additional space
                      before the 'from' name, in case one of the status
                      characters is a letter (this should look better).
                      New: In lightbar mode, the indexed newscan menu can
                      optionally 'snap' to the next sub-board with new messages
                      when showing/returning to the menu
                      Fix: When listing personal email, messages to the user
                      were written with the to-user color wuen unread. Now the
                      regular colors are always used (since all of a user's
                      personal emails are 'to' them).
                      Fix: For indexed newscan, if there are no sub-boards
                      selected for scan in the user's newscan configuration,
                      then output a message and exit. Otherwise, it would end
                      up in an infinite loop.
                      Updated how user settings are loaded, to ensure that
                      default user settings from DDMsgReader.cfg actually get
                      set properly in the user settings.
1.86     2023-11-09   New feature: For indexed mode, when choosing a sub-board,
                      the R key can be used to mark all messages as read in the
                      sub-board.
                      Fix: For continuous newscan or browse newscan (SCAN_BACK),
                      call the stock Synchronet behavior (DDMsgReader did this
                      previously, as DDMsgReader doesn't implement those yet).
                      Fix: In the message list, to-user alternate colors weren't
                      being used unless the message was read. The correct colors
                      are used again.
1.85     2023-11-01   Mark personal email as read if the user is just reading
                      personal email
1.84     2023-10-26   Fix in reader mode for refreshing the message area after
                      closing another window (necessary with recent changes to
                      substrWithAttrCodes())
1.83     2023-10-25   Personal emails to the sysop received as "sysop" (or
                      starting with "sysop") are now correctly identified and
                      marked as read when read
1.82     2023-10-18   Fix for # posts and missing dates in sub-board list when
                      changing sub-board
1.81     2023-10-11   Updated permission check functions (speed improvement)
1.80     2023-10-10   Improved speed of new-to-you scans, and to an extent
                      (hopefully) overall speed
                      Bug fix: Setting reverseListOrder to "ask" in the .cfg
                      file works properly again.
                      Bug fix: When listing messages in reverse order, the
                      selected menu index (for lightbar mode) is now correct.
                      Bug fix: If the user is allowed to read deleted messages,
                      then allow the left & right arrow keys to to the next or
                      previous message if it's deleted.
                      Small fixes for indexed scanning mode.
                      New: For personal email, unread emails will have an
                      'unread' message indicator in the message list as a U
                      between the message number and the 'from' name.
                      New user setting: "Quit from reader to message list":
                      When enabled, quitting from reader mode goes to the
                      message list instead of exiting out of DDMsgReader fully.
                      New user setting: Enter/selection from indexed mode menu
                      shows message list (instead of going into reader mode)
                      New user setting: List messages in reverse order
1.79     2023-09-20   Fixed poll voting for single-answer polls
1.78     2023-08-30   Bug fix for going to a specific message in the message
                      list (especially for lightbar mode)
1.77a    2023-08-26   When saving a message on the local BBS PC without all the
                      headers, the date is now included
1.77     2023-08-20   Including all message headers when saving a message (sysop
                      only) is now optional.
1.76     2023-08-18   Fix for "Message header has 'expanded fields'" error when
                      updating message header attributes in certain conditions
1.75     2023-08-16   Made some changes to allow easy searching of personal
                      email with command-line arguments.
1.74     2023-04-29   Settings for users being able to read deleted messages now
                      applies to personal email. Also, allows reading messages
                      that are marked for deletion in addition to just seeing
                      them in the message list
1.73a    2023-04-25   For viewing message headers, now all message header
                      information is displayed & sorted alphabetically by field
                      name (same with saving a message to a file).
1.73     2023-04-17   Bug fix: When getting header lines to view, ensure the
                      header lines are not too wide for the user's terminal.
                      Header lines that are too long will be split into no more
                      than 2 lines.
1.72     2023-04-16   Added a quick-validation hotkey, Ctrl-Q, for sysops to
                      use to apply a quick-validation set to a user when
                      reading their message. Quick-Validation sets are
                      configured in SCFG > System > Security Options >
                      Quick-Validation Values.
1.71     2023-04-07   Ctrl-C is now supported for message searches to abort the
                      search. A new configurable string was added for this
                      situation: msgSearchAbortedText
1.70     2023-04-04   Added "indexed" reader mode, which lists sub-boards with
                      total and number of new/unread messages and lets the user
                      read messages in those sub-boards. Also, utf-8 characters
                      should now be converted properfly for non utf-8 terminals.
1.69     2023-03-24   Bug fix for deleting multiple selected messages: When
                      updating message headers in the cached arrays, don't try
                      to save them back to the database, because that was
                      already done (this avoids a 'header has expanded fields'
                      error).
1.68     2023-03-15   Makes use of console.aborted when displaying help screens
                      so that screen updates work better after pausing output.
                      Also, when running a new message scan (not new-to-you),
                      the current sub-board being scanned is now outputted.
                      There is a new configurable text string:
                      scanningSubBoardText
1.67     2023-03-09   Fixes for time zone alignment & list key help for wide
                      terminals
1.66     2023-03-02   When forwarding a message, the subject can now be edited
                      before sending the message
1.65     2023-02-24   Ctrl-C can now be used to cancel message scans. Output
                      from the scan is now word-wrapped to the terminal width.
1.64     2023-02-09   When reading personal email (received or sent), as a
                      loadable module, now it can allow reading another user's
                      mail (for the sysop when deleting a user account).
1.63     2023-02-01   Fix for reading colors from the theme file. Also, the
                      theme file now no longer needs the control character for
                      color codes.
1.62     2023-01-30   (Hopefully) Improved display of ANSI messages which would
                      previously look bad with empty lines evrey other line
1.61     2023-01-22   Fix: When replying to an email with an unknown sender
                      (empty or "All"), no longer gives the error "Invalid user
                      field: 0"; also, if the sender is unknown, prompts the
                      user for a user name/number/email address to send the
                      reply to.
1.60     2023-01-20   DDMsgReader can now optionally convert Y-style MCI
                      attribute codes to to Synchronet attribute codes, with
                      the new configuration setting convertYStyleMCIAttrsToSync
                      (true/false).
1.59     2022-12-29   For Synchronet above 3.20, now reads the external editor
                      quote wrap setting from xtrn.ini.  Below version 3.20, the
                      quote wrap setting is read from xtrn.cnf.
                      Also, there's a new user setting to toggle whether or not
                      to use the scrollbar in the scrolling reader. Currently
                      there is no alternate progress displayed if not using the
                      scrollbar, but that is planned for a future update.
1.58     2022-12-14   Now wraps quote lines, if applicable, according to the
                      quote line wrap settings of the user's external editor,
                      if the user uses one
1.57.1   2022-12-12   Fix for "assignment to undeclared variable" error
1.57     2022-12-02   @-codes were only expanded when reading personal mail;
                      now, DDMsgReader also checks to make sure the sender is a
                      sysop.
1.56     2022-11-25   Fixed bug startup mode for scanning all groups for un-read
                      messages to you where the reader was bringing up personal
                      email instead.
1.55     2022-09-23   Refactored how email replies are done (passing the header
                      to the appropriate functions, not using ungetstr() when
                      prompting for the message subject)
1.54     2022-08-06   Users now have a personal twit list, configurable via
                      user settings, with the Ctrl-U hotkey.
1.53     2022-07-18   Deleted messages can now be un-marked for deletion from
                      the message list (if the user has delete permissions).
                      Also, the reader now honors the system setting for whether
                      users can view deleted messages.
1.52     2022-07-09   Mouse click support for the bottom help lines in scrolling
                      mode (thanks to help from Nelgin)
1.51     2022-07-05   Graphic is now only used when using the scrollable
                      interface. Also, when creating the Graphic, now
                      subtracting 1 from the reading area height to avoid making
                      the Graphic one line too tall to avoid unnecessary
                      scrolling.
                      When saving messages with ANSI codes, Graphic is only used
                      if the message has any ASCII drawing characters. (not sure
                      if this really matters much though).
                      Also, applied "use strict" and made some changes as necessary.
1.50     2022-06-20   When doing a text search, it now ignores the user scan
                      configuration for sub-boards, to ensure it will show any
                      results of the text search.
1.49     2022-06-13   Refactor: Simplified saving a message to BBS machine for
                      sysop (as-is, less processing); removed attachment stuff
                      for pre-Synchronet 3.17; moved hasSyncAttrCodes() to
                      attr_conv.js because that's where it needs to be.
1.48     2022-06-12   Improved display of ANSI messages
1.47a    2022-03-23   Internal change: Now calls bbs.edit_msg() for editing an
                      existing message (for Synchronet 3.18 and up).
                      Functionally no change.
1.47     2022-03-14   DDMsgReader can now be called directly as a loadable
                      module by Synchronet (though requires the included
                      ddmr_lm.js if DDMsgReader.js is not in sbbs/exec or
                      sbbs/mods)
1.46     2022-03-07   Fix: When changing to an empty sub-board from within the
                      reader (either from read mode or list mode), it now
                      properly says there are no messages and exits, rather than
                      showing a list of bogus messages.  Unsure when this bug
                      was introduced.
1.45d    2022-02-26   Fix for no group information available when displaying the
                      sub-board header above the message list when listing
                      personal email
1.45c    2022-02-25   Fixed score display and related colors in the message list
                      for wide terminals
1.45b    2022-02-25   Fixed message list time colors for wide terminals (above
                      80 columns)
1.45     2022-02-24   Fixed message scanning & searching issue introduced in the
                      previous version.
1.44     2022-02-19   Removed the scanScopePromptText text line and used the
                      SubGroupOrAll line (621) from text.dat instead.  Also, the
                      reader now supports @-code expansion in configured text
                      strings.
                      Text search now can search sub-board, group, or all like
                      the other text searching.
                      When reading the theme file, color settings are now
                      checked to ensure they only have Synchronet attribute
                      codes.
1.43     2022-02-10   Fixed the memory error when viewing message header info.
                      Also, when viewing message header information, it will no
                      longer show JS functions.
1.42     2022-01-13   Fixed attachment downloading.
                      Also, the first attempt at converting HTML entities in
                      HTML-formatted messages.
                      Also, added the ability to sort the message list by date
                      & time written rather than the import date/time. This is
                      specified in the configuration file via the msgListSort
                      option.
1.41     2021-02-12   Bug fix: When changing to another area with the lightbar
                      interface, if the user's current sub-board is a
                      high-numbered sub-board and they select a message group
                      with fewer sub-boards, the highlighted sub-board in that
                      group would be set to that high number and would be
                      incorrect.  That has been fixed.  Copied a fix from my
                      stand-alone message area chooser.  In that scenario, the
                      current highlighted sub-board in the other group will be
                      the first one.
1.40     2021-01-31   (Michael Long) Fixed left/right colors not being
                      customizable on message list lightbar
1.39     2020-12-01   When forwarding a message, added the ability to optinally
                      edit the message before forwarding it.
1.38     2020-11-26   Bug fix: When forwarding a message, it now correctly sets
                      sets the to_net_type property in the message header to
                      FidoNet or internet for those types of message
                      destinations
1.37     2020-07-11   Added mouse support to the scrollable reader interface.
                      The integrated area changer functionality doesn't have
                      mouse support yet.
1.36     2020-05-23   Added a command-line parameter, -onlyNewPersonalEmail,
                      which specifies to list/read only new/unread personal
                      email to the user.  And for integration with Synchronet
                      via the "Read Email" loadable module, this is to be used
                      together with the updated DDReadPersonalEmail.js.  This
                      is intended to support the "read your unread mail only"
                      option in the email menu.
1.35     2020-05-13   Fixed some logic in determining how to address a personal
                      email when replying (either to a local user or via their
                      network address).
1.34     2020-05-11   The message list mode now honors anonymous posts, showing
                      the 'from' name as "Anonymous" (for non-sysops).  The
                      sysop can still see the real name of the poster.  The
                      reader mode already honored the 'anonymous' flag.
1.33     2020-04-21   Fixed: A new user starting to read messages in a sub-board
                      no longer causes an error (it checks for the scan_ptr
                      being 0xffffffff).  This had been fixed in a couple places
                      previously, but apparently not this particular case.
1.32     2020-04-19   Removed some code that's no longer used.  Also, fixed an
                      issue when changing to another sub-board with the
                      traditional-style (non-lightbar) list where it was slow to
                      list sub-boards.  For the number of messages, it was
                      checking all headers to ignore ones marked as deleted,
                      etc., but that can be fairly slow..  Now it just uses
                      total_msgs for the MessageBase object, which is a lot
                      faster and still gives an idea of how many messages are
                      there.
1.31     2020-04-13   The area change feature now uses DDLightbarMenu.  There
                      is no more internal lightbar code in this message reader.
1.30     2020-04-07   The message list features now uses DDLightbarMenu rather
                      than the internal lightbar menu code.  Requires the
                      latest dd_lightbar_menu.js (in sbbs/exec/load).
                      Later I also plan to update the area chooser code to also
                      use DDLightbarMenu and remove the internal lightbar
                      chooser code from DDMsgReader altogether.
1.29     2020-04-03   When reading a message, if a message is written to the
                      current user, the 'To' username in the header above the
                      message is now written in a different color.  Also, there
                      are new color settings available in the theme
                      configuration file (see the readme for descriptions):
                      msgHdrMsgNumColor, msgHdrFromColor, msgHdrToColor,
                      msgHdrToUserColor, msgHdrSubjColor, msgHdrDateColor
1.28     2019-12-21   Bug fix: When the user changes to a different message
                      area while reading a message, the reader would exit with
                      an error due to an invalid last-read message number.
                      This has been fixed.
1.27     2019-09-16   Bug fix: Now displays the message score in the header
                      even if the message only has downvotes
1.26     2019-09-12   Fixed a bug that was causing some of the message vote
                      tally information to be displayed as "undefined"
1.25     2019-08-29   Added the ability to search for message groups and
                      sub-boards when changing to another sub-board. Search
                      can be started with the / key or CTRL-F (Find). Also, in
                      lightbar mode, the N key can be used to highlight the
                      next match in the list.
1.24     2019-08-17   When making a private reply on local email, an error is
                      now outputted if the recipient's user number is not
                      found.  Also, fixed an 'undefined' bug that happened when
                      searching for messages sometimes.
1.23     2019-07-27   If a message is in UTF-8 format and the user's terminal
                      doesn't support UTF-8, the message text will be converted
                      to CP437.  Also, if there is a color/attribute code in
                      the message before the message text and there are no
                      other color/attribute codes, the color/attribute codes
                      will be removed so  that the entire message isn't colored
1.22     2019-05-12   If the message score is 0, with upvotes and total_votes
                      both 0, then don't show the score when using the default
                      header ANSI.  This is what was intended, but the 0 score
                      started showing up in more recent builds of Synchronet.
1.21     2019-05-04   New uses require() instead of load(), if the require()
                      function exists, to load required .js library scripts.
                      This helps avoid 'multiple definition' errors.  The
                      require() function was added in Synchronet 3.17, so
                      if the require() function doesn't exist, then the reader
                      will use load().
1.20     2019-04-26   Added configurable options for the message score colors
                      for the message list: msgListScoreColor,
                      msgListToUserScoreColor, msgListFromUserScoreColor, and
                      msgListScoreHighlightColor
1.19     2019-04-25   If the terminal size is wide enough (at least 86
                      characters), the overall vote scores for the messages
                      is now displayed in the message list.  Also, fixed a
                      bug introduced in the previous version where the vote
                      scores were no longer being displayed when reading a
                      message.  It's no longer using MsgBase.get_index() and
                      uses get_all_msg_headers(), as before, since that's what
                      is required for message tallies to be included in the
                      message headers.
1.18     2019-04-15   Made use of the new MsgBase.get_index() function (if
                      available) for better performance.  Added 'undefined'
                      checks for some of the messaeg attribute definitions
                      before adding them to the attribute strings, since some
                      of them have changed.
1.17     2019-01-02   Added support for Synchronet's new voting feature that
                      was added in Synchronet 1.17.  Added support to allow the
                      sysop to validate messages in moderated message areas.
                      Fixed various bugs related to doing a newscan, displaying
                      messages with ANSI content, out-of-bounds error when
                      deleting a message, etc.  Updated to set the message
                      number field length dynamically based on the number of
                      messages in the sub-board.  It will be at least 4 but
                      can be more than 4 if there are 10000 messages or more
                      in a sub-board.  Updated so that when listing personal
                      email, it will use the regular formatting colors rather
                      than the colors for messages to the user, since all
                      personal emails are to the user (the 'to user' colors for
                      each email might be obnoxious).
                      Also, updated to support Synchronet's Avatar feature
                      which was added in version 3.17.  For that feature to
                      work, you will need the latest .js files - Specifically,
                      for this reader, you would need smbdefs.js and
                      avatar_lib.js.  Added a new configuration setting,
                      displayAvatars, which toggles whether or not to display
                      user avatars in the message headers.  Valid values are
                      true and false.
                      Also Added the new @-code MSG_FROM_AND_FROM_NET and
                      MSG_FROM_AND_FROM_NET-L (for left-justification with
                      field length), which shows the 'from' name with the from
                      network in parenthesis.  Updated the default message
                      header to show that information.
                      Also contains various bug fixes.
1.16     2016-09-11   Added a new feature that allows users to forward a
                      message to an email address or to another user on the
                      BBS (using the O key).  This can be useful, for
                      instance, if the user wants to send a message in a
                      public sub-board to their personal email for future
                      reference or send a message from a public sub-board to
                      another user to discuss the topic privately.
1.15     2016-08-29   - New user edit feature for sysops only: While reading
                      a message, the U key will edit the user account of the
                      author of the message (only if it's a local user account
                      on the BBS)
                      - Bug fix: Private reply on a networked sub-board
                      was no longer working (different from the bug fixed
                      in 1.14)
                      - Implemented a check to (hopefully) prevent a crash
                      related to parsing and replacing @-codes related to
                      file areas
1.14     2016-08-17   Bug fix: Version 1.13 was failing to reply to
                      private emails
1.13     2016-08-16   - Bug fix: Message number error when a new user starts
                      reading messages.
                      - Bug fix: Now, it should always successfully save a
                      message header with the READ attribute when the user
                      it was addressed to has read the message.  This should
                      fix an issue where the same message would keep coming
                      up in a newscan, etc.
1.12     2016-05-11   - Updated the way the pause prompt is shown in the help
                      screen, in case the sysop has configured an external
                      module (Baja/JS) to run for a pause prompt.
                      - Potential bug fix: When translating a message number to
                      a message index, added a check to ensure the value is
                      a number, to (hopefully) avoid a potential crash.
1.11     2016-03-25   The reader now updates the number of new posts read by
                      the user during the session.  This is represented by
                      bbs.posts_read in JavaScript.  Also, did some internal
                      refactoring of the code, removing some old code leftover
                      from my message lister that is no longer needed in this
                      reader.  DDMsgReader.js is a bit smaller due to the
                      refactor.
1.10     2016-02-19   Added a new configuration option,
                      readingPostOnSubBoardInsteadOfGoToNext, that affects what
                      happens after the user reads the last message on a
                      sub-board (for normal reading, not for newscans etc.): If
                      this is set to true, then the reader will prompt the user
                      if they want to post on the sub-board, then exit (this
                      is the stock Synchronet behavior).  If this is set to
                      false, then the reader will prompt the user whether to go
                      to the next sub-board after reading the last message on a
                      sub-board.  Also, added the postOnSubBoard text
                      configuration parameter for the theme filename, which
                      specifies the text to use for prompting the user if they
                      want to post on the sub-board after reading the last
                      message.
                      Added new configuration options areaChooserHdrFilenameBase
                      and areaChooserHdrMaxLines.  These options specify the
                      filename base for a header file to use for the message
                      area chooser list and the maximum number of lines to use
                      from the area chooser header file.  The filaname is
                      without the extension - The reader will first look for an
                      .ans version, then an .asc version.  Additionally,
                      multiple header files can be used for different terminal
                      widths - For example, chooserMsgHdr-80.ans for an
                      80-column terminal, choosrMsgHdr-140.ans for a 140-column
                      terminal, etc.
                      Updated so that when using the message written dates
                      (instead of the imported dates) in the message list & area
                      chooser, it will adjust the message written dates to the
                      BBS's local time zone so that they are all consistent.
1.09     2016-01-15   Updated to not center the message header lines
                      horizontally.  Now, it will display the header lines
                      starting on column 1.  This was done to fix a display
                      issue in some terminal software.
1.08     2016-01-10   Bug fix: When scanning message sub-boards, it wasn't
                      always closing the sub-board when there were no new
                      messages, resulting in further sub-boards failing to open
                      after a while.  That has been fixed.
1.07     2015-12-24   - Added the ability to select multiple messages (for
                      actions such as batch delete), and added the ability to
                      delete multiple selected messages.  Batch deleting is
                      only allowed when the user has permission to delete
                      messages (such as their own personal email).  Messages
                      can be selected in the following ways:
                        o Lightbar message list: The spacebar selects an
                          individual message.  CTRL-A lets the user select or
                          un-select all messages.
                        o Traditional message list: The S key lets the user
                          select or un-select messages, by typing message
                          numbers, A to select all, or N to select none
                          (un-select all).  The list of message numbers is
                          comma-separated or space-separated, allowing
                          for number ranges such as 120-130 for instance.
                        o Reader interface: The spacebar selects the message.
                      To delete the selected messages, the user must be in the
                      message list; the CTRL-D key combo is used for batch
                      delete, and it will prompt the user for confirmation
                      before deleting the messages.
                      - Added the following configurable items in the theme
                      file:
                      delSelectedMsgsConfirmText
                      selectedMsgsDeletedText
                      cannotDeleteAllSelectedMsgsText
                      selectedMsgMarkColor
1.06     2015-12-13   - Updated so that a sub-board new-message-scan (with the
                      new_msg_scan_cur_sub command-line parameter) can make
                      use of the -subBoard command-line option to scan a
                      specific sub-board, which may be different than the
                      user's current sub-board.
                      - Added a new configuration option, pauseAfterNewMsgScan,
                      which specifies whether or not to pause (i.e., with a
                      "finished" message) after doing a new message scan.
                      - Bug fix: The configFilename command-line parameter was
                      not being read correctly on startup; this has been fixed.
                      - Bug fix: Doing a new-message-scan should now always
                      display the correct sub-board @-code information in the
                      header above the message.
1.05     2015-12-06   - Improved displaying of messages with ANSI codes.  The
                      reader now makes use of frame.js and scrollbar.js (in the
                      sync/exec/load directory) to enable a scrollable user
                      interface when displaying messages with ANSI content.
                      There is also a new configuration option,
                      readerInterfaceStyleForANSIMessages, which lets the sysop
                      configure whether to use a scrollable or traditional user
                      interface for ANSI messages.  The reason for that option
                      is in case ANSI messages don't look good when using
                      frame.js & scrollbar.js - When set to a traditional user
                      interface for ANSI messages, the reader will use a
                      non-scrolling user interface for displaying messages with
                      ANSI codes, which simply sends the message to the client
                      and lets the client display the ANSI content.
                      - More kludge lines displayed (with the 'K' key), and
                      all message header lines are now displayed (with the
                      'H' key).  This is a sysop feature.
                      - Color configuration options for the kludge/header line
                      labels (hdrLineLabelColor) and kludge/header line values
                      (hdrLineValueColor)
                      - Bug fix related to interpreting colors from other BBS
                      software (WWIV, PCBoard, Wildcat, Celerity, Renegade)
1.04     2015-10-10   - New feature: Users can now download attached files,
                      whether uploaded to their mailbox in Synchronet or
                      attached via internet email.
                      - New feature: Sysops can save a message to the BBS
                      machine (using the Ctrl-S key combo).
                      - User experience improvements: Added a pause after
                      saving a message so that the user can see Synchronet's
                      message save screen before going back to the reader or
                      message list.  Also, in the message list, PageDown now
                      goes to the last message when on the last page, and
                      similarly, PageUp goes to the first message when on the
                      first page.
                      - Updated the DDReadPersonalMail.js loadable module
                      script to start reading personal email in lister mode
                      by default, which is more in line with what Synchronet
                      does by default.  That will let the user select a message
                      to read first.
1.03     2015-07-12   Bug fix: In Linux, when replying to the last message in
                      a sub-board during a newscan or in read mode, it would
                      not immediately refresh the messagebase information, so
                      it would not see the new message posted.  This has been
                      fixed by closing the messagebase while the user is
                      posting a reply message and re-opening the messagebase
                      when the user is done posting the reply.
1.02     2015-06-10   Bug fix in DDScanMsgs.js: Switched to bbs.scan_msgs()
                      instead of bbs.scan_subs() for all other scan modes
                      besides SCAN_READ.  Updated the version number to
                      reflect that; no change to the actual reader.
1.01     2015-05-17   Bug fix: The enhanced reader header file is now correctly
                      displayed even if the lengths of its lines are
                      inconsistent.
1.00     2015-05-06   Initial release
