diff --git a/src/sbbs3/js_archive.c b/src/sbbs3/js_archive.c
index 9dfc7403bf0a684c127c9a08ef56a39df23b10de..56562d480fa378b567bb19c708d65b93f843d204 100644
--- a/src/sbbs3/js_archive.c
+++ b/src/sbbs3/js_archive.c
@@ -609,8 +609,8 @@ static jsSyncMethodSpec js_archive_functions[] = {
 #ifdef BUILD_JSDOCS
 static char* archive_prop_desc[] = {
 
-	 "format/compression type of archive file - <small>READ ONLY</small>"
-	,"filename specified in constructor - <small>READ ONLY</small>"
+	 "Format/compression type of archive file - <small>READ ONLY</small>"
+	,"Filename specified in constructor - <small>READ ONLY</small>"
 	,NULL
 };
 #endif
diff --git a/src/sbbs3/js_bbs.cpp b/src/sbbs3/js_bbs.cpp
index 55d72acd9babe66e2888907714eb71afd3d28c4b..9d073a00423fa9192addb3ef43c21b429c5e47df 100644
--- a/src/sbbs3/js_bbs.cpp
+++ b/src/sbbs3/js_bbs.cpp
@@ -153,124 +153,124 @@ enum {
 
 #ifdef BUILD_JSDOCS
 	static const char* bbs_prop_desc[] = {
-	 "system status bitfield (see <tt>SS_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
-	,"startup options bitfield (see <tt>BBS_OPT_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
-	,"answer time, in <i>time_t</i> format"
-	,"logon time, in <i>time_t</i> format"
-	,"time from which user's time left is calculated, in <i>time_t</i> format"
-	,"current file new-scan time, in <i>time_t</i> format"
-	,"previous file new-scan time, in <i>time_t</i> format"
-	,"online (see <tt>ON_*</tt> in <tt>sbbsdefs.js</tt> for valid values)"
-	,"time left (in seconds)"
-	,"time of next exclusive event (in <i>time_t</i> format), or 0 if none"
-	,"internal code of next exclusive event"
-
-	,"current node number"
-	,"current node settings bitfield (see <tt>NM_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
-	,"current node status value (see <tt>nodedefs.js</tt> for valid values)"
-	,"current node error counter"
-	,"current node action (see <tt>nodedefs.js</tt> for valid values)"
-	,"current node user number (<i>useron</i> value)"
-	,"current node connection type (see <tt>nodedefs.js</tt> for valid values)"
-	,"current node misc value (see <tt>nodedefs.js</tt> for valid values)"
-	,"current node aux value"
-	,"current node extended aux (<i>extaux</i>) value"
-	,"validation feedback user for this node (or 0 for no validation feedback required)"
-
-	,"bytes uploaded during this session"
-	,"bytes downloaded during this session"
-	,"files uploaded during this session"
-	,"files downloaded during this session"
-	,"messages posted during this session"
-	,"e-mails sent during this session"
-	,"feedback messages sent during this session"
-	,"messages read during this session"
-
-	,"menu subdirectory (overrides default)"
-	,"menu file (overrides default)"
-	,"total main menu commands received from user during this session"
-	,"total file menu commands received from user during this session"
-
-	,"current message group"
-	,"current message sub-board"
-	,"current message sub-board internal code"
-	,"current file library"
-	,"current file directory"
-	,"current file directory internal code"
-
-	,"remote connection type"
-	,"login name given during RLogin negotiation"
-	,"password specified during RLogin negotiation"
-	,"terminal specified during RLogin negotiation"
-	,"client name"
-
-	,"error level returned from last executed external program"
+	 "System status bitfield (see <tt>SS_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
+	,"Startup options bitfield (see <tt>BBS_OPT_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
+	,"Answer time, in <i>time_t</i> format"
+	,"Logon time, in <i>time_t</i> format"
+	,"Time from which user's time left is calculated, in <i>time_t</i> format"
+	,"Current file new-scan time, in <i>time_t</i> format"
+	,"Previous file new-scan time, in <i>time_t</i> format"
+	,"Online (see <tt>ON_*</tt> in <tt>sbbsdefs.js</tt> for valid values)"
+	,"Time left (in seconds)"
+	,"Time of next exclusive event (in <i>time_t</i> format), or 0 if none"
+	,"Internal code of next exclusive event"
+
+	,"Current node number"
+	,"Current node settings bitfield (see <tt>NM_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
+	,"Current node status value (see <tt>nodedefs.js</tt> for valid values)"
+	,"Current node error counter"
+	,"Current node action (see <tt>nodedefs.js</tt> for valid values)"
+	,"Current node user number (<i>useron</i> value)"
+	,"Current node connection type (see <tt>nodedefs.js</tt> for valid values)"
+	,"Current node misc value (see <tt>nodedefs.js</tt> for valid values)"
+	,"Current node aux value"
+	,"Current node extended aux (<i>extaux</i>) value"
+	,"Validation feedback user for this node (or 0 for no validation feedback required)"
+
+	,"Bytes uploaded during this session"
+	,"Bytes downloaded during this session"
+	,"Files uploaded during this session"
+	,"Files downloaded during this session"
+	,"Messages posted during this session"
+	,"E-mails sent during this session"
+	,"Feedback messages sent during this session"
+	,"Messages read during this session"
+
+	,"Menu subdirectory (overrides default)"
+	,"Menu file (overrides default)"
+	,"Total main menu commands received from user during this session"
+	,"Total file menu commands received from user during this session"
+
+	,"Current message group"
+	,"Current message sub-board"
+	,"Current message sub-board internal code"
+	,"Current file library"
+	,"Current file directory"
+	,"Current file directory internal code"
+
+	,"Remote connection type"
+	,"Login name given during RLogin negotiation"
+	,"Password specified during RLogin negotiation"
+	,"Terminal specified during RLogin negotiation"
+	,"Client name"
+
+	,"Error level returned from last executed external program"
 
 	/* READ ONLY */
-	,"message group name of message being read"
-	,"message group description of message being read"
-	,"message group number of message being read"
-	,"sub-board name of message being read"
-	,"sub-board description of message being read"
-	,"sub-board internal code of message being read"
-	,"sub-board number of message being read"
-	,"message base attributes"
-	,"highest message number in message base"
-	,"total number of messages in message base"
-	,"number of messages loaded from message base"
-	,"current message number in message base"
+	,"Message group name of message being read"
+	,"Message group description of message being read"
+	,"Message group number of message being read"
+	,"Sub-board name of message being read"
+	,"Sub-board description of message being read"
+	,"Sub-board internal code of message being read"
+	,"Sub-board number of message being read"
+	,"Message base attributes"
+	,"Highest message number in message base"
+	,"Total number of messages in message base"
+	,"Number of messages loaded from message base"
+	,"Current message number in message base"
 
 	/* READ ONLY */
-	,"message recipient name"
-	,"message recipient extension"
-	,"message recipient network address"
-	,"message recipient agent type"
-	,"message sender name"
-	,"message sender extension"
-	,"message sender network address"
-	,"message sender BBS ID"
-	,"message sender agent type"
-	,"message reply-to name"
-	,"message reply-to extension"
-	,"message reply-to network address"
-	,"message reply-to agent type"
-	,"message subject"
-	,"message date/time"
-	,"message time zone"
-	,"message date/time imported"
-	,"message attributes"
-	,"message auxiliary attributes"
-	,"message network attributes"
-	,"message header offset"
-	,"message number (unique, monotonically incrementing)"
-	,"message expiration"
-	,"message forwarded"
-	,"message thread identifier (0 if unknown)"
-	,"message thread, back message number"
-	,"message thread, next message number"
-	,"message thread, message number of first reply to this message"
-	,"message identifier"
-	,"message replied-to identifier"
-	,"message delivery attempt counter"
-
-	,"message header displayed at top-of-screen"
-
-	,"file name"
-	,"file description"
-	,"file directory (number)"
-	,"file attribute flags"
-	,"file date"
-	,"file size (in bytes)"
-	,"file credit value"
-	,"file uploader (user name)"
-	,"file upload date"
-	,"file last-download date"
-	,"file download count"
-
-	,"number of files in batch upload queue"
-	,"number of files in batch download queue"
-
-	,"current command shell/module <i>command string</i> value"
+	,"Message recipient name"
+	,"Message recipient extension"
+	,"Message recipient network address"
+	,"Message recipient agent type"
+	,"Message sender name"
+	,"Message sender extension"
+	,"Message sender network address"
+	,"Message sender BBS ID"
+	,"Message sender agent type"
+	,"Message reply-to name"
+	,"Message reply-to extension"
+	,"Message reply-to network address"
+	,"Message reply-to agent type"
+	,"Message subject"
+	,"Message date/time"
+	,"Message time zone"
+	,"Message date/time imported"
+	,"Message attributes"
+	,"Message auxiliary attributes"
+	,"Message network attributes"
+	,"Message header offset"
+	,"Message number (unique, monotonically incrementing)"
+	,"Message expiration"
+	,"Message forwarded"
+	,"Message thread identifier (0 if unknown)"
+	,"Message thread, back message number"
+	,"Message thread, next message number"
+	,"Message thread, message number of first reply to this message"
+	,"Message identifier"
+	,"Message replied-to identifier"
+	,"Message delivery attempt counter"
+
+	,"Message header displayed at top-of-screen"
+
+	,"File name"
+	,"File description"
+	,"File directory (number)"
+	,"File attribute flags"
+	,"File date"
+	,"File size (in bytes)"
+	,"File credit value"
+	,"File uploader (user name)"
+	,"File upload date"
+	,"File last-download date"
+	,"File download count"
+
+	,"Number of files in batch upload queue"
+	,"Number of files in batch download queue"
+
+	,"Current command shell/module <i>command string</i> value"
 	,NULL
 	};
 #endif
@@ -4372,20 +4372,20 @@ js_select_user(JSContext *cx, uintN argc, jsval *arglist)
 
 static jsSyncMethodSpec js_bbs_functions[] = {
 	{"atcode",			js_atcode,			1,	JSTYPE_STRING,	JSDOCSTR("code_string")
-	,JSDOCSTR("returns @-code value, specified <i>code</i> string does not include @ character delimiters")
+	,JSDOCSTR("Returns @-code value, specified <i>code</i> string does not include @ character delimiters")
 	,310
 	},
 	/* text.dat */
 	{"text",			js_text,			1,	JSTYPE_STRING,	JSDOCSTR("line_number")
-	,JSDOCSTR("returns specified text string from text.dat")
+	,JSDOCSTR("Returns specified text string from text.dat")
 	,310
 	},
 	{"replace_text",	js_replace_text,	2,	JSTYPE_BOOLEAN,	JSDOCSTR("line_number, text")
-	,JSDOCSTR("replaces specified text string in memory")
+	,JSDOCSTR("Replaces specified text string in memory")
 	,310
 	},
 	{"revert_text",		js_revert_text,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("[line_number=<i>all</i>]")
-	,JSDOCSTR("reverts specified text string to original text string; "
+	,JSDOCSTR("Reverts specified text string to original text string; "
 		"if <i>line_number</i> unspecified, reverts all text lines")
 	,310
 	},
@@ -4395,86 +4395,87 @@ static jsSyncMethodSpec js_bbs_functions[] = {
 	},
 	/* procedures */
 	{"newuser",			js_newuser,			0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("interactive new user procedure")
+	,JSDOCSTR("Interactive new user procedure")
 	,310
 	},
 	{"login",			js_login,			4,	JSTYPE_BOOLEAN,	JSDOCSTR("user_name [,password_prompt] [,user_password] [,system_password]")
-	,JSDOCSTR("login with <i>user_name</i>, displaying <i>password_prompt</i> for user's password (if required), "
+	,JSDOCSTR("Login with <i>user_name</i>, displaying <i>password_prompt</i> for user's password (if required), "
 	"optionally supplying the user's password and the system password as arguments so as to not be prompted")
 	,310
 	},
 	{"logon",			js_logon,			0,	JSTYPE_BOOLEAN,	JSDOCSTR("")
-	,JSDOCSTR("interactive logon procedure")
+	,JSDOCSTR("Interactive user-logon procedure")
 	,310
 	},
 	{"logoff",			js_logoff,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("[prompt=<i>true</i>]")
-	,JSDOCSTR("interactive logoff procedure, pass <i>false</i> for <i>prompt</i> argument to avoid yes/no prompt, returns <i>false</i> if denied logoff")
+	,JSDOCSTR("Interactive user-logoff procedure, pass <i>false</i> for <i>prompt</i> argument to avoid yes/no prompt, returns <i>false</i> if denied logoff, "
+		"hangs-up (disconnects) upon completion of logoff")
 	,315
 	},
 	{"logout",			js_logout,			0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("non-interactive logout procedure")
+	,JSDOCSTR("Non-interactive user-logout procedure, invoked implicitly upon user-disconnect. Only invoke this method to force a logout without a disconnect.")
 	,310
 	},
 	{"hangup",			js_hangup,			0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("hangup (disconnect) immediately")
+	,JSDOCSTR("Hangup (disconnect) the connected user/client immediately")
 	,310
 	},
 	{"node_sync",		js_nodesync,		1,	JSTYPE_ALIAS },
-	{"nodesync",		js_nodesync,		1,	JSTYPE_VOID,	JSDOCSTR("[clearline=<i>false</i>]")
-	,JSDOCSTR("synchronize with node database, checks for messages, interruption, etc. (AKA node_sync), "
-	"clears the current console line if there's a message to print when <i>clearline</i> is <i>true</i>.")
+	{"nodesync",		js_nodesync,		1,	JSTYPE_VOID,	JSDOCSTR("[clear-line=<i>false</i>]")
+	,JSDOCSTR("Synchronize with node database, checks for messages, interruption, etc. (AKA node_sync), "
+	"clears the current console line if there's a message to print when <i>clear-line</i> is <i>true</i>.")
 	,310
 	},
 	{"auto_msg",		js_automsg,			0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("read/create system's auto-message")
+	,JSDOCSTR("Read/create system's auto-message")
 	,310
 	},
 	{"time_bank",		js_time_bank,		0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("enter the time banking system")
+	,JSDOCSTR("Enter the time banking system")
 	,310
 	},
 	{"qwk_sec",			js_qwk_sec,			0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("enter the QWK message packet upload/download/config section")
+	,JSDOCSTR("Enter the QWK message packet upload/download/config section")
 	,310
 	},
 	{"text_sec",		js_text_sec,		0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("enter the text files section")
+	,JSDOCSTR("Enter the text files section")
 	,310
 	},
 	{"xtrn_sec",		js_xtrn_sec,		0,	JSTYPE_VOID,	JSDOCSTR("[section]")
-	,JSDOCSTR("enter the external programs section (or go directly to the specified <i>section</i>)")
+	,JSDOCSTR("Enter the external programs section (or go directly to the specified <i>section</i>)")
 	,310
 	},
 	{"chat_sec",		js_chat_sec,		0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("enter the chat section/menu")
+	,JSDOCSTR("Enter the chat section/menu")
 	,320
 	},
 	{"xfer_policy",		js_xfer_policy,		0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("display the file transfer policy")
+	,JSDOCSTR("Display the file transfer policy")
 	,310
 	},
 	{"batch_menu",		js_batchmenu,		0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("enter the batch file transfer menu")
+	,JSDOCSTR("Enter the batch file transfer menu")
 	,310
 	},
 	{"batch_download",	js_batchdownload,	0,	JSTYPE_BOOLEAN,	JSDOCSTR("")
-	,JSDOCSTR("start a batch download")
+	,JSDOCSTR("Start a batch download")
 	,310
 	},
 	{"batch_add_list",	js_batchaddlist,	1,	JSTYPE_VOID,	JSDOCSTR("list_filename")
-	,JSDOCSTR("add file list to batch download queue")
+	,JSDOCSTR("Add file list to batch download queue")
 	,310
 	},
 	{"batch_clear",		js_batchclear,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("upload=false")
-	,JSDOCSTR("clear batch download (or upload) queue")
+	,JSDOCSTR("Clear batch download (or upload) queue")
 	,320
 	},
 	{"view_file",		js_viewfile,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("filename")
-	,JSDOCSTR("list contents of specified filename (complete path)")
+	,JSDOCSTR("List contents of specified filename (complete path)")
 	,319
 	},
 	{"send_file",		js_sendfile,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("filename [,protocol] [,description] [,autohang=true]")
-	,JSDOCSTR("send specified filename (complete path) to user via user-prompted "
+	,JSDOCSTR("Send specified filename (complete path) to user via user-prompted "
 		"(or optionally specified) protocol.<br>"
 		"The optional <i>description</i> string is used for logging purposes.<br>"
 		"When <i>autohang=true</i>, disconnect after transfer based on user's default setting."
@@ -4482,111 +4483,111 @@ static jsSyncMethodSpec js_bbs_functions[] = {
 	,314
 	},
 	{"receive_file",	js_recvfile,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("filename [,protocol] [,autohang=true]")
-	,JSDOCSTR("received specified filename (complete path) from user via user-prompted "
+	,JSDOCSTR("Received specified filename (complete path) from user via user-prompted "
 		"(or optionally specified) protocol.<br>"
 		"When <i>autohang=true</i>, disconnect after transfer based on user's default setting."
 	)
 	,314
 	},
 	{"temp_xfer",		js_temp_xfer,		0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("enter the temporary file tranfer menu")
+	,JSDOCSTR("Enter the temporary file tranfer menu")
 	,310
 	},
 	{"user_sync",		js_user_sync,		0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("read the current user data from the database")
+	,JSDOCSTR("Read the current user data from the database")
 	,310
 	},
 	{"user_config",		js_user_config,		0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("enter the user settings configuration menu")
+	,JSDOCSTR("Enter the user settings configuration menu")
 	,310
 	},
 	{"sys_info",		js_sys_info,		0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("display system information")
+	,JSDOCSTR("Display system information")
 	,310
 	},
 	{"sub_info",		js_sub_info,		1,	JSTYPE_VOID,	JSDOCSTR("[sub-board=<i>current</i>]")
-	,JSDOCSTR("display message sub-board information (current <i>sub-board</i>, if unspecified)")
+	,JSDOCSTR("Display message sub-board information (current <i>sub-board</i>, if unspecified)")
 	,310
 	},
 	{"dir_info",		js_dir_info,		0,	JSTYPE_VOID,	JSDOCSTR("[directory=<i>current</i>]")
-	,JSDOCSTR("display file directory information (current <i>directory</i>, if unspecified)")
+	,JSDOCSTR("Display file directory information (current <i>directory</i>, if unspecified)")
 	,310
 	},
 	{"user_info",		js_user_info,		0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("display current user information")
+	,JSDOCSTR("Display current user information")
 	,310
 	},
 	{"ver",				js_ver,				0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("display software version information")
+	,JSDOCSTR("Display software version information")
 	,310
 	},
 	{"sys_stats",		js_sys_stats,		0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("display system statistics")
+	,JSDOCSTR("Display system statistics")
 	,310
 	},
 	{"node_stats",		js_node_stats,		0,	JSTYPE_VOID,	JSDOCSTR("[node_number=<i>current</i>]")
-	,JSDOCSTR("display current (or specified) node statistics")
+	,JSDOCSTR("Display current (or specified) node statistics")
 	,310
 	},
 	{"list_users",		js_userlist,		0,	JSTYPE_VOID,	JSDOCSTR("[mode=<tt>UL_ALL</tt>]")
-	,JSDOCSTR("display user list"
+	,JSDOCSTR("Display user list"
 	"(see <tt>UL_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> values)")
 	,310
 	},
 	{"edit_user",		js_useredit,		0,	JSTYPE_VOID,	JSDOCSTR("[user_number=<i>current</i>]")
-	,JSDOCSTR("enter the user editor")
+	,JSDOCSTR("Enter the user editor")
 	,310
 	},
 	{"change_user",		js_change_user,		0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("change to a different user")
+	,JSDOCSTR("Change to a different user")
 	,310
 	},
 	{"list_logons",		js_logonlist,		0,	JSTYPE_VOID,	JSDOCSTR("[arguments]")
-	,JSDOCSTR("display the logon list (optionally passing arguments to the logon list module)")
+	,JSDOCSTR("Display the logon list (optionally passing arguments to the logon list module)")
 	,310
 	},
 	{"read_mail",		js_readmail,		0,	JSTYPE_NUMBER,	JSDOCSTR("[which=<tt>MAIL_YOUR</tt>] [,user_number=<i>current</i>] [,loadmail_mode=<tt>0</tt>]")
-	,JSDOCSTR("read private e-mail"
+	,JSDOCSTR("Read private e-mail"
 	"(see <tt>MAIL_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>which</i> values), returns user-modified loadmail_mode value")
 	,310
 	},
 	{"email",			js_email,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("to_user_number [,mode=<tt>WM_EMAIL</tt>] [,top=<i>none</i>] [,subject=<i>none</i>] [,object reply_header]")
-	,JSDOCSTR("send private e-mail to a local user (<i>reply_header</i> added in v3.17c)")
+	,JSDOCSTR("Send private e-mail to a local user (<i>reply_header</i> added in v3.17c)")
 	,310
 	},
 	{"netmail",			js_netmail,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("[string address or array of addresses] [,mode=<tt>WM_NONE</tt>] [,subject=<i>none</i>] [,object reply_header]")
-	,JSDOCSTR("send private netmail (<i>reply_header</i> added in v3.17c, <i>array of addresses</i> added in v3.18a)")
+	,JSDOCSTR("Send private netmail (<i>reply_header</i> added in v3.17c, <i>array of addresses</i> added in v3.18a)")
 	,310
 	},
 	{"bulk_mail",		js_bulkmail,		0,	JSTYPE_VOID,	JSDOCSTR("[ars]")
-	,JSDOCSTR("send bulk private e-mail, if <i>ars</i> not specified, prompt for destination users")
+	,JSDOCSTR("Send bulk private e-mail, if <i>ars</i> not specified, prompt for destination users")
 	,310
 	},
 	{"upload_file",		js_upload_file,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("[directory=<i>current</i>]")
-	,JSDOCSTR("upload file to file directory specified by number or internal code")
+	,JSDOCSTR("Upload file to file directory specified by number or internal code")
 	,310
 	},
 	{"bulk_upload",		js_bulkupload,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("[directory=<i>current</i>]")
-	,JSDOCSTR("add files (already in local storage path) to file directory "
+	,JSDOCSTR("Add files (already in local storage path) to file directory "
 		"specified by number or internal code")
 	,310
 	},
 	{"export_filelist",	js_export_filelist,	2,	JSTYPE_NUMBER,	JSDOCSTR("filename [,mode=<tt>FL_NONE</tt>]")
-	,JSDOCSTR("export list of files to a text file, optionally specifying a file list mode (e.g. <tt>FL_ULTIME</tt>), returning the number of files listed")
+	,JSDOCSTR("Export list of files to a text file, optionally specifying a file list mode (e.g. <tt>FL_ULTIME</tt>), returning the number of files listed")
 	,319
 	},
 	{"list_files",		js_listfiles,		1,	JSTYPE_NUMBER,	JSDOCSTR("[directory=<i>current</i>] [,filespec=<tt>\"*.*\"</tt> or search_string] [,mode=<tt>FL_NONE</tt>]")
-	,JSDOCSTR("list files in the specified file directory, "
+	,JSDOCSTR("List files in the specified file directory, "
 		"optionally specifying a file specification (wildcards) or a description search string, "
 		"and <i>mode</i> (bitfield)")
 	,310
 	},
 	{"list_file_info",	js_listfileinfo,	1,	JSTYPE_NUMBER,	JSDOCSTR("[directory=<i>current</i>] [,filespec=<tt>\"*.*\"</tt>] [,mode=<tt>FI_INFO</tt>]")
-	,JSDOCSTR("list extended file information for files in the specified file directory")
+	,JSDOCSTR("List extended file information for files in the specified file directory")
 	,310
 	},
 	{"post_msg",		js_post_msg,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("[sub-board=<i>current</i>] [,mode=<tt>WM_NONE</tt>] [,object reply_header]")
-	,JSDOCSTR("post a message in the specified message sub-board (number or internal code) "
+	,JSDOCSTR("Post a message in the specified message sub-board (number or internal code) "
 		"with optional <i>mode</i> (bitfield)<br>"
 		"If <i>reply_header</i> is specified (a header object returned from <i>MsgBase.get_msg_header()</i>), that header "
 		"will be used for the in-reply-to header fields.")
@@ -4601,210 +4602,210 @@ static jsSyncMethodSpec js_bbs_functions[] = {
 	,31802
 	},
 	{"show_msg",		js_show_msg,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("object header [,mode=<tt>P_NONE</tt>] ")
-	,JSDOCSTR("show a message's header and body (text) with optional print <i>mode</i> (bitfield)<br>"
+	,JSDOCSTR("Show a message's header and body (text) with optional print <i>mode</i> (bitfield)<br>"
 		"<i>header</i> must be a header object returned from <i>MsgBase.get_msg_header()</i>)")
 	,31702
 	},
 	{"show_msg_header",	js_show_msg_header,	1,	JSTYPE_VOID,	JSDOCSTR("object header [,subject] [,from] [,to]")
-	,JSDOCSTR("show a message's header (only)<br>"
+	,JSDOCSTR("Show a message's header (only)<br>"
 		"<i>header</i> must be a header object returned from <i>MsgBase.get_msg_header()</i>)")
 	,31702
 	},
 	{"download_msg_attachments", js_download_msg_attachments, 1, JSTYPE_VOID, JSDOCSTR("object header")
-	,JSDOCSTR("prompt the user to download each of the message's file attachments (if there are any)<br>"
+	,JSDOCSTR("Prompt the user to download each of the message's file attachments (if there are any)<br>"
 		"<i>header</i> must be a header object returned from <i>MsgBase.get_msg_header()</i>)")
 	,31702
 	},
 	{"change_msg_attr", js_change_msg_attr, 1, JSTYPE_NUMBER, JSDOCSTR("object header")
-	,JSDOCSTR("prompt the user to modify the specified message header attributes")
+	,JSDOCSTR("Prompt the user to modify the specified message header attributes")
 	,31702
 	},
 	{"cfg_msg_scan",	js_msgscan_cfg,		0,	JSTYPE_VOID,	JSDOCSTR("[type=<tt>SCAN_CFG_NEW</tt>]")
-	,JSDOCSTR("configure message scan "
+	,JSDOCSTR("Configure message scan "
 		"(<i>type</i> is either <tt>SCAN_CFG_NEW</tt> or <tt>SCAN_CFG_TOYOU</tt>)")
 	,310
 	},
 	{"cfg_msg_ptrs",	js_msgscan_ptrs,	0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("change message scan pointer values")
+	,JSDOCSTR("Change message scan pointer values")
 	,310
 	},
 	{"reinit_msg_ptrs",	js_msgscan_reinit,	0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("re-initialize new message scan pointers to values at logon")
+	,JSDOCSTR("Re-initialize new message scan pointers to values at logon")
 	,310
 	},
 	{"save_msg_scan",	js_save_msg_scan,	0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("save message scan configuration and pointers to userbase")
+	,JSDOCSTR("Save message scan configuration and pointers to userbase")
 	,320
 	},
 	{"reload_msg_scan",	js_reload_msg_scan,	0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("re-loads message scan configuration and pointers from userbase")
+	,JSDOCSTR("Re-loads message scan configuration and pointers from userbase")
 	,320
 	},
 	{"scan_subs",		js_scansubs,		0,	JSTYPE_VOID,	JSDOCSTR("[mode=<tt>SCAN_NEW</tt>] [,all=<tt>false</tt>]")
-	,JSDOCSTR("scan sub-boards for messages")
+	,JSDOCSTR("Scan sub-boards for messages")
 	,310
 	},
 	{"scan_dirs",		js_scandirs,		0,	JSTYPE_VOID,	JSDOCSTR("[mode=<tt>FL_NONE</tt>] [,all=<tt>false</tt>]")
-	,JSDOCSTR("scan directories for files")
+	,JSDOCSTR("Scan directories for files")
 	,310
 	},
 	{"scan_posts",		js_scanposts,		1,	JSTYPE_ALIAS },
 	{"scan_msgs",		js_scanposts,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("[sub-board=<i>current</i>] [,mode=<tt>SCAN_READ</tt>] [,find]")
-	,JSDOCSTR("scan messages in the specified message sub-board (number or internal code), "
+	,JSDOCSTR("Scan messages in the specified message sub-board (number or internal code), "
 		"optionally search for 'find' string (AKA scan_posts)")
 	,310
 	},
 	{"list_msgs",		js_listmsgs,		1,	JSTYPE_NUMBER,	JSDOCSTR("[sub-board=<i>current</i>] [,mode=<tt>SCAN_INDEX</tt>] [,message_number=<tt>0</tt>] [,find]")
-	,JSDOCSTR("list messages in the specified message sub-board (number or internal code), "
+	,JSDOCSTR("List messages in the specified message sub-board (number or internal code), "
 		"optionally search for 'find' string, returns number of messages listed")
 	,314
 	},
 	/* menuing */
 	{"menu",			js_menu,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("base_filename [,mode=<tt>P_NONE</tt>] [,object scope]")
-	,JSDOCSTR("display a menu file from the text/menu directory.<br>"
+	,JSDOCSTR("Display a menu file from the text/menu directory.<br>"
 	"See <tt>P_*</tt> in <tt>sbbsdefs.js</tt> for <i>mode</i> flags.<br>"
 	"When <i>scope</i> is specified, <tt>@JS:property@</tt> codes will expand the referenced property names.<br>"
 	"To display a randomly-chosen menu file, including wild-card (* or ?) characters in the <tt>base_filename</tt>.")
 	,310
 	},
 	{"menu_exists",		js_menu_exists,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("base_filename")
-	,JSDOCSTR("returns true if the referenced menu file exists (i.e. in the text/menu directory)")
+	,JSDOCSTR("Returns true if the referenced menu file exists (i.e. in the text/menu directory)")
 	,31700
 	},
 	{"log_key",			js_logkey,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("key [,comma=<tt>false</tt>]")
-	,JSDOCSTR("log key to node.log (comma optional)")
+	,JSDOCSTR("Log key to node.log (comma optional)")
 	,310
 	},
 	{"log_str",			js_logstr,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("text")
-	,JSDOCSTR("log string to node.log")
+	,JSDOCSTR("Log string to node.log")
 	,310
 	},
 	/* users */
 	{"finduser",		js_finduser,		1,	JSTYPE_NUMBER,	JSDOCSTR("username_or_number")
-	,JSDOCSTR("find user name (partial name support), interactive")
+	,JSDOCSTR("Find user name (partial name support), interactive")
 	,310
 	},
 	{"trashcan",		js_trashcan,		2,	JSTYPE_BOOLEAN,	JSDOCSTR("base_filename, search_string")
-	,JSDOCSTR("search file for pseudo-regexp (search string) in trashcan file (text/base_filename.can)")
+	,JSDOCSTR("Search file for pseudo-regexp (search string) in trashcan file (text/base_filename.can)")
 	,310
 	},
 	/* xtrn programs/modules */
 	{"exec",			js_exec,			2,	JSTYPE_NUMBER,	JSDOCSTR("cmdline [,mode=<tt>EX_NONE</tt>] [,startup_dir]")
-	,JSDOCSTR("execute a program, optionally changing current directory to <i>startup_dir</i> "
+	,JSDOCSTR("Execute a program, optionally changing current directory to <i>startup_dir</i> "
 	"(see <tt>EX_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> flags.)")
 	,310
 	},
 	{"exec_xtrn",		js_exec_xtrn,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("xtrn_number_or_code")
-	,JSDOCSTR("execute external program by number or internal code")
+	,JSDOCSTR("Execute external program by number or internal code")
 	,310
 	},
 	{"user_event",		js_user_event,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("event_type")
-	,JSDOCSTR("execute user event by event type "
+	,JSDOCSTR("Execute user event by event type "
 	"(see <tt>EVENT_*</tt> in <tt>sbbsdefs.js</tt> for valid values)")
 	,310
 	},
 	{"telnet_gate",		js_telnet_gate,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("address[:port] [,mode=<tt>TG_NONE</tt>] [,timeout=<tt>10</tt>]")
-	,JSDOCSTR("external Telnet gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> flags).")
+	,JSDOCSTR("External Telnet gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> flags).")
 	,310
 	},
 	{"rlogin_gate",		js_rlogin_gate,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("address[:port] [,client-user-name=<tt>user.alias</tt>, server-user-name=<tt>user.name</tt>, terminal=<tt>console.terminal</tt>] [,mode=<tt>TG_NONE</tt>]  [,timeout=<tt>10</tt>]")
-	,JSDOCSTR("external RLogin gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> flags).")
+	,JSDOCSTR("External RLogin gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> flags).")
 	,316
 	},
 	/* security */
 	{"check_filename",	js_checkfname,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("filename")
-	,JSDOCSTR("verify that the specified <i>filename</i> string is legal and allowed for upload "
+	,JSDOCSTR("Verify that the specified <i>filename</i> string is legal and allowed for upload "
 		"(based on system configuration), returns <i>true</i> if the filename is allowed.<br>"
 		"Note: Will display <tt>text/badfile.msg</tt> for matching filenames, if it exists.")
 	,31902
 	},
 	{"check_syspass",	js_chksyspass,		0,	JSTYPE_BOOLEAN,	JSDOCSTR("[sys_pw]")
-	,JSDOCSTR("verify system password, prompting for the password if not passed as an argument")
+	,JSDOCSTR("Verify system password, prompting for the password if not passed as an argument")
 	,310
 	},
 	{"good_password",	js_chkpass,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("password")
-	,JSDOCSTR("check if requested user password meets minimum password requirements "
+	,JSDOCSTR("Check if requested user password meets minimum password requirements "
 		"(length, uniqueness, etc.)")
 	,310
 	},
 	/* chat/node stuff */
 	{"page_sysop",		js_pagesysop,		0,	JSTYPE_BOOLEAN,	JSDOCSTR("")
-	,JSDOCSTR("page the sysop for chat, returns <i>false</i> if the sysop could not be paged")
+	,JSDOCSTR("Page the sysop for chat, returns <i>false</i> if the sysop could not be paged")
 	,310
 	},
 	{"page_guru",		js_pageguru,		0,	JSTYPE_BOOLEAN,	JSDOCSTR("")
-	,JSDOCSTR("page the guru for chat")
+	,JSDOCSTR("Page the guru for chat")
 	,310
 	},
 	{"multinode_chat",	js_multinode_chat,	0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("enter multi-node chat")
+	,JSDOCSTR("Enter multi-node chat")
 	,310
 	},
 	{"private_message",	js_private_message,	0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("use the private inter-node message prompt")
+	,JSDOCSTR("Use the private inter-node message prompt")
 	,310
 	},
 	{"private_chat",	js_private_chat,	0,	JSTYPE_VOID,	JSDOCSTR("[local=<i>false</i>]")
-	,JSDOCSTR("enter private inter-node chat, or local sysop chat (if <i>local</i>=<i>true</i>)")
+	,JSDOCSTR("Enter private inter-node chat, or local sysop chat (if <i>local</i>=<i>true</i>)")
 	,310
 	},
 	{"get_node_message",js_get_node_message,1,	JSTYPE_VOID,	JSDOCSTR("[clearline=<i>false</i>]")
-	,JSDOCSTR("receive and display an inter-node message")
+	,JSDOCSTR("Receive and display an inter-node message")
 	,310
 	},
 	{"put_node_message",js_put_node_message,2,	JSTYPE_BOOLEAN,	JSDOCSTR("[node_number] [,text]")
-	,JSDOCSTR("send an inter-node message (specify a <i>node_number</i> value of <tt>-1</tt> for 'all active nodes')")
+	,JSDOCSTR("Send an inter-node message (specify a <i>node_number</i> value of <tt>-1</tt> for 'all active nodes')")
 	,31700
 	},
 	{"get_telegram",	js_get_telegram,	2,	JSTYPE_VOID,	JSDOCSTR("[user_number=<i>current</i>], [clearline=<i>false</i>]")
-	,JSDOCSTR("receive and display waiting telegrams for specified (or current) user")
+	,JSDOCSTR("Receive and display waiting telegrams for specified (or current) user")
 	,310
 	},
 	{"put_telegram",	js_put_telegram,	2,	JSTYPE_BOOLEAN,	JSDOCSTR("[user_number] [,text]")
-	,JSDOCSTR("send a telegram (short multi-line stored message) to a user")
+	,JSDOCSTR("Send a telegram (short multi-line stored message) to a user")
 	,31700
 	},
 	{"list_nodes",		js_nodelist,		0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("list all nodes")
+	,JSDOCSTR("List all nodes")
 	,310
 	},
 	{"whos_online",		js_whos_online,		0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("list active nodes only (who's online)")
+	,JSDOCSTR("List active nodes only (who's online)")
 	,310
 	},
 	{"spy",				js_spy,				1,	JSTYPE_VOID,	JSDOCSTR("node_number")
-	,JSDOCSTR("spy on a node")
+	,JSDOCSTR("Spy on a node")
 	,310
 	},
 	/* misc */
 	{"cmdstr",			js_cmdstr,			1,	JSTYPE_STRING,	JSDOCSTR("command_string [,fpath=<tt>\"\"</tt>] [,fspec=<tt>\"\"</tt>]")
-	,JSDOCSTR("return expanded command string using Synchronet command-line specifiers")
+	,JSDOCSTR("Return expanded command string using Synchronet command-line specifiers")
 	,310
 	},
 	/* input */
 	{"get_filespec",	js_getfilespec,		0,	JSTYPE_STRING,	JSDOCSTR("")
-	,JSDOCSTR("returns a file specification input by the user (optionally with wildcards)")
+	,JSDOCSTR("Returns a file specification input by the user (optionally with wildcards)")
 	,310
 	},
 	{"get_newscantime",	js_getnstime,		1,	JSTYPE_NUMBER,	JSDOCSTR("time=<i>current</i>")
-	,JSDOCSTR("confirm or change a new-scan time, returns the new new-scan time value (<i>time_t</i> format)")
+	,JSDOCSTR("Confirm or change a new-scan time, returns the new new-scan time value (<i>time_t</i> format)")
 	,310
 	},
 	{"select_shell",	js_select_shell,	0,	JSTYPE_BOOLEAN,	JSDOCSTR("")
-	,JSDOCSTR("prompt user to select a new command shell")
+	,JSDOCSTR("Prompt user to select a new command shell")
 	,310
 	},
 	{"select_editor",	js_select_editor,	0,	JSTYPE_BOOLEAN,	JSDOCSTR("")
-	,JSDOCSTR("prompt user to select a new external message editor")
+	,JSDOCSTR("Prompt user to select a new external message editor")
 	,310
 	},
 	{"get_time_left",	js_get_time_left,	0,	JSTYPE_NUMBER,	JSDOCSTR("")
-	,JSDOCSTR("check the user's available remaining time online and return the value, in seconds<br>"
+	,JSDOCSTR("Check the user's available remaining time online and return the value, in seconds<br>"
 	"This method will inform (and disconnect) the user when they are out of time")
 	,31401
 	},
 	{"compare_ars",		js_chk_ar,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("ars")
-	,JSDOCSTR("verify the current user online meets the specified Access Requirements String")
+	,JSDOCSTR("Verify the current user online meets the specified Access Requirements String")
 	,315
 	},
 	{"select_node",		js_select_node,		1,	JSTYPE_NUMBER,	JSDOCSTR("all_is_an_option=<i>false</i>")
diff --git a/src/sbbs3/js_client.c b/src/sbbs3/js_client.c
index ced4f02af97ce03f7a1ca2ed268a376d14f43a08..3ea1b306660f12951ee2b1823ea498f920ec288e 100644
--- a/src/sbbs3/js_client.c
+++ b/src/sbbs3/js_client.c
@@ -52,16 +52,16 @@ enum {
 
 #ifdef BUILD_JSDOCS
 	static char* client_prop_desc[] = {
-	 "client's IPv4 or IPv6 address"
-	,"client's host name (up to 64 characters)"
-	,"client's TCP or UDP port number"
-	,"date/time of initial connection (in time_t format)"
-	,"protocol/service name (e.g. 'Telnet', 'FTP', etc.)"
-	,"user's name/alias"
-	,"user's number (non-zero if logged in)"
+	 "Client's IPv4 or IPv6 address"
+	,"Client's host name (up to 64 characters)"
+	,"Client's TCP or UDP port number"
+	,"Date/time of initial connection (in time_t format)"
+	,"Protocol/service name (e.g. 'Telnet', 'FTP', etc.)"
+	,"User's name/alias"
+	,"User's number (non-zero if logged in)"
 
 	/* this next one must be last */
-	,"instance of <a href=#Socket>Socket class</a> representing client's TCP/IP connection"
+	,"Instance of <a href=#Socket>Socket class</a> representing client's TCP/IP connection"
 	,NULL
 	};
 #endif
diff --git a/src/sbbs3/js_com.c b/src/sbbs3/js_com.c
index 4c1592d4305824f8bbf6defd757a073474cfa3b3..03a7e6e0f10a36d13c6357f266734a0ec8c8bbf3 100644
--- a/src/sbbs3/js_com.c
+++ b/src/sbbs3/js_com.c
@@ -513,9 +513,9 @@ enum {
 
 #ifdef BUILD_JSDOCS
 static char* com_prop_desc[] = {
-	 "error status for the last COM operation that failed - <small>READ ONLY</small>"
+	 "Error status for the last COM operation that failed - <small>READ ONLY</small>"
 	,"<i>true</i> if port is in a connected state - <small>READ ONLY</small>"
-	,"enable debug logging"
+	,"Enable debug logging"
 	,"COM handle (advanced uses only)"
 	,"<i>true</i> if binary data is to be sent in Network Byte Order (big end first), default is <i>true</i>"
 	,"COM port Baud rate"
@@ -696,41 +696,41 @@ static jsSyncPropertySpec js_com_properties[] = {
 
 static jsSyncMethodSpec js_com_functions[] = {
 	{"close",		js_close,		0,	JSTYPE_VOID,	""
-	,JSDOCSTR("close the port immediately")
+	,JSDOCSTR("Close the port immediately")
 	,315
 	},
 	{"open",     js_open,     2,	JSTYPE_BOOLEAN,	JSDOCSTR("")
-	,JSDOCSTR("connect to a COM port")
+	,JSDOCSTR("Connect to a COM port")
 	,315
 	},
 	{"write",		js_send,		1,	JSTYPE_ALIAS },
 	{"send",		js_send,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("data")
-	,JSDOCSTR("send a string (AKA write)")
+	,JSDOCSTR("Send a string (AKA write)")
 	,315
 	},
 	{"sendfile",	js_sendfile,	1,	JSTYPE_BOOLEAN,	JSDOCSTR("path/filename")
-	,JSDOCSTR("send an entire file over the port")
+	,JSDOCSTR("Send an entire file over the port")
 	,315
 	},
 	{"writeBin",	js_sendbin,		1,	JSTYPE_ALIAS },
 	{"sendBin",		js_sendbin,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("value [,bytes=<tt>4</tt>]")
-	,JSDOCSTR("send a binary integer over the port, default number of bytes is 4 (32-bits)")
+	,JSDOCSTR("Send a binary integer over the port, default number of bytes is 4 (32-bits)")
 	,315
 	},
 	{"read",		js_recv,		1,	JSTYPE_ALIAS },
 	{"recv",		js_recv,		1,	JSTYPE_STRING,	JSDOCSTR("[maxlen=<tt>512</tt> [,timeout=<tt>30</tt>]]")
-	,JSDOCSTR("receive a string, default maxlen is 512 characters, default timeout is 30 seconds (AKA read)")
+	,JSDOCSTR("Receive a string, default maxlen is 512 characters, default timeout is 30 seconds (AKA read)")
 	,315
 	},
 	{"readline",	js_recvline,	0,	JSTYPE_ALIAS },
 	{"readln",		js_recvline,	0,	JSTYPE_ALIAS },
 	{"recvline",	js_recvline,	0,	JSTYPE_STRING,	JSDOCSTR("[maxlen=<tt>512</tt>] [,timeout=<tt>30.0</tt>]")
-	,JSDOCSTR("receive a line-feed terminated string, default maxlen is 512 characters, default timeout is 30 seconds (AKA readline and readln)")
+	,JSDOCSTR("Receive a line-feed terminated string, default maxlen is 512 characters, default timeout is 30 seconds (AKA readline and readln)")
 	,315
 	},
 	{"readBin",		js_recvbin,		0,	JSTYPE_ALIAS },
 	{"recvBin",		js_recvbin,		0,	JSTYPE_NUMBER,	JSDOCSTR("[bytes=<tt>4</tt> [,timeout=<tt>30</tt>]")
-	,JSDOCSTR("receive a binary integer from the port, default number of bytes is 4 (32-bits), default timeout is 30 seconds")
+	,JSDOCSTR("Receive a binary integer from the port, default number of bytes is 4 (32-bits), default timeout is 30 seconds")
 	,315
 	},
 	{0}
diff --git a/src/sbbs3/js_console.cpp b/src/sbbs3/js_console.cpp
index 171ea2583f65609d5a2a791b80aeaefb7e096e00..271e6e469e3830866067cba146eb40ea7134cb4d 100644
--- a/src/sbbs3/js_console.cpp
+++ b/src/sbbs3/js_console.cpp
@@ -396,36 +396,36 @@ static jsSyncPropertySpec js_console_properties[] = {
 
 #ifdef BUILD_JSDOCS
 static const char* con_prop_desc[] = {
-	 "status bit-field (see <tt>CON_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
-	,"mouse mode bit-field (see <tt>MOUSE_MODE_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions, "
+	 "Status bit-field (see <tt>CON_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
+	,"Mouse mode bit-field (see <tt>MOUSE_MODE_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions, "
 		"set to <tt>true</tt> for default enabled mode, <tt>false</tt> to disable)"
-	,"current 0-based line counter (used for automatic screen pause)"
-	,"current 0-based row counter"
-	,"current 0-based column counter (used to auto-increment <i>line_counter</i> when screen wraps)"
-	,"length of last line sent to terminal (before a carriage-return or line-wrap)"
-	,"duration of delay (in milliseconds) before each line-feed character is sent to the terminal"
-	,"current display attributes (set with number or string value)"
-	,"set to <i>true</i> if the terminal cursor is already at the top of the screen - <small>READ ONLY</small>"
-	,"number of remote terminal screen rows (in lines)"
-	,"number of remote terminal screen columns (in character cells)"
-	,"current tab stop interval (tab size), in columns"
-	,"bit-field of automatically detected terminal settings "
+	,"Current 0-based line counter (used for automatic screen pause)"
+	,"Current 0-based row counter"
+	,"Current 0-based column counter (used to auto-increment <i>line_counter</i> when screen wraps)"
+	,"Length of last line sent to terminal (before a carriage-return or line-wrap)"
+	,"Duration of delay (in milliseconds) before each line-feed character is sent to the terminal"
+	,"Current display attributes (set with number or string value)"
+	,"Set to <i>true</i> if the terminal cursor is already at the top of the screen - <small>READ ONLY</small>"
+	,"Number of remote terminal screen rows (in lines)"
+	,"Number of remote terminal screen columns (in character cells)"
+	,"Current tab stop interval (tab size), in columns"
+	,"Bit-field of automatically detected terminal settings "
 		"(see <tt>USER_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
-	,"terminal type description, possibly supplied by client (e.g. 'ANSI')"
-	,"terminal type (i.e. 'ANSI', 'RIP', 'PETSCII', or 'DUMB')"
-	,"terminal character set (i.e. 'UTF-8', 'CP437', 'CBM-ASCII', or 'US-ASCII')"
-	,"detected CTerm (SyncTERM) version as an integer > 1000 where major version is cterm_version / 1000 and minor version is cterm_version % 1000"
-	,"number of seconds before displaying warning (Are you really there?) due to user/keyboard inactivity"
-	,"number of seconds before disconnection due to user/keyboard inactivity"
-	,"user/keyboard inactivity timeout reference value (time_t format)"
-	,"number of low time-left (5 or fewer minutes remaining) warnings displayed to user"
-	,"input/output has been aborted"
-	,"remote output can be asynchronously aborted with Ctrl-C"
-	,"current Telnet mode bit-field (see <tt>TELNET_MODE_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
-	,"word-wrap buffer (used by getstr) - <small>READ ONLY</small>"
-	,"current yes/no question (set by yesno and noyes)"
-	,"cursor position offset for use with <tt>getstr(K_USEOFFSET)</tt>"
-	,"control key pass-through bit-mask, set bits represent control key combinations "
+	,"Terminal type description, possibly supplied by client (e.g. 'ANSI')"
+	,"Terminal type (i.e. 'ANSI', 'RIP', 'PETSCII', or 'DUMB')"
+	,"Terminal character set (i.e. 'UTF-8', 'CP437', 'CBM-ASCII', or 'US-ASCII')"
+	,"Detected CTerm (SyncTERM) version as an integer > 1000 where major version is cterm_version / 1000 and minor version is cterm_version % 1000"
+	,"Number of seconds before displaying warning (Are you really there?) due to user/keyboard inactivity"
+	,"Number of seconds before disconnection due to user/keyboard inactivity"
+	,"User/keyboard inactivity timeout reference value (time_t format)"
+	,"Number of low time-left (5 or fewer minutes remaining) warnings displayed to user"
+	,"Input/output has been aborted"
+	,"Remote output can be asynchronously aborted with Ctrl-C"
+	,"Current Telnet mode bit-field (see <tt>TELNET_MODE_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
+	,"Word-wrap buffer (used by getstr) - <small>READ ONLY</small>"
+	,"Current yes/no question (set by yesno and noyes)"
+	,"Cursor position offset for use with <tt>getstr(K_USEOFFSET)</tt>"
+	,"Control key pass-through bit-mask, set bits represent control key combinations "
 		"<i>not</i> handled by <tt>inkey()</tt> method "
 		"This may optionally be specified as a string of characters. "
 		"The format of this string is [+-][@-_]. If neither plus nor minus is "
@@ -434,13 +434,13 @@ static const char* con_prop_desc[] = {
 		"added to the set, and a - indicates they should be removed. "
 		"ex: <tt>console.ctrlkey_passthru=\"-UP+AB\"</tt> will clear CTRL-U and "
 		"CTRL-P and set CTRL-A and CTRL-B."
-	,"number of bytes currently in the input buffer (from the remote client) - <small>READ ONLY</small>"
-	,"number of bytes available in the input buffer	- <small>READ ONLY</small>"
-	,"number of bytes currently in the output buffer (from the local server) - <small>READ ONLY</small>"
-	,"number of bytes available in the output buffer - <small>READ ONLY</small>"
-	,"emulated serial data output rate, in bits-per-second (0 = unlimited)"
-	,"number of characters current in the keyboard input buffer (from <tt>ungetstr</tt>) - <small>READ ONLY</small>"
-	,"number of characters spaces available in the keyboard input buffer - <small>READ ONLY</small>"
+	,"Number of bytes currently in the input buffer (from the remote client) - <small>READ ONLY</small>"
+	,"Number of bytes available in the input buffer	- <small>READ ONLY</small>"
+	,"Number of bytes currently in the output buffer (from the local server) - <small>READ ONLY</small>"
+	,"Number of bytes available in the output buffer - <small>READ ONLY</small>"
+	,"Emulated serial data output rate, in bits-per-second (0 = unlimited)"
+	,"Number of characters current in the keyboard input buffer (from <tt>ungetstr</tt>) - <small>READ ONLY</small>"
+	,"Number of characters spaces available in the keyboard input buffer - <small>READ ONLY</small>"
 	,NULL
 };
 #endif
@@ -2343,38 +2343,38 @@ js_flush(JSContext *cx, uintN argc, jsval *arglist)
 
 static jsSyncMethodSpec js_console_functions[] = {
 	{"inkey",			js_inkey,			0, JSTYPE_STRING,	JSDOCSTR("[mode=<tt>K_NONE</tt>] [,timeout=<tt>0</tt>]")
-	,JSDOCSTR("get a single key with optional <i>timeout</i> in milliseconds (defaults to 0, for no wait).<br>"
+	,JSDOCSTR("Get a single key with optional <i>timeout</i> in milliseconds (defaults to 0, for no wait).<br>"
 		"Returns an empty string (or <tt>null</tt> when the <tt>K_NUL</tt> mode flag is used) if there is no input (e.g. timeout occurs).<br>"
 		"See <tt>K_*</tt> in <tt>sbbsdefs.js</tt> for <i>mode</i> flags.")
 	,311
 	},
 	{"getkey",			js_getkey,			0, JSTYPE_STRING,	JSDOCSTR("[mode=<tt>K_NONE</tt>]")
-	,JSDOCSTR("get a single key, with wait.<br>"
+	,JSDOCSTR("Get a single key, with wait.<br>"
 		"See <tt>K_*</tt> in <tt>sbbsdefs.js</tt> for <i>mode</i> flags.")
 	,310
 	},
 	{"getstr",			js_getstr,			0, JSTYPE_STRING,	JSDOCSTR("[string] [,maxlen=<tt>128</tt>] [,mode=<tt>K_NONE</tt>] [,history[]]")
-	,JSDOCSTR("get a text string from the user.<br>"
+	,JSDOCSTR("Get a text string from the user.<br>"
 		"See <tt>K_*</tt> in <tt>sbbsdefs.js</tt> for <i>mode</i> flags.<br>"
 		"<i>history[]</i>, added in v3.17, allows a command history (string array) to be recalled using the up/down arrow keys."
 		)
 	,310
 	},
 	{"getnum",			js_getnum,			0, JSTYPE_NUMBER,	JSDOCSTR("[maxnum[, default]]")
-	,JSDOCSTR("get a number between 1 and <i>maxnum</i> from the user with a default value of <i>default</i>")
+	,JSDOCSTR("Get a number between 1 and <i>maxnum</i> from the user with a default value of <i>default</i>")
 	,310
 	},
 	{"getkeys",			js_getkeys,			1, JSTYPE_NUMBER,	JSDOCSTR("[keys] [,maxnum] [,mode=<tt>K_UPPER</tt>]")
-	,JSDOCSTR("get one key from of a list of valid command <i>keys</i> (any key, if not specified), "
+	,JSDOCSTR("Get one key from of a list of valid command <i>keys</i> (any key, if not specified), "
 		"or a number between 1 and <i>maxnum</i>")
 	,310
 	},
 	{"gettemplate",		js_gettemplate,		1, JSTYPE_STRING,	JSDOCSTR("format [,string] [,mode=<tt>0</tt>]")
-	,JSDOCSTR("get an input string based on specified template")
+	,JSDOCSTR("Get an input string based on specified template")
 	,310
 	},
 	{"ungetstr",		js_ungetstr,		1, JSTYPE_VOID,		JSDOCSTR("keys")
-	,JSDOCSTR("put one or more characters in the keyboard input buffer")
+	,JSDOCSTR("Put one or more characters in the keyboard input buffer")
 	,310
 	},
 	{"yesno",			js_yesno,			2, JSTYPE_BOOLEAN,	JSDOCSTR("question [,mode = P_NONE]")
@@ -2386,106 +2386,106 @@ static jsSyncMethodSpec js_console_functions[] = {
 	,310
 	},
 	{"mnemonics",		js_mnemonics,		1, JSTYPE_VOID,		JSDOCSTR("text")
-	,JSDOCSTR("print a mnemonics string, command keys highlighted with tilde (~) characters")
+	,JSDOCSTR("Print a mnemonics string, command keys highlighted with tilde (~) characters")
 	,310
 	},
 	{"clear",           js_clear,			0, JSTYPE_VOID,		JSDOCSTR("[attribute] [,autopause=<tt>true</tt>]")
-	,JSDOCSTR("clear screen and home cursor, "
+	,JSDOCSTR("Clear screen and home cursor, "
 		"optionally (in v3.13b+) setting current attribute first")
 	,310
 	},
 	{"home",            js_cursor_home,		0, JSTYPE_VOID,		JSDOCSTR("")
-	,JSDOCSTR("send cursor to home position (x,y:1,1)")
+	,JSDOCSTR("Send cursor to home position (x,y:1,1)")
 	,311
 	},
 	{"clearline",       js_clearline,		0, JSTYPE_VOID,		JSDOCSTR("[attribute]")
-	,JSDOCSTR("clear current line, "
+	,JSDOCSTR("Clear current line, "
 		"optionally (in v3.13b+) setting current attribute first")
 	,310
 	},
 	{"cleartoeol",      js_cleartoeol,		0, JSTYPE_VOID,		JSDOCSTR("[attribute]")
-	,JSDOCSTR("clear to end-of-line, "
+	,JSDOCSTR("Clear to end-of-line, "
 		"optionally (in v3.13b+) setting current attribute first")
 	,311
 	},
 	{"crlf",            js_crlf,			0, JSTYPE_VOID,		JSDOCSTR("[count=<tt>1</tt>]")
-	,JSDOCSTR("output <i>count</i> number of carriage-return/line-feed pairs (new-lines)")
+	,JSDOCSTR("Output <i>count</i> number of carriage-return/line-feed pairs (new-lines)")
 	,310
 	},
 	{"pause",			js_pause,			0, JSTYPE_BOOLEAN,	JSDOCSTR("[set_abort=true]")
-	,JSDOCSTR("display pause prompt and wait for key hit, returns <i>false</i> if user responded with Quit/Abort key.<br>"
+	,JSDOCSTR("Display pause prompt and wait for key hit, returns <i>false</i> if user responded with Quit/Abort key.<br>"
 		"Passing <tt>false</tt> for the <i>set_abort</i> argument will prevent the ''console.aborted'' flag from being set by this method.")
 	,310
 	},
 	{"beep",			js_beep,			1, JSTYPE_VOID,		JSDOCSTR("[count=<tt>1</tt>]")
-	,JSDOCSTR("beep for <i>count</i> number of times (default count is 1)")
+	,JSDOCSTR("Beep for <i>count</i> number of times (default count is 1)")
 	,311
 	},
 	{"print",			js_print,			1, JSTYPE_VOID,		JSDOCSTR("[value [,value][...]] or [string [,mode=<tt>P_NONE</tt>]]")
-	,JSDOCSTR("display one or more values as strings (supports Ctrl-A codes, Telnet-escaping, auto-screen pausing, etc.).<br>"
+	,JSDOCSTR("Display one or more values as strings (supports Ctrl-A codes, Telnet-escaping, auto-screen pausing, etc.).<br>"
 		"Supports a limited set of <tt>P_*</tt> flags, e.g. <tt>P_PETSCII</tt> and <tt>P_UTF8</tt>."
 	)
 	,310
 	},
 	{"write",			js_write,			1, JSTYPE_VOID,		JSDOCSTR("value [,value]")
-	,JSDOCSTR("display one or more values as raw strings (may include NULs)")
+	,JSDOCSTR("Display one or more values as raw strings (may include NULs)")
 	,310
 	},
 	{"writeln",			js_writeln,			1, JSTYPE_VOID,		JSDOCSTR("value [,value]")
-	,JSDOCSTR("display one or more values as raw strings followed by a single carriage-return/line-feed pair (new-line)")
+	,JSDOCSTR("Display one or more values as raw strings followed by a single carriage-return/line-feed pair (new-line)")
 	,315
 	},
 	{"putmsg",			js_putmsg,			1, JSTYPE_VOID,		JSDOCSTR("text [,mode=<tt>P_NONE</tt>] [,orig_columns=0] [,object scope]")
-	,JSDOCSTR("display message text (Ctrl-A codes, @-codes, pipe codes, etc.).<br> "
+	,JSDOCSTR("Display message text (Ctrl-A codes, @-codes, pipe codes, etc.).<br> "
 		"See <tt>P_*</tt> in <tt>sbbsdefs.js</tt> for <i>mode</i> flags.<br>"
 		"When <tt>P_WORDWRAP</tt> mode flag is specified, <i>orig_columns</i> specifies the original text column width, if known.<br>"
 		"When <i>scope</i> is specified, <tt>@JS:property@</tt> codes will expand the referenced property names.")
 	,310
 	},
 	{"center",			js_center,			1, JSTYPE_VOID,		JSDOCSTR("text [,width]")
-	,JSDOCSTR("display a string centered on the screen, with an optionally-specified screen width (in columns)")
+	,JSDOCSTR("Display a string centered on the screen, with an optionally-specified screen width (in columns)")
 	,310
 	},
 	{"wide",			js_wide,			1, JSTYPE_VOID,		JSDOCSTR("text")
-	,JSDOCSTR("display a string double-wide on the screen (sending \"fullwidth\" Unicode characters when possible)")
+	,JSDOCSTR("Display a string double-wide on the screen (sending \"fullwidth\" Unicode characters when possible)")
 	,31702
 	},
 	{"progress",		js_progress,		1, JSTYPE_VOID,		JSDOCSTR("text, count, total [,interval = 500]")
-	,JSDOCSTR("display a progress indication bar, updated every <i>interval</i> milliseconds")
+	,JSDOCSTR("Display a progress indication bar, updated every <i>interval</i> milliseconds")
 	,31902
 	},
 	{"strlen",			js_strlen,			1, JSTYPE_NUMBER,	JSDOCSTR("text [,mode=<tt>P_NONE</tt>]")
-	,JSDOCSTR("returns the printed-length (number of columns) of the specified <i>text</i>, accounting for Ctrl-A codes")
+	,JSDOCSTR("Returns the printed-length (number of columns) of the specified <i>text</i>, accounting for Ctrl-A codes")
 	,310
 	},
 	{"printfile",		js_printfile,		1, JSTYPE_BOOLEAN,		JSDOCSTR("filename [,mode=<tt>P_NONE</tt>] [,orig_columns=0] [,object scope]")
-	,JSDOCSTR("print a message text file with optional mode.<br>"
+	,JSDOCSTR("Print a message text file with optional mode.<br>"
 		"When <tt>P_WORDWRAP</tt> mode flag is specified, <i>orig_columns</i> specifies the original text column width, if known.<br>"
 		"When <i>scope</i> is specified, <tt>@JS:property@</tt> codes will expand the referenced property names.")
 	,310
 	},
 	{"printtail",		js_printtail,		2, JSTYPE_BOOLEAN,		JSDOCSTR("filename, lines [,mode=<tt>P_NONE</tt>] [,orig_columns=0] [,object scope]")
-	,JSDOCSTR("print the last <i>n</i> lines of file with optional mode, original column width, and scope.")
+	,JSDOCSTR("Print the last <i>n</i> lines of file with optional mode, original column width, and scope.")
 	,310
 	},
 	{"editfile",		js_editfile,		1, JSTYPE_BOOLEAN,		JSDOCSTR("filename")
-	,JSDOCSTR("edit/create a text file using the user's preferred message editor")
+	,JSDOCSTR("Edit/create a text file using the user's preferred message editor")
 	,310
 	},
 	{"uselect",			js_uselect,			0, JSTYPE_NUMBER,	JSDOCSTR("[number, title, item] [,ars]")
-	,JSDOCSTR("user selection menu, call for each item, then with no args to display select menu")
+	,JSDOCSTR("User selection menu, call for each item, then with no args to display select menu")
 	,312
 	},
 	{"saveline",		js_saveline,		0, JSTYPE_BOOLEAN,	JSDOCSTR("")
-	,JSDOCSTR("push the current console line of text and attributes to a (local) LIFO list of //saved lines//")
+	,JSDOCSTR("Push the current console line of text and attributes to a (local) LIFO list of //saved lines//")
 	,310
 	},
 	{"restoreline",		js_restoreline,		0, JSTYPE_BOOLEAN,	JSDOCSTR("")
-	,JSDOCSTR("pop the most recently //saved line// of text and attributes and display it on the remote console")
+	,JSDOCSTR("Pop the most recently //saved line// of text and attributes and display it on the remote console")
 	,310
 	},
 	{"ansi",			js_ansi,			1, JSTYPE_STRING,	JSDOCSTR("attribute [,current_attribute]")
-	,JSDOCSTR("returns ANSI sequence required to generate specified terminal <i>attribute</i> "
+	,JSDOCSTR("Returns ANSI sequence required to generate specified terminal <i>attribute</i> "
 	"(e.g. <tt>YELLOW|HIGH|BG_BLUE</tt>), "
 	"if <i>current_attribute</i> is specified, an optimized ANSI sequence may be returned")
 	,310
@@ -2493,130 +2493,130 @@ static jsSyncMethodSpec js_console_functions[] = {
 	{"ansi_save",		js_pushxy,			0, JSTYPE_ALIAS	},
 	{"ansi_pushxy",		js_pushxy,			0, JSTYPE_ALIAS	},
 	{"pushxy",			js_pushxy,			0, JSTYPE_VOID,		JSDOCSTR("")
-	,JSDOCSTR("save the current cursor position (x and y coordinates) in the remote terminal")
+	,JSDOCSTR("Save the current cursor position (x and y coordinates) in the remote terminal")
 	,311
 	},
 	{"ansi_restore",	js_popxy,			0, JSTYPE_ALIAS },
 	{"ansi_popxy",		js_popxy,			0, JSTYPE_ALIAS },
 	{"popxy",			js_popxy,			0, JSTYPE_VOID,		JSDOCSTR("")
-	,JSDOCSTR("restore a saved cursor position to the remote terminal (requires terminal support, e.g. ANSI)")
+	,JSDOCSTR("Restore a saved cursor position to the remote terminal (requires terminal support, e.g. ANSI)")
 	,311
 	},
 	{"ansi_gotoxy",		js_gotoxy,			1, JSTYPE_ALIAS },
 	{"gotoxy",			js_gotoxy,			1, JSTYPE_VOID,		JSDOCSTR("[x,y] or [object { x,y }]")
-	,JSDOCSTR("move cursor to a specific screen coordinate (ANSI or PETSCII, 1-based values), "
+	,JSDOCSTR("Move cursor to a specific screen coordinate (ANSI or PETSCII, 1-based values), "
 	"arguments can be separate x and y coordinates or an object with x and y properties "
 	"(like that returned from <tt>console.getxy()</tt>)")
 	,311
 	},
 	{"ansi_up",			js_cursor_up,		0, JSTYPE_ALIAS },
 	{"up",				js_cursor_up,		0, JSTYPE_VOID,		JSDOCSTR("[rows=<tt>1</tt>]")
-	,JSDOCSTR("move cursor up one or more rows")
+	,JSDOCSTR("Move cursor up one or more rows")
 	,311
 	},
 	{"ansi_down",		js_cursor_down,		0, JSTYPE_ALIAS },
 	{"down",			js_cursor_down,		0, JSTYPE_VOID,		JSDOCSTR("[rows=<tt>1</tt>]")
-	,JSDOCSTR("move cursor down one or more rows")
+	,JSDOCSTR("Move cursor down one or more rows")
 	,311
 	},
 	{"ansi_right",		js_cursor_right,	0, JSTYPE_ALIAS },
 	{"right",			js_cursor_right,	0, JSTYPE_VOID,		JSDOCSTR("[columns=<tt>1</tt>]")
-	,JSDOCSTR("move cursor right one or more columns")
+	,JSDOCSTR("Move cursor right one or more columns")
 	,311
 	},
 	{"ansi_left",		js_cursor_left,		0, JSTYPE_ALIAS },
 	{"left",			js_cursor_left,		0, JSTYPE_VOID,		JSDOCSTR("[columns=<tt>1</tt>]")
-	,JSDOCSTR("move cursor left one or more columns")
+	,JSDOCSTR("Move cursor left one or more columns")
 	,311
 	},
 	{"ansi_getlines",	js_getlines,		0, JSTYPE_ALIAS },
 	{"getlines",		js_getlines,		0, JSTYPE_ALIAS },
 	{"getdimensions",	js_getlines,		0, JSTYPE_VOID,		JSDOCSTR("")
-	,JSDOCSTR("query the number of rows and columns on the remote terminal")
+	,JSDOCSTR("Query the number of rows and columns on the remote terminal")
 	,311
 	},
 	{"ansi_getxy",		js_getxy,			0, JSTYPE_ALIAS },
 	{"getxy",			js_getxy,			0, JSTYPE_OBJECT,	JSDOCSTR("")
-	,JSDOCSTR("query the current cursor position on the remote (ANSI) terminal "
+	,JSDOCSTR("Query the current cursor position on the remote (ANSI) terminal "
 		"and returns the coordinates as an object (with <tt>x</tt> and <tt>y</tt> properties) or <tt>false</tt> on failure")
 	,311
 	},
 	{"lock_input",		js_lock_input,		1, JSTYPE_VOID,		JSDOCSTR("[lock=<tt>true</tt>]")
-	,JSDOCSTR("lock the user input thread (allowing direct client socket access)")
+	,JSDOCSTR("Lock the user input thread (allowing direct client socket access)")
 	,310
 	},
 	{"telnet_cmd",		js_telnet_cmd,		3, JSTYPE_BOOLEAN,		JSDOCSTR("command [,option=<tt>0</tt>] [,timeout=<tt>0</tt>]")
-	,JSDOCSTR("send Telnet command (with optional command option) to remote client"
+	,JSDOCSTR("Send Telnet command (with optional command option) to remote client"
 		", if the optional timeout is specified (in milliseconds, added in v3.17), then an acknowledgment will be expected and"
 		" the return value will indicate whether or not one was received")
 	,317
 	},
 	{"handle_ctrlkey",	js_handle_ctrlkey,	1, JSTYPE_BOOLEAN,	JSDOCSTR("key [,mode=<tt>K_NONE</tt>]")
-	,JSDOCSTR("call internal control key handler for specified control key, returns <tt>true</tt> if handled")
+	,JSDOCSTR("Call internal control key handler for specified control key, returns <tt>true</tt> if handled")
 	,311
 	},
 	{"term_supports",	js_term_supports,	1, JSTYPE_BOOLEAN,	JSDOCSTR("[terminal_flags]")
-	,JSDOCSTR("either returns <i>bool</i>, indicating whether or not the current user/client "
+	,JSDOCSTR("Either returns <i>bool</i>, indicating whether or not the current user/client "
 		"supports all the specified <i>terminal_flags</i>, or returns the current user/client's "
 		"<i>terminal_flags</i> (numeric bit-field) if no <i>terminal_flags</i> were specified")
 	,314
 	},
 	{"term_updated",	js_term_updated,	1, JSTYPE_BOOLEAN,	JSDOCSTR("")
-	,JSDOCSTR("update the node's <tt>terminal.ini</tt> file to match the current terminal settings")
+	,JSDOCSTR("Update the node's <tt>terminal.ini</tt> file to match the current terminal settings")
 	,31802
 	},
 	{"backspace",		js_backspace,		0, JSTYPE_VOID,		JSDOCSTR("[count=<tt>1</tt>]")
-	,JSDOCSTR("send a destructive backspace sequence")
+	,JSDOCSTR("Send a destructive backspace sequence")
 	,315
 	},
 	{"creturn",			js_creturn,			0, JSTYPE_VOID,		JSDOCSTR("[count=<tt>1</tt>]")
-	,JSDOCSTR("send a carriage return sequence")
+	,JSDOCSTR("Send a carriage return sequence")
 	,31700
 	},
 	{"clearkeybuffer",	js_clearkeybuf,		0, JSTYPE_VOID,		JSDOCSTR("")
-	,JSDOCSTR("clear keyboard input buffer")
+	,JSDOCSTR("Clear keyboard input buffer")
 	,315
 	},
 	{"getbyte",			js_getbyte,			1, JSTYPE_NUMBER,	JSDOCSTR("[timeout=<tt>0</tt>]")
-	,JSDOCSTR("returns an unprocessed input byte from the remote terminal "
+	,JSDOCSTR("Returns an unprocessed input byte from the remote terminal "
 		"with optional <i>timeout</i> in milliseconds (defaults to 0, for no wait), "
 		"returns <i>null</i> on failure (timeout)")
 	,31700
 	},
 	{"putbyte",			js_putbyte,			1, JSTYPE_BOOLEAN,	JSDOCSTR("value")
-	,JSDOCSTR("sends an unprocessed byte value to the remote terminal")
+	,JSDOCSTR("Sends an unprocessed byte value to the remote terminal")
 	,31700
 	},
 	{"add_hotspot",		js_add_hotspot,		1,	JSTYPE_VOID,	JSDOCSTR("cmd [,bool hungry=<tt>true</tt>] [,min_x] [,max_x] [,y]")
-		,JSDOCSTR("adds a mouse hot-spot (a clickable screen area that generates keyboard input)")
+		,JSDOCSTR("Adds a mouse hot-spot (a clickable screen area that generates keyboard input)")
 		,31800
 		},
 	{"clear_hotspots",	js_clear_hotspots,		0,	JSTYPE_VOID,	JSDOCSTR("")
-		,JSDOCSTR("clear all current mouse hot-spots")
+		,JSDOCSTR("Clear all current mouse hot-spots")
 		,31800
 		},
 	{"scroll_hotspots",	js_scroll_hotspots,		0,	JSTYPE_VOID,	JSDOCSTR("[rows=1]")
-		,JSDOCSTR("scroll all current mouse hot-spots by the specific number of rows")
+		,JSDOCSTR("Scroll all current mouse hot-spots by the specific number of rows")
 		,31800
 		},
 	{"on",			js_on,				2,	JSTYPE_NUMBER,	JSDOCSTR("type, callback")
-		,JSDOCSTR("calls callback whenever the condition type specifies is possible.  Currently, only 'read' is supported for type.  Returns an id suitable for use with clearOn")
+		,JSDOCSTR("Calls callback whenever the condition type specifies is possible.  Currently, only 'read' is supported for type.  Returns an id suitable for use with clearOn")
 		,31900
 		},
 	{"once",		js_once,			2,	JSTYPE_NUMBER,	JSDOCSTR("type, callback")
-		,JSDOCSTR("calls callback the first time the condition type specifies is possible.  Currently, only 'read' is supported for type.  Returns an id suitable for use with clearOnce")
+		,JSDOCSTR("Calls callback the first time the condition type specifies is possible.  Currently, only 'read' is supported for type.  Returns an id suitable for use with clearOnce")
 		,31900
 		},
 	{"clearOn",		js_clearOn,			2,	JSTYPE_VOID,	JSDOCSTR("type, id")
-		,JSDOCSTR("removes a callback installed by on")
+		,JSDOCSTR("Removes a callback installed by on")
 		,31900
 		},
 	{"clearOnce",		js_clearOnce,			2,	JSTYPE_VOID,	JSDOCSTR("type, id")
-		,JSDOCSTR("removes a callback installed by once")
+		,JSDOCSTR("Removes a callback installed by once")
 		,31900
 		},
 	{"flush",		js_flush,			0,	JSTYPE_VOID,	JSDOCSTR("")
-		,JSDOCSTR("flushes the output buffer")
+		,JSDOCSTR("Flushes the output buffer")
 		,31902
 		},
 	{0}
diff --git a/src/sbbs3/js_file.c b/src/sbbs3/js_file.c
index 59410a530b3c48c02a640d09f13a3176f09703db..2fdfff4129b50746b4280bea12635ad59eaec96c 100644
--- a/src/sbbs3/js_file.c
+++ b/src/sbbs3/js_file.c
@@ -2815,45 +2815,44 @@ static jsSyncPropertySpec js_file_properties[] = {
 
 #ifdef BUILD_JSDOCS
 static const char* file_prop_desc[] = {
-	 "filename specified in constructor - <small>READ ONLY</small>"
-	,"mode string specified in <i>open</i> call - <small>READ ONLY</small>"
+	 "Filename specified in constructor - <small>READ ONLY</small>"
+	,"Mode string specified in <i>open</i> call - <small>READ ONLY</small>"
 	,"<i>true</i> if the file is open or exists (case-insensitive) - <small>READ ONLY</small>"
 	,"<i>true</i> if the file has been opened successfully - <small>READ ONLY</small>"
 	,"<i>true</i> if the current file position is at the <i>end of file</i> - <small>READ ONLY</small>"
-	,"the last occurred error value (use <i>clear_error</i> to clear) - <small>READ ONLY</small>"
-	,"the open file descriptor (advanced use only) - <small>READ ONLY</small>"
-	,"end-of-text character (advanced use only), if non-zero used by <i>read</i>, <i>readln</i>, and <i>write</i>"
-	,"set to <i>true</i> to enable debug log output"
-	,"the current file position (offset in bytes), change value to seek within file"
-	,"last modified date/time (in time_t format)"
-	,"the current length of the file (in bytes)"
-	,"file type/mode flags (i.e. <tt>struct stat.st_mode</tt> value, compatible with <tt>file_chmod()</tt>)"
-	,"set to <i>true</i> if binary data is to be written and read in Network Byte Order (big end first)"
-	,"set to <i>true</i> to enable automatic ROT13 translation of text"
-	,"set to <i>true</i> to enable automatic Unix-to-Unix encode and decode on <tt>read</tt> and <tt>write</tt> calls"
-	,"set to <i>true</i> to enable automatic yEnc encode and decode on <tt>read</tt> and <tt>write</tt> calls"
-	,"set to <i>true</i> to enable automatic Base64 encode and decode on <tt>read</tt> and <tt>write</tt> calls"
-	,"calculated 16-bit CRC of file contents - <small>READ ONLY</small>"
-	,"calculated 32-bit CRC of file contents - <small>READ ONLY</small>"
-	,"calculated 32-bit checksum of file contents - <small>READ ONLY</small>"
-	,"calculated 128-bit MD5 digest of file contents as hexadecimal string - <small>READ ONLY</small>"
-	,"calculated 128-bit MD5 digest of file contents as base64-encoded string - <small>READ ONLY</small>"
-	,"calculated 160-bit SHA1 digest of file contents as hexadecimal string - <small>READ ONLY</small>"
-	,"calculated 160-bit SHA1 digest of file contents as base64-encoded string - <small>READ ONLY</small>"
-	,"ini style: minimum key length (for left-justified white-space padded keys)"
-	,"ini style: key prefix (e.g. '\\t', null = default prefix)"
-	,"ini style: section separator (e.g. '\\n', null = default separator)"
-	,"ini style: value separator (e.g. ' = ', null = default separator)"
-	,"ini style: bit separator (e.g. ' | ', null = default separator)"
-	,"ini style: literal separator (null = default separator)"
+	,"The last occurred error value (use <i>clear_error</i> to clear) - <small>READ ONLY</small>"
+	,"The open file descriptor (advanced use only) - <small>READ ONLY</small>"
+	,"End-of-text character (advanced use only), if non-zero used by <i>read</i>, <i>readln</i>, and <i>write</i>"
+	,"Set to <i>true</i> to enable debug log output"
+	,"The current file position (offset in bytes), change value to seek within file"
+	,"Last modified date/time (in time_t format)"
+	,"The current length of the file (in bytes)"
+	,"File type/mode flags (i.e. <tt>struct stat.st_mode</tt> value, compatible with <tt>file_chmod()</tt>)"
+	,"Set to <i>true</i> if binary data is to be written and read in Network Byte Order (big end first)"
+	,"Set to <i>true</i> to enable automatic ROT13 translation of text"
+	,"Set to <i>true</i> to enable automatic Unix-to-Unix encode and decode on <tt>read</tt> and <tt>write</tt> calls"
+	,"Set to <i>true</i> to enable automatic yEnc encode and decode on <tt>read</tt> and <tt>write</tt> calls"
+	,"Set to <i>true</i> to enable automatic Base64 encode and decode on <tt>read</tt> and <tt>write</tt> calls"
+	,"Calculated 16-bit CRC of file contents - <small>READ ONLY</small>"
+	,"Calculated 32-bit CRC of file contents - <small>READ ONLY</small>"
+	,"Calculated 32-bit checksum of file contents - <small>READ ONLY</small>"
+	,"Calculated 128-bit MD5 digest of file contents as hexadecimal string - <small>READ ONLY</small>"
+	,"Calculated 128-bit MD5 digest of file contents as base64-encoded string - <small>READ ONLY</small>"
+	,"Calculated 160-bit SHA1 digest of file contents as hexadecimal string - <small>READ ONLY</small>"
+	,"Calculated 160-bit SHA1 digest of file contents as base64-encoded string - <small>READ ONLY</small>"
+	,"Ini style: minimum key length (for left-justified white-space padded keys)"
+	,"Ini style: key prefix (e.g. '\\t', null = default prefix)"
+	,"Ini style: section separator (e.g. '\\n', null = default separator)"
+	,"Ini style: value separator (e.g. ' = ', null = default separator)"
+	,"Ini style: bit separator (e.g. ' | ', null = default separator)"
+	,"Ini style: literal separator (null = default separator)"
 	,NULL
 };
 #endif
 
-
 static jsSyncMethodSpec js_file_functions[] = {
 	{"open",			js_open,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("[mode=<tt>\"w+\"</tt>] [,shareable=<tt>false</tt>] [,buffer_length]")
-	,JSDOCSTR("open file, <i>shareable</i> defaults to <i>false</i>, <i>buffer_length</i> defaults to 2048 bytes, "
+	,JSDOCSTR("Open file, <i>shareable</i> defaults to <i>false</i>, <i>buffer_length</i> defaults to 2048 bytes, "
 		"mode (default: <tt>'w+'</tt>) specifies the type of access requested for the file, as follows:<br>"
 		"<tt>r&nbsp</tt> open for reading; if the file does not exist or cannot be found, the open call fails<br>"
 		"<tt>w&nbsp</tt> open an empty file for writing; if the given file exists, its contents are destroyed<br>"
@@ -2886,7 +2885,7 @@ static jsSyncMethodSpec js_file_functions[] = {
 	,310
 	},
 	{"popen",			js_popen,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("[mode=<tt>\"r+\"</tt>] [,buffer_length]")
-	,JSDOCSTR("open pipe to command, <i>buffer_length</i> defaults to 2048 bytes, "
+	,JSDOCSTR("Open pipe to command, <i>buffer_length</i> defaults to 2048 bytes, "
 		"mode (default: <tt>'r+'</tt>) specifies the type of access requested for the file, as follows:<br>"
 		"<tt>r&nbsp</tt> read the programs stdout;<br>"
 		"<tt>w&nbsp</tt> write to the programs stdin<br>"
@@ -2896,112 +2895,112 @@ static jsSyncMethodSpec js_file_functions[] = {
 	,315
 	},
 	{"close",			js_close,			0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("close file")
+	,JSDOCSTR("Close file")
 	,310
 	},
 	{"remove",			js_delete,			0,	JSTYPE_BOOLEAN, JSDOCSTR("")
-	,JSDOCSTR("remove the file from the disk")
+	,JSDOCSTR("Remove the file from the disk")
 	,310
 	},
 	{"clearError",		js_clear_error,		0,	JSTYPE_ALIAS },
 	{"clear_error",		js_clear_error,		0,	JSTYPE_BOOLEAN, JSDOCSTR("")
-	,JSDOCSTR("clears the current error value (AKA clearError)")
+	,JSDOCSTR("Clears the current error value (AKA clearError)")
 	,310
 	},
 	{"flush",			js_flush,			0,	JSTYPE_BOOLEAN,	JSDOCSTR("")
-	,JSDOCSTR("flush/commit buffers to disk")
+	,JSDOCSTR("Flush/commit buffers to disk")
 	,310
 	},
 	{"rewind",			js_rewind,			0,	JSTYPE_BOOLEAN,	JSDOCSTR("")
-	,JSDOCSTR("repositions the file pointer (<i>position</i>) to the beginning of a file "
+	,JSDOCSTR("Repositions the file pointer (<i>position</i>) to the beginning of a file "
 		"and clears error and end-of-file indicators")
 	,311
 	},
 	{"truncate",		js_truncate,		0,	JSTYPE_BOOLEAN,	JSDOCSTR("[length=<tt>0</tt>]")
-	,JSDOCSTR("changes the file <i>length</i> (default: 0) and repositions the file pointer "
+	,JSDOCSTR("Changes the file <i>length</i> (default: 0) and repositions the file pointer "
 	"(<i>position</i>) to the new end-of-file")
 	,314
 	},
 	{"lock",			js_lock,			2,	JSTYPE_BOOLEAN,	JSDOCSTR("[offset=<tt>0</tt>] [,length=<i>file_length</i>-<i>offset</i>]")
-	,JSDOCSTR("lock file record for exclusive access (file must be opened <i>shareable</i>)")
+	,JSDOCSTR("Lock file record for exclusive access (file must be opened <i>shareable</i>)")
 	,310
 	},
 	{"unlock",			js_unlock,			2,	JSTYPE_BOOLEAN,	JSDOCSTR("[offset=<tt>0</tt>] [,length=<i>file_length</i>-<i>offset</i>]")
-	,JSDOCSTR("unlock file record for exclusive access")
+	,JSDOCSTR("Unlock file record for exclusive access")
 	,310
 	},
 	{"read",			js_read,			0,	JSTYPE_STRING,	JSDOCSTR("[maxlen=<i>file_length</i>-<i>file_position</i>]")
-	,JSDOCSTR("read a string from file (optionally unix-to-unix or base64 decoding in the process), "
+	,JSDOCSTR("Read a string from file (optionally unix-to-unix or base64 decoding in the process), "
 		"<i>maxlen</i> defaults to the current length of the file minus the current file position")
 	,310
 	},
 	{"readln",			js_readln,			0,	JSTYPE_STRING,	JSDOCSTR("[maxlen=<tt>512</tt>]")
-	,JSDOCSTR("read a line-feed terminated string, <i>maxlen</i> defaults to 512 characters. "
+	,JSDOCSTR("Read a line-feed terminated string, <i>maxlen</i> defaults to 512 characters. "
 		"Returns <i>null</i> upon end of file.")
 	,310
 	},
 	{"readBin",			js_readbin,			0,	JSTYPE_NUMBER,	JSDOCSTR("[bytes=<tt>4</tt> [,count=<tt>1</tt>]")
-	,JSDOCSTR("read one or more binary integers from the file, default number of <i>bytes</i> is 4 (32-bits). "
+	,JSDOCSTR("Read one or more binary integers from the file, default number of <i>bytes</i> is 4 (32-bits). "
 			  "if count is not equal to 1, an array is returned (even if no integers were read)")
 	,310
 	},
 	{"readAll",			js_readall,			0,	JSTYPE_ARRAY,	JSDOCSTR("[maxlen=<tt>512</tt>]")
-	,JSDOCSTR("read all lines into an array of strings, <i>maxlen</i> defaults to 512 characters")
+	,JSDOCSTR("Read all lines into an array of strings, <i>maxlen</i> defaults to 512 characters")
 	,310
 	},
 	{"raw_read",		js_raw_read,		0,	JSTYPE_STRING,	JSDOCSTR("[maxlen=<i>1</i>]")
-	,JSDOCSTR("read a string from underlying file descriptor. "
+	,JSDOCSTR("Read a string from underlying file descriptor. "
 				"Undefined results when mixed with any other read/write methods except raw_write, including indirect ones. "
 				"<i>maxlen</i> defaults to one")
 	,317
 	},
 	{"raw_pollin",		js_raw_pollin,		0,	JSTYPE_BOOLEAN,	JSDOCSTR("[timeout]")
-	,JSDOCSTR("waits up to <i>timeout</i> milliseconds (or forever if timeout is not specified) for data to be available "
+	,JSDOCSTR("Waits up to <i>timeout</i> milliseconds (or forever if timeout is not specified) for data to be available "
 			"via raw_read().")
 	,317
 	},
 	{"write",			js_write,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("text [,length=<i>text_length</i>]")
-	,JSDOCSTR("write a string to the file (optionally unix-to-unix or base64 decoding in the process). "
+	,JSDOCSTR("Write a string to the file (optionally unix-to-unix or base64 decoding in the process). "
 		"If the specified <i>length</i> is longer than the <i>text</i>, the remaining length will be written as NUL bytes.")
 	,310
 	},
 	{"writeln",			js_writeln,			0,	JSTYPE_BOOLEAN, JSDOCSTR("[text]")
-	,JSDOCSTR("write a new-line terminated string (a line of text) to the file")
+	,JSDOCSTR("Write a new-line terminated string (a line of text) to the file")
 	,310
 	},
 	{"writeBin",		js_writebin,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("value(s) [,bytes=<tt>4</tt>]")
-	,JSDOCSTR("write one or more binary integers to the file, default number of <i>bytes</i> is 4 (32-bits). "
+	,JSDOCSTR("Write one or more binary integers to the file, default number of <i>bytes</i> is 4 (32-bits). "
 			  "If value is an array, writes the entire array to the file.")
 	,310
 	},
 	{"writeAll",		js_writeall,		0,	JSTYPE_BOOLEAN,	JSDOCSTR("array lines")
-	,JSDOCSTR("write an array of new-line terminated strings (lines of text) to the file")
+	,JSDOCSTR("Write an array of new-line terminated strings (lines of text) to the file")
 	,310
 	},
 	{"raw_write",		js_raw_write,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("text")
-	,JSDOCSTR("write a string to the underlying file descriptor. "
+	,JSDOCSTR("Write a string to the underlying file descriptor. "
 				"Undefined results when mixed with any other read/write methods except raw_read, including indirect ones.")
 	,317
 	},
 	{"printf",			js_fprintf,			0,	JSTYPE_NUMBER,	JSDOCSTR("format [,args]")
-	,JSDOCSTR("write a formatted string to the file (ala fprintf) - "
+	,JSDOCSTR("Write a formatted string to the file (ala fprintf) - "
 		"<small>CAUTION: for experienced C programmers ONLY</small>")
 	,310
 	},
 	{"iniGetSections",	js_iniGetSections,	0,	JSTYPE_ARRAY,	JSDOCSTR("[prefix=<i>none</i>]")
-	,JSDOCSTR("parse all section names from a <tt>.ini</tt> file (format = '<tt>[section]</tt>') "
+	,JSDOCSTR("Parse all section names from a <tt>.ini</tt> file (format = '<tt>[section]</tt>') "
 		"and return the section names as an <i>array of strings</i>, "
 		"optionally, only those section names that begin with the specified <i>prefix</i>")
 	,311
 	},
 	{"iniGetKeys",		js_iniGetKeys,		1,	JSTYPE_ARRAY,	JSDOCSTR("[section=<i>root</i>]")
-	,JSDOCSTR("parse all key names from the specified <i>section</i> in a <tt>.ini</tt> file "
+	,JSDOCSTR("Parse all key names from the specified <i>section</i> in a <tt>.ini</tt> file "
 		"and return the key names as an <i>array of strings</i>. "
 		"if <i>section</i> is undefined, returns key names from the <i>root</i> section")
 	,311
 	},
 	{"iniGetValue",		js_iniGetValue,		3,	JSTYPE_UNDEF,	JSDOCSTR("section, key [,default=<i>none</i>]")
-	,JSDOCSTR("parse a key from a <tt>.ini</tt> file and return its value (format = '<tt>key = value</tt>'). "
+	,JSDOCSTR("Parse a key from a <tt>.ini</tt> file and return its value (format = '<tt>key = value</tt>'). "
 		"returns the specified <i>default</i> value if the key or value is missing or invalid. "
 		"to parse a key from the <i>root</i> section, pass <i>null</i> for <i>section</i>. "
 		"Returns a <i>bool</i>, <i>number</i>, <i>string</i>, or an <i>array of strings</i> "
@@ -3011,14 +3010,14 @@ static jsSyncMethodSpec js_file_functions[] = {
 	,311
 	},
 	{"iniSetValue",		js_iniSetValue,		3,	JSTYPE_BOOLEAN,	JSDOCSTR("section, key, [value=<i>none</i>]")
-	,JSDOCSTR("set the specified <i>key</i> to the specified <i>value</i> in the specified <i>section</i> "
+	,JSDOCSTR("Set the specified <i>key</i> to the specified <i>value</i> in the specified <i>section</i> "
 		"of a <tt>.ini</tt> file. "
 		"to set a key in the <i>root</i> section, pass <i>null</i> for <i>section</i>. ")
 	,312
 	},
 	{"iniGetObject",	js_iniGetObject,	1,	JSTYPE_OBJECT,	JSDOCSTR("[section=<i>root</i>] [,lowercase=<tt>false</tt>] "
 		"[,blanks=<tt>false</tt>]")
-	,JSDOCSTR("parse an entire section from a .ini file "
+	,JSDOCSTR("Parse an entire section from a .ini file "
 		"and return all of its keys (optionally lowercased) and values as properties of an object. "
 		"If <i>section</i> is <tt>null</tt> or <tt>undefined</tt>, returns keys and values from the <i>root</i> section. "
 		"If <i>blanks</i> is <tt>true</tt> then empty string (instead of <tt>undefined</tt>) values may included in the returned object."
@@ -3026,7 +3025,7 @@ static jsSyncMethodSpec js_file_functions[] = {
 	,311
 	},
 	{"iniSetObject",	js_iniSetObject,	2,	JSTYPE_BOOLEAN,	JSDOCSTR("section, object")
-	,JSDOCSTR("write all the properties of the specified <i>object</i> as separate <tt>key=value</tt> pairs "
+	,JSDOCSTR("Write all the properties of the specified <i>object</i> as separate <tt>key=value</tt> pairs "
 		"in the specified <i>section</i> of a <tt>.ini</tt> file. "
 		"to write an object in the <i>root</i> section, pass <i>null</i> for <i>section</i>. "
 		"<br><b>Note:</b> this method does not remove unreferenced keys from an existing section. "
@@ -3035,7 +3034,7 @@ static jsSyncMethodSpec js_file_functions[] = {
 	},
 	{"iniGetAllObjects",js_iniGetAllObjects,1,	JSTYPE_ARRAY,	JSDOCSTR("[name_property] [,prefix=<i>none</i>] [,lowercase=<tt>false</tt>] "
 		"[,blanks=<tt>false</tt>]")
-	,JSDOCSTR("parse all sections from a .ini file and return all (non-<i>root</i>) sections "
+	,JSDOCSTR("Parse all sections from a .ini file and return all (non-<i>root</i>) sections "
 		"in an array of objects with each section's keys (optionally lowercased) as properties of each object. "
 		"<i>name_property</i> is the name of the property to create to contain the section's name "
 		"(optionally lowercased, default is <tt>\"name\"</tt>), "
@@ -3046,24 +3045,24 @@ static jsSyncMethodSpec js_file_functions[] = {
 	,311
 	},
 	{"iniSetAllObjects",js_iniSetAllObjects,1,	JSTYPE_BOOLEAN,	JSDOCSTR("object array [,name_property=<tt>\"name\"</tt>]")
-	,JSDOCSTR("write an array of objects to a .ini file, each object in its own section named "
+	,JSDOCSTR("Write an array of objects to a .ini file, each object in its own section named "
 	"after the object's <i>name_property</i> (default: <tt>name</tt>)")
 	,312
 	},
 	{"iniRemoveKey",	js_iniRemoveKey,	2,	JSTYPE_BOOLEAN,	JSDOCSTR("section, key")
-	,JSDOCSTR("remove specified <i>key</i> from specified <i>section</i> in <tt>.ini</tt> file.")
+	,JSDOCSTR("Remove specified <i>key</i> from specified <i>section</i> in <tt>.ini</tt> file.")
 	,314
 	},
 	{"iniRemoveSection",js_iniRemoveSection,1,	JSTYPE_BOOLEAN,	JSDOCSTR("section")
-	,JSDOCSTR("remove specified <i>section</i> from <tt>.ini</tt> file.")
+	,JSDOCSTR("Remove specified <i>section</i> from <tt>.ini</tt> file.")
 	,314
 	},
 	{"iniRemoveSections",js_iniRemoveSections,1, JSTYPE_BOOLEAN,	JSDOCSTR("[prefix]")
-	,JSDOCSTR("remove all sections from <tt>.ini</tt> file, optionally only sections with the specified section name <i>prefix</i>.")
+	,JSDOCSTR("Remove all sections from <tt>.ini</tt> file, optionally only sections with the specified section name <i>prefix</i>.")
 	,32000
 	},
 	{"iniReadAll",		js_iniReadAll,		0,	JSTYPE_ARRAY,	JSDOCSTR("")
-	,JSDOCSTR("read entire <tt>.ini</tt> file into an array of string (with <tt>!include</tt>ed files).")
+	,JSDOCSTR("Read entire <tt>.ini</tt> file into an array of string (with <tt>!include</tt>ed files).")
 	,31802
 	},
 	{0}
diff --git a/src/sbbs3/js_file_area.c b/src/sbbs3/js_file_area.c
index 6904aa01fc2858918e07fb9b9e95e81dd2dbe2dd..54c6d99d8fde8f436c4aa3b1561330bdcfc4171c 100644
--- a/src/sbbs3/js_file_area.c
+++ b/src/sbbs3/js_file_area.c
@@ -25,63 +25,63 @@
 #ifdef BUILD_JSDOCS
 
 static char* file_area_prop_desc[] = {
-	 "minimum amount of available disk space (in bytes) required for user uploads to be allowed"
-	,"file area settings (bitfield) - see <tt>FM_*</tt> in <tt>sbbsdefs.js</tt> for details"
-	,"web file virtual path prefix <i>(introduced in v3.19c)</i>"
+	 "Minimum amount of available disk space (in bytes) required for user uploads to be allowed"
+	,"File area settings (bitfield) - see <tt>FM_*</tt> in <tt>sbbsdefs.js</tt> for details"
+	,"Web file virtual path prefix <i>(introduced in v3.19c)</i>"
 	,NULL
 };
 
 static char* lib_prop_desc[] = {
-	 "index into lib_list array (or -1 if not in array) <i>(introduced in v3.12)</i>"
-	,"unique number for this library"
-	,"name"
-	,"description"
-	,"access requirements"
-	,"virtual directory name (for FTP or HTTP access)"
-	,"user has sufficient access to this library's directories <i>(introduced in v3.18)</i>"
-	,"internal code prefix (for directories) <i>(introduced in v3.18c)</i>"
+	 "Index into lib_list array (or -1 if not in array) <i>(introduced in v3.12)</i>"
+	,"Unique number for this library"
+	,"Name"
+	,"Description"
+	,"Access requirements"
+	,"Virtual directory name (for FTP or HTTP access)"
+	,"User has sufficient access to this library's directories <i>(introduced in v3.18)</i>"
+	,"Internal code prefix (for directories) <i>(introduced in v3.18c)</i>"
 	,NULL
 };
 
 static char* dir_prop_desc[] = {
 
-	 "index into dir_list array (or -1 if not in array) <i>(introduced in v3.12)</i>"
-	,"unique number for this directory"
-	,"library index <i>(introduced in v3.12)</i>"
-	,"library number"
-	,"library name <i>(introduced in v3.12)</i>"
-	,"directory internal code"
-	,"directory name"
-	,"directory description"
-	,"directory area tag for file echoes <i>(introduced in v3.19)</i>"
-	,"directory file storage location"
-	,"directory access requirements"
-	,"directory upload requirements"
-	,"directory download requirements"
-	,"directory exemption requirements"
-	,"directory operator requirements"
-	,"allowed file extensions (comma delimited)"
-	,"upload semaphore file"
-	,"directory data storage location"
-	,"toggle options (bitfield)"
-	,"sequential (slow storage) device number"
-	,"sort order (see <tt>FileBase.SORT</tt> for valid values)"
-	,"configured maximum number of files"
-	,"configured maximum age (in days) of files before expiration"
-	,"percent of file size awarded uploader in credits upon file upload"
-	,"percent of file size awarded uploader in credits upon subsequent downloads"
-	,"virtual directory name (for FTP or HTTP access)"
-	,"virtual path (for FTP or HTTP access)"
-	,"number of files currently in this directory <i>(introduced in v3.18c)</i>"
-	,"timestamp of file base index of this directory <i>(introduced in v3.19)</i>"
-	,"user has sufficient access to view this directory (e.g. list files) <i>(introduced in v3.18)</i>"
-	,"user has sufficient access to upload files to this directory"
-	,"user has sufficient access to download files from this directory"
-	,"user is exempt from download credit costs (or the directory is configured for free downloads)"
-	,"user has operator access to this directory"
-	,"directory is for offline storage <i>(introduced in v3.14)</i>"
-	,"directory is for uploads only <i>(introduced in v3.14)</i>"
-	,"directory is for uploads to sysop only <i>(introduced in v3.14)</i>"
+	 "Index into dir_list array (or -1 if not in array) <i>(introduced in v3.12)</i>"
+	,"Unique number for this directory"
+	,"Library index <i>(introduced in v3.12)</i>"
+	,"Library number"
+	,"Library name <i>(introduced in v3.12)</i>"
+	,"Directory internal code"
+	,"Directory name"
+	,"Directory description"
+	,"Directory area tag for file echoes <i>(introduced in v3.19)</i>"
+	,"Directory file storage location"
+	,"Directory access requirements"
+	,"Directory upload requirements"
+	,"Directory download requirements"
+	,"Directory exemption requirements"
+	,"Directory operator requirements"
+	,"Allowed file extensions (comma delimited)"
+	,"Upload semaphore file"
+	,"Directory data storage location"
+	,"Toggle options (bitfield)"
+	,"Sequential (slow storage) device number"
+	,"Sort order (see <tt>FileBase.SORT</tt> for valid values)"
+	,"Configured maximum number of files"
+	,"Configured maximum age (in days) of files before expiration"
+	,"Percent of file size awarded uploader in credits upon file upload"
+	,"Percent of file size awarded uploader in credits upon subsequent downloads"
+	,"Virtual directory name (for FTP or HTTP access)"
+	,"Virtual path (for FTP or HTTP access)"
+	,"Number of files currently in this directory <i>(introduced in v3.18c)</i>"
+	,"Timestamp of file base index of this directory <i>(introduced in v3.19)</i>"
+	,"User has sufficient access to view this directory (e.g. list files) <i>(introduced in v3.18)</i>"
+	,"User has sufficient access to upload files to this directory"
+	,"User has sufficient access to download files from this directory"
+	,"User is exempt from download credit costs (or the directory is configured for free downloads)"
+	,"User has operator access to this directory"
+	,"Directory is for offline storage <i>(introduced in v3.14)</i>"
+	,"Directory is for uploads only <i>(introduced in v3.14)</i>"
+	,"Directory is for uploads to sysop only <i>(introduced in v3.14)</i>"
 	,NULL
 };
 #endif
diff --git a/src/sbbs3/js_filebase.c b/src/sbbs3/js_filebase.c
index 9c9953188a1d624792a9d7e50004db5b48b2fcbb..a7ddb702b517a7ee541285ee1a619cd45ce8029a 100644
--- a/src/sbbs3/js_filebase.c
+++ b/src/sbbs3/js_filebase.c
@@ -1592,20 +1592,20 @@ static jsSyncPropertySpec js_filebase_properties[] = {
 #ifdef BUILD_JSDOCS
 static char* filebase_prop_desc[] = {
 
-	 "last occurred file base error description - <small>READ ONLY</small>"
-	,"return value of last <i>SMB Library</i> function call - <small>READ ONLY</small>"
-	,"base path and filename of file base - <small>READ ONLY</small>"
-	,"file base open/lock retry timeout (in seconds)"
-	,"delay between file base open/lock retries (in milliseconds)"
-	,"first file number - <small>READ ONLY</small>"
-	,"last file number - <small>READ ONLY</small>"
-	,"timestamp of last file - <small>READ ONLY</small>"
-	,"total number of files - <small>READ ONLY</small>"
-	,"timestamp of file base index (only writable when file base is closed)"
-	,"maximum number of files before expiration - <small>READ ONLY</small>"
-	,"maximum age (in days) of files to store - <small>READ ONLY</small>"
-	,"file base attributes - <small>READ ONLY</small>"
-	,"directory number (0-based, -1 if invalid) - <small>READ ONLY</small>"
+	 "Last occurred file base error description - <small>READ ONLY</small>"
+	,"Return value of last <i>SMB Library</i> function call - <small>READ ONLY</small>"
+	,"Base path and filename of file base - <small>READ ONLY</small>"
+	,"File base open/lock retry timeout (in seconds)"
+	,"Delay between file base open/lock retries (in milliseconds)"
+	,"First file number - <small>READ ONLY</small>"
+	,"Last file number - <small>READ ONLY</small>"
+	,"Timestamp of last file - <small>READ ONLY</small>"
+	,"Total number of files - <small>READ ONLY</small>"
+	,"Timestamp of file base index (only writable when file base is closed)"
+	,"Maximum number of files before expiration - <small>READ ONLY</small>"
+	,"Maximum age (in days) of files to store - <small>READ ONLY</small>"
+	,"File base attributes - <small>READ ONLY</small>"
+	,"Directory number (0-based, -1 if invalid) - <small>READ ONLY</small>"
 	,"<i>true</i> if the file base has been opened successfully - <small>READ ONLY</small>"
 	,NULL
 };
@@ -1614,17 +1614,17 @@ static char* filebase_prop_desc[] = {
 static jsSyncMethodSpec js_filebase_functions[] = {
 	{"open",			js_open,			0, JSTYPE_BOOLEAN
 		,JSDOCSTR("")
-		,JSDOCSTR("open file base")
+		,JSDOCSTR("Open file base")
 		,31900
 	},
 	{"close",			js_close,			0, JSTYPE_BOOLEAN
 		,JSDOCSTR("")
-		,JSDOCSTR("close file base (if open)")
+		,JSDOCSTR("Close file base (if open)")
 		,31900
 	},
 	{"get",				js_get_file,		2, JSTYPE_OBJECT
 		,JSDOCSTR("filename or file-meta-object [,detail=FileBase.DETAIL.NORM]")
-		,JSDOCSTR("get a file metadata object or <tt>null</tt> on failure. "
+		,JSDOCSTR("Get a file metadata object or <tt>null</tt> on failure. "
 			"The file-meta-object may contain the following properties (depending on <i>detail</i> value):<br>"
 			"<table>"
 			"<tr><td align=top><tt>name</tt><td>Filename <i>(required)</i>"
@@ -1658,72 +1658,72 @@ static jsSyncMethodSpec js_filebase_functions[] = {
 	},
 	{"get_list",		js_get_file_list,	4, JSTYPE_ARRAY
 		,JSDOCSTR("[filespec] [,detail=FileBase.DETAIL.NORM] [,since-time=0] [,sort=true [,order]]")
-		,JSDOCSTR("get a list (array) of file metadata objects"
+		,JSDOCSTR("Get a list (array) of file metadata objects"
 			", the default sort order is the sysop-configured order or <tt>FileBase.SORT.NAME_AI</tt>"
 			)
 		,31900
 	},
 	{"get_name",		js_get_file_name,	1, JSTYPE_STRING
 		,JSDOCSTR("path/filename")
-		,JSDOCSTR("returns index-formatted (e.g. shortened) version of filename without path (file base does not have to be open)")
+		,JSDOCSTR("Returns index-formatted (e.g. shortened) version of filename without path (file base does not have to be open)")
 		,31900
 	},
 	{"get_names",		js_get_file_names,	3, JSTYPE_ARRAY
 		,JSDOCSTR("[filespec] [,since-time=0] [,sort=true [,order]]")
-		,JSDOCSTR("get a list of index-formatted (e.g. shortened) filenames (strings) from file base index"
+		,JSDOCSTR("Get a list of index-formatted (e.g. shortened) filenames (strings) from file base index"
 			", the default sort order is the sysop-configured order or <tt>FileBase.SORT.NAME_AI</tt>")
 		,31900
 	},
 	{"get_path",		js_get_file_path,	1, JSTYPE_STRING
 		,JSDOCSTR("filename or file-meta-object")
-		,JSDOCSTR("get the full path to the local file")
+		,JSDOCSTR("Get the full path to the local file")
 		,31900
 	},
 	{"get_size",		js_get_file_size,	1, JSTYPE_NUMBER
 		,JSDOCSTR("filename or file-meta-object")
-		,JSDOCSTR("get the size of the local file, in bytes, or -1 if it does not exist")
+		,JSDOCSTR("Get the size of the local file, in bytes, or -1 if it does not exist")
 		,31900
 	},
 	{"get_time",		js_get_file_time,	1, JSTYPE_NUMBER
 		,JSDOCSTR("filename or file-meta-object")
-		,JSDOCSTR("get the modification date/time stamp of the local file")
+		,JSDOCSTR("Get the modification date/time stamp of the local file")
 		,31900
 	},
 	{"add",				js_add_file,		1, JSTYPE_BOOLEAN
 		,JSDOCSTR("file-meta-object [,use_diz_always=false] [,object client=none]")
-		,JSDOCSTR("add a file to the file base, returning <tt>true</tt> on success or <tt>false</tt> upon failure.")
+		,JSDOCSTR("Add a file to the file base, returning <tt>true</tt> on success or <tt>false</tt> upon failure.")
 		,31900
 	},
 	{"remove",			js_remove_file,		2, JSTYPE_BOOLEAN
 		,JSDOCSTR("filename [,delete=false]")
-		,JSDOCSTR("remove an existing file from the file base and optionally delete file"
+		,JSDOCSTR("Remove an existing file from the file base and optionally delete file"
 				", may throw exception on errors (e.g. file remove failure)")
 		,31900
 	},
 	{"update",			js_update_file,		3, JSTYPE_BOOLEAN
 		,JSDOCSTR("filename, file-meta-object [,use_diz_always=false] [,readd_always=false]")
-		,JSDOCSTR("update an existing file in the file base"
+		,JSDOCSTR("Update an existing file in the file base"
 				", may throw exception on errors (e.g. file rename failure)")
 		,31900
 	},
 	{"renew",			js_renew_file,		1, JSTYPE_BOOLEAN
 		,JSDOCSTR("filename")
-		,JSDOCSTR("remove and re-add (as new) an existing file in the file base")
+		,JSDOCSTR("Remove and re-add (as new) an existing file in the file base")
 		,31900
 	},
 	{"hash",			js_hash_file,		1, JSTYPE_OBJECT
 		,JSDOCSTR("filename_or_fullpath")
-		,JSDOCSTR("calculate hashes of a file's contents (file base does not have to be open)")
+		,JSDOCSTR("Calculate hashes of a file's contents (file base does not have to be open)")
 		,31900
 	},
 	{"dump",			js_dump_file,		1, JSTYPE_ARRAY
 		,JSDOCSTR("filename")
-		,JSDOCSTR("dump file header fields to an array of strings for diagnostic uses")
+		,JSDOCSTR("Dump file header fields to an array of strings for diagnostic uses")
 		,31900
 	},
 	{"format_name",		js_format_file_name,1, JSTYPE_STRING
 		,JSDOCSTR("path/filename [,number size=12] [,boolean pad=false]")
-		,JSDOCSTR("returns formatted (e.g. shortened) version of filename without path (file base does not have to be open) for display")
+		,JSDOCSTR("Returns formatted (e.g. shortened) version of filename without path (file base does not have to be open) for display")
 		,31900
 	},
 	{0}
diff --git a/src/sbbs3/js_global.c b/src/sbbs3/js_global.c
index 8edf6dae7678718164d79308c68a7cc52018ee2e..f0a879ff061ee474a4e7b62250767f3130ebc64d 100644
--- a/src/sbbs3/js_global.c
+++ b/src/sbbs3/js_global.c
@@ -4786,13 +4786,13 @@ js_qwknet_route(JSContext *cx, uintN argc, jsval *arglist)
 
 static jsSyncMethodSpec js_global_functions[] = {
 	{"exit",			js_exit,			0,	JSTYPE_VOID,	"[exit_code]"
-	,JSDOCSTR("stop script execution, "
+	,JSDOCSTR("Stop script execution, "
 		"optionally setting the global property <tt>exit_code</tt> to the specified numeric value")
 	,311
 	},		
 	{"load",            js_load,            1,	JSTYPE_UNDEF
 	,JSDOCSTR("[<i>bool</i> background or <i>object</i> scope,] <i>string</i> filename [,args]")
-	,JSDOCSTR("load and execute a JavaScript module (<i>filename</i>), "
+	,JSDOCSTR("Load and execute a JavaScript module (<i>filename</i>), "
 		"optionally specifying a target <i>scope</i> object (default: <i>this</i>) "
 		"and a list of arguments to pass to the module (as <i>argv</i>). "
 		"Returns the result (last executed statement) of the executed script "
@@ -4810,7 +4810,7 @@ static jsSyncMethodSpec js_global_functions[] = {
 	},
 	{"require",         js_require,         1,	JSTYPE_UNDEF
 	,JSDOCSTR("[<i>object</i> scope,] <i>string</i> filename, propname [,args]")
-	,JSDOCSTR("load and execute a JavaScript module (<i>filename</i>), "
+	,JSDOCSTR("Load and execute a JavaScript module (<i>filename</i>), "
 		"optionally specifying a target <i>scope</i> object (default: <i>this</i>) "
 		"and a list of arguments to pass to the module (as <i>argv</i>) "
 		"IF AND ONLY IF the property named <i>propname</i> is not defined in "
@@ -4822,80 +4822,80 @@ static jsSyncMethodSpec js_global_functions[] = {
 	},
 	{"sleep",			js_mswait,			0,	JSTYPE_ALIAS },
 	{"mswait",			js_mswait,			0,	JSTYPE_NUMBER,	JSDOCSTR("[milliseconds=<tt>1</tt>]")
-	,JSDOCSTR("millisecond wait/sleep routine (AKA sleep), returns number of elapsed clock ticks (in v3.13)")
+	,JSDOCSTR("Millisecond wait/sleep routine (AKA sleep), returns number of elapsed clock ticks (in v3.13)")
 	,313
 	},
 	{"yield",			js_yield,			0,	JSTYPE_VOID,	JSDOCSTR("[forced=<tt>true</tt>]")
-	,JSDOCSTR("release current thread time-slice, "
+	,JSDOCSTR("Release current thread time-slice, "
 		"a <i>forced</i> yield will yield to all other pending tasks (lowering CPU utilization), "
 		"a non-<i>forced</i> yield will yield only to pending tasks of equal or higher priority. "
 		"<i>forced</i> defaults to <i>true</i>")
 	,311
 	},
 	{"random",			js_random,			1,	JSTYPE_NUMBER,	JSDOCSTR("max_number=<tt>100</tt>")
-	,JSDOCSTR("return random integer between <tt>0</tt> and <i>max_number</i>-1")
+	,JSDOCSTR("Return random integer between <tt>0</tt> and <i>max_number</i>-1")
 	,310
 	},		
 	{"time",			js_time,			0,	JSTYPE_NUMBER,	""
-	,JSDOCSTR("return current time and date in Unix (time_t) format "
+	,JSDOCSTR("Return current time and date in Unix (time_t) format "
 		"(number of seconds since Jan-01-1970)")
 	,310
 	},		
 	{"beep",			js_beep,			0,	JSTYPE_VOID,	JSDOCSTR("[frequency=<tt>500</tt>] [,duration=<tt>500</tt>]")
-	,JSDOCSTR("produce a tone on the local speaker at specified frequency for specified duration (in milliseconds)")
+	,JSDOCSTR("Produce a tone on the local speaker at specified frequency for specified duration (in milliseconds)")
 	,310
 	},		
 	{"sound",			js_sound,			0,	JSTYPE_BOOLEAN,	JSDOCSTR("[filename]")
-	,JSDOCSTR("play a waveform (.wav) sound file (currently, on Windows platforms only)")
+	,JSDOCSTR("Play a waveform (.wav) sound file (currently, on Windows platforms only)")
 	,310
 	},		
 	{"ctrl",			js_ctrl,			1,	JSTYPE_STRING,	JSDOCSTR("number or string")
-	,JSDOCSTR("return ASCII control character representing character passed - Example: <tt>ctrl('C') returns '\3'</tt>")
+	,JSDOCSTR("Return ASCII control character representing character passed - Example: <tt>ctrl('C') returns '\3'</tt>")
 	,311
 	},
 	{"ascii",			js_ascii,			1,	JSTYPE_UNDEF,	JSDOCSTR("[string text] or [number value]")
-	,JSDOCSTR("convert single character to numeric ASCII value or vice-versa (returns number OR string)")
+	,JSDOCSTR("Convert single character to numeric ASCII value or vice-versa (returns number OR string)")
 	,310
 	},		
 	{"ascii_str",		js_ascii_str,		1,	JSTYPE_STRING,	JSDOCSTR("text")
-	,JSDOCSTR("convert extended-ASCII (CP437) characters in text string to plain US-ASCII equivalent, returns modified string")
+	,JSDOCSTR("Convert extended-ASCII (CP437) characters in text string to plain US-ASCII equivalent, returns modified string")
 	,310
 	},		
 	{"strip_ctrl",		js_strip_ctrl,		1,	JSTYPE_STRING,	JSDOCSTR("text")
-	,JSDOCSTR("strip control characters from string, returns modified string")
+	,JSDOCSTR("Strip control characters from string, returns modified string")
 	,310
 	},		
 	{"strip_ansi",		js_strip_ansi,		1,	JSTYPE_STRING,	JSDOCSTR("text")
-	,JSDOCSTR("strip all ANSI terminal control sequences from string, returns modified string")
+	,JSDOCSTR("Strip all ANSI terminal control sequences from string, returns modified string")
 	,31802
 	},		
 	{"strip_exascii",	js_strip_exascii,	1,	JSTYPE_STRING,	JSDOCSTR("text")
-	,JSDOCSTR("strip all extended-ASCII characters from string, returns modified string")
+	,JSDOCSTR("Strip all extended-ASCII characters from string, returns modified string")
 	,310
 	},		
 	{"skipsp",			js_skipsp,			1,	JSTYPE_STRING,	JSDOCSTR("text")
-	,JSDOCSTR("skip (trim) white-space characters off <b>beginning</b> of string, returns modified string")
+	,JSDOCSTR("Skip (trim) white-space characters off <b>beginning</b> of string, returns modified string")
 	,315
 	},
 	{"truncsp",			js_truncsp,			1,	JSTYPE_STRING,	JSDOCSTR("text")
-	,JSDOCSTR("truncate (trim) white-space characters off <b>end</b> of string, returns modified string")
+	,JSDOCSTR("Truncate (trim) white-space characters off <b>end</b> of string, returns modified string")
 	,310
 	},
 	{"truncstr",		js_truncstr,		2,	JSTYPE_STRING,	JSDOCSTR("text, charset")
-	,JSDOCSTR("truncate (trim) string at first char in <i>charset</i>, returns modified string")
+	,JSDOCSTR("Truncate (trim) string at first char in <i>charset</i>, returns modified string")
 	,310
 	},		
 	{"lfexpand",		js_lfexpand,		1,	JSTYPE_STRING,	JSDOCSTR("text")
-	,JSDOCSTR("expand line-feeds (LF) to carriage-return/line-feeds (CRLF), returns modified string")
+	,JSDOCSTR("Expand line-feeds (LF) to carriage-return/line-feeds (CRLF), returns modified string")
 	,310
 	},
 	{"wildmatch",		js_wildmatch,		2,	JSTYPE_BOOLEAN, JSDOCSTR("[case_sensitive=<tt>false</tt>,] string [,pattern=<tt>'*'</tt>] [,path=<tt>false</tt>]")
-	,JSDOCSTR("returns <tt>true</tt> if the <i>string</i> matches the wildcard <i>pattern</i> (wildcards supported are '*' and '?'), "
+	,JSDOCSTR("Returns <tt>true</tt> if the <i>string</i> matches the wildcard <i>pattern</i> (wildcards supported are '*' and '?'), "
 	"if <i>path</i> is <tt>true</tt>, '*' will not match path delimeter characters (e.g. '/')")
 	,314
 	},
 	{"backslash",		js_backslash,		1,	JSTYPE_STRING,	JSDOCSTR("path")
-	,JSDOCSTR("returns directory path with trailing (platform-specific) path delimeter "
+	,JSDOCSTR("Returns directory path with trailing (platform-specific) path delimeter "
 		"(i.e. \"slash\" or \"backslash\")")
 	,312
 	},
@@ -4904,45 +4904,45 @@ static jsSyncMethodSpec js_global_functions[] = {
 	,315
 	},
 	{"file_getname",	js_getfname,		1,	JSTYPE_STRING,	JSDOCSTR("path/filename")
-	,JSDOCSTR("returns filename portion of passed path string")
+	,JSDOCSTR("Returns filename portion of passed path string")
 	,311
 	},
 	{"file_getext",		js_getfext,			1,	JSTYPE_STRING,	JSDOCSTR("path/filename")
-	,JSDOCSTR("returns file extension portion of passed path/filename string (including '.') "
+	,JSDOCSTR("Returns file extension portion of passed path/filename string (including '.') "
 		"or <i>undefined</i> if no extension is found")
 	,311
 	},
 	{"file_getcase",	js_getfcase,		1,	JSTYPE_STRING,	JSDOCSTR("path/filename")
-	,JSDOCSTR("returns correct case of filename (long version of filename on Windows) "
+	,JSDOCSTR("Returns correct case of filename (long version of filename on Windows) "
 		"or <i>undefined</i> if the file doesn't exist")
 	,311
 	},
 	{"file_cfgname",	js_cfgfname,		2,	JSTYPE_STRING,	JSDOCSTR("path, filename")
-	,JSDOCSTR("returns completed configuration filename from supplied <i>path</i> and <i>filename</i>, "
+	,JSDOCSTR("Returns completed configuration filename from supplied <i>path</i> and <i>filename</i>, "
 	"optionally including the local hostname (e.g. <tt>path/file.<i>host</i>.<i>domain</i>.ext</tt> "
 	"or <tt>path/file.<i>host</i>.ext</tt>) if such a variation of the filename exists")
 	,312
 	},
 	{"file_getdosname",	js_dosfname,		1,	JSTYPE_STRING,	JSDOCSTR("path/filename")
-	,JSDOCSTR("returns DOS-compatible (Micros~1 shortened) version of specified <i>path/filename</i>"
+	,JSDOCSTR("Returns DOS-compatible (Micros~1 shortened) version of specified <i>path/filename</i>"
 		"(on Windows only)<br>"
 		"returns unmodified <i>path/filename</i> on other platforms")
 	,315
 	},
 	{"file_exists",		js_fexist,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("path/filename")
-	,JSDOCSTR("verify a file's existence")
+	,JSDOCSTR("Verify a file's existence")
 	,310
 	},		
 	{"file_remove",		js_remove,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("path/filename")
-	,JSDOCSTR("delete a file")
+	,JSDOCSTR("Delete a file")
 	,310
 	},		
 	{"file_removecase",	js_removecase,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("path/filename")
-	,JSDOCSTR("delete files case insensitively")
+	,JSDOCSTR("Delete files case insensitively")
 	,314
 	},		
 	{"file_rename",		js_rename,			2,	JSTYPE_BOOLEAN,	JSDOCSTR("path/oldname, path/newname")
-	,JSDOCSTR("rename a file, possibly moving it to another directory in the process")
+	,JSDOCSTR("Rename a file, possibly moving it to another directory in the process")
 	,311
 	},
 	{"file_copy",		js_fcopy,			2,	JSTYPE_BOOLEAN,	JSDOCSTR("path/source, path/destination")
@@ -4950,7 +4950,7 @@ static jsSyncMethodSpec js_global_functions[] = {
 	,311
 	},
 	{"file_backup",		js_backup,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("path/filename [,level=<tt>5</tt>] [,rename=<tt>false</tt>]")
-	,JSDOCSTR("backup the specified <i>filename</i> as <tt>filename.<i>number</i>.extension</tt> "
+	,JSDOCSTR("Backup the specified <i>filename</i> as <tt>filename.<i>number</i>.extension</tt> "
 		"where <i>number</i> is the backup number 0 through <i>level</i>-1 "
 		"(default backup <i>level</i> is 5), "
 		"if <i>rename</i> is <i>true</i>, the original file is renamed instead of copied "
@@ -4958,53 +4958,53 @@ static jsSyncMethodSpec js_global_functions[] = {
 	,311
 	},
 	{"file_isdir",		js_isdir,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("path/filename")
-	,JSDOCSTR("check if specified <i>filename</i> is a directory")
+	,JSDOCSTR("Check if specified <i>filename</i> is a directory")
 	,310
 	},		
 	{"file_attrib",		js_fattr,			1,	JSTYPE_NUMBER,	JSDOCSTR("path/filename")
-	,JSDOCSTR("get a file's attributes (same as </i>file_mode()</i> on *nix). "
+	,JSDOCSTR("Get a file's attributes (same as </i>file_mode()</i> on *nix). "
 		"On Windows, the return value corresponds with <tt>_finddata_t.attrib</tt> "
 		"(includes DOS/Windows file system-specific attributes, like <i>hidden</i>, and <i>archive</i>). "
 		"Returns <tt>-1</tt> if the <i>path/filename</i> does not exist.")
 	,310
 	},		
 	{"file_mode",		js_fmode,			1,	JSTYPE_NUMBER,	JSDOCSTR("path/filename")
-	,JSDOCSTR("get a file's type and mode flags (e.g. read/write/execute permissions). "
+	,JSDOCSTR("Get a file's type and mode flags (e.g. read/write/execute permissions). "
 		"The return value corresponds with <tt>struct stat.st_mode</tt>. "
 		"Returns <tt>-1</tt> if the <i>path/filename</i> does not exist.")
 	,31702
 	},		
 	{"file_chmod",		js_chmod,			1,	JSTYPE_NUMBER,	JSDOCSTR("path/filename, number mode")
-	,JSDOCSTR("set a file's permissions flags. "
+	,JSDOCSTR("Set a file's permissions flags. "
 		"The supported <i>mode</i> bit values are system-dependent "
 		"(e.g. Windows only supports setting or clearing the user-write/0x80 mode flag). "
 		"Returns <tt>true</tt> if the requested change was successful.")
 	,31702
 	},		
 	{"file_date",		js_fdate,			1,	JSTYPE_NUMBER,	JSDOCSTR("path/filename")
-	,JSDOCSTR("get a file's last modified date/time (in time_t format). Returns <tt>-1</tt> if the <i>path/filename</i> does not exist.")
+	,JSDOCSTR("Get a file's last modified date/time (in time_t format). Returns <tt>-1</tt> if the <i>path/filename</i> does not exist.")
 	,310
 	},
 	{"file_cdate",		js_fcdate,			1,	JSTYPE_NUMBER,	JSDOCSTR("path/filename")
-	,JSDOCSTR("get a file's creation date/time (in time_t format). Returns <tt>-1</tt> if the <i>path/filename</i> does not exist.")
+	,JSDOCSTR("Get a file's creation date/time (in time_t format). Returns <tt>-1</tt> if the <i>path/filename</i> does not exist.")
 	,317
 	},
 	{"file_size",		js_flength,			1,	JSTYPE_NUMBER,	JSDOCSTR("path/filename")
-	,JSDOCSTR("get a file's length (in bytes). Returns <tt>-1</tt> if the <i>path/filename</i> does not exist.")
+	,JSDOCSTR("Get a file's length (in bytes). Returns <tt>-1</tt> if the <i>path/filename</i> does not exist.")
 	,310
 	},
 	{"file_utime",		js_utime,			3,	JSTYPE_BOOLEAN,	JSDOCSTR("path/filename [,access_time=<i>current</i>] [,mod_time=<i>current</i>]")
-	,JSDOCSTR("change a file's last accessed and modification date/time (in time_t format), "
+	,JSDOCSTR("Change a file's last accessed and modification date/time (in time_t format), "
 		"or change to current time")
 	,311
 	},
 	{"file_touch",		js_ftouch,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("path/filename")
-	,JSDOCSTR("updates a file's last modification date/time to current time, "
+	,JSDOCSTR("Updates a file's last modification date/time to current time, "
 		"creating an empty file if it doesn't already exist")
 	,311
 	},
 	{"file_mutex",		js_fmutex,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("path/filename [,text=<i>local_hostname</i>] [,max_age=<tt>0</tt>]")
-	,JSDOCSTR("attempts to create an mutual-exclusion (e.g. lock) file, "
+	,JSDOCSTR("Attempts to create an mutual-exclusion (e.g. lock) file, "
 		"optionally with the contents of <i>text</i>. "
 		"If a non-zero <i>max_age</i> (supported in v3.13b+) is specified "
 		"and the lock file exists, but is older than this value (in seconds), "
@@ -5012,29 +5012,29 @@ static jsSyncMethodSpec js_global_functions[] = {
 	,312
 	},
 	{"file_compare",	js_fcompare,		2,	JSTYPE_BOOLEAN,	JSDOCSTR("path/file1, path/file2")
-	,JSDOCSTR("compare 2 files, returning <i>true</i> if they are identical, <i>false</i> otherwise")
+	,JSDOCSTR("Compare 2 files, returning <i>true</i> if they are identical, <i>false</i> otherwise")
 	,314
 	},
 	{"directory",		js_directory,		1,	JSTYPE_ARRAY,	JSDOCSTR("path/pattern [,flags=<tt>GLOB_MARK</tt>]")
-	,JSDOCSTR("returns an array of directory entries, "
+	,JSDOCSTR("Returns an array of directory entries, "
 		"<i>pattern</i> is the path and filename or wildcards to search for (e.g. '/subdir/*.txt'), "
 		"<i>flags</i> is a bitfield of optional <tt>glob</tt> flags (default is <tt>GLOB_MARK</tt>)")
 	,310
 	},
 	{"dir_freespace",	js_freediskspace,	2,	JSTYPE_NUMBER,	JSDOCSTR("directory [,unit_size=<tt>1</tt>]")
-	,JSDOCSTR("returns the amount of available disk space in the specified <i>directory</i> "
+	,JSDOCSTR("Returns the amount of available disk space in the specified <i>directory</i> "
 		"using the specified <i>unit_size</i> in bytes (default: 1), "
 		"specify a <i>unit_size</i> of <tt>1024</tt> to return the available space in <i>kilobytes</i>.")
 	,311
 	},
 	{"disk_size",		js_disksize,		2,	JSTYPE_NUMBER,	JSDOCSTR("directory [,unit_size=<tt>1</tt>]")
-	,JSDOCSTR("returns the total disk size of the specified <i>directory</i> "
+	,JSDOCSTR("Returns the total disk size of the specified <i>directory</i> "
 		"using the specified <i>unit_size</i> in bytes (default: 1), "
 		"specify a <i>unit_size</i> of <tt>1024</tt> to return the total disk size in <i>kilobytes</i>.")
 	,314
 	},
 	{"socket_select",	js_socket_select,	0,	JSTYPE_ARRAY,	JSDOCSTR("[array of socket objects or descriptors] [,timeout=<tt>0</tt>] [,write=<tt>false</tt>]")
-	,JSDOCSTR("checks an array of socket objects or descriptors for read or write ability (default is <i>read</i>), "
+	,JSDOCSTR("Checks an array of socket objects or descriptors for read or write ability (default is <i>read</i>), "
 		"default timeout value is 0.0 seconds (immediate timeout), "
 		"returns an array of 0-based index values into the socket array, representing the sockets that were ready for reading or writing, or <i>null</i> on error. "
 		"If multiple arrays of sockets are passed, they are presumed to be in the order of read, write, and except.  In this case, the write parameter is ignored "
@@ -5043,141 +5043,141 @@ static jsSyncMethodSpec js_global_functions[] = {
 	,311
 	},
 	{"socket_strerror", js_socket_strerror,	1,	JSTYPE_STRING,	JSDOCSTR("error")
-		,JSDOCSTR("get the description(string representation) of a numeric socket error value (e.g. <tt>socket_errno</tt>)")
+		,JSDOCSTR("Get the description(string representation) of a numeric socket error value (e.g. <tt>socket_errno</tt>)")
 		,31802
 	},
 	{"strerror",		js_strerror,		1,	JSTYPE_STRING,	JSDOCSTR("error")
-		,JSDOCSTR("get the description(string representation) of a numeric system error value (e.g. <tt>errno</tt>)")
+		,JSDOCSTR("Get the description(string representation) of a numeric system error value (e.g. <tt>errno</tt>)")
 		,31802
 	},
 	{"mkdir",			js_mkdir,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("path/directory")
-	,JSDOCSTR("make a directory")
+	,JSDOCSTR("Make a directory on a local file system")
 	,310
 	},		
 	{"mkpath",			js_mkpath,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("path/directory")
-	,JSDOCSTR("make a path to a directory (creating all necessary sub-directories). Returns true if the directory already exists.")
+	,JSDOCSTR("Make a path to a directory (creating all necessary sub-directories). Returns true if the directory already exists.")
 	,315
 	},		
 	{"rmdir",			js_rmdir,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("path/directory")
-	,JSDOCSTR("remove a directory")
+	,JSDOCSTR("Remove a directory")
 	,310
 	},
 	{"rmfiles",			js_rmfiles,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("path/directory [,file-spec='*'] [,files-to-keep=0]")
-	,JSDOCSTR("remove all files and sub-directories in the specified directory, recursively - <b>use with caution!</b>")
+	,JSDOCSTR("Remove all files and sub-directories in the specified directory, recursively - <b>use with caution!</b>")
 	,320
 	},
 	{"strftime",		js_strftime,		1,	JSTYPE_STRING,	JSDOCSTR("format [,time=<i>current</i>]")
-	,JSDOCSTR("return a formatted time string (ala C strftime)")
+	,JSDOCSTR("Return a formatted time string (ala C strftime)")
 	,310
 	},		
 	{"format",			js_format,			1,	JSTYPE_STRING,	JSDOCSTR("format [,args]")
-	,JSDOCSTR("return a formatted string (ala the standard C <tt>sprintf</tt> function)")
+	,JSDOCSTR("Return a formatted string (ala the standard C <tt>sprintf</tt> function)")
 	,310
 	},
 	{"html_encode",		js_html_encode,		1,	JSTYPE_STRING,	JSDOCSTR("text [,ex_ascii=<tt>true</tt>] [,white_space=<tt>true</tt>] [,ansi=<tt>true</tt>] [,ctrl_a=<tt>true</tt>] [, state (object)]")
-	,JSDOCSTR("return an HTML-encoded text string (using standard HTML character entities), "
+	,JSDOCSTR("Return an HTML-encoded text string (using standard HTML character entities), "
 		"escaping IBM extended-ASCII (CP437), white-space characters, ANSI codes, and CTRL-A codes by default."
 		"Optionally storing the current ANSI state in <i>state</i> object")
 	,311
 	},
 	{"html_decode",		js_html_decode,		1,	JSTYPE_STRING,	JSDOCSTR("html")
-	,JSDOCSTR("return a decoded HTML-encoded text string")
+	,JSDOCSTR("Return a decoded HTML-encoded text string")
 	,311
 	},
 	{"word_wrap",		js_word_wrap,		1,	JSTYPE_STRING,	JSDOCSTR("text [,line_length=<tt>79</tt> [, orig_line_length=<tt>79</tt> [, handle_quotes=<tt>true</tt> [, is_utf8=<tt>false</tt>]]]]")
-	,JSDOCSTR("returns a word-wrapped version of the text string argument optionally handing quotes magically, "
+	,JSDOCSTR("Returns a word-wrapped version of the text string argument optionally handing quotes magically, "
 		"<i>line_length</i> defaults to <i>79</i>, <i>orig_line_length</i> defaults to <i>79</i>, "
 		"<i>handle_quotes</i> defaults to <i>true</i>, and <i>is_utf8</i> defaults to <i>false</i>")
 	,311
 	},
 	{"quote_msg",		js_quote_msg,		1,	JSTYPE_STRING,	JSDOCSTR("text [,line_length=<tt>79</tt>] [,prefix=<tt>\" > \"</tt>]")
-	,JSDOCSTR("returns a quoted version of the message text string argument, <i>line_length</i> defaults to <i>79</i>, "
+	,JSDOCSTR("Returns a quoted version of the message text string argument, <i>line_length</i> defaults to <i>79</i>, "
 		"<i>prefix</i> defaults to <tt>\" > \"</tt>")
 	,311
 	},
 	{"rot13_translate",	js_rot13,			1,	JSTYPE_STRING,	JSDOCSTR("text")
-	,JSDOCSTR("returns ROT13-translated version of text string (will encode or decode text)")
+	,JSDOCSTR("Returns ROT13-translated version of text string (will encode or decode text)")
 	,311
 	},
 	{"base64_encode",	js_b64_encode,		1,	JSTYPE_STRING,	JSDOCSTR("text")
-	,JSDOCSTR("returns base64-encoded version of text string or <i>null</i> on error")
+	,JSDOCSTR("Returns base64-encoded version of text string or <i>null</i> on error")
 	,311
 	},
 	{"base64_decode",	js_b64_decode,		1,	JSTYPE_STRING,	JSDOCSTR("text")
-	,JSDOCSTR("returns base64-decoded text string or <i>null</i> on error")
+	,JSDOCSTR("Returns base64-decoded text string or <i>null</i> on error")
 	,311
 	},
 	{"crc16_calc",		js_crc16,			1,	JSTYPE_NUMBER,	JSDOCSTR("text")
-	,JSDOCSTR("calculate and return 16-bit CRC of text string")
+	,JSDOCSTR("Calculate and return 16-bit CRC of text string")
 	,311
 	},		
 	{"crc32_calc",		js_crc32,			1,	JSTYPE_NUMBER,	JSDOCSTR("text")
-	,JSDOCSTR("calculate and return 32-bit CRC of text string")
+	,JSDOCSTR("Calculate and return 32-bit CRC of text string")
 	,311
 	},		
 	{"chksum_calc",		js_chksum,			1,	JSTYPE_NUMBER,	JSDOCSTR("text")
-	,JSDOCSTR("calculate and return 32-bit checksum of text string")
+	,JSDOCSTR("Calculate and return 32-bit checksum of text string")
 	,311
 	},
 	{"md5_calc",		js_md5_calc,		1,	JSTYPE_STRING,	JSDOCSTR("text [,hex=<tt>false</tt>]")
-	,JSDOCSTR("calculate and return 128-bit MD5 digest of text string, result encoded in base64 (default) or hexadecimal")
+	,JSDOCSTR("Calculate and return 128-bit MD5 digest of text string, result encoded in base64 (default) or hexadecimal")
 	,311
 	},
 	{"sha1_calc",		js_sha1_calc,		1,	JSTYPE_STRING,	JSDOCSTR("text [,hex=false]")
-	,JSDOCSTR("calculate and return 160-bit SHA-1 digest of text string, result encoded in base64 (default) or hexadecimal")
+	,JSDOCSTR("Calculate and return 160-bit SHA-1 digest of text string, result encoded in base64 (default) or hexadecimal")
 	,31900
 	},
 	{"gethostbyname",	js_resolve_ip,		1,	JSTYPE_ALIAS },
 	{"resolve_ip",		js_resolve_ip,		1,	JSTYPE_STRING,	JSDOCSTR("hostname [,array=<tt>false</tt>]")
-	,JSDOCSTR("resolve IP address of specified hostname (AKA gethostbyname).  If <i>array</i> is true (added in 3.17), will return "
+	,JSDOCSTR("Resolve IP address of specified hostname (AKA gethostbyname).  If <i>array</i> is true (added in 3.17), will return "
 	"an array of all addresses rather than just the first one (upon success).")
 	,311
 	},
 	{"gethostbyaddr",	js_resolve_host,	1,	JSTYPE_ALIAS },
 	{"resolve_host",	js_resolve_host,	1,	JSTYPE_STRING,	JSDOCSTR("ip_address")
-	,JSDOCSTR("resolve hostname of specified IP address (AKA gethostbyaddr)")
+	,JSDOCSTR("Resolve hostname of specified IP address (AKA gethostbyaddr)")
 	,311
 	},
 	{"netaddr_type",	js_netaddr_type,	1,	JSTYPE_NUMBER,	JSDOCSTR("email_address")
-	,JSDOCSTR("returns the proper message <i>net_type</i> for the specified <i>email_address</i>, "
+	,JSDOCSTR("Returns the proper message <i>net_type</i> for the specified <i>email_address</i>, "
 		"(e.g. <tt>NET_INTERNET</tt> for Internet e-mail or <tt>NET_NONE</tt> for local e-mail)")
 	,312
 	},
 	{"list_named_queues",js_list_named_queues,0,JSTYPE_ARRAY,	JSDOCSTR("")
-	,JSDOCSTR("returns an array of <i>named queues</i> (created with the <i>Queue</i> constructor)")
+	,JSDOCSTR("Returns an array of <i>named queues</i> (created with the <i>Queue</i> constructor)")
 	,312
 	},
 	{"flags_str",		js_flags_str,		1,	JSTYPE_UNDEF,	JSDOCSTR("[string] or [number]")
-	,JSDOCSTR("convert a string of security flags (letters) into their numeric value or vice-versa "
+	,JSDOCSTR("Convert a string of security flags (letters) into their numeric value or vice-versa "
 	"(returns number OR string) - (added in v3.13)")
 	,313
 	},
 	{"utf8_encode",		js_utf8_encode,		1,	JSTYPE_STRING,	JSDOCSTR("[string CP437] or [string UTF16] or [number codepoint]")
-	,JSDOCSTR("returns UTF-8 encoded version of the specified CP437 text string, UTF-16 encoded text string, or a single Unicode <i>codepoint</i>")
+	,JSDOCSTR("Returns UTF-8 encoded version of the specified CP437 text string, UTF-16 encoded text string, or a single Unicode <i>codepoint</i>")
 	,31702
 	},
 	{"utf8_decode",		js_utf8_decode,		1,	JSTYPE_STRING,	JSDOCSTR("text")
-		,JSDOCSTR("returns CP437 representation of UTF-8 encoded text string or <i>null</i> on error (invalid UTF-8)")
+		,JSDOCSTR("Returns CP437 representation of UTF-8 encoded text string or <i>null</i> on error (invalid UTF-8)")
 		,31702
 	},
 	{"utf8_get_width",		js_utf8_get_width,	1,	JSTYPE_NUMBER,	JSDOCSTR("text")
-		,JSDOCSTR("returns the fixed printed-width of the specified string of UTF-8 encoded characters")
+		,JSDOCSTR("Returns the fixed printed-width of the specified string of UTF-8 encoded characters")
 		,31702
 	},
 	{"str_is_utf8",			js_str_is_utf8,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("text")
-		,JSDOCSTR("returns <tt>true</tt> if the specified string contains only valid UTF-8 encoded and US-ASCII characters")
+		,JSDOCSTR("Returns <tt>true</tt> if the specified string contains only valid UTF-8 encoded and US-ASCII characters")
 		,31702
 	},
 	{"str_is_utf16",		js_str_is_utf16,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("text")
-		,JSDOCSTR("returns <tt>true</tt> if the specified string contains one or more UTF-16 encoded characters")
+		,JSDOCSTR("Returns <tt>true</tt> if the specified string contains one or more UTF-16 encoded characters")
 		,31702
 	},
 	{"str_is_ascii",		js_str_is_ascii,	1,	JSTYPE_BOOLEAN,	JSDOCSTR("text")
-		,JSDOCSTR("returns <tt>true</tt> if the specified string contains only US-ASCII (no CP437 or UTF-8) characters")
+		,JSDOCSTR("Returns <tt>true</tt> if the specified string contains only US-ASCII (no CP437 or UTF-8) characters")
 		,31702
 	},
 	{"str_has_ctrl",		js_str_has_ctrl,	1,	JSTYPE_BOOLEAN,	JSDOCSTR("text")
-		,JSDOCSTR("returns <tt>true</tt> if the specified string contains any control characters (ASCII 0x01 - 0x1F)")
+		,JSDOCSTR("Returns <tt>true</tt> if the specified string contains any control characters (ASCII 0x01 - 0x1F)")
 		,31702
 	},
 	{0}
diff --git a/src/sbbs3/js_internal.c b/src/sbbs3/js_internal.c
index 84197136a2c02f82a08e82ebd287a68f58689ff2..bfe425eb5a769555302bae17e80721450a94880e 100644
--- a/src/sbbs3/js_internal.c
+++ b/src/sbbs3/js_internal.c
@@ -206,28 +206,28 @@ static jsSyncPropertySpec js_properties[] = {
 #ifdef BUILD_JSDOCS
 static char* prop_desc[] = {
 	 "JavaScript engine version information (AKA system.js_version)"
-	,"set to <i>false</i> to disable the automatic termination of the script upon external request"
-	,"termination has been requested (stop execution as soon as possible)"
-	,"number of operation callbacks performed in this runtime"
-	,"maximum number of operation callbacks, used for infinite-loop detection (0=disabled)"
-	,"interval of periodic time-slice yields (lower number=higher frequency, 0=disabled)"
-	,"interval of periodic garbage collection attempts (lower number=higher frequency, 0=disabled)"
-	,"number of garbage collections attempted in this runtime - <small>READ ONLY</small>"
+	,"Set to <i>false</i> to disable the automatic termination of the script upon external request"
+	,"Termination has been requested (stop execution as soon as possible)"
+	,"Number of operation callbacks performed in this runtime"
+	,"Maximum number of operation callbacks, used for infinite-loop detection (0=disabled)"
+	,"Interval of periodic time-slice yields (lower number=higher frequency, 0=disabled)"
+	,"Interval of periodic garbage collection attempts (lower number=higher frequency, 0=disabled)"
+	,"Number of garbage collections attempted in this runtime - <small>READ ONLY</small>"
 #ifdef jscntxt_h___
-	,"number of garbage collections performed in this runtime - <small>READ ONLY</small>"
-	,"number of heap bytes in use after last garbage collection - <small>READ ONLY</small>"
-	,"number of heap bytes currently in use - <small>READ ONLY</small>"
-	,"maximum number of bytes available for heap"
+	,"Number of garbage collections performed in this runtime - <small>READ ONLY</small>"
+	,"Number of heap bytes in use after last garbage collection - <small>READ ONLY</small>"
+	,"Number of heap bytes currently in use - <small>READ ONLY</small>"
+	,"Maximum number of bytes available for heap"
 #endif
-	,"global (top level) object - <small>READ ONLY</small>"
-	,"option flags - <small>READ ONLY</small>"
-	,"do callbacks after script finishes running"
+	,"Global (top level) object - <small>READ ONLY</small>"
+	,"Option flags - <small>READ ONLY</small>"
+	,"Do callbacks after script finishes running"
 	/* New properties go here... */
-	,"full path and filename of JS file executed"
+	,"Full path and filename of JS file executed"
 	,"JS filename executed (with no path)"
-	,"directory of executed JS file"
+	,"Directory of executed JS file"
 	,"Either the configured startup directory in SCFG (for externals) or the cwd when jsexec is started"
-	,"global scope for this script"
+	,"Global scope for this script"
 	,"load() search path array.<br>For relative load paths (e.g. not beginning with '/' or '\\'), "
 		"the path is assumed to be a sub-directory of the (configurable) mods or exec directories "
 		"and is searched accordingly. "
@@ -1434,62 +1434,62 @@ done:
 
 static jsSyncMethodSpec js_functions[] = {
 	{"eval",            js_eval,            0,	JSTYPE_UNDEF,	JSDOCSTR("script")
-	,JSDOCSTR("evaluate a JavaScript string in its own (secure) context, returning the result")
+	,JSDOCSTR("Evaluate a JavaScript string in its own (secure) context, returning the result")
 	,311
 	},		
 	{"gc",				js_gc,				0,	JSTYPE_VOID,	JSDOCSTR("forced=<tt>true</tt>")
-	,JSDOCSTR("perform a garbage collection operation (freeing memory for unused allocated objects), "
+	,JSDOCSTR("Perform a garbage collection operation (freeing memory for unused allocated objects), "
 		"if <i>forced</i> is <i>true</i> (the default) a garbage collection is always performed, "
 		"otherwise it is only performed if deemed appropriate by the JavaScript engine")
 	,311
 	},
 	{"on_exit",			js_on_exit,			1,	JSTYPE_VOID,	JSDOCSTR("to_eval")
-	,JSDOCSTR("add a string to evaluate/execute (LIFO stack) upon script's termination")
+	,JSDOCSTR("Add a string to evaluate/execute (LIFO stack) upon script's termination (e.g. call of <tt>exit()</tt>)")
 	,313
 	},
 	{"report_error",	js_report_error,	1,	JSTYPE_VOID,	JSDOCSTR("error [,fatal=<tt>false</tt>]")
-	,JSDOCSTR("report an error using the standard JavaScript error reporting mechanism "
+	,JSDOCSTR("Report an error using the standard JavaScript error reporting mechanism "
 	"(including script filename and line number), "
 	"if <i>fatal</i> is <i>true</i>, immediately terminates script")
 	,313
 	},
 	{"get_parent",		js_get_parent,		1,	JSTYPE_OBJECT,	JSDOCSTR("object")
-	,JSDOCSTR("return the parent of the specified object")
+	,JSDOCSTR("Return the parent of the specified object")
 	,314
 	},
 	{"get_size",		js_getsize,			1,	JSTYPE_NUMBER,	JSDOCSTR("[object]")
-	,JSDOCSTR("return the size in bytes the object uses in memory (forces GC) ")
+	,JSDOCSTR("Return the size in bytes the object uses in memory (forces GC) ")
 	,316
 	},
 	{"flatten_string",	js_flatten,			1,	JSTYPE_VOID,	JSDOCSTR("[string]")
-	,JSDOCSTR("flatten a string, optimizing allocated memory used for concatenated strings")
+	,JSDOCSTR("Flatten a string, optimizing allocated memory used for concatenated strings")
 	,316
 	},
-	{"exec",	js_execfile,			1,	JSTYPE_NUMBER,	JSDOCSTR("filename [, startup_dir], <i>object</i> scope [,...]")
-	,JSDOCSTR("execute a script within the specified scope.  The main difference between this method "
-	"and <tt>load()</tt> is that scripts called this way can call <tt>exit()</tt> without terminating the caller.  If it does, any "
-	"<tt>on_exit()</tt> handlers will be evaluated in scripts scope when the script exists. <br>"
+	{"exec",	js_execfile,			1,	JSTYPE_NUMBER,	JSDOCSTR("filename [,startup_dir], <i>object</i> scope [,...]")
+	,JSDOCSTR("Execute a script within the specified <i>scope</i>.  The main difference between this method "
+	"and <tt>load()</tt> is that scripts invoked in this way can call <tt>exit()</tt> without terminating the caller.  If it does, any "
+	"<tt>on_exit()</tt> handlers will be evaluated in the script's scope when the script exits. <br>"
 	"NOTE: to get a child of the current scope, you need to create an object in the current scope. "
 	"An anonymous object can be created using '<tt>new function(){}</tt>'. <br>"
-	"NOTE: Use <tt>js.exec.apply()</tt> if you need to pass a variable number of arguments to the executed script.")
+	"TIP: Use <tt>js.exec.apply()</tt> if you need to pass a variable number of arguments to the executed script.")
 	,31702
 	},
-	{"setTimeout",	js_setTimeout,			2,	JSTYPE_NUMBER,	JSDOCSTR("callback, time [, thisObj]")
-	,JSDOCSTR("install a timeout timer.  <tt>callback()<.tt> will be called <tt>time</tt> (milliseconds) after this function is called. "
+	{"setTimeout",	js_setTimeout,			2,	JSTYPE_NUMBER,	JSDOCSTR("callback, time [,thisObj]")
+	,JSDOCSTR("Install a timeout timer.  <tt>callback()</tt> will be called <tt>time</tt> (milliseconds) after this function is called. "
 	 "Returns an id which can be passed to <tt>clearTimeout()</tt>")
 	,31900
 	},
-	{"setInterval",	js_setInterval,			2,	JSTYPE_NUMBER,	JSDOCSTR("callback, period [, thisObj]")
-	,JSDOCSTR("install an interval timer.  <tt>callback()</tt> will be called every <tt>period</tt> (milliseconds) after <tt>setInterval()</tt> is called. "
+	{"setInterval",	js_setInterval,			2,	JSTYPE_NUMBER,	JSDOCSTR("callback, period [,thisObj]")
+	,JSDOCSTR("Install an interval timer.  <tt>callback()</tt> will be called every <tt>period</tt> (milliseconds) after <tt>setInterval()</tt> is called. "
 	 "Returns an id which can be passed to <tt>clearInterval()</tt>")
 	,31900
 	},
 	{"clearTimeout",	js_clearTimeout,	1,	JSTYPE_VOID,	JSDOCSTR("id")
-	,JSDOCSTR("remove a timeout timer")
+	,JSDOCSTR("Remove a timeout timer")
 	,31900
 	},
 	{"clearInterval",	js_clearInterval,	1,	JSTYPE_VOID,	JSDOCSTR("id")
-	,JSDOCSTR("remove an interval timer")
+	,JSDOCSTR("Remove an interval timer")
 	,31900
 	},
 	{"addEventListener",	js_addEventListener,	2,	JSTYPE_NUMBER,	JSDOCSTR("eventName, callback")
@@ -1500,11 +1500,11 @@ static jsSyncMethodSpec js_functions[] = {
 	,JSDOCSTR("Remove listeners added with <tt>js.addEventListener()</tt>.  <tt>id</tt> can be a string or an id returned by <tt>addEventListener()</tt>.  This does not remove already triggered callbacks from the run queue.")
 	,31900
 	},
-	{"dispatchEvent",	js_dispatchEvent,	1,	JSTYPE_VOID,	JSDOCSTR("eventName [, thisObj]")
+	{"dispatchEvent",	js_dispatchEvent,	1,	JSTYPE_VOID,	JSDOCSTR("eventName [,thisObj]")
 	,JSDOCSTR("Add all listeners of eventName to the end of the run queue.  If <tt>thisObj</tt> is passed, specifies <tt>this</tt> in the callback (the <tt>js</tt> object is used otherwise).")
 	,31900
 	},
-	{"setImmediate",	js_setImmediate,	1,	JSTYPE_VOID,	JSDOCSTR("callback[, thisObj]")
+	{"setImmediate",	js_setImmediate,	1,	JSTYPE_VOID,	JSDOCSTR("callback [,thisObj]")
 	,JSDOCSTR("Adds <tt>callback</tt> to the end of the run queue, where it will be called after all pending events are processed")
 	,31900
 	},
diff --git a/src/sbbs3/js_msg_area.c b/src/sbbs3/js_msg_area.c
index 106ab4daa3eac1f4dd886421883a65d0483d313a..5eaa4e4db36630869c0d637b39466e20b879ca56 100644
--- a/src/sbbs3/js_msg_area.c
+++ b/src/sbbs3/js_msg_area.c
@@ -26,63 +26,63 @@
 #ifdef BUILD_JSDOCS
 
 static char* msg_area_prop_desc[] = {
-	  "message area settings (bitfield) - see <tt>MM_*</tt> in <tt>sbbsdefs.js</tt> for details"
+	  "Message area settings (bitfield) - see <tt>MM_*</tt> in <tt>sbbsdefs.js</tt> for details"
 	 ,"FidoNet NetMail settings (bitfield) - see <tt>NMAIL_*</tt> in <tt>sbbsdefs.js</tt> for details"
 	 ,"Internet NetMail settings (bitfield) - see <tt>NMAIL_*</tt> in <tt>sbbsdefs.js</tt> for details"
 	,NULL
 };
 
 static char* msg_grp_prop_desc[] = {
-	 "index into grp_list array (or -1 if not in array) <i>(introduced in v3.12)</i>"
-	,"unique number for this message group"
-	,"group name"
-	,"group description"
-	,"group access requirements"
-	,"user has sufficient access to list this group's sub-boards <i>(introduced in v3.18)</i>"
-	,"internal code prefix (for sub-boards) <i>(introduced in v3.18c)</i>"
+	 "Index into grp_list array (or -1 if not in array) <i>(introduced in v3.12)</i>"
+	,"Unique number for this message group"
+	,"Group name"
+	,"Group description"
+	,"Group access requirements"
+	,"User has sufficient access to list this group's sub-boards <i>(introduced in v3.18)</i>"
+	,"Internal code prefix (for sub-boards) <i>(introduced in v3.18c)</i>"
 	,NULL
 };
 
 static char* msg_sub_prop_desc[] = {
 
-	 "index into sub_list array (or -1 if not in array) <i>(introduced in v3.12)</i>"
-	,"group's index into grp_list array <i>(introduced in v3.12)</i>"
-	,"unique number for this sub-board"
-	,"group number"
-	,"group name <i>(introduced in v3.12)</i>"
-	,"sub-board internal code"
-	,"sub-board name"
-	,"sub-board description"
+	 "Index into sub_list array (or -1 if not in array) <i>(introduced in v3.12)</i>"
+	,"Group's index into grp_list array <i>(introduced in v3.12)</i>"
+	,"Unique number for this sub-board"
+	,"Group number"
+	,"Group name <i>(introduced in v3.12)</i>"
+	,"Sub-board internal code"
+	,"Sub-board name"
+	,"Sub-board description"
 	,"QWK conference name"
-	,"area tag for FidoNet-style echoes, a.k.a. EchoTag <i>(introduced in v3.19)</i>"
-	,"newsgroup name (as configured or dynamically generated)"
-	,"sub-board access requirements"
-	,"sub-board reading requirements"
-	,"sub-board posting requirements"
-	,"sub-board operator requirements"
-	,"sub-board moderated-user requirements (if non-blank)"
-	,"sub-board data storage location"
+	,"Area tag for FidoNet-style echoes, a.k.a. EchoTag <i>(introduced in v3.19)</i>"
+	,"Newsgroup name (as configured or dynamically generated)"
+	,"Sub-board access requirements"
+	,"Sub-board reading requirements"
+	,"Sub-board posting requirements"
+	,"Sub-board operator requirements"
+	,"Sub-board moderated-user requirements (if non-blank)"
+	,"Sub-board data storage location"
 	,"FidoNet node address"
 	,"FidoNet origin line"
 	,"QWK Network tagline"
-	,"toggle options (bitfield) - see <tt>SUB_*</tt> in <tt>sbbsdefs.js</tt> for details"
-	,"index into message scan configuration/pointer file"
+	,"Toggle options (bitfield) - see <tt>SUB_*</tt> in <tt>sbbsdefs.js</tt> for details"
+	,"Index into message scan configuration/pointer file"
 	,"QWK conference number"
-	,"configured maximum number of message CRCs to store (for dupe checking)"
-	,"configured maximum number of messages before purging"
-	,"configured maximum age (in days) of messages before expiration"
-	,"additional print mode flags to use when printing messages - see <tt>P_*</tt> in <tt>sbbsdefs.js</tt> for details"
-	,"print mode flags to <i>negate</i> when printing messages - see <tt>P_*</tt> in <tt>sbbsdefs.js</tt> for details"
+	,"Configured maximum number of message CRCs to store (for dupe checking)"
+	,"Configured maximum number of messages before purging"
+	,"Configured maximum age (in days) of messages before expiration"
+	,"Additional print mode flags to use when printing messages - see <tt>P_*</tt> in <tt>sbbsdefs.js</tt> for details"
+	,"Print mode flags to <i>negate</i> when printing messages - see <tt>P_*</tt> in <tt>sbbsdefs.js</tt> for details"
 	/* Insert here */
-	,"user has sufficient access to see this sub-board"
-	,"user has sufficient access to read messages in this sub-board"
-	,"user has sufficient access to post messages in this sub-board"
-	,"user has operator access to this sub-board"
-	,"user's posts are moderated"
-	,"user's current new message scan pointer (highest-read message number)"
-	,"user's message scan configuration (bitfield) - see <tt>SCAN_CFG_*</tt> in <tt>sbbsdefs.js</tt> for details"
-	,"user's last-read message number"
-	,"number of messages currently posted to this sub-board <i>(introduced in v3.18c)</i>"
+	,"User has sufficient access to see this sub-board"
+	,"User has sufficient access to read messages in this sub-board"
+	,"User has sufficient access to post messages in this sub-board"
+	,"User has operator access to this sub-board"
+	,"User's posts are moderated"
+	,"User's current new message scan pointer (highest-read message number)"
+	,"User's message scan configuration (bitfield) - see <tt>SCAN_CFG_*</tt> in <tt>sbbsdefs.js</tt> for details"
+	,"User's last-read message number"
+	,"Number of messages currently posted to this sub-board <i>(introduced in v3.18c)</i>"
 	,NULL
 };
 #endif
diff --git a/src/sbbs3/js_msgbase.c b/src/sbbs3/js_msgbase.c
index 3c7d80650aa40e807373c80da70332e4cdb4ce51..179dbbf4f56c46d4cf34b960828ec0f44dfab107 100644
--- a/src/sbbs3/js_msgbase.c
+++ b/src/sbbs3/js_msgbase.c
@@ -3077,19 +3077,19 @@ static jsSyncPropertySpec js_msgbase_properties[] = {
 #ifdef BUILD_JSDOCS
 static char* msgbase_prop_desc[] = {
 
-	 "last occurred message base error - <small>READ ONLY</small>"
-	,"return value of last <i>SMB Library</i> function call - <small>READ ONLY</small>"
-	,"base path and filename of message base - <small>READ ONLY</small>"
-	,"message base open/lock retry timeout (in seconds)"
-	,"delay between message base open/lock retries (in milliseconds)"
-	,"first message number - <small>READ ONLY</small>"
-	,"last message number - <small>READ ONLY</small>"
-	,"total number of messages - <small>READ ONLY</small>"
-	,"maximum number of message CRCs to store (for dupe checking) - <small>READ ONLY</small>"
-	,"maximum number of messages before expiration - <small>READ ONLY</small>"
-	,"maximum age (in days) of messages to store - <small>READ ONLY</small>"
-	,"message base attributes - <small>READ ONLY</small>"
-	,"sub-board number (0-based, 65535 for e-mail) - <small>READ ONLY</small>"
+	 "Last occurred message base error - <small>READ ONLY</small>"
+	,"Return value of last <i>SMB Library</i> function call - <small>READ ONLY</small>"
+	,"Base path and filename of message base - <small>READ ONLY</small>"
+	,"Message base open/lock retry timeout (in seconds)"
+	,"Delay between message base open/lock retries (in milliseconds)"
+	,"First message number - <small>READ ONLY</small>"
+	,"Last message number - <small>READ ONLY</small>"
+	,"Total number of messages - <small>READ ONLY</small>"
+	,"Maximum number of message CRCs to store (for dupe checking) - <small>READ ONLY</small>"
+	,"Maximum number of messages before expiration - <small>READ ONLY</small>"
+	,"Maximum age (in days) of messages to store - <small>READ ONLY</small>"
+	,"Message base attributes - <small>READ ONLY</small>"
+	,"Sub-board number (0-based, 65535 for e-mail) - <small>READ ONLY</small>"
 	,"<i>true</i> if the message base has been opened successfully - <small>READ ONLY</small>"
 	,NULL
 };
@@ -3097,15 +3097,15 @@ static char* msgbase_prop_desc[] = {
 
 static jsSyncMethodSpec js_msgbase_functions[] = {
 	{"open",			js_open,			0, JSTYPE_BOOLEAN,	JSDOCSTR("")
-	,JSDOCSTR("open message base")
+	,JSDOCSTR("Open message base")
 	,310
 	},
 	{"close",			js_close,			0, JSTYPE_BOOLEAN,	JSDOCSTR("")
-	,JSDOCSTR("close message base (if open)")
+	,JSDOCSTR("Close message base (if open)")
 	,310
 	},
 	{"get_msg_header",	js_get_msg_header,	4, JSTYPE_OBJECT,	JSDOCSTR("[by_offset=<tt>false</tt>,] number_or_offset_or_id [,expand_fields=<tt>true</tt>] [,include_votes=<tt>false</tt>]")
-	,JSDOCSTR("returns a specific message header, <i>null</i> on failure. "
+	,JSDOCSTR("Returns a specific message header, <i>null</i> on failure. "
 	"<br><i>New in v3.12:</i> Pass <i>false</i> for the <i>expand_fields</i> argument (default: <i>true</i>) "
 	"if you will be re-writing the header later with <i>put_msg_header()</i>"
 	"<br>"
@@ -3114,18 +3114,18 @@ static jsSyncMethodSpec js_msgbase_functions[] = {
 	,312
 	},
 	{"get_all_msg_headers", js_get_all_msg_headers, 1, JSTYPE_OBJECT, JSDOCSTR("[include_votes=<tt>false</tt>] [,expand_fields=<tt>true</tt>]")
-	,JSDOCSTR("returns an object (associative array) of all message headers \"indexed\" by message number.<br>"
+	,JSDOCSTR("Returns an object (associative array) of all message headers \"indexed\" by message number.<br>"
 	"Message headers returned by this function include additional properties: <tt>upvotes</tt>, <tt>downvotes</tt> and <tt>total_votes</tt>.<br>"
 	"Vote messages are excluded by default.")
 	,316
 	},
 	{"put_msg_header",	js_put_msg_header,	2, JSTYPE_BOOLEAN,	JSDOCSTR("[by_offset=<tt>false</tt>,] [number_or_offset_or_id,] object header")
-	,JSDOCSTR("modify an existing message header (must have been 'got' without expanded fields)")
+	,JSDOCSTR("Modify an existing message header (must have been 'got' without expanded fields)")
 	,310
 	},
 	{"get_msg_body",	js_get_msg_body,	2, JSTYPE_STRING,	JSDOCSTR("[by_offset=<tt>false</tt>,] number_or_offset_or_id_or_header [,strip_ctrl_a=<tt>false</tt>] "
 		"[,dot_stuffing=<tt>false</tt>] [,include_tails=<tt>true</tt>] [,plain_text=<tt>false</tt>]")
-	,JSDOCSTR("returns the entire body text of a specific message as a single String, <i>null</i> on failure. "
+	,JSDOCSTR("Returns the entire body text of a specific message as a single String, <i>null</i> on failure. "
 	"The default behavior is to leave Ctrl-A codes intact, do not stuff dots (e.g. per RFC-821), and to include tails (if any) in the "
 		"returned body text. When <i>plain_text</i> is true, only the first plain-text portion of a multi-part MIME encoded message body is returned. "
 		"The first argument (following the optional <i>by_offset</i> boolean) must be either a number (message number or index-offset), string (message-ID), or object (message header). "
@@ -3137,11 +3137,11 @@ static jsSyncMethodSpec js_msgbase_functions[] = {
 	,310
 	},
 	{"get_msg_tail",	js_get_msg_tail,	2, JSTYPE_STRING,	JSDOCSTR("[by_offset=<tt>false</tt>,] number_or_offset_or_id_or_header [,strip_ctrl_a]=<tt>false</tt>")
-	,JSDOCSTR("returns the tail text of a specific message, <i>null</i> on failure")
+	,JSDOCSTR("Returns the tail text of a specific message, <i>null</i> on failure")
 	,310
 	},
 	{"get_msg_index",	js_get_msg_index,	3, JSTYPE_OBJECT,	JSDOCSTR("[by_offset=<tt>false</tt>,] number_or_offset, [include_votes=<tt>false</tt>]")
-	,JSDOCSTR("returns a specific message index record, <i>null</i> on failure. "
+	,JSDOCSTR("Returns a specific message index record, <i>null</i> on failure. "
 	"The index object will contain the following properties:<br>"
 	"<table>"
 	"<tr><td align=top><tt>attr</tt><td>Attribute bitfield"
@@ -3164,17 +3164,17 @@ static jsSyncMethodSpec js_msgbase_functions[] = {
 	,311
 	},
 	{"get_index",	js_get_index, 0, JSTYPE_ARRAY,	JSDOCSTR("")
-	,JSDOCSTR("return an array of message index records represented as objects, the same format as returned by <i>get_msg_index()</i>"
+	,JSDOCSTR("Return an array of message index records represented as objects, the same format as returned by <i>get_msg_index()</i>"
 		"<br>"
 		"This is the fastest method of obtaining a list of all message index records.")
 	,31702
 	},
 	{"remove_msg",		js_remove_msg,		2, JSTYPE_BOOLEAN,	JSDOCSTR("[by_offset=<tt>false</tt>,] number_or_offset_or_id")
-	,JSDOCSTR("mark message for deletion")
+	,JSDOCSTR("Mark message for deletion")
 	,311
 	},
 	{"save_msg",		js_save_msg,		2, JSTYPE_BOOLEAN,	JSDOCSTR("object header [,client=<i>none</i>] [,body_text=<tt>\"\"</tt>] [,array rcpt_list=<i>none</i>]")
-	,JSDOCSTR("create a new message in message base, the <i>header</i> object may contain the following properties:<br>"
+	,JSDOCSTR("Create a new message in message base, the <i>header</i> object may contain the following properties:<br>"
 	"<table>"
 	"<tr><td align=top><tt>subject</tt><td>Message subject <i>(required)</i>"
 	"<tr><td align=top><tt>to</tt><td>Recipient's name <i>(required)</i>"
@@ -3257,7 +3257,7 @@ static jsSyncMethodSpec js_msgbase_functions[] = {
 	,312
 	},
 	{"vote_msg",		js_vote_msg,		1, JSTYPE_BOOLEAN,	JSDOCSTR("object header")
-	,JSDOCSTR("create a new vote in message base, the <i>header</i> object should contain the following properties:<br>"
+	,JSDOCSTR("Create a new vote in message base, the <i>header</i> object should contain the following properties:<br>"
 	"<table>"
 	"<tr><td align=top><tt>from</tt><td>Sender's name <i>(required)</i>"
 	"<tr><td align=top><tt>from_ext</tt><td>Sender's user number (if applicable)"
@@ -3271,7 +3271,7 @@ static jsSyncMethodSpec js_msgbase_functions[] = {
 	,317
 	},
 	{"add_poll",		js_add_poll,		1, JSTYPE_BOOLEAN,	JSDOCSTR("object header")
-	,JSDOCSTR("create a new poll in message base, the <i>header</i> object should contain the following properties:<br>"
+	,JSDOCSTR("Create a new poll in message base, the <i>header</i> object should contain the following properties:<br>"
 	"<table>"
 	"<tr><td align=top><tt>subject</tt><td>Polling question <i>(required)</i>"
 	"<tr><td align=top><tt>from</tt><td>Sender's name <i>(required)</i>"
@@ -3283,7 +3283,7 @@ static jsSyncMethodSpec js_msgbase_functions[] = {
 	,317
 	},
 	{"close_poll",		js_close_poll,		2, JSTYPE_BOOLEAN,	JSDOCSTR("message number, user name or alias")
-	,JSDOCSTR("close an existing poll")
+	,JSDOCSTR("Close an existing poll")
 	,317
 	},
 	{"how_user_voted",		js_how_user_voted,		2, JSTYPE_NUMBER,	JSDOCSTR("message number, user name or alias")
@@ -3291,7 +3291,7 @@ static jsSyncMethodSpec js_msgbase_functions[] = {
 	,317
 	},
 	{"dump_msg_header",		js_dump_msg_header,		1,	JSTYPE_ARRAY,	JSDOCSTR("object header")
-		,JSDOCSTR("dump a message header object to an array of strings for diagnostic uses")
+		,JSDOCSTR("Dump a message header object to an array of strings for diagnostic uses")
 		,31702
 	},
 	{0}
diff --git a/src/sbbs3/js_queue.c b/src/sbbs3/js_queue.c
index aed059c39c9e9908e396c08febd0347885958b80..ce2ae64a028ab69576f9f8a2ddd9c311464ff698 100644
--- a/src/sbbs3/js_queue.c
+++ b/src/sbbs3/js_queue.c
@@ -1,7 +1,5 @@
 /* Synchronet JavaScript "Queue" Object */
 
-/* $Id: js_queue.c,v 1.57 2019/08/22 01:41:23 rswindell Exp $ */
-
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -15,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
@@ -277,10 +263,10 @@ enum {
 
 #ifdef BUILD_JSDOCS
 static char* queue_prop_desc[] = {
-	 "name of the queue (if it has one)"
+	 "Name of the queue (if it has one)"
 	,"<i>true</i> if data is waiting to be read from queue"
-	,"number of values in the read queue"
-	,"number of values in the write queue"
+	,"Number of values in the read queue"
+	,"Number of values in the write queue"
 	,"<i>true</i> if current thread is the owner/creator of the queue"
 	,"<i>true</i> if the owner of the queue has detached from the queue"
 	,NULL
@@ -350,24 +336,24 @@ static jsSyncPropertySpec js_queue_properties[] = {
 
 static jsSyncMethodSpec js_queue_functions[] = {
 	{"poll",		js_poll,		1,	JSTYPE_UNDEF,	"[timeout=<tt>0</tt>]"
-	,JSDOCSTR("wait for any value to be written to the queue for up to <i>timeout</i> milliseconds "
+	,JSDOCSTR("Wait for any value to be written to the queue for up to <i>timeout</i> milliseconds "
 		"(default: <i>0</i>), returns <i>true</i> or the <i>name</i> (string) of "
 		"the value waiting (if it has one), or <i>false</i> if no values are waiting")
 	,312
 	},
 	{"read",		js_read,		1,	JSTYPE_UNDEF,	"[string name] or [timeout=<tt>0</tt>]"
-	,JSDOCSTR("read a value from the queue, if <i>name</i> not specified, reads next value "
+	,JSDOCSTR("Read a value from the queue, if <i>name</i> not specified, reads next value "
 		"from the bottom of the queue (waiting up to <i>timeout</i> milliseconds)")
 	,313
 	},
 	{"peek",		js_peek,		1,	JSTYPE_UNDEF,	"[timeout=<tt>0</tt>]"
-	,JSDOCSTR("peek at the value at the bottom of the queue, "
+	,JSDOCSTR("Peek at the value at the bottom of the queue, "
 		"wait up to <i>timeout</i> milliseconds for any value to be written "
 		"(default: <i>0</i>)")
 	,313
 	},
 	{"write",		js_write,		1,	JSTYPE_BOOLEAN,	"value [,name=<i>none</i>]"
-	,JSDOCSTR("write a value (optionally named) to the queue")
+	,JSDOCSTR("Write a value (optionally named) to the queue")
 	,312
 	},
 	{0}
diff --git a/src/sbbs3/js_server.c b/src/sbbs3/js_server.c
index f0650fa03f247080e3ce07e3b3c7c57fa4d3f6ea..8f47c397d265c021461a6074d7e2f1187079d4ba 100644
--- a/src/sbbs3/js_server.c
+++ b/src/sbbs3/js_server.c
@@ -120,11 +120,11 @@ static jsSyncPropertySpec js_server_properties[] = {
 #ifdef BUILD_JSDOCS
 static char* server_prop_desc[] = {
 
-	 "server name and version number"
-	,"detailed version/build information"
+	 "Server name and version number"
+	,"Detailed version/build information"
 	,"First bound IPv4 address (<tt>0.0.0.0</tt> = <i>ANY</i>) (obsolete since 3.17, see interface_ip_addr_list)"
-	,"bit-field of server-specific startup options"
-	,"number of active clients (if available)"
+	,"Bit-field of server-specific startup options"
+	,"Number of active clients (if available)"
 	,"Array of IP addresses of bound network interface (<tt>0.0.0.0</tt> = <i>ANY</i>)"
 	,NULL
 };
@@ -248,7 +248,7 @@ JSObject* js_CreateServerObject(JSContext* cx, JSObject* parent
 		return(NULL);
 
 #ifdef BUILD_JSDOCS
-	js_DescribeSyncObject(cx,obj,"Server-specifc properties",310);
+	js_DescribeSyncObject(cx,obj,"Server-specific properties",310);
 	js_CreateArrayOfStrings(cx,obj,"_property_desc_list", server_prop_desc, JSPROP_READONLY);
 #endif
 
diff --git a/src/sbbs3/js_socket.c b/src/sbbs3/js_socket.c
index 8426006c8cde4df3077e372ead62a4a851620c89..693442399d16c1622cb04c81c993fa63e0d19907 100644
--- a/src/sbbs3/js_socket.c
+++ b/src/sbbs3/js_socket.c
@@ -2239,28 +2239,28 @@ enum {
 #ifdef BUILD_JSDOCS
 static char* socket_prop_desc[] = {
 	/* Regular properties */
-	 "error status for the last socket operation that failed - <small>READ ONLY</small>"
-	,"error description for the last socket operation that failed - <small>READ ONLY</small>"
+	 "Error status for the last socket operation that failed - <small>READ ONLY</small>"
+	,"Error description for the last socket operation that failed - <small>READ ONLY</small>"
 	,"<i>true</i> if socket is in a connected state - <small>READ ONLY</small>"
 	,"<i>true</i> if socket can accept written data - Setting to false will shutdown the write end of the socket."
-	,"alias for is_writeable"
+	,"Alias for is_writeable"
 	,"<i>true</i> if data is waiting to be read from socket - <small>READ ONLY</small>"
-	,"number of bytes waiting to be read - TLS sockets will never return more than 1 - <small>READ ONLY</small>"
-	,"enable debug logging"
-	,"socket descriptor (advanced uses only)"
-	,"use non-blocking operation (default is <i>false</i>)"
-	,"local IP address (string in dotted-decimal format)"
-	,"local TCP or UDP port number"
-	,"remote IP address (string in dotted-decimal format)"
-	,"remote TCP or UDP port number"
-	,"socket type, <tt>SOCK_STREAM</tt> (TCP) or <tt>SOCK_DGRAM</tt> (UDP)"
-	,"socket protocol family, <tt>PF_INET</tt> (IPv4) or <tt>PF_INET6</tt> (IPv6)"
+	,"Number of bytes waiting to be read - TLS sockets will never return more than 1 - <small>READ ONLY</small>"
+	,"Enable debug logging"
+	,"Socket descriptor (advanced uses only)"
+	,"Use non-blocking operation (default is <i>false</i>)"
+	,"Local IP address (string in dotted-decimal format)"
+	,"Local TCP or UDP port number"
+	,"Remote IP address (string in dotted-decimal format)"
+	,"Remote TCP or UDP port number"
+	,"Socket type, <tt>SOCK_STREAM</tt> (TCP) or <tt>SOCK_DGRAM</tt> (UDP)"
+	,"Socket protocol family, <tt>PF_INET</tt> (IPv4) or <tt>PF_INET6</tt> (IPv6)"
 	,"<i>true</i> if binary data is to be sent in Network Byte Order (big end first), default is <i>true</i>"
-	,"set to <i>true</i> to enable SSL as a client on the socket"
-	,"set to <i>true</i> to enable SSL as a server on the socket"
+	,"Set to <i>true</i> to enable SSL as a client on the socket"
+	,"Set to <i>true</i> to enable SSL as a server on the socket"
 
 	/* statically-defined properties: */
-	,"array of socket option names supported by the current platform"
+	,"Array of socket option names supported by the current platform"
 	,NULL
 };
 #endif
@@ -2597,110 +2597,110 @@ static jsSyncPropertySpec js_socket_properties[] = {
 
 static jsSyncMethodSpec js_socket_functions[] = {
 	{"close",		js_close,		0,	JSTYPE_VOID,	""
-	,JSDOCSTR("close (shutdown) the socket immediately")
+	,JSDOCSTR("Close (shutdown) the socket immediately")
 	,310
 	},
 	{"bind",		js_bind,		0,	JSTYPE_BOOLEAN,	JSDOCSTR("[port] [,ip_address]")
-	,JSDOCSTR("bind socket to a TCP or UDP <i>port</i> (number or service name), "
+	,JSDOCSTR("Bind socket to a TCP or UDP <i>port</i> (number or service name), "
 		"optionally specifying a network interface (via <i>ip_address</i>)")
 	,311
 	},
 	{"connect",     js_connect,     2,	JSTYPE_BOOLEAN,	JSDOCSTR("host, port [,timeout=<tt>10.0</tt>]")
-	,JSDOCSTR("connect to a remote port (number or service name) on the specified host (IP address or host name)"
+	,JSDOCSTR("Connect to a remote port (number or service name) on the specified host (IP address or host name)"
 	", default <i>timeout</i> value is <i>10.0</i> (seconds)")
 	,311
 	},
 	{"listen",		js_listen,		0,	JSTYPE_BOOLEAN,	JSDOCSTR("")
-	,JSDOCSTR("place socket in a state to listen for incoming connections (use before an accept)")
+	,JSDOCSTR("Place socket in a state to listen for incoming connections (use before an accept)")
 	,310
 	},
 	{"accept",		js_accept,		0,	JSTYPE_OBJECT,	JSDOCSTR("")
-	,JSDOCSTR("accept an incoming connection, returns a new <i>Socket</i> object representing the new connection")
+	,JSDOCSTR("Accept an incoming connection, returns a new <i>Socket</i> object representing the new connection")
 	,310
 	},
 	{"write",		js_send,		1,	JSTYPE_ALIAS },
 	{"send",		js_send,		1,	JSTYPE_NUMBER,	JSDOCSTR("data")
-	,JSDOCSTR("send a string (AKA write).  Returns the number of bytes sent or undefined if an error occured.  "
+	,JSDOCSTR("Send a string (AKA write).  Returns the number of bytes sent or undefined if an error occured.  "
 	"Versions before 3.17 returned a bool true if all bytes were sent and false otherwise.")
 	,310
 	},
 	{"writeln",		js_sendline,		1,	JSTYPE_ALIAS },
 	{"sendline",	js_sendline,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("data")
-	,JSDOCSTR("send a string (AKA write) with a carriage return line feed appended")
+	,JSDOCSTR("Send a string (AKA write) with a carriage return line feed appended")
 	,317
 	},
 	{"sendto",		js_sendto,		3,	JSTYPE_BOOLEAN,	JSDOCSTR("data, address, port")
-	,JSDOCSTR("send data to a specific host (IP address or host name) and port (number or service name), for UDP sockets")
+	,JSDOCSTR("Send data to a specific host (IP address or host name) and port (number or service name), for UDP sockets")
 	,310
 	},
 	{"sendfile",	js_sendfile,	1,	JSTYPE_BOOLEAN,	JSDOCSTR("path/filename")
-	,JSDOCSTR("send an entire file over the socket")
+	,JSDOCSTR("Send an entire file over the socket")
 	,310
 	},
 	{"writeBin",	js_sendbin,		1,	JSTYPE_ALIAS },
 	{"sendBin",		js_sendbin,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("value [,bytes=<tt>4</tt>]")
-	,JSDOCSTR("send a binary integer over the socket, default number of bytes is 4 (32-bits)")
+	,JSDOCSTR("Send a binary integer over the socket, default number of bytes is 4 (32-bits)")
 	,311
 	},
 	{"read",		js_recv,		1,	JSTYPE_ALIAS },
 	{"recv",		js_recv,		1,	JSTYPE_STRING,	JSDOCSTR("[maxlen=<tt>512</tt>, [timeout_sec=<tt>120</tt>]]")
-	,JSDOCSTR("receive a string, default maxlen is 512 characters (AKA read)")
+	,JSDOCSTR("Receive a string, default maxlen is 512 characters (AKA read)")
 	,310
 	},
 	{"peek",		js_peek,		0,	JSTYPE_STRING,	JSDOCSTR("[maxlen=<tt>512</tt>]")
-	,JSDOCSTR("receive a string, default maxlen is 512 characters, leaves string in receive buffer (TLS sockets will never return more than one byte)")
+	,JSDOCSTR("Receive a string, default maxlen is 512 characters, leaves string in receive buffer (TLS sockets will never return more than one byte)")
 	,310
 	},
 	{"readline",	js_recvline,	0,	JSTYPE_ALIAS },
 	{"readln",		js_recvline,	0,	JSTYPE_ALIAS },
 	{"recvline",	js_recvline,	0,	JSTYPE_STRING,	JSDOCSTR("[maxlen=<tt>512</tt>] [,timeout=<tt>30.0</tt>]")
-	,JSDOCSTR("receive a line-feed terminated string, default maxlen is 512 characters, default timeout is 30 seconds (AKA readline and readln)")
+	,JSDOCSTR("Receive a line-feed terminated string, default maxlen is 512 characters, default timeout is 30 seconds (AKA readline and readln)")
 	,310
 	},
 	{"recvfrom",	js_recvfrom,	0,	JSTYPE_OBJECT,	JSDOCSTR("[binary=<tt>false</tt>] [,maxlen=<tt>512</tt> or int_size=<tt>4</tt>]")
-	,JSDOCSTR("receive data (string or integer) from a socket (typically UDP)"
+	,JSDOCSTR("Receive data (string or integer) from a socket (typically UDP)"
 	"<p>returns object with <i>ip_address</i> and <i>port</i> of sender along with <i>data</i> properties"
 	"<p><i>binary</i> defaults to <i>false</i>, <i>maxlen</i> defaults to 512 chars, <i>int_size</i> defaults to 4 bytes (32-bits)")
 	,311
 	},
 	{"readBin",		js_recvbin,		0,	JSTYPE_ALIAS },
 	{"recvBin",		js_recvbin,		0,	JSTYPE_NUMBER,	JSDOCSTR("[bytes=<tt>4</tt>]")
-	,JSDOCSTR("receive a binary integer from the socket, default number of bytes is 4 (32-bits)")
+	,JSDOCSTR("Receive a binary integer from the socket, default number of bytes is 4 (32-bits)")
 	,311
 	},
 	{"getoption",	js_getsockopt,	1,	JSTYPE_NUMBER,	JSDOCSTR("option")
-	,JSDOCSTR("get socket option value, option may be socket option name "
+	,JSDOCSTR("Get socket option value, option may be socket option name "
 	"(see <tt>sockopts</tt> in <tt>sockdefs.js</tt>) or number")
 	,310
 	},
 	{"setoption",	js_setsockopt,	2,	JSTYPE_BOOLEAN,	JSDOCSTR("option, value")
-	,JSDOCSTR("set socket option value, option may be socket option name "
+	,JSDOCSTR("Set socket option value, option may be socket option name "
 	"(see <tt>sockopts</tt> in <tt>sockdefs.js</tt>) or number")
 	,310
 	},
 	{"ioctl",		js_ioctlsocket,	1,	JSTYPE_NUMBER,	JSDOCSTR("command [,argument=<tt>0</tt>]")
-	,JSDOCSTR("send socket IOCTL (advanced)")
+	,JSDOCSTR("Send socket IOCTL (advanced)")
 	,310
 	},
 	{"poll",		js_poll,		1,	JSTYPE_NUMBER,	JSDOCSTR("[timeout=<tt>0</tt>] [,write=<tt>false</tt>]")
-	,JSDOCSTR("poll socket for read or write ability (default is <i>read</i>), "
+	,JSDOCSTR("Poll socket for read or write ability (default is <i>read</i>), "
 	"default timeout value is 0.0 seconds (immediate timeout)")
 	,310
 	},
 	{"on",		js_on,		2,	JSTYPE_NUMBER,	JSDOCSTR("('read' | 'write'), callback")
-	,JSDOCSTR("execute callback whenever socket is readable/writable.  Returns an id to be passed to js.clearOn()")
+	,JSDOCSTR("Execute callback whenever socket is readable/writable.  Returns an id to be passed to js.clearOn()")
 	,31900
 	},
 	{"once",	js_once,	2,	JSTYPE_NUMBER,	JSDOCSTR("('read' | 'write'), callback")
-	,JSDOCSTR("execute callback next time socket is readable/writable  Returns and id to be passed to js.clearOnce()")
+	,JSDOCSTR("Execute callback next time socket is readable/writable  Returns and id to be passed to js.clearOnce()")
 	,31900
 	},
 	{"clearOn",	js_clearOn,	2,	JSTYPE_NUMBER,	JSDOCSTR("('read' | 'write'), id")
-	,JSDOCSTR("remove callback installed by Socket.on()")
+	,JSDOCSTR("Remove callback installed by Socket.on()")
 	,31900
 	},
 	{"clearOnce",	js_clearOnce,	2,	JSTYPE_NUMBER,	JSDOCSTR("('read' | 'write'), id")
-	,JSDOCSTR("remove callback installed by Socket.once()")
+	,JSDOCSTR("Remove callback installed by Socket.once()")
 	,31900
 	},
 	{0}
diff --git a/src/sbbs3/js_system.c b/src/sbbs3/js_system.c
index 45ef6fbf511dc9221ea6723f9f831646ec6ef57b..66b44430a0f3760785e1a2a37270e04ee2ee4f69 100644
--- a/src/sbbs3/js_system.c
+++ b/src/sbbs3/js_system.c
@@ -480,83 +480,83 @@ static jsSyncPropertySpec js_system_properties[] = {
 #ifdef BUILD_JSDOCS
 static char* sys_prop_desc[] = {
 	 "BBS name"
-	,"operator name"
-	,"operator is available for chat"
-	,"system QWK-ID (for QWK packets)"
-	,"settings bitfield (see <tt>SYS_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
+	,"Operator name"
+	,"Operator is available for chat"
+	,"System QWK-ID (for QWK packets)"
+	,"Settings bitfield (see <tt>SYS_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
 	,"Internet address (host or domain name)"
-	,"location (city, state)"
-	,"timezone (use <i>system.zonestr()</i> to get string representation)"
-	,"days between forced user password changes (<tt>0</tt>=<i>never</i>)"
-	,"minimum number of characters in user passwords"
-	,"maximum number of characters in user passwords"
-	,"days to preserve deleted user records, record will not be reused/overwritten during this period"
-	,"days of user inactivity before auto-deletion (<tt>0</tt>=<i>disabled</i>), N/A to P-exempt users"
-
-	,"last user record number in user database (includes deleted and inactive user records)"
-	,"name of last user to logoff"
-	,"amount of free disk space (in bytes)"
-	,"amount of free disk space (in kilobytes)"
-
-	,"total number of BBS nodes"
-	,"last displayable node number"
-
-	,"new user password"
-	,"new user magic word"
-	,"new user level"
-	,"new user flag set #1"
-	,"new user flag set #2"
-	,"new user flag set #3"
-	,"new user flag set #4"
-	,"new user restriction flags"
-	,"new user exemption flags"
-	,"new user credits"
-	,"new user extra minutes"
-	,"new user command shell"
-	,"new user external editor"
-	,"new user settings"
-	,"new user file transfer protocol (command key)"
-	,"new user expiration days"
-	,"new user questions bitfield (see <tt>UQ_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
-
-	,"expired user level"
-	,"expired user flag set #1"
-	,"expired user flag set #2"
-	,"expired user flag set #3"
-	,"expired user flag set #4"
-	,"expired user restriction flags"
-	,"expired user exemption flags"
+	,"Location (city, state)"
+	,"Timezone (use <i>system.zonestr()</i> to get string representation)"
+	,"Days between forced user password changes (<tt>0</tt>=<i>never</i>)"
+	,"Minimum number of characters in user passwords"
+	,"Maximum number of characters in user passwords"
+	,"Days to preserve deleted user records, record will not be reused/overwritten during this period"
+	,"Days of user inactivity before auto-deletion (<tt>0</tt>=<i>disabled</i>), N/A to P-exempt users"
+
+	,"Last user record number in user database (includes deleted and inactive user records)"
+	,"Name of last user to logoff"
+	,"Amount of free disk space (in bytes)"
+	,"Amount of free disk space (in kilobytes)"
+
+	,"Total number of BBS nodes"
+	,"Last displayable node number"
+
+	,"New user password"
+	,"New user magic word"
+	,"New user level"
+	,"New user flag set #1"
+	,"New user flag set #2"
+	,"New user flag set #3"
+	,"New user flag set #4"
+	,"New user restriction flags"
+	,"New user exemption flags"
+	,"New user credits"
+	,"New user extra minutes"
+	,"New user command shell"
+	,"New user external editor"
+	,"New user settings"
+	,"New user file transfer protocol (command key)"
+	,"New user expiration days"
+	,"New user questions bitfield (see <tt>UQ_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
+
+	,"Expired user level"
+	,"Expired user flag set #1"
+	,"Expired user flag set #2"
+	,"Expired user flag set #3"
+	,"Expired user flag set #4"
+	,"Expired user restriction flags"
+	,"Expired user exemption flags"
 
 	/* directories */
-	,"node directory"
-	,"control file directory"
-	,"data file directory"
-	,"text file directory"
-	,"temporary file directory"
-	,"executable file directory"
-	,"modified modules directory (optional)"
-	,"log file directory"
+	,"Node directory"
+	,"Control file directory"
+	,"Data file directory"
+	,"Text file directory"
+	,"Temporary file directory"
+	,"Executable file directory"
+	,"Modified modules directory (optional)"
+	,"Log file directory"
 
 	/* filenames */
-	,"platform-specific \"null\" device filename"
-	,"platform-specific temporary file directory"
-	,"platform-specific command processor/shell"
+	,"Platform-specific \"null\" device filename"
+	,"Platform-specific temporary file directory"
+	,"Platform-specific command processor/shell"
 
 	/* clock */
-	,"amount of elapsed time in clock 'ticks'"
-	,"number of clock ticks per second"
-	,"high-resolution timer, in seconds (fractional seconds supported)"
+	,"Amount of elapsed time in clock 'ticks'"
+	,"Number of clock ticks per second"
+	,"High-resolution timer, in seconds (fractional seconds supported)"
 
-	,"private host name that uniquely identifies this system on the local network"
-	,"array of nameservers in use by the system"
+	,"Private host name that uniquely identifies this system on the local network"
+	,"Array of nameservers in use by the system"
 	/* INSERT new tabled properties here */
 
 	/* Manually created (non-tabled) properties */
-	,"public host name that uniquely identifies this system on the Internet (usually the same as <i>system.inet_addr</i>)"
-	,"socket library version information"
-	,"time/date system was brought online (in time_t format)"
+	,"Public host name that uniquely identifies this system on the Internet (usually the same as <i>system.inet_addr</i>)"
+	,"Socket library version information"
+	,"Time/date system was brought online (in time_t format)"
 	,"Synchronet full version information (e.g. '3.10k Beta Debug')"
-	,"date and time compiled"
+	,"Date and time compiled"
 	,"Synchronet version number (e.g. '3.10')"
 	,"Synchronet revision letter (e.g. 'k')"
 	,"Synchronet alpha/beta designation (e.g. ' beta')"
@@ -565,14 +565,14 @@ static char* sys_prop_desc[] = {
 	,"Synchronet version number in hexadecimal (e.g. 0x31301 for v3.13b)"
 	,"Synchronet Git repository branch name"
 	,"Synchronet Git repository commit hash"
-	,"platform description (e.g. 'Win32', 'Linux', 'FreeBSD')"
-	,"architecture description (e.g. 'i386', 'i686', 'x86_64')"
-	,"message base library version information"
-	,"compiler used to build Synchronet"
+	,"Platform description (e.g. 'Win32', 'Linux', 'FreeBSD')"
+	,"Architecture description (e.g. 'i386', 'i686', 'x86_64')"
+	,"Message base library version information"
+	,"Compiler used to build Synchronet"
 	,"Synchronet copyright display"
 	,"JavaScript engine version information"
-	,"operating system version information"
-	,"array of FidoNet Technology Network (FTN) addresses associated with this system"
+	,"Operating system version information"
+	,"Array of FidoNet Technology Network (FTN) addresses associated with this system"
 	,NULL
 };
 #endif
@@ -738,23 +738,23 @@ static jsSyncPropertySpec js_sysstats_properties[] = {
 
 #if !defined(JSDOOR) && defined(BUILD_JSDOCS)
 static char* sysstat_prop_desc[] = {
-	 "total logons"
-	,"logons today"
-	,"total time used"
-	,"time used today"
-	,"total files in file bases"
-	,"files uploaded today"
-	,"bytes uploaded today"
-	,"files downloaded today"
-	,"bytes downloaded today"
-	,"total messages in message bases"
-	,"messages posted today"
-	,"total messages in mail base"
-	,"email sent today"
-	,"total feedback messages waiting"
-	,"feedback sent today"
-	,"total user records (does not include deleted or inactive user records)"
-	,"new users today"
+	 "Total logons"
+	,"Logons today"
+	,"Total time used"
+	,"Time used today"
+	,"Total files in file bases"
+	,"Files uploaded today"
+	,"Bytes uploaded today"
+	,"Files downloaded today"
+	,"Bytes downloaded today"
+	,"Total messages in message bases"
+	,"Messages posted today"
+	,"Total messages in mail base"
+	,"Email sent today"
+	,"Total feedback messages waiting"
+	,"Feedback sent today"
+	,"Total user records (does not include deleted or inactive user records)"
+	,"New users today"
 	,NULL
 };
 #endif
@@ -2127,24 +2127,24 @@ js_text(JSContext *cx, uintN argc, jsval *arglist)
 static jsSyncMethodSpec js_system_functions[] = {
 #ifndef JSDOOR
 	{"username",		js_username,		1,	JSTYPE_STRING,	JSDOCSTR("user_number")
-	,JSDOCSTR("returns name of user in specified user record <i>number</i>, or empty string if not found")
+	,JSDOCSTR("Returns name of user in specified user record <i>number</i>, or empty string if not found")
 	,311
 	},
 	{"alias",			js_alias,			1,	JSTYPE_STRING,	JSDOCSTR("alias")
-	,JSDOCSTR("returns name of user that matches alias (if found in <tt>ctrl/alias.cfg</tt>)")
+	,JSDOCSTR("Returns name of user that matches alias (if found in <tt>ctrl/alias.cfg</tt>)")
 	,310
 	},
 	{"find_login_id",	js_find_login_id,	1,	JSTYPE_NUMBER,	JSDOCSTR("user-id")
-	,JSDOCSTR("find a user's login ID (alias, real name, or number), returns matching user record number or 0 if not found")
+	,JSDOCSTR("Find a user's login ID (alias, real name, or number), returns matching user record number or 0 if not found")
 	,32000
 	},
 	{"matchuser",		js_matchuser,		1,	JSTYPE_NUMBER,	JSDOCSTR("username [,sysop_alias=<tt>true</tt>]")
-	,JSDOCSTR("exact user name matching, returns number of user whose name/alias matches <i>username</i> "
+	,JSDOCSTR("Exact user name matching, returns number of user whose name/alias matches <i>username</i> "
 		" or 0 if not found, matches well-known sysop aliases by default")
 	,310
 	},
 	{"matchuserdata",	js_matchuserdata,	2,	JSTYPE_NUMBER,	JSDOCSTR("field, data [,match_del=<tt>false</tt>] [,usernumber, match_next=<tt>false</tt>]")
-	,JSDOCSTR("search user database for data in a specific field (see <tt>U_*</tt> in <tt>sbbsdefs.js</tt>), "
+	,JSDOCSTR("Search user database for data in a specific field (see <tt>U_*</tt> in <tt>sbbsdefs.js</tt>), "
 		"if <i>match_del</i> is <tt>true</tt>, deleted user records are searched, "
 		"returns first matching user record number, optional <i>usernumber</i> specifies user record to skip, "
 		"or record at which to begin searching if optional <i>match_next</i> is <tt>true</tt>")
@@ -2152,133 +2152,133 @@ static jsSyncMethodSpec js_system_functions[] = {
 	},
 #endif
 	{"trashcan",		js_trashcan,		2,	JSTYPE_BOOLEAN,	JSDOCSTR("basename, find_string")
-	,JSDOCSTR("search <tt>text/<i>basename</i>.can</tt> for pseudo-regexp")
+	,JSDOCSTR("Search <tt>text/<i>basename</i>.can</tt> for pseudo-regexp")
 	,310
 	},
 	{"findstr",			js_findstr,			2,	JSTYPE_BOOLEAN,	JSDOCSTR("path/filename or array of strings, find_string")
-	,JSDOCSTR("search any trashcan/filter file or array of pattern strings (in <tt>*.can</tt> format) for <i>find_string</i>")
+	,JSDOCSTR("Search any trashcan/filter file or array of pattern strings (in <tt>*.can</tt> format) for <i>find_string</i>")
 	,310
 	},
 	{"zonestr",			js_zonestr,			0,	JSTYPE_STRING,	JSDOCSTR("[timezone=<i>local</i>]")
-	,JSDOCSTR("convert time zone integer to string, defaults to system timezone if <i>timezone</i> not specified")
+	,JSDOCSTR("Convert time zone integer to string, defaults to system timezone if <i>timezone</i> not specified")
 	,310
 	},
 	{"timestr",			js_timestr,			0,	JSTYPE_STRING,	JSDOCSTR("[time=<i>current</i>]")
-	,JSDOCSTR("convert time_t integer into a time string, "
+	,JSDOCSTR("Convert time_t integer into a time string, "
 		"defaults to current time if <i>time</i> not specified")
 	,310
 	},
 	{"datestr",			js_datestr,			0,	JSTYPE_STRING,	JSDOCSTR("[time=<i>current</i>]")
-	,JSDOCSTR("convert time_t integer into a date string (in either <tt>MM/DD/YY</tt> or <tt>DD/MM/YY</tt> format), "
+	,JSDOCSTR("Convert time_t integer into a date string (in either <tt>MM/DD/YY</tt> or <tt>DD/MM/YY</tt> format), "
 		"defaults to current date if <i>time</i> not specified. "
 		"If <i>time</i> is a string in the appropriate format, returns the time_t.")
 	,310
 	},
 	{"secondstr",		js_secondstr,		0,	JSTYPE_STRING,	JSDOCSTR("seconds")
-	,JSDOCSTR("convert elapsed time in seconds into a string in <tt>hh:mm:ss</tt> format")
+	,JSDOCSTR("Convert elapsed time in seconds into a string in <tt>hh:mm:ss</tt> format")
 	,310
 	},
 #ifndef JSDOOR
 	{"spamlog",			js_spamlog,			6,	JSTYPE_BOOLEAN,	JSDOCSTR("[protocol, action, reason, host, ip, to, from]")
-	,JSDOCSTR("log a suspected SPAM attempt")
+	,JSDOCSTR("Log a suspected SPAM attempt")
 	,310
 	},
 	{"hacklog",			js_hacklog,			5,	JSTYPE_BOOLEAN,	JSDOCSTR("[protocol, user, text, host, ip, port]")
-	,JSDOCSTR("log a suspected hack attempt")
+	,JSDOCSTR("Log a suspected hack attempt")
 	,310
 	},
 	{"filter_ip",		js_filter_ip,		4,	JSTYPE_BOOLEAN,	JSDOCSTR("[protocol, reason, host, ip, username, filename]")
-	,JSDOCSTR("add an IP address (with comment) to an IP filter file. If filename is not specified, the ip.can file is used")
+	,JSDOCSTR("Add an IP address (with comment) to an IP filter file. If filename is not specified, the ip.can file is used")
 	,311
 	},
 	{"get_node",		js_get_node,		1,	JSTYPE_OBJECT,	JSDOCSTR("node_number")
-	,JSDOCSTR("read a node data record all at once (and leaving the record unlocked) "
+	,JSDOCSTR("Read a node data record all at once (and leaving the record unlocked) "
 		"returning an object matching the elements of <tt>system.node_list</tt>")
 	,31702
 	},
 	{"get_node_message",js_get_node_message,0,	JSTYPE_STRING,	JSDOCSTR("node_number")
-	,JSDOCSTR("read any messages waiting for the specified node and return in a single string")
+	,JSDOCSTR("Read any messages waiting for the specified node and return in a single string")
 	,311
 	},
 	{"put_node_message",js_put_node_message,2,	JSTYPE_BOOLEAN,	JSDOCSTR("node_number, message_text")
-	,JSDOCSTR("send a node a short text message, delivered immediately")
+	,JSDOCSTR("Send a node a short text message, delivered immediately")
 	,310
 	},
 	{"get_telegram",	js_get_telegram,	1,	JSTYPE_STRING,	JSDOCSTR("user_number")
-	,JSDOCSTR("returns any short text messages waiting for the specified user")
+	,JSDOCSTR("Returns any short text messages waiting for the specified user")
 	,311
 	},
 	{"put_telegram",	js_put_telegram,	2,	JSTYPE_BOOLEAN,	JSDOCSTR("user_number, message_text")
-	,JSDOCSTR("sends a user a short text message, delivered immediately or during next logon")
+	,JSDOCSTR("Sends a user a short text message, delivered immediately or during next logon")
 	,310
 	},
 	{"notify",			js_notify,			2,	JSTYPE_BOOLEAN,	JSDOCSTR("user_number, subject [,message_text]")
-	,JSDOCSTR("notify a user or operator via both email and a short text message about an important event")
+	,JSDOCSTR("Notify a user or operator via both email and a short text message about an important event")
 	,31801
 	},
 	{"newuser",			js_new_user,		1,	JSTYPE_ALIAS },
 	{"new_user",		js_new_user,		1,	JSTYPE_OBJECT,	JSDOCSTR("name/alias [,client object]")
-	,JSDOCSTR("creates a new user record, returns a new <a href=#User>User</a> object representing the new user account, on success.<br>"
+	,JSDOCSTR("Creates a new user record, returns a new <a href=#User>User</a> object representing the new user account, on success.<br>"
 	"returns an numeric error code on failure (optional <i>client</i> object argument added in v3.15a.  As of 3.16c, the global "
 	"client object is used if the argument is omitted)")
 	,310
 	},
 	{"del_user",		js_del_user,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("user_number")
-	,JSDOCSTR("delete the specified user account")
+	,JSDOCSTR("Delete the specified user account")
 	,316
 	},
 #endif
 	{"exec",			js_sys_exec,		0,	JSTYPE_NUMBER,	JSDOCSTR("command-line")
-	,JSDOCSTR("executes a native system/shell command-line, returns <i>0</i> on success")
+	,JSDOCSTR("Executes a native system/shell command-line, returns <i>0</i> on success")
 	,311
 	},
 	{"popen",			js_popen,			0,	JSTYPE_ARRAY,	JSDOCSTR("command-line")
-	,JSDOCSTR("executes a native system/shell command-line, returns array of captured output lines on success "
+	,JSDOCSTR("Executes a native system/shell command-line, returns array of captured output lines on success "
 		"(<b>only functional on UNIX systems</b>)")
 	,311
 	},
 #ifndef JSDOOR
 	{"check_syspass",	js_chksyspass,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("password")
-	,JSDOCSTR("compares the supplied <i>password</i> against the system password and returns <i>true</i> if it matches")
+	,JSDOCSTR("Compares the supplied <i>password</i> against the system password and returns <i>true</i> if it matches")
 	,311
 	},
 	{"check_name",		js_chkname,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("name/alias")
-	,JSDOCSTR("checks that the provided name/alias string is suitable for a new user account, "
+	,JSDOCSTR("Checks that the provided name/alias string is suitable for a new user account, "
 		"returns <i>true</i> if it is valid")
 	,315
 	},
 	{"check_filename",	js_chkfname,		1,	JSTYPE_BOOLEAN,	JSDOCSTR("filename")
-	,JSDOCSTR("verify that the specified <i>filename</i> string is legal and allowed for upload by users "
+	,JSDOCSTR("Verify that the specified <i>filename</i> string is legal and allowed for upload by users "
 		"(based on system configuration), returns <i>true</i> if the filename is allowed")
 	,31902
 	},
 	{"allowed_filename", js_allowed_fname,	1,	JSTYPE_BOOLEAN,	JSDOCSTR("filename")
-	,JSDOCSTR("verify that the specified <i>filename</i> string is allowed for upload by users "
+	,JSDOCSTR("Verify that the specified <i>filename</i> string is allowed for upload by users "
 		"(based on system configuration), returns <i>true</i> if the filename is allowed")
 	,31902
 	},
 	{"safest_filename",	js_safest_fname,	1,	JSTYPE_BOOLEAN,	JSDOCSTR("filename")
-	,JSDOCSTR("verify that the specified <i>filename</i> string contains only the safest subset of characters")
+	,JSDOCSTR("Verify that the specified <i>filename</i> string contains only the safest subset of characters")
 	,31902
 	},
 	{"illegal_filename", js_illegal_fname,	1,	JSTYPE_BOOLEAN,	JSDOCSTR("filename")
-	,JSDOCSTR("check if the specified <i>filename</i> string contains illegal characters or sequences, "
+	,JSDOCSTR("Check if the specified <i>filename</i> string contains illegal characters or sequences, "
 		"returns <i>true</i> if it is an illegal filename")
 	,31902
 	},
 #endif
 	{"check_pid",		js_chkpid,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("process-ID")
-	,JSDOCSTR("checks that the provided process ID is a valid executing process on the system, "
+	,JSDOCSTR("Checks that the provided process ID is a valid executing process on the system, "
 		"returns <i>true</i> if it is valid")
 	,315
 	},
 	{"terminate_pid",	js_killpid,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("process-ID")
-	,JSDOCSTR("terminates executing process on the system with the specified process ID, "
+	,JSDOCSTR("Terminates executing process on the system with the specified process ID, "
 		"returns <i>true</i> on success")
 	,315
 	},
 	{"text",			js_text,			1,	JSTYPE_STRING,	JSDOCSTR("number")
-	,JSDOCSTR("returns specified text string from text.dat (like <tt>bbs.text()</tt>) or returns <i>null</i> upon error")
+	,JSDOCSTR("Returns specified text string from text.dat (like <tt>bbs.text()</tt>) or returns <i>null</i> upon error")
 	,31802
 	},
 	{0}
@@ -2301,15 +2301,15 @@ enum {
 
 #ifdef BUILD_JSDOCS
 static char* node_prop_desc[] = {
-	 "status (see <tt>nodedefs.js</tt> for valid values)"
-	,"error counter"
-	,"current user action (see <tt>nodedefs.js</tt>)"
-	,"current user number"
-	,"connection speed (<tt>0xffff</tt> = Telnet or RLogin)"
-	,"miscellaneous bitfield (see <tt>nodedefs.js</tt>)"
-	,"auxillary value"
-	,"extended auxillary value"
-	,"node directory"
+	 "Status (see <tt>nodedefs.js</tt> for valid values)"
+	,"Error counter"
+	,"Current user action (see <tt>nodedefs.js</tt>)"
+	,"Current user number"
+	,"Connection speed (<tt>0xffff</tt> = Telnet or RLogin)"
+	,"Miscellaneous bitfield (see <tt>nodedefs.js</tt>)"
+	,"Auxillary value"
+	,"Extended auxillary value"
+	,"Node directory"
 	,NULL
 };
 #endif
diff --git a/src/sbbs3/js_uifc.c b/src/sbbs3/js_uifc.c
index a4de390b4a128438c2faa498d7dc1b1abcbb765d..5670d87c62fdd08330dd0a5b796b77c5569f47a2 100644
--- a/src/sbbs3/js_uifc.c
+++ b/src/sbbs3/js_uifc.c
@@ -1,5 +1,5 @@
-/* js_uifc.c */
 /* Synchronet "uifc" (user interface) object */
+
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
@@ -13,21 +13,9 @@
  * See the GNU General Public License for more details: gpl.txt or			*
  * http://www.fsf.org/copyleft/gpl.html										*
  *																			*
- * Anonymous FTP access to the most recent released source is available at	*
- * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
- *																			*
- * Anonymous CVS access to the development source and modification history	*
- * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
- *     (just hit return, no password is necessary)							*
- * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
- *																			*
  * For Synchronet coding style and modification guidelines, see				*
  * http://www.synchro.net/source.html										*
  *																			*
- * You are encouraged to submit any modifications (preferably in Unix diff	*
- * format) via e-mail to mods@synchro.net									*
- *																			*
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 #ifndef JAVASCRIPT
@@ -1135,28 +1123,28 @@ js_finalize(JSContext *cx, JSObject *obj)
 }
 static jsSyncMethodSpec js_functions[] = {
 	{"init",            js_uifc_init,       1,	JSTYPE_BOOLEAN,	JSDOCSTR("string title [, string mode]")
-	,JSDOCSTR("initialize.  <tt>mode</tt> is a string representing the desired conio mode... one of STDIO, AUTO, "
+	,JSDOCSTR("Initialize.  <tt>mode</tt> is a string representing the desired conio mode... one of STDIO, AUTO, "
 	"X, CURSES, ANSI, CONIO, or SDL.")
 	,314
 	},
 	{"bail",			js_uifc_bail,		0,	JSTYPE_VOID,	JSDOCSTR("")
-	,JSDOCSTR("uninitialize")
+	,JSDOCSTR("Uninitialize")
 	,314
 	},
 	{"msg",				js_uifc_msg,		1,	JSTYPE_VOID,	JSDOCSTR("string text")
-	,JSDOCSTR("print a message")
+	,JSDOCSTR("Print a message")
 	,314
 	},
 	{"pop",				js_uifc_pop,		1,	JSTYPE_VOID,	JSDOCSTR("[string text]")
-	,JSDOCSTR("popup (or down) a message")
+	,JSDOCSTR("Pop-up (or down) a message. Pop-down by passing no <i>text</i> argument.")
 	,314
 	},
 	{"input",			js_uifc_input,		0,	JSTYPE_STRING,	JSDOCSTR("[number mode] [,number left] [,number top] [,string default] [,number maxlen] [,number kmode]")
-	,JSDOCSTR("prompt for a string input")
+	,JSDOCSTR("Prompt for a string input")
 	,314
 	},
 	{"list",			js_uifc_list,		0,	JSTYPE_NUMBER,	JSDOCSTR("[number mode,] string title, array options [,uifc.list.CTX object]")
-	,JSDOCSTR("select from a list of options.<br>"
+	,JSDOCSTR("Select from a list of options.<br>"
 		"The context object can be created using new uifc.list.CTX() and if the same object is passed, allows WIN_SAV to work correctly.<br>"
 		"The context object has the following properties:<br>cur, bar, top, left, width"
 	)
@@ -1263,7 +1251,7 @@ JSObject* js_CreateUifcObject(JSContext* cx, JSObject* parent)
 	if(!JS_SetPrivate(cx, obj, api))	/* Store a pointer to uifcapi_t */
 		return(NULL);
 #ifdef BUILD_JSDOCS
-	js_DescribeSyncObject(cx,obj,"User InterFaCe object - used for jsexec menus" ,314);
+	js_DescribeSyncObject(cx,obj,"User InterFaCe object - Text User Interface (TUI) menu system for JSexec" ,314);
 	js_CreateArrayOfStrings(cx, obj, "_property_desc_list", uifc_prop_desc, JSPROP_READONLY);
 #endif
 	return(obj);
diff --git a/src/sbbs3/js_user.c b/src/sbbs3/js_user.c
index 15c3ce52b9ab82b340cddd1adcf64eef0ba18620..3b654494f8bfdd3cd59ac2c75cb72c7b9258c3e8 100644
--- a/src/sbbs3/js_user.c
+++ b/src/sbbs3/js_user.c
@@ -837,46 +837,46 @@ static jsSyncPropertySpec js_user_properties[] = {
 #ifdef BUILD_JSDOCS
 static char* user_prop_desc[] = {
 
-	 "record number (1-based)"
-	,"alias/name"
-	,"real name"
-	,"chat handle"
+	 "Record number (1-based)"
+	,"Alias/name"
+	,"Real name"
+	,"Chat handle"
 	,"IP address last logged on from"
 	,"Sysop note (AKA ip_address on 3.16 and before)"
-	,"host name last logged on from"
+	,"Host name last logged on from"
 	,"AKA host_name"
-	,"sysop's comment"
-	,"external e-mail address"
-	,"local Internet e-mail address	- <small>READ ONLY</small>"
-	,"street address"
-	,"location (e.g. city, state)"
-	,"zip/postal code"
-	,"phone number"
-	,"birth date in 'YYYYMMDD' format or legacy format: 'MM/DD/YY' or 'DD/MM/YY', depending on system configuration"
-	,"birth year"
-	,"birth month (1-12)"
-	,"birth day of month (1-31)"
-	,"calculated age in years - <small>READ ONLY</small>"
-	,"connection type (protocol)"
+	,"Sysop's comment"
+	,"External e-mail address"
+	,"Local Internet e-mail address	- <small>READ ONLY</small>"
+	,"Street address"
+	,"Location (e.g. city, state)"
+	,"Zip/postal code"
+	,"Phone number"
+	,"Birth date in 'YYYYMMDD' format or legacy format: 'MM/DD/YY' or 'DD/MM/YY', depending on system configuration"
+	,"Birth year"
+	,"Birth month (1-12)"
+	,"Birth day of month (1-31)"
+	,"Calculated age in years - <small>READ ONLY</small>"
+	,"Connection type (protocol)"
 	,"AKA connection"
-	,"terminal rows (0 = auto-detect)"
-	,"terminal columns (0 = auto-detect)"
-	,"gender type (e.g. M or F or any single-character)"
-	,"current/last message sub-board (internal code)"
-	,"current/last file directory (internal code)"
-	,"current/last external program (internal code) run"
-	,"external message editor (internal code) or <i>blank</i> if none"
-	,"command shell (internal code)"
-	,"settings bitfield - see <tt>USER_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
+	,"Terminal rows (0 = auto-detect)"
+	,"Terminal columns (0 = auto-detect)"
+	,"Gender type (e.g. M or F or any single-character)"
+	,"Current/last message sub-board (internal code)"
+	,"Current/last file directory (internal code)"
+	,"Current/last external program (internal code) run"
+	,"External message editor (internal code) or <i>blank</i> if none"
+	,"Command shell (internal code)"
+	,"Settings bitfield - see <tt>USER_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
 	,"QWK packet settings bitfield - see <tt>QWK_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
-	,"chat settings bitfield - see <tt>CHAT_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
-	,"mail settings bitfield - see <tt>MAIL_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
-	,"temporary file type (extension)"
-	,"new file scan date/time (time_t format)"
-	,"file transfer protocol (command key)"
-	,"logon time (time_t format)"
-	,"record is currently cached in memory"
-	,"user has a System Operator's security level"
+	,"Chat settings bitfield - see <tt>CHAT_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
+	,"Mail settings bitfield - see <tt>MAIL_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
+	,"Temporary file type (extension)"
+	,"New file scan date/time (time_t format)"
+	,"File transfer protocol (command key)"
+	,"Logon time (time_t format)"
+	,"Record is currently cached in memory"
+	,"User has a System Operator's security level"
 	,NULL
 };
 #endif
@@ -906,20 +906,20 @@ static jsSyncPropertySpec js_user_security_properties[] = {
 #ifdef BUILD_JSDOCS
 static char* user_security_prop_desc[] = {
 
-	 "password"
-	,"date password last modified (time_t format)"
-	,"security level (0-99)"
-	,"flag set #1 (bitfield) can use +/-[A-?] notation"
-	,"flag set #2 (bitfield) can use +/-[A-?] notation"
-	,"flag set #3 (bitfield) can use +/-[A-?] notation"
-	,"flag set #4 (bitfield) can use +/-[A-?] notation"
-	,"exemption flags (bitfield) can use +/-[A-?] notation"
-	,"restriction flags (bitfield) can use +/-[A-?] notation"
-	,"credits"
-	,"free credits (for today only)"
-	,"extra minutes (time bank)"
-	,"extra minutes (for today only)"
-	,"expiration date/time (time_t format)"
+	 "Password"
+	,"Date password last modified (time_t format)"
+	,"Security level (0-99)"
+	,"Flag set #1 (bitfield) can use +/-[A-?] notation"
+	,"Flag set #2 (bitfield) can use +/-[A-?] notation"
+	,"Flag set #3 (bitfield) can use +/-[A-?] notation"
+	,"Flag set #4 (bitfield) can use +/-[A-?] notation"
+	,"Exemption flags (bitfield) can use +/-[A-?] notation"
+	,"Restriction flags (bitfield) can use +/-[A-?] notation"
+	,"Credits"
+	,"Free credits (for today only)"
+	,"Extra minutes (time bank)"
+	,"Extra minutes (for today only)"
+	,"Expiration date/time (time_t format)"
 	,NULL
 };
 #endif
@@ -945,13 +945,13 @@ static jsSyncPropertySpec js_user_limits_properties[] = {
 #ifdef BUILD_JSDOCS
 static char* user_limits_prop_desc[] = {
 
-	 "time (in minutes) per logon"
-	,"time (in minutes) per day"
-	,"logons per day"
-	,"lines per message (post or email)"
-	,"email sent per day"
-	,"messages posted per day"
-	,"free credits given per day"
+	 "Time (in minutes) per logon"
+	,"Time (in minutes) per day"
+	,"Logons per day"
+	,"Lines per message (post or email)"
+	,"Email sent per day"
+	,"Messages posted per day"
+	,"Free credits given per day"
 	,NULL
 };
 #endif
@@ -993,29 +993,29 @@ static jsSyncPropertySpec js_user_stats_properties[] = {
 #ifdef BUILD_JSDOCS
 static char* user_stats_prop_desc[] = {
 
-	 "date of previous logon (time_t format)"
-	,"date of first logon (time_t format)"
-	,"total number of logons"
-	,"total logons today"
-	,"total time used (in minutes)"
-	,"time used today (in minutes)"
-	,"time used last session (in minutes)"
-	,"total messages posted"
-	,"total e-mails sent"
-	,"total feedback messages sent"
-	,"e-mail sent today"
-	,"messages posted today"
-	,"total bytes uploaded"
-	,"total files uploaded"
-	,"total bytes downloaded"
-	,"total files downloaded"
-	,"latest average download rate, in characters (bytes) per second"
-	,"suspected leech downloads"
-	,"total number of e-mail messages currently waiting in inbox"
-	,"number of read e-mail messages currently waiting in inbox"
-	,"number of unread e-mail messages currently waiting in inbox"
-	,"number of SPAM e-mail messages currently waiting in inbox"
-	,"number of e-mail messages sent, currently pending deletion"
+	 "Date of previous logon (time_t format)"
+	,"Date of first logon (time_t format)"
+	,"Total number of logons"
+	,"Total logons today"
+	,"Total time used (in minutes)"
+	,"Time used today (in minutes)"
+	,"Time used last session (in minutes)"
+	,"Total messages posted"
+	,"Total e-mails sent"
+	,"Total feedback messages sent"
+	,"E-mail sent today"
+	,"Messages posted today"
+	,"Total bytes uploaded"
+	,"Total files uploaded"
+	,"Total bytes downloaded"
+	,"Total files downloaded"
+	,"Latest average download rate, in characters (bytes) per second"
+	,"Suspected leech downloads"
+	,"Total number of e-mail messages currently waiting in inbox"
+	,"Number of read e-mail messages currently waiting in inbox"
+	,"Number of unread e-mail messages currently waiting in inbox"
+	,"Number of SPAM e-mail messages currently waiting in inbox"
+	,"Number of e-mail messages sent, currently pending deletion"
 	,NULL
 };
 #endif
diff --git a/src/sbbs3/js_xtrn_area.c b/src/sbbs3/js_xtrn_area.c
index a54c20fc8e3b747202adca463110cdca5c7fad95..b86d6f755ffcca03a41743ba46737628650c9e74 100644
--- a/src/sbbs3/js_xtrn_area.c
+++ b/src/sbbs3/js_xtrn_area.c
@@ -27,65 +27,65 @@
 
 static char* xtrn_sec_prop_desc[] = {
 
-	 "index into sec_list array (or -1 if not in index) <i>(introduced in v3.12)</i>"
-	,"unique number for this external program section"
-	,"external program section internal code"
-	,"external program section name"
-	,"external program section access requirements"
-	,"user has sufficient access to enter this section <i>(introduced in v3.15)</i>"
+	 "Index into sec_list array (or -1 if not in index) <i>(introduced in v3.12)</i>"
+	,"Unique number for this external program section"
+	,"External program section internal code"
+	,"External program section name"
+	,"External program section access requirements"
+	,"User has sufficient access to enter this section <i>(introduced in v3.15)</i>"
 	,NULL
 };
 
 static char* xtrn_prog_prop_desc[] = {
 
-	 "index into prog_list array (or -1 if not in index) <i>(introduced in v3.12)</i>"
-	,"program number"
-	,"program section index <i>(introduced in v3.12)</i>"
-	,"program section number"
-	,"program section internal code <i>(introduced in v3.12)</i>"
-	,"internal code"
-	,"name"
-	,"command-line"
-	,"clean-up command-line"
-	,"startup directory"
-	,"access requirements"
-	,"execution requirements"
-	,"toggle options (bitfield)"
-	,"drop file type"
-	,"event type (0=none)"
-	,"extra time given to users running this program"
-	,"maximum time allowed in program"
-	,"execution cost (credits to run this program)"
+	 "Index into prog_list array (or -1 if not in index) <i>(introduced in v3.12)</i>"
+	,"Program number"
+	,"Program section index <i>(introduced in v3.12)</i>"
+	,"Program section number"
+	,"Program section internal code <i>(introduced in v3.12)</i>"
+	,"Internal code"
+	,"Name"
+	,"Command-line"
+	,"Clean-up command-line"
+	,"Startup directory"
+	,"Access requirements"
+	,"Execution requirements"
+	,"Toggle options (bitfield)"
+	,"Drop file type"
+	,"Event type (0=none)"
+	,"Extra time given to users running this program"
+	,"Maximum time allowed in program"
+	,"Execution cost (credits to run this program)"
 	/* Insert here */
-	,"user has sufficient access to see this program"
-	,"user has sufficient access to run this program"
+	,"User has sufficient access to see this program"
+	,"User has sufficient access to run this program"
 	,NULL
 };
 
 static char* event_prop_desc[] = {
 
-	 "command-line"
-	,"startup directory"
-	,"node number"
-	,"time to execute (minutes since midnight)"
-	,"frequency to execute"
-	,"days of week to execute (bitfield)"
-	,"days of month to execute (bitfield)"
-	,"months of year to execute (bitfield)"
-	,"date/time of last run (in time_t format)"
-	,"date/time of next run (in time_t format)"
-	,"error log level"
-	,"toggle options (bitfield)"
+	 "Command-line"
+	,"Startup directory"
+	,"Node number"
+	,"Time to execute (minutes since midnight)"
+	,"Frequency to execute"
+	,"Days of week to execute (bitfield)"
+	,"Days of month to execute (bitfield)"
+	,"Months of year to execute (bitfield)"
+	,"Date/time of last run (in time_t format)"
+	,"Date/time of next run (in time_t format)"
+	,"Error log level"
+	,"Toggle options (bitfield)"
 	,NULL
 };
 
 static char* xedit_prop_desc[] = {
 
-	 "name"
-	,"command-line"
-	,"access requirements"
-	,"toggle options (bitfield)"
-	,"drop file type"
+	 "Name"
+	,"Command-line"
+	,"Access requirements"
+	,"Toggle options (bitfield)"
+	,"Drop file type"
 	,NULL
 };
 
diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c
index 929b54f4c75683a621ce317cd8f5afc4b12581f8..abb3a29d7b24ca7059420a7d2d565a2dbd75c80e 100644
--- a/src/sbbs3/jsexec.c
+++ b/src/sbbs3/jsexec.c
@@ -735,7 +735,7 @@ static jsSyncMethodSpec js_global_functions[] = {
 	{"log",				js_log,				1},
 	{"read",			js_read,            1},
 	{"readln",			js_readln,			0,	JSTYPE_STRING,	JSDOCSTR("[count]")
-	,JSDOCSTR("read a single line, up to count characters, from input stream")
+	,JSDOCSTR("Read a single line, up to count characters, from input stream")
 	,311
 	},
     {"write",           js_write,           0},
diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index b641c805f6771c4c145df6d4fbc768c2c51f7c43..a87cb9d5cc49123f4658711b5b2d0570eb396fc9 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -1198,52 +1198,52 @@ js_prompt(JSContext *cx, uintN argc, jsval *arglist)
 
 static jsSyncMethodSpec js_global_functions[] = {
 	{"log",				js_log,				1,	JSTYPE_STRING,	JSDOCSTR("[level,] value [,value]")
-	,JSDOCSTR("add a line of text to the server and/or system log, "
+	,JSDOCSTR("Add a line of text to the server and/or system log, "
 		"<i>values</i> are typically string constants or variables, "
 		"<i>level</i> is the debug level/priority (default: <tt>LOG_INFO</tt>)")
 	,311
 	},
 	{"read",			js_read,			0,	JSTYPE_STRING,	JSDOCSTR("[count]")
-	,JSDOCSTR("read up to count characters from input stream")
+	,JSDOCSTR("Read up to count characters from input stream")
 	,311
 	},
 	{"readln",			js_readln,			0,	JSTYPE_STRING,	JSDOCSTR("[count]")
-	,JSDOCSTR("read a single line, up to count characters, from input stream")
+	,JSDOCSTR("Read a single line, up to count characters, from input stream")
 	,311
 	},
 	{"write",			js_write,			0,	JSTYPE_VOID,	JSDOCSTR("value [,value]")
-	,JSDOCSTR("send one or more values (typically strings) to the server output")
+	,JSDOCSTR("Send one or more values (typically strings) to the server output")
 	,311
 	},
 	{"write_raw",			js_write_raw,			0,	JSTYPE_VOID,	JSDOCSTR("value [,value]")
-	,JSDOCSTR("send a stream of bytes (possibly containing NULLs or special control code sequences) to the server output")
+	,JSDOCSTR("Send a stream of bytes (possibly containing NULLs or special control code sequences) to the server output")
 	,314
 	},
 	{"print",			js_writeln,			0,	JSTYPE_ALIAS },
     {"writeln",         js_writeln,         0,	JSTYPE_VOID,	JSDOCSTR("value [,value]")
-	,JSDOCSTR("send a line of text to the console or event log with automatic line termination (CRLF), "
+	,JSDOCSTR("Send a line of text to the console or event log with automatic line termination (CRLF), "
 		"<i>values</i> are typically string constants or variables (AKA print)")
 	,311
 	},
     {"printf",          js_printf,          1,	JSTYPE_STRING,	JSDOCSTR("string format [,value][,value]")
-	,JSDOCSTR("print a formatted string - <small>CAUTION: for experienced C programmers ONLY</small>")
+	,JSDOCSTR("Print a formatted string - <small>CAUTION: for experienced C programmers ONLY</small>")
 	,310
 	},
 	{"alert",			js_alert,			1,	JSTYPE_VOID,	JSDOCSTR("value")
-	,JSDOCSTR("print an alert message (ala client-side JS)")
+	,JSDOCSTR("Print an alert message (ala client-side JS)")
 	,310
 	},
 	{"prompt",			js_prompt,			1,	JSTYPE_STRING,	JSDOCSTR("[text] [,value] [,mode=K_EDIT]")
-	,JSDOCSTR("displays a prompt (<i>text</i>) and returns a string of user input (ala client-side JS)")
+	,JSDOCSTR("Displays a prompt (<i>text</i>) and returns a string of user input (ala client-side JS)")
 	,310
 	},
 	{"confirm",			js_confirm,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("value")
-	,JSDOCSTR("displays a Yes/No prompt and returns <i>true</i> or <i>false</i> "
+	,JSDOCSTR("Displays a Yes/No prompt and returns <i>true</i> or <i>false</i> "
 		"based on user's confirmation (ala client-side JS, <i>true</i> = yes)")
 	,310
 	},
 	{"deny",			js_deny,			1,	JSTYPE_BOOLEAN,	JSDOCSTR("value")
-	,JSDOCSTR("displays a No/Yes prompt and returns <i>true</i> or <i>false</i> "
+	,JSDOCSTR("Displays a No/Yes prompt and returns <i>true</i> or <i>false</i> "
 		"based on user's denial (<i>true</i> = no)")
 	,31501
 	},