diff --git a/docs/jsobjs.html b/docs/jsobjs.html
index 6137fc016a210c20c71d5117b5c2bf7e123de168..d3387daeb066c4c901b40700ed32a3637a54b2e2 100644
--- a/docs/jsobjs.html
+++ b/docs/jsobjs.html
@@ -10,7 +10,10 @@
 <body>
 <font face=arial,helvetica>
 <h1>Synchronet JavaScript Object Model Reference</h1>
-Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
+Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Nov 26 2003 14:01
+<br><font size=-1>
+Property and Method version numbers (when available) indicate the Synchronet version when the item was added or modified.
+</font>
 <ol type=square>
 <li onclick = 'this.className = (this.className == "showList") ? "defaultStyles" : "showList";'
 	onselectstart = 'event.returnValue = false;'>
@@ -27,6 +30,9 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 	onselectstart = 'event.returnValue = false;'>
 [+] &nbsp<a href="#js"><b>js</b></a> object
 <ul>
+<li onclick = 'this.className = (this.className == "showList") ? "defaultStyles" : "showList";'
+	onselectstart = 'event.returnValue = false;'>
+<a href=#js_methods>methods</a>
 <li onclick = 'this.className = (this.className == "showList") ? "defaultStyles" : "showList";'
 	onselectstart = 'event.returnValue = false;'>
 <a href=#js_properties>properties</a>
@@ -278,121 +284,186 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Returns</font>
 <th align=left width=200>
 <font color="white">Usage</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
-<tr valign=top><td><b>log</b><td>string<td><tt>log(value [,value])
-<td>add a line of text to the server and/or system log, <i>values</i> are typically string constants or variables
+<tr valign=top><td><b>log</b><td>string<td><tt>log([level,] value [,value])
+<td>3.11
+<td>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>)
 <tr valign=top><td><b>read</b><td>string<td><tt>read([count])
+<td>3.11
 <td>read up to count characters from input stream
 <tr valign=top><td><b>readln</b><td>string<td><tt>readln([count])
+<td>3.11
 <td>read a single line, up to count characters, from input stream
 <tr valign=top><td><b>write</b><td>void<td><tt>write(value [,value])
+<td>3.11
 <td>send one or more values (typically strings) to the server output
 <tr valign=top><td><b>writeln</b><td>void<td><tt>writeln(value [,value])
+<td>3.11
 <td>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)
 <tr valign=top><td><b>printf</b><td>string<td><tt>printf(string format [,value][,value])
+<td>3.10
 <td>print a formatted string - <small>CAUTION: for experienced C programmers ONLY</small>
 <tr valign=top><td><b>alert</b><td>void<td><tt>alert(value)
+<td>3.10
 <td>print an alert message (ala client-side JS)
 <tr valign=top><td><b>prompt</b><td>string<td><tt>prompt([value])
+<td>3.10
 <td>displays a prompt (<i>value</i>) and returns a string of user input (ala clent-side JS)
 <tr valign=top><td><b>confirm</b><td>boolean<td><tt>confirm(value)
+<td>3.10
 <td>displays a Yes/No prompt and returns <i>true</i> or <i>false</i> based on users confirmation (ala client-side JS)
 <tr valign=top><td><b>exit</b><td>void<td><tt>exit([number exit_code])
+<td>3.11
 <td>stop script execution, optionally setting the global property <tt>exit_code</tt> to the specified numeric value
-<tr valign=top><td><b>load</b><td>boolean<td><tt>load(string filename [,args])
-<td>load and execute a JavaScript file, returns <i>true</i> if the execution was successful
+<tr valign=top><td><b>load</b><td>boolean<td><tt>load([object scope,] string filename [,args])
+<td>3.11
+<td>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 <i>true</i> if the execution was successful
 <tr valign=top><td><b>mswait</b><td>void<td><tt>mswait([number milliseconds])
+<td>3.10
 <td>millisecond wait/sleep routine (AKA sleep)
 <tr valign=top><td><b>yield</b><td>void<td><tt>yield([bool forced])
+<td>3.11
 <td>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>
 <tr valign=top><td><b>random</b><td>number<td><tt>random(number max)
+<td>3.10
 <td>return random integer between 0 and max-1
 <tr valign=top><td><b>time</b><td>number<td><tt>time()
+<td>3.10
 <td>return current time in Unix (time_t) format (number of seconds since Jan-01-1970)
 <tr valign=top><td><b>beep</b><td>void<td><tt>beep([number freq, duration])
+<td>3.10
 <td>produce a tone on the local speaker at specified frequency for specified duration (in milliseconds)
 <tr valign=top><td><b>sound</b><td>boolean<td><tt>sound([string filename])
+<td>3.10
 <td>play a waveform (.wav) sound file
 <tr valign=top><td><b>ctrl</b><td>string<td><tt>ctrl(number or string)
+<td>3.11
 <td>return ASCII control character representing character passed - Example: <tt>ctrl('C') returns ''</tt>
 <tr valign=top><td><b>ascii</b><td>number<td><tt>ascii([string text] or [number value])
+<td>3.10
 <td>convert string to ASCII value or vice-versa (returns number OR string)
 <tr valign=top><td><b>ascii_str</b><td>string<td><tt>ascii_str(string text)
+<td>3.10
 <td>convert extended-ASCII in string to plain ASCII
 <tr valign=top><td><b>strip_ctrl</b><td>string<td><tt>strip_ctrl(string text)
+<td>3.10
 <td>strip control characters from string
 <tr valign=top><td><b>strip_exascii</b><td>string<td><tt>strip_exascii(string text)
+<td>3.10
 <td>strip extended-ASCII characters from string
 <tr valign=top><td><b>truncsp</b><td>string<td><tt>truncsp(string text)
+<td>3.10
 <td>truncate white-space characters off end of string
 <tr valign=top><td><b>truncstr</b><td>string<td><tt>truncstr(string text, charset)
+<td>3.10
 <td>truncate string at first char in <i>charset</i>
 <tr valign=top><td><b>lfexpand</b><td>string<td><tt>lfexpand(string text)
+<td>3.10
 <td>expand line-feeds (LF) to carriage-return/line-feeds (CRLF)
 <tr valign=top><td><b>file_getname</b><td>string<td><tt>file_getname(string path)
+<td>3.11
 <td>returns filename portion of passed path string
 <tr valign=top><td><b>file_getext</b><td>string<td><tt>file_getext(string path)
+<td>3.11
 <td>returns file extension portion of passed path/filename string (including '.') or <i>undefined</i> if no extension is found
 <tr valign=top><td><b>file_getcase</b><td>string<td><tt>file_getcase(string filename)
+<td>3.11
 <td>returns correct case of filename (long version of filename on Win32) or <i>undefined</i> if the file doesn't exist
 <tr valign=top><td><b>file_exists</b><td>boolean<td><tt>file_exists(string filename)
+<td>3.10
 <td>verify a file's existence
 <tr valign=top><td><b>file_remove</b><td>boolean<td><tt>file_remove(string filename)
+<td>3.10
 <td>delete a file
 <tr valign=top><td><b>file_rename</b><td>boolean<td><tt>file_rename(oldname, newname)
+<td>3.11
 <td>rename a file, possibly moving it to another directory in the process
 <tr valign=top><td><b>file_copy</b><td>boolean<td><tt>file_copy(source, destination)
+<td>3.11
 <td>copy a file from one directory or filename to another
 <tr valign=top><td><b>file_backup</b><td>boolean<td><tt>file_backup(string filename [,number level] [,bool rename])
+<td>3.11
 <td>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 (default is <i>false</i>)
 <tr valign=top><td><b>file_isdir</b><td>boolean<td><tt>file_isdir(string filename)
+<td>3.10
 <td>check if specified <i>filename</i> is a directory
 <tr valign=top><td><b>file_attrib</b><td>number<td><tt>file_attrib(string filename)
+<td>3.10
 <td>get a file's permissions/attributes
 <tr valign=top><td><b>file_date</b><td>number<td><tt>file_date(string filename)
+<td>3.10
 <td>get a file's last modified date/time (in time_t format)
 <tr valign=top><td><b>file_size</b><td>number<td><tt>file_size(string filename)
+<td>3.10
 <td>get a file's length (in bytes)
 <tr valign=top><td><b>file_utime</b><td>boolean<td><tt>file_utime(string filename [,access_time] [,mod_time])
+<td>3.11
 <td>change a file's last accessed and modification date/time (in time_t format), or change to current time
 <tr valign=top><td><b>file_touch</b><td>boolean<td><tt>file_touch(string filename)
+<td>3.11
 <td>updates a file's last modification date/time to current time, creating an empty file if it doesn't already exist
 <tr valign=top><td><b>directory</b><td>array<td><tt>directory(string pattern [,flags])
+<td>3.10
 <td>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>)
+<tr valign=top><td><b>dir_freespace</b><td>number<td><tt>dir_freespace(string directory [,unit_size])
+<td>3.11
+<td>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>.
+<tr valign=top><td><b>socket_select</b><td>array<td><tt>socket_select([array of socket objects or descriptors] [,number timeout] [,bool write])
+<td>3.11
+<td>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
 <tr valign=top><td><b>mkdir</b><td>boolean<td><tt>mkdir(string directory)
+<td>3.10
 <td>make a directory
 <tr valign=top><td><b>rmdir</b><td>boolean<td><tt>rmdir(string directory)
+<td>3.10
 <td>remove a directory
 <tr valign=top><td><b>strftime</b><td>string<td><tt>strftime(string format [,number time])
+<td>3.10
 <td>return a formatted time string (ala C strftime)
 <tr valign=top><td><b>format</b><td>string<td><tt>format(string format [,args])
+<td>3.10
 <td>return a formatted string (ala sprintf) - <small>CAUTION: for experienced C programmers ONLY</small>
-<tr valign=top><td><b>html_encode</b><td>string<td><tt>html_encode(string text [,bool ex_ascii] [,bool white_space])
-<td>return an HTML-encoded text string (using standard HTML character entities), escaping IBM extended-ASCII and white-space characters by default
+<tr valign=top><td><b>html_encode</b><td>string<td><tt>html_encode(string text [,bool ex_ascii] [,bool white_space] [,bool ansi] [,bool ctrl_a])
+<td>3.11
+<td>return an HTML-encoded text string (using standard HTML character entities), escaping IBM extended-ASCII, white-space characters, ANSI codes, and CTRL-A codes by default
 <tr valign=top><td><b>html_decode</b><td>string<td><tt>html_decode(string text)
+<td>3.11
 <td>return a decoded HTML-encoded text string
 <tr valign=top><td><b>word_wrap</b><td>string<td><tt>word_wrap(string text [,line_length])
+<td>3.11
 <td>returns a word-wrapped version of the text string argument, <i>line_length</i> defaults to <i>79</i>
 <tr valign=top><td><b>quote_msg</b><td>string<td><tt>quote_msg(string text [,line_length] [,prefix])
+<td>3.11
 <td>returns a quoted version of the message text string argumnet, <i>line_length</i> defaults to <i>79</i>, <i>prefix</i> defaults to <tt>" > "</tt>
 <tr valign=top><td><b>rot13_translate</b><td>string<td><tt>rot13_translate(string text)
+<td>3.11
 <td>returns ROT13-translated version of text string (will encode or decode text)
 <tr valign=top><td><b>base64_encode</b><td>string<td><tt>base64_encode(string text)
+<td>3.11
 <td>returns base64-encoded version of text string or <i>null</i> on error
 <tr valign=top><td><b>base64_decode</b><td>string<td><tt>base64_decode(string text)
+<td>3.11
 <td>returns base64-decoded text string or <i>null</i> on error (not useful for binary data)
 <tr valign=top><td><b>crc16_calc</b><td>number<td><tt>crc16_calc(string text)
+<td>3.11
 <td>calculate and return 16-bit CRC of text string
 <tr valign=top><td><b>crc32_calc</b><td>number<td><tt>crc32_calc(string text)
+<td>3.11
 <td>calculate and return 32-bit CRC of text string
 <tr valign=top><td><b>chksum_calc</b><td>number<td><tt>chksum_calc(string text)
+<td>3.11
 <td>calculate and return 32-bit checksum of text string
 <tr valign=top><td><b>md5_calc</b><td>string<td><tt>md5_calc(string text [,bool hex])
+<td>3.11
 <td>calculate and return 128-bit MD5 digest of text string, result encoded in base64 (default) or hexadecimal
 <tr valign=top><td><b>resolve_ip</b><td>string<td><tt>resolve_ip(string hostname)
+<td>3.11
 <td>resolve IP address of specified hostname (AKA gethostbyname)
 <tr valign=top><td><b>resolve_host</b><td>string<td><tt>resolve_host(string ip_address)
+<td>3.11
 <td>resolve hostname of specified IP address (AKA gethostbyaddr)
 </table>
 <br>
@@ -414,9 +485,33 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 </table>
 <h2><a name=js>js object</a>
 <br><font size=-1>JavaScript execution and garbage collection control object</font>
+<font size=-1> - introduced in v3.11</font>
 </h2>
 <table border=1 width=100%>
 <caption align=left><b><tt>js</tt>
+<a name=js_methods> methods</a>
+</b></caption>
+<tr bgcolor=gray>
+<th align=left width=100>
+<font color="white">Name</font>
+<th align=left width=100>
+<font color="white">Returns</font>
+<th align=left width=200>
+<font color="white">Usage</font>
+<th align=left width=50>
+<font color="white">Ver</font>
+<th align=left>
+<font color="white">Description</font>
+<tr valign=top><td><b>eval</b><td>string<td><tt>js.eval(string script)
+<td>3.11
+<td>evaluate a JavaScript string in its own (secure) context, returning the result
+<tr valign=top><td><b>gc</b><td>void<td><tt>js.gc(bool forced)
+<td>3.11
+<td>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
+</table>
+<br>
+<table border=1 width=100%>
+<caption align=left><b><tt>js</tt>
 <a name=js_properties> properties</a>
 </b></caption>
 <tr bgcolor=gray>
@@ -424,28 +519,46 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Name</font>
 <th align=left width=100>
 <font color="white">Type</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
+<tr valign=top><td><b>version</b><td>string
+<td>3.11
+<td>JavaScript engine version information (AKA system.js_version)
+<tr valign=top><td><b>auto_terminate</b><td>boolean
+<td>3.11
+<td>set to <i>false</i> to disable the automatic termination of the script upon external request
 <tr valign=top><td><b>terminated</b><td>boolean
-<td>termination has been requested (stop execution as soon as possible)</td>
+<td>3.11
+<td>termination has been requested (stop execution as soon as possible)
 <tr valign=top><td><b>branch_counter</b><td>number
-<td>number of branch operations performed in this runtime</td>
+<td>3.11
+<td>number of branch operations performed in this runtime
 <tr valign=top><td><b>branch_limit</b><td>number
-<td>maximum number of branches, used for infinite-loop detection (0=disabled)</td>
+<td>3.11
+<td>maximum number of branches, used for infinite-loop detection (0=disabled)
 <tr valign=top><td><b>yield_interval</b><td>number
-<td>interval of periodic time-slice yields (lower number=higher frequency, 0=disabled)</td>
+<td>3.11
+<td>interval of periodic time-slice yields (lower number=higher frequency, 0=disabled)
 <tr valign=top><td><b>gc_interval</b><td>number
-<td>interval of periodic garbage collection attempts (lower number=higher frequency, 0=disabled)</td>
+<td>3.11
+<td>interval of periodic garbage collection attempts (lower number=higher frequency, 0=disabled)
 <tr valign=top><td><b>gc_attempts</b><td>number
-<td>number of garbage collections attempted in this runtime - <small>READ ONLY</small></td>
+<td>3.11
+<td>number of garbage collections attempted in this runtime - <small>READ ONLY</small>
 <tr valign=top><td><b>gc_counter</b><td>number
-<td>number of garbage collections performed in this runtime - <small>READ ONLY</small></td>
+<td>3.11
+<td>number of garbage collections performed in this runtime - <small>READ ONLY</small>
 <tr valign=top><td><b>gc_last_bytes</b><td>number
-<td>number of heap bytes in use after last garbage collection - <small>READ ONLY</small></td>
+<td>3.11
+<td>number of heap bytes in use after last garbage collection - <small>READ ONLY</small>
 <tr valign=top><td><b>bytes</b><td>number
-<td>number of heap bytes currently in use - <small>READ ONLY</small></td>
+<td>3.11
+<td>number of heap bytes currently in use - <small>READ ONLY</small>
 <tr valign=top><td><b>max_bytes</b><td>number
-<td>maximum number of bytes available for heap</td>
+<td>3.11
+<td>maximum number of bytes available for heap
 </table>
 <h2><a name=system>system object</a>
 <br><font size=-1>Global system-related properties and methods</font>
@@ -461,47 +574,72 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Returns</font>
 <th align=left width=200>
 <font color="white">Usage</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>username</b><td>string<td><tt>system.username(number)
+<td>3.11
 <td>returns name of user in specified user record <i>number</i>, or empty string if not found
 <tr valign=top><td><b>alias</b><td>string<td><tt>system.alias(string alias)
+<td>3.10
 <td>returns name of user that matches alias (if found in <tt>ctrl/alias.cfg</tt>)
 <tr valign=top><td><b>matchuser</b><td>number<td><tt>system.matchuser(string username [,bool sysop_alias])
+<td>3.10
 <td>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
 <tr valign=top><td><b>matchuserdata</b><td>number<td><tt>system.matchuserdata(field, data [,usernumber])
+<td>3.10
 <td>search user database for data in a specific field (specified by offset), returns first matching user record number, optional <i>usernumber</i> specifies user record to skip
 <tr valign=top><td><b>trashcan</b><td>boolean<td><tt>system.trashcan(string filename, search)
+<td>3.10
 <td>search text/filename.can for pseudo-regexp
 <tr valign=top><td><b>findstr</b><td>boolean<td><tt>system.findstr(string filename, search)
+<td>3.10
 <td>search any file for pseudo-regexp
 <tr valign=top><td><b>zonestr</b><td>string<td><tt>system.zonestr([timezone])
+<td>3.10
 <td>convert time zone integer to string, defaults to system timezone if <i>timezone</i> not specified
 <tr valign=top><td><b>timestr</b><td>string<td><tt>system.timestr([time])
+<td>3.10
 <td>convert time_t integer into a time string, defaults to current time if <i>time</i> not specified
 <tr valign=top><td><b>datestr</b><td>string<td><tt>system.datestr([time])
+<td>3.10
 <td>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
 <tr valign=top><td><b>secondstr</b><td>string<td><tt>system.secondstr(seconds)
+<td>3.10
 <td>convert elapsed time in seconds into a string in <tt>hh:mm:ss</tt> format
 <tr valign=top><td><b>spamlog</b><td>boolean<td><tt>system.spamlog([protocol, action, reason, host, ip, to, from])
+<td>3.10
 <td>log a suspected SPAM attempt
 <tr valign=top><td><b>hacklog</b><td>boolean<td><tt>system.hacklog([protocol, user, text, host, ip, port])
+<td>3.10
 <td>log a suspected hack attempt
 <tr valign=top><td><b>filter_ip</b><td>boolean<td><tt>system.filter_ip([protocol, reason, host, ip, username])
+<td>3.11
 <td>add an IP address (with comment) to the system's IP filter file
 <tr valign=top><td><b>get_node_message</b><td>string<td><tt>system.get_node_message(number node)
+<td>3.11
 <td>read any messages waiting for the specified node and return in a single string
 <tr valign=top><td><b>put_node_message</b><td>boolean<td><tt>system.put_node_message(number node, string message)
+<td>3.10
 <td>send a node a short text message, delivered immediately
 <tr valign=top><td><b>get_telegram</b><td>string<td><tt>system.get_telegram(number user)
+<td>3.11
 <td>returns any short text messages waiting for the specified user
 <tr valign=top><td><b>put_telegram</b><td>boolean<td><tt>system.put_telegram(number user, string message)
+<td>3.10
 <td>sends a user a short text message, delivered immediately or during next logon
 <tr valign=top><td><b>new_user</b><td>object<td><tt>system.new_user(name/alias)
+<td>3.10
 <td>creates a new user record, returns a new <a href=#User>User</a> object representing the new user account
 <tr valign=top><td><b>exec</b><td>number<td><tt>system.exec(command-line)
-<td>executes a native system/shell command-line, returns 0 on success
+<td>3.11
+<td>executes a native system/shell command-line, returns <i>0</i> on success
+<tr valign=top><td><b>popen</b><td>array<td><tt>system.popen(command-line)
+<td>3.11
+<td>executes a native system/shell command-line, returns array of captured output lines on success (<b>only functional on UNIX systems</b>)
 <tr valign=top><td><b>check_syspass</b><td>boolean<td><tt>system.check_syspass(string password)
+<td>3.11
 <td>compares the supplied <i>password</i> against the system password and return's <i>true</i> if it matches
 </table>
 <br>
@@ -514,140 +652,214 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Name</font>
 <th align=left width=100>
 <font color="white">Type</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>name</b><td>string
-<td>BBS name</td>
+<td>3.10
+<td>BBS name
 <tr valign=top><td><b>operator</b><td>string
-<td>operator name</td>
+<td>3.10
+<td>operator name
 <tr valign=top><td><b>qwk_id</b><td>string
-<td>system QWK-ID (for QWK packets)</td>
+<td>3.10
+<td>system QWK-ID (for QWK packets)
 <tr valign=top><td><b>settings</b><td>number
-<td>settings bitfield (see <tt>SS_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)</td>
+<td>3.10
+<td>settings bitfield (see <tt>SS_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)
 <tr valign=top><td><b>psname</b><td>string
-<td>PostLink name</td>
+<td>3.10
+<td>PostLink name
 <tr valign=top><td><b>psnum</b><td>number
-<td>PostLink system number</td>
-<tr valign=top><td><b>inetaddr</b><td>string
-<td>Internet address (host or domain name)</td>
+<td>3.10
+<td>PostLink system number
+<tr valign=top><td><b>inet_addr</b><td>string
+<td>3.11
+<td>Internet address (host or domain name)
 <tr valign=top><td><b>location</b><td>string
-<td>location (city, state)</td>
+<td>3.10
+<td>location (city, state)
 <tr valign=top><td><b>timezone</b><td>number
-<td>timezone (use <i>system.zonestr()</i> to get string representation)</td>
+<td>3.10
+<td>timezone (use <i>system.zonestr()</i> to get string representation)
 <tr valign=top><td><b>pwdays</b><td>number
-<td>days between forced password changes</td>
+<td>3.10
+<td>days between forced password changes
 <tr valign=top><td><b>deldays</b><td>number
-<td>days to preserve deleted user records</td>
+<td>3.10
+<td>days to preserve deleted user records
 <tr valign=top><td><b>lastuser</b><td>number
-<td>last user record number in user database (includes deleted and inactive user records)</td>
+<td>3.11
+<td>last user record number in user database (includes deleted and inactive user records)
 <tr valign=top><td><b>lastuseron</b><td>string
-<td>name of last user to logoff</td>
+<td>3.10
+<td>name of last user to logoff
 <tr valign=top><td><b>freediskspace</b><td>number
-<td>amount of free disk space (in bytes)</td>
+<td>3.10
+<td>amount of free disk space (in bytes)
 <tr valign=top><td><b>freediskspacek</b><td>number
-<td>amount of free disk space (in kilobytes)</td>
+<td>3.10
+<td>amount of free disk space (in kilobytes)
 <tr valign=top><td><b>nodes</b><td>number
-<td>total number of BBS nodes</td>
+<td>3.10
+<td>total number of BBS nodes
 <tr valign=top><td><b>lastnode</b><td>number
-<td>last displayable node number</td>
+<td>3.10
+<td>last displayable node number
 <tr valign=top><td><b>newuser_password</b><td>string
-<td>new user password</td>
+<td>3.10
+<td>new user password
 <tr valign=top><td><b>newuser_magic_word</b><td>string
-<td>new user magic word</td>
+<td>3.10
+<td>new user magic word
 <tr valign=top><td><b>newuser_level</b><td>number
-<td>new user level</td>
+<td>3.10
+<td>new user level
 <tr valign=top><td><b>newuser_flags1</b><td>number
-<td>new user flag set #1</td>
+<td>3.10
+<td>new user flag set #1
 <tr valign=top><td><b>newuser_flags2</b><td>number
-<td>new user flag set #2</td>
+<td>3.10
+<td>new user flag set #2
 <tr valign=top><td><b>newuser_flags3</b><td>number
-<td>new user flag set #3</td>
+<td>3.10
+<td>new user flag set #3
 <tr valign=top><td><b>newuser_flags4</b><td>number
-<td>new user flag set #4</td>
+<td>3.10
+<td>new user flag set #4
 <tr valign=top><td><b>newuser_restrictions</b><td>number
-<td>new user restriction flags</td>
+<td>3.10
+<td>new user restriction flags
 <tr valign=top><td><b>newuser_exemptions</b><td>number
-<td>new user exemption flags</td>
+<td>3.10
+<td>new user exemption flags
 <tr valign=top><td><b>newuser_credits</b><td>number
-<td>new user credits</td>
+<td>3.10
+<td>new user credits
 <tr valign=top><td><b>newuser_minutes</b><td>number
-<td>new user extra minutes</td>
+<td>3.10
+<td>new user extra minutes
 <tr valign=top><td><b>newuser_command_shell</b><td>number
-<td>new user command shell</td>
+<td>3.10
+<td>new user command shell
 <tr valign=top><td><b>newuser_editor</b><td>string
-<td>new user external editor</td>
+<td>3.10
+<td>new user external editor
 <tr valign=top><td><b>newuser_settings</b><td>number
-<td>new user settings</td>
+<td>3.10
+<td>new user settings
 <tr valign=top><td><b>newuser_download_protocol</b><td>string
-<td>new user file transfer protocol (command key)</td>
+<td>3.10
+<td>new user file transfer protocol (command key)
 <tr valign=top><td><b>newuser_expiration_days</b><td>number
-<td>new user expiration days</td>
+<td>3.10
+<td>new user expiration days
 <tr valign=top><td><b>newuser_questions</b><td>number
-<td>new user questions bitfield (see <tt>UQ_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)</td>
+<td>3.10
+<td>new user questions bitfield (see <tt>UQ_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)
 <tr valign=top><td><b>expired_level</b><td>number
-<td>expired user level</td>
+<td>3.10
+<td>expired user level
 <tr valign=top><td><b>expired_flags1</b><td>number
-<td>expired user flag set #1</td>
+<td>3.10
+<td>expired user flag set #1
 <tr valign=top><td><b>expired_flags2</b><td>number
-<td>expired user flag set #2</td>
+<td>3.10
+<td>expired user flag set #2
 <tr valign=top><td><b>expired_flags3</b><td>number
-<td>expired user flag set #3</td>
+<td>3.10
+<td>expired user flag set #3
 <tr valign=top><td><b>expired_flags4</b><td>number
-<td>expired user flag set #4</td>
+<td>3.10
+<td>expired user flag set #4
 <tr valign=top><td><b>expired_restrictions</b><td>number
-<td>expired user restriction flags</td>
+<td>3.10
+<td>expired user restriction flags
 <tr valign=top><td><b>expired_exemptions</b><td>number
-<td>expired user exemption flags</td>
+<td>3.10
+<td>expired user exemption flags
 <tr valign=top><td><b>node_dir</b><td>string
-<td>node directory</td>
+<td>3.10
+<td>node directory
 <tr valign=top><td><b>ctrl_dir</b><td>string
-<td>control file directory</td>
+<td>3.10
+<td>control file directory
 <tr valign=top><td><b>data_dir</b><td>string
-<td>data file directory</td>
+<td>3.10
+<td>data file directory
 <tr valign=top><td><b>text_dir</b><td>string
-<td>text file directory</td>
+<td>3.10
+<td>text file directory
 <tr valign=top><td><b>temp_dir</b><td>string
-<td>temporary file directory</td>
+<td>3.10
+<td>temporary file directory
 <tr valign=top><td><b>exec_dir</b><td>string
-<td>executable file directory</td>
+<td>3.10
+<td>executable file directory
 <tr valign=top><td><b>mods_dir</b><td>string
-<td>modified modules directory (optional)</td>
+<td>3.10
+<td>modified modules directory (optional)
 <tr valign=top><td><b>logs_dir</b><td>string
-<td>log file directory</td>
+<td>3.10
+<td>log file directory
 <tr valign=top><td><b>devnull</b><td>string
-<td>null device filename</td>
+<td>3.11
+<td>null device filename
+<tr valign=top><td><b>clock_ticks</b><td>number
+<td>3.11
+<td>amount of elapsed processor time in clock 'ticks'
+<tr valign=top><td><b>clock_ticks_per_second</b><td>number
+<td>3.11
+<td>number of clock ticks per second
 <tr valign=top><td><b>local_host_name</b><td>string
-<td>private host name that uniquely identifies this system on the local network</td>
+<td>3.11
+<td>private host name that uniquely identifies this system on the local network
 <tr valign=top><td><b>host_name</b><td>string
-<td>public host name that uniquely identifies this system on the Internet (usually the same as <i>system.inetaddr</i>)</td>
+<td>N/A
+<td>public host name that uniquely identifies this system on the Internet (usually the same as <i>system.inetaddr</i>)
 <tr valign=top><td><b>version</b><td>string
-<td>Synchronet version number (e.g. '3.10')</td>
+<td>N/A
+<td>Synchronet version number (e.g. '3.10')
 <tr valign=top><td><b>revision</b><td>string
-<td>Synchronet revision letter (e.g. 'k')</td>
+<td>N/A
+<td>Synchronet revision letter (e.g. 'k')
 <tr valign=top><td><b>beta_version</b><td>string
-<td>Synchronet alpha/beta designation (e.g. ' beta')</td>
+<td>N/A
+<td>Synchronet alpha/beta designation (e.g. ' beta')
 <tr valign=top><td><b>full_version</b><td>string
-<td>Synchronet full version information (e.g. '3.10k Beta Debug')</td>
+<td>N/A
+<td>Synchronet full version information (e.g. '3.10k Beta Debug')
 <tr valign=top><td><b>version_notice</b><td>string
-<td>Synchronet version notice (includes version and platform)</td>
+<td>N/A
+<td>Synchronet version notice (includes version and platform)
 <tr valign=top><td><b>platform</b><td>string
-<td>platform description (e.g. 'Win32', 'Linux', 'FreeBSD')</td>
+<td>N/A
+<td>platform description (e.g. 'Win32', 'Linux', 'FreeBSD')
 <tr valign=top><td><b>socket_lib</b><td>string
-<td>socket library version information</td>
+<td>N/A
+<td>socket library version information
 <tr valign=top><td><b>msgbase_lib</b><td>string
-<td>message base library version information</td>
+<td>N/A
+<td>message base library version information
 <tr valign=top><td><b>compiled_with</b><td>string
-<td>compiler used to build Synchronet</td>
+<td>N/A
+<td>compiler used to build Synchronet
 <tr valign=top><td><b>compiled_when</b><td>string
-<td>date and time compiled</td>
+<td>N/A
+<td>date and time compiled
 <tr valign=top><td><b>copyright</b><td>string
-<td>Synchronet copyright display</td>
+<td>N/A
+<td>Synchronet copyright display
 <tr valign=top><td><b>js_version</b><td>string
-<td>JavaScript engine version information</td>
+<td>N/A
+<td>JavaScript engine version information
 <tr valign=top><td><b>os_version</b><td>string
-<td>operating system version information</td>
+<td>N/A
+<td>operating system version information
 <tr valign=top><td><b>uptime</b><td>number
-<td>time/date system was brought online (in time_t format)</td>
+<td>N/A
+<td>time/date system was brought online (in time_t format)
 </table>
 <h2><a name=system.stats>system.stats object</a>
 <br><font size=-1>System statistics</font>
@@ -661,42 +873,61 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Name</font>
 <th align=left width=100>
 <font color="white">Type</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>total_logons</b><td>number
-<td>total logons</td>
+<td>3.10
+<td>total logons
 <tr valign=top><td><b>logons_today</b><td>number
-<td>logons today</td>
+<td>3.10
+<td>logons today
 <tr valign=top><td><b>total_timeon</b><td>number
-<td>total time used</td>
+<td>3.10
+<td>total time used
 <tr valign=top><td><b>timeon_today</b><td>number
-<td>time used today</td>
+<td>3.10
+<td>time used today
 <tr valign=top><td><b>total_files</b><td>number
-<td>total files in file bases</td>
+<td>3.10
+<td>total files in file bases
 <tr valign=top><td><b>files_uploaded_today</b><td>number
-<td>files uploaded today</td>
+<td>3.10
+<td>files uploaded today
 <tr valign=top><td><b>bytes_uploaded_today</b><td>number
-<td>bytes uploaded today</td>
+<td>3.10
+<td>bytes uploaded today
 <tr valign=top><td><b>files_downloaded_today</b><td>number
-<td>files downloaded today</td>
+<td>3.10
+<td>files downloaded today
 <tr valign=top><td><b>bytes_downloaded_today</b><td>number
-<td>bytes downloaded today</td>
+<td>3.10
+<td>bytes downloaded today
 <tr valign=top><td><b>total_messages</b><td>number
-<td>total messages in message bases</td>
+<td>3.10
+<td>total messages in message bases
 <tr valign=top><td><b>messages_posted_today</b><td>number
-<td>messages posted today</td>
+<td>3.10
+<td>messages posted today
 <tr valign=top><td><b>total_email</b><td>number
-<td>total messages in mail base</td>
+<td>3.10
+<td>total messages in mail base
 <tr valign=top><td><b>email_sent_today</b><td>number
-<td>email sent today</td>
+<td>3.10
+<td>email sent today
 <tr valign=top><td><b>total_feedback</b><td>number
-<td>total feedback messages waiting</td>
+<td>3.10
+<td>total feedback messages waiting
 <tr valign=top><td><b>feedback_sent_today</b><td>number
-<td>feedback sent today</td>
+<td>3.10
+<td>feedback sent today
 <tr valign=top><td><b>total_users</b><td>number
-<td>total user records (does not include deleted or inactive user records)</td>
+<td>3.10
+<td>total user records (does not include deleted or inactive user records)
 <tr valign=top><td><b>new_users_today</b><td>number
-<td>new users today</td>
+<td>3.10
+<td>new users today
 </table>
 <h2><a name=system.node_list>system.node_list array</a>
 <br><font size=-1>BBS node listing</font>
@@ -710,24 +941,34 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Name</font>
 <th align=left width=100>
 <font color="white">Type</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>status</b><td>number
-<td>status (see <tt>nodedefs.js</tt> for valid values)</td>
+<td>3.10
+<td>status (see <tt>nodedefs.js</tt> for valid values)
 <tr valign=top><td><b>errors</b><td>number
-<td>error counter</td>
+<td>3.10
+<td>error counter
 <tr valign=top><td><b>action</b><td>number
-<td>current user action (see <tt>nodedefs.js</tt>)</td>
+<td>3.10
+<td>current user action (see <tt>nodedefs.js</tt>)
 <tr valign=top><td><b>useron</b><td>number
-<td>current user number</td>
+<td>3.10
+<td>current user number
 <tr valign=top><td><b>connection</b><td>number
-<td>connection speed (<tt>0xffff</tt> = Telnet or RLogin)</td>
+<td>3.10
+<td>connection speed (<tt>0xffff</tt> = Telnet or RLogin)
 <tr valign=top><td><b>misc</b><td>number
-<td>miscellaneous bitfield (see <tt>nodedefs.js</tt>)</td>
+<td>3.10
+<td>miscellaneous bitfield (see <tt>nodedefs.js</tt>)
 <tr valign=top><td><b>aux</b><td>number
-<td>auxillary value</td>
+<td>3.10
+<td>auxillary value
 <tr valign=top><td><b>extaux</b><td>number
-<td>extended auxillary value</td>
+<td>3.10
+<td>extended auxillary value
 </table>
 <h2><a name=server>server object</a>
 <br><font size=-1>Server-specifc properties</font>
@@ -741,12 +982,25 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Name</font>
 <th align=left width=100>
 <font color="white">Type</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>version</b><td>string
-<td>server name and version number</td>
+<td>3.10
+<td>server name and version number
 <tr valign=top><td><b>version_detail</b><td>string
-<td>detailed version/build information</td>
+<td>3.10
+<td>detailed version/build information
+<tr valign=top><td><b>interface_ip_address</b><td>string
+<td>3.11
+<td>IP address of bound network interface (<tt>0.0.0.0</tt> = <i>ANY</i>)
+<tr valign=top><td><b>options</b><td>number
+<td>3.11
+<td>bit-field of server-specific startup options
+<tr valign=top><td><b>clients</b><td>number
+<td>3.11
+<td>number of active clients (if available)
 </table>
 <h2><a name=client>client object</a>
 <br><font size=-1>Represents a TCP/IP client session</font>
@@ -760,22 +1014,31 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Name</font>
 <th align=left width=100>
 <font color="white">Type</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>ip_address</b><td>string
-<td>client's IP address (in dotted-decimal format)</td>
+<td>3.10
+<td>client's IP address (in dotted-decimal format)
 <tr valign=top><td><b>host_name</b><td>string
-<td>client's host name (up to 64 characters)</td>
+<td>3.10
+<td>client's host name (up to 64 characters)
 <tr valign=top><td><b>port</b><td>number
-<td>client's TCP or UDP port number</td>
+<td>3.10
+<td>client's TCP or UDP port number
 <tr valign=top><td><b>connect_time</b><td>number
-<td>date/time of initial connection (in time_t format)</td>
+<td>3.10
+<td>date/time of initial connection (in time_t format)
 <tr valign=top><td><b>protocol</b><td>string
-<td>protocol description (e.g. 'Telnet', 'FTP', etc.)</td>
+<td>3.10
+<td>protocol description (e.g. 'Telnet', 'FTP', etc.)
 <tr valign=top><td><b>user_name</b><td>string
-<td>user's name/alias (if logged in)</td>
+<td>3.10
+<td>user's name/alias (if logged in)
 <tr valign=top><td><b>socket</b><td>object
-<td>instance of <a href=#Socket>Socket class</a> representing client's TCP/IP connection</td>
+<td>N/A
+<td>instance of <a href=#Socket>Socket class</a> representing client's TCP/IP connection
 </table>
 <h2><a name=user>user object</a>
 <br><font size=-1>Instance of <i>User</i> class, representing current user online</font>
@@ -792,9 +1055,12 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Returns</font>
 <th align=left width=200>
 <font color="white">Usage</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>compare_ars</b><td>boolean<td><tt>user.compare_ars(string ars)
+<td>3.10
 <td>Verify user meets access requirements string
 </table>
 <br>
@@ -807,74 +1073,109 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Name</font>
 <th align=left width=100>
 <font color="white">Type</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>number</b><td>number
-<td>record number (1-based)</td>
+<td>3.10
+<td>record number (1-based)
 <tr valign=top><td><b>alias</b><td>string
-<td>alias/name</td>
+<td>3.10
+<td>alias/name
 <tr valign=top><td><b>name</b><td>string
-<td>real name</td>
+<td>3.10
+<td>real name
 <tr valign=top><td><b>handle</b><td>string
-<td>chat handle</td>
+<td>3.10
+<td>chat handle
 <tr valign=top><td><b>ip_address</b><td>string
-<td>IP address last logged on from</td>
+<td>3.10
+<td>IP address last logged on from
 <tr valign=top><td><b>note</b><td>string
-<td>AKA ip_address</td>
+<td>3.10
+<td>AKA ip_address
 <tr valign=top><td><b>host_name</b><td>string
-<td>host name last logged on from</td>
+<td>3.10
+<td>host name last logged on from
 <tr valign=top><td><b>computer</b><td>string
-<td>AKA host_name</td>
+<td>3.10
+<td>AKA host_name
 <tr valign=top><td><b>comment</b><td>string
-<td>sysop's comment</td>
+<td>3.10
+<td>sysop's comment
 <tr valign=top><td><b>netmail</b><td>string
-<td>external e-mail address</td>
+<td>3.10
+<td>external e-mail address
 <tr valign=top><td><b>email</b><td>string
-<td>local Internet e-mail address	- <small>READ ONLY</small></td>
+<td>3.10
+<td>local Internet e-mail address	- <small>READ ONLY</small>
 <tr valign=top><td><b>address</b><td>string
-<td>street address</td>
+<td>3.10
+<td>street address
 <tr valign=top><td><b>location</b><td>string
-<td>location (city, state)</td>
+<td>3.10
+<td>location (city, state)
 <tr valign=top><td><b>zipcode</b><td>string
-<td>zip/postal code</td>
+<td>3.10
+<td>zip/postal code
 <tr valign=top><td><b>phone</b><td>string
-<td>phone number</td>
+<td>3.10
+<td>phone number
 <tr valign=top><td><b>birthdate</b><td>string
-<td>birth date</td>
+<td>3.10
+<td>birth date
 <tr valign=top><td><b>age</b><td>number
-<td>calculated age in years - <small>READ ONLY</small></td>
+<td>3.10
+<td>calculated age in years - <small>READ ONLY</small>
 <tr valign=top><td><b>connection</b><td>string
-<td>connection type</td>
+<td>3.10
+<td>connection type
 <tr valign=top><td><b>modem</b><td>string
-<td>AKA connection</td>
+<td>3.10
+<td>AKA connection
 <tr valign=top><td><b>screen_rows</b><td>number
-<td>terminal rows (lines)</td>
+<td>3.10
+<td>terminal rows (lines)
 <tr valign=top><td><b>gender</b><td>string
-<td>gender type</td>
+<td>3.10
+<td>gender type
 <tr valign=top><td><b>cursub</b><td>string
-<td>current message sub-board</td>
+<td>3.10
+<td>current message sub-board
 <tr valign=top><td><b>curdir</b><td>string
-<td>current file directory</td>
+<td>3.10
+<td>current file directory
 <tr valign=top><td><b>curxtrn</b><td>string
-<td>current external program being run</td>
+<td>3.10
+<td>current external program being run
 <tr valign=top><td><b>editor</b><td>string
-<td>external message editor</td>
+<td>3.10
+<td>external message editor
 <tr valign=top><td><b>command_shell</b><td>string
-<td>command shell</td>
+<td>3.10
+<td>command shell
 <tr valign=top><td><b>settings</b><td>number
-<td>settings bitfield</td>
+<td>3.10
+<td>settings bitfield
 <tr valign=top><td><b>qwk_settings</b><td>number
-<td>QWK packet settings bitfield</td>
+<td>3.10
+<td>QWK packet settings bitfield
 <tr valign=top><td><b>chat_settings</b><td>number
-<td>chat settings bitfield</td>
+<td>3.10
+<td>chat settings bitfield
 <tr valign=top><td><b>temp_file_ext</b><td>string
-<td>temporary file type (extension)</td>
+<td>3.10
+<td>temporary file type (extension)
 <tr valign=top><td><b>new_file_time</b><td>number
-<td>new file scan date/time (time_t format)</td>
+<td>3.11
+<td>new file scan date/time (time_t format)
 <tr valign=top><td><b>download_protocol</b><td>string
-<td>file transfer protocol (command key)</td>
+<td>3.10
+<td>file transfer protocol (command key)
 <tr valign=top><td><b>logontime</b><td>number
-<td>logon time (time_t format)</td>
+<td>3.10
+<td>logon time (time_t format)
 </table>
 <h2><a name=user.stats>user.stats object</a>
 <br><font size=-1>User statistics (all <small>READ ONLY</small>)</font>
@@ -888,45 +1189,65 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Name</font>
 <th align=left width=100>
 <font color="white">Type</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>laston_date</b><td>number
-<td>date of previous logon</td>
+<td>3.10
+<td>date of previous logon
 <tr valign=top><td><b>firston_date</b><td>number
-<td>date of first logon</td>
+<td>3.10
+<td>date of first logon
 <tr valign=top><td><b>total_logons</b><td>number
-<td>total number of logons</td>
+<td>3.10
+<td>total number of logons
 <tr valign=top><td><b>logons_today</b><td>number
-<td>total logons today</td>
+<td>3.10
+<td>total logons today
 <tr valign=top><td><b>total_timeon</b><td>number
-<td>total time used (in minutes)</td>
+<td>3.10
+<td>total time used (in minutes)
 <tr valign=top><td><b>timeon_today</b><td>number
-<td>time used today</td>
+<td>3.10
+<td>time used today
 <tr valign=top><td><b>timeon_last_logon</b><td>number
-<td>time used last session</td>
+<td>3.10
+<td>time used last session
 <tr valign=top><td><b>total_posts</b><td>number
-<td>total messages posted</td>
+<td>3.10
+<td>total messages posted
 <tr valign=top><td><b>total_emails</b><td>number
-<td>total e-mails sent</td>
+<td>3.10
+<td>total e-mails sent
 <tr valign=top><td><b>total_feedbacks</b><td>number
-<td>total feedback messages sent</td>
+<td>3.10
+<td>total feedback messages sent
 <tr valign=top><td><b>email_today</b><td>number
-<td>e-mail sent today</td>
+<td>3.10
+<td>e-mail sent today
 <tr valign=top><td><b>posts_today</b><td>number
-<td>messages posted today</td>
+<td>3.10
+<td>messages posted today
 <tr valign=top><td><b>bytes_uploaded</b><td>number
-<td>total bytes uploaded</td>
+<td>3.10
+<td>total bytes uploaded
 <tr valign=top><td><b>files_uploaded</b><td>number
-<td>total files uploaded</td>
+<td>3.10
+<td>total files uploaded
 <tr valign=top><td><b>bytes_downloaded</b><td>number
-<td>total bytes downloaded</td>
+<td>3.10
+<td>total bytes downloaded
 <tr valign=top><td><b>files_downloaded</b><td>number
-<td>total files downloaded</td>
+<td>3.10
+<td>total files downloaded
 <tr valign=top><td><b>leech_attempts</b><td>number
-<td>suspected leech downloads</td>
+<td>3.10
+<td>suspected leech downloads
 </table>
 <h2><a name=user.limits>user.limits object</a>
 <br><font size=-1>User limitations based on security level (all <small>READ ONLY</small>)</font>
+<font size=-1> - introduced in v3.11</font>
 </h2>
 <table border=1 width=100%>
 <caption align=left><b><tt>user.limits</tt>
@@ -937,22 +1258,31 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Name</font>
 <th align=left width=100>
 <font color="white">Type</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>time_per_logon</b><td>number
-<td>time (in minutes) per logon</td>
+<td>3.11
+<td>time (in minutes) per logon
 <tr valign=top><td><b>time_per_day</b><td>number
-<td>time (in minutes) per day</td>
+<td>3.11
+<td>time (in minutes) per day
 <tr valign=top><td><b>logons_per_day</b><td>number
-<td>logons per day</td>
+<td>3.11
+<td>logons per day
 <tr valign=top><td><b>lines_per_message</b><td>number
-<td>lines per message (post or email)</td>
+<td>3.11
+<td>lines per message (post or email)
 <tr valign=top><td><b>email_per_day</b><td>number
-<td>email sent per day</td>
+<td>3.11
+<td>email sent per day
 <tr valign=top><td><b>posts_per_day</b><td>number
-<td>messages posted per day</td>
+<td>3.11
+<td>messages posted per day
 <tr valign=top><td><b>free_credits_per_day</b><td>number
-<td>free credits given per day</td>
+<td>3.11
+<td>free credits given per day
 </table>
 <h2><a name=user.security>user.security object</a>
 <br><font size=-1>User security settings</font>
@@ -966,36 +1296,52 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Name</font>
 <th align=left width=100>
 <font color="white">Type</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>password</b><td>string
-<td>password</td>
+<td>3.10
+<td>password
 <tr valign=top><td><b>password_date</b><td>number
-<td>date password last modified (time_t format)</td>
+<td>3.10
+<td>date password last modified (time_t format)
 <tr valign=top><td><b>level</b><td>number
-<td>security level (0-99)</td>
+<td>3.10
+<td>security level (0-99)
 <tr valign=top><td><b>flags1</b><td>number
-<td>flag set #1 (bitfield)</td>
+<td>3.10
+<td>flag set #1 (bitfield)
 <tr valign=top><td><b>flags2</b><td>number
-<td>flag set #2 (bitfield)</td>
+<td>3.10
+<td>flag set #2 (bitfield)
 <tr valign=top><td><b>flags3</b><td>number
-<td>flag set #3 (bitfield)</td>
+<td>3.10
+<td>flag set #3 (bitfield)
 <tr valign=top><td><b>flags4</b><td>number
-<td>flag set #4 (bitfield)</td>
+<td>3.10
+<td>flag set #4 (bitfield)
 <tr valign=top><td><b>exemptions</b><td>number
-<td>exemption flags (bitfield)</td>
+<td>3.10
+<td>exemption flags (bitfield)
 <tr valign=top><td><b>restrictions</b><td>number
-<td>restriction flags (bitfield)</td>
+<td>3.10
+<td>restriction flags (bitfield)
 <tr valign=top><td><b>credits</b><td>number
-<td>credits</td>
+<td>3.10
+<td>credits
 <tr valign=top><td><b>free_credits</b><td>number
-<td>free credits (for today only)</td>
+<td>3.10
+<td>free credits (for today only)
 <tr valign=top><td><b>minutes</b><td>number
-<td>extra minutes (time bank)</td>
+<td>3.10
+<td>extra minutes (time bank)
 <tr valign=top><td><b>extra_time</b><td>number
-<td>extra minutes (for today only)</td>
+<td>3.10
+<td>extra minutes (for today only)
 <tr valign=top><td><b>expiration_date</b><td>number
-<td>expiration date/time (time_t format)</td>
+<td>3.10
+<td>expiration date/time (time_t format)
 </table>
 <h2><a name=bbs>bbs object</a>
 <br><font size=-1>Controls the Telnet/RLogin BBS experience</font>
@@ -1011,165 +1357,246 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Returns</font>
 <th align=left width=200>
 <font color="white">Usage</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>atcode</b><td>string<td><tt>bbs.atcode(string code)
+<td>3.10
 <td>returns @-code value, specified <i>code</i> string does not include @ character delimiters
 <tr valign=top><td><b>text</b><td>string<td><tt>bbs.text(number line)
+<td>3.10
 <td>returns specified text string from text.dat
 <tr valign=top><td><b>replace_text</b><td>boolean<td><tt>bbs.replace_text(number line, string text)
+<td>3.10
 <td>replaces specified text string in memory
 <tr valign=top><td><b>revert_text</b><td>boolean<td><tt>bbs.revert_text([number line])
+<td>3.10
 <td>reverts specified text string to original text string; if <i>line</i> unspecified, reverts all text lines
 <tr valign=top><td><b>load_text</b><td>boolean<td><tt>bbs.load_text(string basefilename)
+<td>3.10
 <td>load an alternate text.dat from ctrl directory, automatically appends '.dat' to basefilename
 <tr valign=top><td><b>newuser</b><td>void<td><tt>bbs.newuser()
+<td>3.10
 <td>interactive new user procedure
 <tr valign=top><td><b>login</b><td>boolean<td><tt>bbs.login(string username, password_prompt)
+<td>3.10
 <td>login with <i>username</i>, displaying <i>password_prompt</i> for password (if required)
 <tr valign=top><td><b>logon</b><td>boolean<td><tt>bbs.logon()
+<td>3.10
 <td>interactive logon procedure
 <tr valign=top><td><b>logoff</b><td>void<td><tt>bbs.logoff()
+<td>3.10
 <td>interactive logoff procedure
 <tr valign=top><td><b>logout</b><td>void<td><tt>bbs.logout()
+<td>3.10
 <td>non-interactive logout procedure
 <tr valign=top><td><b>hangup</b><td>void<td><tt>bbs.hangup()
+<td>3.10
 <td>hangup (disconnect) immediately
 <tr valign=top><td><b>nodesync</b><td>void<td><tt>bbs.nodesync()
+<td>3.10
 <td>synchronize with node database, checks for messages, interruption, etc. (AKA node_sync)
 <tr valign=top><td><b>auto_msg</b><td>void<td><tt>bbs.auto_msg()
+<td>3.10
 <td>read/create system's auto-message
 <tr valign=top><td><b>time_bank</b><td>void<td><tt>bbs.time_bank()
+<td>3.10
 <td>enter the time banking system
 <tr valign=top><td><b>qwk_sec</b><td>void<td><tt>bbs.qwk_sec()
+<td>3.10
 <td>enter the QWK message packet upload/download/config section
 <tr valign=top><td><b>text_sec</b><td>void<td><tt>bbs.text_sec()
+<td>3.10
 <td>enter the text files section
 <tr valign=top><td><b>xtrn_sec</b><td>void<td><tt>bbs.xtrn_sec()
+<td>3.10
 <td>enter the external programs section
 <tr valign=top><td><b>xfer_policy</b><td>void<td><tt>bbs.xfer_policy()
+<td>3.10
 <td>display the file transfer policy
 <tr valign=top><td><b>batch_menu</b><td>void<td><tt>bbs.batch_menu()
+<td>3.10
 <td>enter the batch file transfer menu
 <tr valign=top><td><b>batch_download</b><td>boolean<td><tt>bbs.batch_download()
+<td>3.10
 <td>start a batch download
 <tr valign=top><td><b>batch_add_list</b><td>void<td><tt>bbs.batch_add_list(filename)
+<td>3.10
 <td>add file list to batch download queue
 <tr valign=top><td><b>temp_xfer</b><td>void<td><tt>bbs.temp_xfer()
+<td>3.10
 <td>enter the temporary file tranfer menu
 <tr valign=top><td><b>user_sync</b><td>void<td><tt>bbs.user_sync()
+<td>3.10
 <td>read the current user data from the database
 <tr valign=top><td><b>user_config</b><td>void<td><tt>bbs.user_config()
+<td>3.10
 <td>enter the user settings configuration menu
 <tr valign=top><td><b>sys_info</b><td>void<td><tt>bbs.sys_info()
+<td>3.10
 <td>display system information
 <tr valign=top><td><b>sub_info</b><td>void<td><tt>bbs.sub_info([subboard])
+<td>3.10
 <td>display message sub-board information (current <i>subboard</i>, if unspecified)
 <tr valign=top><td><b>dir_info</b><td>void<td><tt>bbs.dir_info([directory])
+<td>3.10
 <td>display file directory information (current <i>directory</i>, if unspecified)
 <tr valign=top><td><b>user_info</b><td>void<td><tt>bbs.user_info()
+<td>3.10
 <td>display current user information
 <tr valign=top><td><b>ver</b><td>void<td><tt>bbs.ver()
+<td>3.10
 <td>display software version information
 <tr valign=top><td><b>sys_stats</b><td>void<td><tt>bbs.sys_stats()
+<td>3.10
 <td>display system statistics
 <tr valign=top><td><b>node_stats</b><td>void<td><tt>bbs.node_stats()
+<td>3.10
 <td>display current node statistics
 <tr valign=top><td><b>list_users</b><td>void<td><tt>bbs.list_users()
+<td>3.10
 <td>display user list
 <tr valign=top><td><b>edit_user</b><td>void<td><tt>bbs.edit_user()
+<td>3.10
 <td>enter the user editor
 <tr valign=top><td><b>change_user</b><td>void<td><tt>bbs.change_user()
+<td>3.10
 <td>change to a different user
 <tr valign=top><td><b>list_logons</b><td>void<td><tt>bbs.list_logons()
+<td>3.10
 <td>display the logon list
 <tr valign=top><td><b>read_mail</b><td>void<td><tt>bbs.read_mail()
+<td>3.10
 <td>read private e-mail
 <tr valign=top><td><b>email</b><td>boolean<td><tt>bbs.email(number user [,number mode] [,string top] [,string subject])
+<td>3.10
 <td>send private e-mail or netmail
 <tr valign=top><td><b>netmail</b><td>boolean<td><tt>bbs.netmail(string address [,number mode] [,string subject])
+<td>3.10
 <td>send private netmail
 <tr valign=top><td><b>bulk_mail</b><td>void<td><tt>bbs.bulk_mail([ars])
+<td>3.10
 <td>send bulk private e-mail
 <tr valign=top><td><b>upload_file</b><td>boolean<td><tt>bbs.upload_file(directory)
+<td>3.10
 <td>upload file to file directory specified by number or internal code
 <tr valign=top><td><b>bulk_upload</b><td>boolean<td><tt>bbs.bulk_upload(directory)
+<td>3.10
 <td>add files (already in local storage path) to file directory specified by number or internal code
 <tr valign=top><td><b>resort_dir</b><td>boolean<td><tt>bbs.resort_dir(directory)
+<td>3.10
 <td>re-sort the file directory specified by number or internal code)
 <tr valign=top><td><b>list_files</b><td>number<td><tt>bbs.list_files(directory [,string filespec] [,number mode])
+<td>3.10
 <td>list files in the specified file directory, optionally specifying a file specification (wildcards) and <i>mode</i> (bitfield)
 <tr valign=top><td><b>list_file_info</b><td>number<td><tt>bbs.list_file_info(directory [,string filespec] [,number mode])
+<td>3.10
 <td>list extended file information for files in the specified file directory
 <tr valign=top><td><b>post_msg</b><td>boolean<td><tt>bbs.post_msg(sub-board [,number mode])
+<td>3.10
 <td>post a message in the specified message sub-board (number or internal code) with optinal <i>mode</i> (bitfield)
 <tr valign=top><td><b>cfg_msg_scan</b><td>void<td><tt>bbs.cfg_msg_scan([number type])
+<td>3.10
 <td>configure message scan (<i>type</i> is either <tt>SCAN_CFG_NEW</tt> or <tt>SCAN_CFG_TOYOU</tt>)
 <tr valign=top><td><b>cfg_msg_ptrs</b><td>void<td><tt>bbs.cfg_msg_ptrs([number type])
+<td>3.10
 <td>change message scan pointer values (<i>type</i> is either <tt>SCAN_CFG_NEW</tt> or <tt>SCAN_CFG_TOYOU</tt>)
 <tr valign=top><td><b>reinit_msg_ptrs</b><td>void<td><tt>bbs.reinit_msg_ptrs()
+<td>3.10
 <td>re-initialize new message scan pointers
 <tr valign=top><td><b>scan_subs</b><td>void<td><tt>bbs.scan_subs([number mode, boolean all])
+<td>3.10
 <td>scan sub-boards for messages
 <tr valign=top><td><b>scan_dirs</b><td>void<td><tt>bbs.scan_dirs([number mode, boolean all])
+<td>3.10
 <td>scan directories for files
 <tr valign=top><td><b>scan_posts</b><td>boolean<td><tt>bbs.scan_posts([sub-board, number mode, string find])
+<td>3.10
 <td>scan posts in the specified message sub-board (number or internal code), optionally search for 'find' string
 <tr valign=top><td><b>menu</b><td>void<td><tt>bbs.menu(base_filename)
+<td>3.10
 <td>display a menu file from the text/menu directory
 <tr valign=top><td><b>log_key</b><td>boolean<td><tt>bbs.log_key(key [,boolean comma])
+<td>3.10
 <td>log key to node.log (comma optional)
 <tr valign=top><td><b>log_str</b><td>boolean<td><tt>bbs.log_str(text)
+<td>3.10
 <td>log string to node.log
 <tr valign=top><td><b>finduser</b><td>number<td><tt>bbs.finduser(username_or_number)
+<td>3.10
 <td>find user name (partial name support), interactive
 <tr valign=top><td><b>trashcan</b><td>boolean<td><tt>bbs.trashcan(base_filename, search_string)
+<td>3.10
 <td>search file for psuedo-regexp (search string) in trashcan file (text/base_filename.can)
 <tr valign=top><td><b>exec</b><td>number<td><tt>bbs.exec(cmdline [,number mode] [,string startup_dir])
+<td>3.10
 <td>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> bits)
 <tr valign=top><td><b>exec_xtrn</b><td>boolean<td><tt>bbs.exec_xtrn(xtrn_number_or_code)
+<td>3.10
 <td>execute external program by internal code
 <tr valign=top><td><b>user_event</b><td>boolean<td><tt>bbs.user_event(number event_type)
+<td>3.10
 <td>execute user event by event type (see <tt>EVENT_*</tt> in <tt>sbbsdefs.js</tt> for valid values)
 <tr valign=top><td><b>telnet_gate</b><td>void<td><tt>bbs.telnet_gate(string address [,number mode])
+<td>3.10
 <td>external telnet gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> bits)
 <tr valign=top><td><b>check_syspass</b><td>boolean<td><tt>bbs.check_syspass()
+<td>3.10
 <td>prompt for and verify system password
 <tr valign=top><td><b>good_password</b><td>string<td><tt>bbs.good_password(string password)
+<td>3.10
 <td>check if requested user password meets minimum password requirements (length, uniqueness, etc.)
 <tr valign=top><td><b>page_sysop</b><td>boolean<td><tt>bbs.page_sysop()
+<td>3.10
 <td>page the sysop for chat
 <tr valign=top><td><b>page_guru</b><td>boolean<td><tt>bbs.page_guru()
+<td>3.10
 <td>page the guru for chat
 <tr valign=top><td><b>multinode_chat</b><td>void<td><tt>bbs.multinode_chat()
+<td>3.10
 <td>enter multi-node chat
 <tr valign=top><td><b>private_message</b><td>void<td><tt>bbs.private_message()
+<td>3.10
 <td>use the private inter-node message prompt
 <tr valign=top><td><b>private_chat</b><td>void<td><tt>bbs.private_chat()
+<td>3.10
 <td>enter private inter-node chat
 <tr valign=top><td><b>get_node_message</b><td>void<td><tt>bbs.get_node_message()
+<td>3.10
 <td>receive and display an inter-node message
 <tr valign=top><td><b>put_node_message</b><td>boolean<td><tt>bbs.put_node_message(number node, string text)
+<td>3.10
 <td>send an inter-node message
 <tr valign=top><td><b>get_telegram</b><td>void<td><tt>bbs.get_telegram([number usernum])
+<td>3.10
 <td>receive and display a telegram
 <tr valign=top><td><b>put_telegram</b><td>boolean<td><tt>bbs.put_telegram(number user, string text)
+<td>3.10
 <td>send a telegram to a user
 <tr valign=top><td><b>list_nodes</b><td>void<td><tt>bbs.list_nodes()
+<td>3.10
 <td>list all nodes
 <tr valign=top><td><b>whos_online</b><td>void<td><tt>bbs.whos_online()
+<td>3.10
 <td>list active nodes only (who's online)
 <tr valign=top><td><b>spy</b><td>void<td><tt>bbs.spy(node_number)
+<td>3.10
 <td>spy on a node
 <tr valign=top><td><b>cmdstr</b><td>string<td><tt>bbs.cmdstr(string str [,string fpath] [,string fspec])
+<td>3.10
 <td>return expanded command string using Synchronet command-line specifiers
 <tr valign=top><td><b>get_filespec</b><td>string<td><tt>bbs.get_filespec()
+<td>3.10
 <td>returns a file specification input by the user (optionally with wildcards)
 <tr valign=top><td><b>get_newscantime</b><td>number<td><tt>bbs.get_newscantime(number time)
+<td>3.10
 <td>confirm or change newscan time, returns new newscan time value (time_t format)
 <tr valign=top><td><b>select_shell</b><td>boolean<td><tt>bbs.select_shell()
+<td>3.10
 <td>prompt user to select a new command shell
 <tr valign=top><td><b>select_editor</b><td>boolean<td><tt>bbs.select_editor()
+<td>3.10
 <td>prompt user to select a new external message editor
 </table>
 <br>
@@ -1182,162 +1609,241 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Name</font>
 <th align=left width=100>
 <font color="white">Type</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>sys_status</b><td>number
-<td>system status bitfield (see <tt>SS_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)</td>
+<td>3.10
+<td>system status bitfield (see <tt>SS_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)
 <tr valign=top><td><b>startup_options</b><td>number
-<td>startup options bitfield (see <tt>BBS_OPT_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)</td>
+<td>3.10
+<td>startup options bitfield (see <tt>BBS_OPT_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)
 <tr valign=top><td><b>answer_time</b><td>number
-<td>answer time, in time_t format</td>
+<td>3.10
+<td>answer time, in time_t format
 <tr valign=top><td><b>logon_time</b><td>number
-<td>logon time, in time_t format</td>
+<td>3.10
+<td>logon time, in time_t format
 <tr valign=top><td><b>new_file_time</b><td>number
-<td>file newscan time, in time_t format</td>
+<td>3.10
+<td>file newscan time, in time_t format
 <tr valign=top><td><b>last_new_file_time</b><td>number
-<td>previous newscan time, in time_t format</td>
+<td>3.10
+<td>previous newscan time, in time_t format
 <tr valign=top><td><b>online</b><td>number
-<td>online (see <tt>ON_*</tt> in <tt>sbbsdefs.js</tt> for valid values)</td>
+<td>3.10
+<td>online (see <tt>ON_*</tt> in <tt>sbbsdefs.js</tt> for valid values)
 <tr valign=top><td><b>time_left</b><td>number
-<td>time left (in seconds)</td>
+<td>3.11
+<td>time left (in seconds)
 <tr valign=top><td><b>event_time</b><td>number
-<td>time of next exclusive event (in time_t format), or 0 if none</td>
+<td>3.11
+<td>time of next exclusive event (in time_t format), or 0 if none
 <tr valign=top><td><b>event_code</b><td>string
-<td>internal code of next exclusive event</td>
+<td>3.11
+<td>internal code of next exclusive event
 <tr valign=top><td><b>node_num</b><td>number
-<td>current node number</td>
+<td>3.10
+<td>current node number
 <tr valign=top><td><b>node_settings</b><td>number
-<td>current node settings bitfield (see <tt>NM_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)</td>
+<td>3.10
+<td>current node settings bitfield (see <tt>NM_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)
 <tr valign=top><td><b>node_action</b><td>number
-<td>current node action (see <tt>nodedefs.js</tt> for valid values)</td>
+<td>3.10
+<td>current node action (see <tt>nodedefs.js</tt> for valid values)
 <tr valign=top><td><b>node_val_user</b><td>number
-<td>validation feedback user for this node (or 0 for no validation feedback required)</td>
+<td>3.10
+<td>validation feedback user for this node (or 0 for no validation feedback required)
 <tr valign=top><td><b>logon_ulb</b><td>number
-<td>bytes uploaded during this session</td>
+<td>3.10
+<td>bytes uploaded during this session
 <tr valign=top><td><b>logon_dlb</b><td>number
-<td>bytes downloaded during this session</td>
+<td>3.10
+<td>bytes downloaded during this session
 <tr valign=top><td><b>logon_uls</b><td>number
-<td>files uploaded during this session</td>
+<td>3.10
+<td>files uploaded during this session
 <tr valign=top><td><b>logon_dls</b><td>number
-<td>files downloaded during this session</td>
+<td>3.10
+<td>files downloaded during this session
 <tr valign=top><td><b>logon_posts</b><td>number
-<td>messages posted during this session</td>
+<td>3.10
+<td>messages posted during this session
 <tr valign=top><td><b>logon_emails</b><td>number
-<td>e-mails sent during this session</td>
+<td>3.10
+<td>e-mails sent during this session
 <tr valign=top><td><b>logon_fbacks</b><td>number
-<td>feedback messages sent during this session</td>
+<td>3.10
+<td>feedback messages sent during this session
 <tr valign=top><td><b>posts_read</b><td>number
-<td>messages read during this session</td>
+<td>3.10
+<td>messages read during this session
 <tr valign=top><td><b>menu_dir</b><td>string
-<td>menu subdirectory (overrides default)</td>
+<td>3.10
+<td>menu subdirectory (overrides default)
 <tr valign=top><td><b>menu_file</b><td>string
-<td>menu file (overrides default)</td>
+<td>3.10
+<td>menu file (overrides default)
 <tr valign=top><td><b>main_cmds</b><td>number
-<td>total main menu commands received from user during this session</td>
+<td>3.10
+<td>total main menu commands received from user during this session
 <tr valign=top><td><b>file_cmds</b><td>number
-<td>total file menu commands received from user during this session</td>
+<td>3.10
+<td>total file menu commands received from user during this session
 <tr valign=top><td><b>curgrp</b><td>number
-<td>current message group</td>
+<td>3.10
+<td>current message group
 <tr valign=top><td><b>cursub</b><td>number
-<td>current message sub-board</td>
+<td>3.10
+<td>current message sub-board
 <tr valign=top><td><b>curlib</b><td>number
-<td>current file library</td>
+<td>3.10
+<td>current file library
 <tr valign=top><td><b>curdir</b><td>number
-<td>current file directory</td>
+<td>3.10
+<td>current file directory
 <tr valign=top><td><b>connection</b><td>string
-<td>remote connection type</td>
+<td>3.10
+<td>remote connection type
 <tr valign=top><td><b>rlogin_name</b><td>string
-<td>rlogin name</td>
+<td>3.10
+<td>rlogin name
 <tr valign=top><td><b>client_name</b><td>string
-<td>client name</td>
+<td>3.10
+<td>client name
 <tr valign=top><td><b>alt_ul_dir</b><td>number
-<td>current alternate upload path number</td>
+<td>3.10
+<td>current alternate upload path number
 <tr valign=top><td><b>smb_group</b><td>string
-<td>message group name of message being read</td>
+<td>3.10
+<td>message group name of message being read
 <tr valign=top><td><b>smb_group_desc</b><td>string
-<td>message group description of message being read</td>
+<td>3.10
+<td>message group description of message being read
 <tr valign=top><td><b>smb_group_number</b><td>number
-<td>message group number of message being read</td>
+<td>3.10
+<td>message group number of message being read
 <tr valign=top><td><b>smb_sub</b><td>string
-<td>sub-board name of message being read</td>
+<td>3.10
+<td>sub-board name of message being read
 <tr valign=top><td><b>smb_sub_desc</b><td>string
-<td>sub-board description of message being read</td>
+<td>3.10
+<td>sub-board description of message being read
 <tr valign=top><td><b>smb_sub_code</b><td>string
-<td>sub-board internal code of message being read</td>
+<td>3.10
+<td>sub-board internal code of message being read
 <tr valign=top><td><b>smb_sub_number</b><td>number
-<td>sub-board number of message being read</td>
+<td>3.10
+<td>sub-board number of message being read
 <tr valign=top><td><b>smb_attr</b><td>number
-<td>message base attributes</td>
+<td>3.10
+<td>message base attributes
 <tr valign=top><td><b>smb_last_msg</b><td>number
-<td>highest message number in message base</td>
+<td>3.10
+<td>highest message number in message base
 <tr valign=top><td><b>smb_total_msgs</b><td>number
-<td>total number of messages in message base</td>
+<td>3.10
+<td>total number of messages in message base
 <tr valign=top><td><b>smb_msgs</b><td>number
-<td>number of messages loaded from message base</td>
+<td>3.10
+<td>number of messages loaded from message base
 <tr valign=top><td><b>smb_curmsg</b><td>number
-<td>current message number in message base</td>
+<td>3.10
+<td>current message number in message base
 <tr valign=top><td><b>msg_to</b><td>string
-<td>message recipient name</td>
+<td>3.10
+<td>message recipient name
 <tr valign=top><td><b>msg_to_ext</b><td>string
-<td>message recipient extension</td>
+<td>3.10
+<td>message recipient extension
 <tr valign=top><td><b>msg_to_net</b><td>string
-<td>message recipient network type</td>
+<td>3.10
+<td>message recipient network type
 <tr valign=top><td><b>msg_to_agent</b><td>number
-<td>message recipient agent type</td>
+<td>3.10
+<td>message recipient agent type
 <tr valign=top><td><b>msg_from</b><td>string
-<td>message sender name</td>
+<td>3.10
+<td>message sender name
 <tr valign=top><td><b>msg_from_ext</b><td>string
-<td>message sender extension</td>
+<td>3.10
+<td>message sender extension
 <tr valign=top><td><b>msg_from_net</b><td>string
-<td>message sender network type</td>
+<td>3.10
+<td>message sender network type
 <tr valign=top><td><b>msg_from_agent</b><td>number
-<td>message sender agent type</td>
+<td>3.10
+<td>message sender agent type
 <tr valign=top><td><b>msg_replyto</b><td>string
-<td>message reply-to name</td>
+<td>3.10
+<td>message reply-to name
 <tr valign=top><td><b>msg_replyto_ext</b><td>string
-<td>message reply-to extension</td>
+<td>3.10
+<td>message reply-to extension
 <tr valign=top><td><b>msg_replyto_net</b><td>string
-<td>message reply-to network type</td>
+<td>3.10
+<td>message reply-to network type
 <tr valign=top><td><b>msg_replyto_agent</b><td>number
-<td>message reply-to agent type</td>
+<td>3.10
+<td>message reply-to agent type
 <tr valign=top><td><b>msg_subject</b><td>string
-<td>message subject</td>
+<td>3.10
+<td>message subject
 <tr valign=top><td><b>msg_date</b><td>number
-<td>message date/time</td>
+<td>3.10
+<td>message date/time
 <tr valign=top><td><b>msg_timezone</b><td>number
-<td>message time zone</td>
+<td>3.10
+<td>message time zone
 <tr valign=top><td><b>msg_date_imported</b><td>number
-<td>message date/time imported</td>
+<td>3.10
+<td>message date/time imported
 <tr valign=top><td><b>msg_attr</b><td>number
-<td>message attributes</td>
+<td>3.10
+<td>message attributes
 <tr valign=top><td><b>msg_auxattr</b><td>number
-<td>message auxillary attributes</td>
+<td>3.10
+<td>message auxillary attributes
 <tr valign=top><td><b>msg_netattr</b><td>number
-<td>message network attributes</td>
+<td>3.10
+<td>message network attributes
 <tr valign=top><td><b>msg_offset</b><td>number
-<td>message header offset</td>
+<td>3.10
+<td>message header offset
 <tr valign=top><td><b>msg_number</b><td>number
-<td>message number</td>
+<td>3.10
+<td>message number
 <tr valign=top><td><b>msg_expiration</b><td>number
-<td>message expiration</td>
+<td>3.10
+<td>message expiration
 <tr valign=top><td><b>msg_forwarded</b><td>number
-<td>message forwarded</td>
+<td>3.10
+<td>message forwarded
 <tr valign=top><td><b>msg_thread_orig</b><td>number
-<td>message thread, original message number</td>
+<td>3.10
+<td>message thread, original message number
 <tr valign=top><td><b>msg_thread_next</b><td>number
-<td>message thread, next message number</td>
+<td>3.10
+<td>message thread, next message number
 <tr valign=top><td><b>msg_thread_first</b><td>number
-<td>message thread, first reply to this message</td>
+<td>3.10
+<td>message thread, first reply to this message
 <tr valign=top><td><b>msg_id</b><td>string
-<td>message identifier</td>
+<td>3.10
+<td>message identifier
 <tr valign=top><td><b>msg_reply_id</b><td>string
-<td>message replied-to identifier</td>
+<td>3.10
+<td>message replied-to identifier
 <tr valign=top><td><b>msg_delivery_attempts</b><td>number
-<td>message delivery attempt counter</td>
+<td>3.10
+<td>message delivery attempt counter
 <tr valign=top><td><b>batch_upload_total</b><td>number
-<td>number of files in batch upload queue</td>
+<td>3.10
+<td>number of files in batch upload queue
 <tr valign=top><td><b>batch_dnload_total</b><td>number
-<td>number of files in batch download queue</td>
+<td>3.10
+<td>number of files in batch download queue
 </table>
 <h2><a name=console>console object</a>
 <br><font size=-1>Controls the user's Telnet/RLogin terminal</font>
@@ -1353,89 +1859,132 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Returns</font>
 <th align=left width=200>
 <font color="white">Usage</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>inkey</b><td>string<td><tt>console.inkey([number mode] [,number timeout])
+<td>3.11
 <td>get a single key with optional <i>timeout</i> in milliseconds (defaults to 0, for no wait), see <tt>K_*</tt> in <tt>sbbsdefs.js</tt> for <i>mode</i> bits
 <tr valign=top><td><b>getkey</b><td>string<td><tt>console.getkey([number mode])
+<td>3.10
 <td>get a single key, with wait, see <tt>K_*</tt> in <tt>sbbsdefs.js</tt> for <i>mode</i> bits
 <tr valign=top><td><b>getstr</b><td>string<td><tt>console.getstr([string][,maxlen][,mode])
+<td>3.10
 <td>get a text string from the user, see <tt>K_*</tt> in <tt>sbbsdefs.js</tt> for <i>mode</i> bits
 <tr valign=top><td><b>getnum</b><td>number<td><tt>console.getnum([maxnum])
+<td>3.10
 <td>get a number between 1 and <i>maxnum</i> from the user
 <tr valign=top><td><b>getkeys</b><td>number<td><tt>console.getkeys(string keys [,maxnum])
+<td>3.10
 <td>get one key from of a list of valid command <i>keys</i>, or a number between 1 and <i>maxnum</i>
 <tr valign=top><td><b>gettemplate</b><td>string<td><tt>console.gettemplate(format [,string] [,mode])
+<td>3.10
 <td>get a string based on template
 <tr valign=top><td><b>ungetstr</b><td>void<td><tt>console.ungetstr()
+<td>3.10
 <td>put a string in the keyboard buffer
 <tr valign=top><td><b>yesno</b><td>boolean<td><tt>console.yesno(string question)
+<td>3.10
 <td>YES/no question
 <tr valign=top><td><b>noyes</b><td>boolean<td><tt>console.noyes(string question)
+<td>3.10
 <td>NO/yes question
 <tr valign=top><td><b>mnemonics</b><td>void<td><tt>console.mnemonics(string text)
+<td>3.10
 <td>print a mnemonics string
 <tr valign=top><td><b>clear</b><td>void<td><tt>console.clear()
+<td>3.10
 <td>clear screen and home cursor
 <tr valign=top><td><b>home</b><td>void<td><tt>console.home()
+<td>3.11
 <td>send cursor to home position (x,y:1,1)
 <tr valign=top><td><b>clearline</b><td>void<td><tt>console.clearline()
+<td>3.10
 <td>clear current line
 <tr valign=top><td><b>cleartoeol</b><td>void<td><tt>console.cleartoeol()
+<td>3.11
 <td>clear to end-of-line (ANSI)
 <tr valign=top><td><b>crlf</b><td>void<td><tt>console.crlf()
+<td>3.10
 <td>output a carriage-return/line-feed pair (new-line)
 <tr valign=top><td><b>pause</b><td>void<td><tt>console.pause()
+<td>3.10
 <td>display pause prompt and wait for key hit
 <tr valign=top><td><b>beep</b><td>void<td><tt>console.beep([number count])
+<td>3.11
 <td>beep for count number of times (default count is 1)
 <tr valign=top><td><b>print</b><td>void<td><tt>console.print(string text)
+<td>3.10
 <td>display a string (supports Ctrl-A codes)
 <tr valign=top><td><b>write</b><td>void<td><tt>console.write(string text)
+<td>3.10
 <td>display a raw string
 <tr valign=top><td><b>putmsg</b><td>void<td><tt>console.putmsg(string text [,number mode])
+<td>3.10
 <td>display message text (Ctrl-A codes, @-codes, pipe codes, etc), see <tt>P_*</tt> in <tt>sbbsdefs.js</tt> for <i>mode</i> bits
 <tr valign=top><td><b>center</b><td>void<td><tt>console.center(string text)
+<td>3.10
 <td>display a string centered on the screen
 <tr valign=top><td><b>strlen</b><td>number<td><tt>console.strlen(string text)
+<td>3.10
 <td>returns the number of characters in text, excluding Ctrl-A codes
 <tr valign=top><td><b>printfile</b><td>void<td><tt>console.printfile(string text [,number mode])
+<td>3.10
 <td>print a message text file with optional mode
 <tr valign=top><td><b>printtail</b><td>void<td><tt>console.printtail(string text, number lines [,number mode])
+<td>3.10
 <td>print last x lines of file with optional mode
 <tr valign=top><td><b>editfile</b><td>void<td><tt>console.editfile(string filename)
+<td>3.10
 <td>edit/create a text file using the user's preferred message editor
 <tr valign=top><td><b>uselect</b><td>number<td><tt>console.uselect([number, string title, string item, string ars])
+<td>3.10
 <td>user selection menu, call for each item, then with no args to display select menu
 <tr valign=top><td><b>saveline</b><td>void<td><tt>console.saveline()
+<td>3.10
 <td>save last output line
 <tr valign=top><td><b>restoreline</b><td>void<td><tt>console.restoreline()
+<td>3.10
 <td>restore last output line
 <tr valign=top><td><b>ansi</b><td>string<td><tt>console.ansi(number attribute)
+<td>3.10
 <td>returns ANSI encoding of specified attribute
 <tr valign=top><td><b>pushxy</b><td>void<td><tt>console.pushxy()
+<td>3.11
 <td>save current cursor position (AKA ansi_save)
 <tr valign=top><td><b>popxy</b><td>void<td><tt>console.popxy()
+<td>3.11
 <td>restore saved cursor position (AKA ansi_restore)
 <tr valign=top><td><b>gotoxy</b><td>void<td><tt>console.gotoxy(number x,y)
+<td>3.11
 <td>Move cursor to a specific screen coordinate (ANSI), arguments can be separate x and y cooridinates or an object with x and y properites (like that returned from <tt>console.getxy()</tt>)
 <tr valign=top><td><b>up</b><td>void<td><tt>console.up([number rows])
+<td>3.11
 <td>Move cursor up one or more rows (ANSI)
 <tr valign=top><td><b>down</b><td>void<td><tt>console.down([number rows])
+<td>3.11
 <td>Move cursor down one or more rows (ANSI)
 <tr valign=top><td><b>right</b><td>void<td><tt>console.right([number columns])
+<td>3.11
 <td>Move cursor right one or more columns (ANSI)
 <tr valign=top><td><b>left</b><td>void<td><tt>console.left([number columns])
+<td>3.11
 <td>Move cursor left one or more columns (ANSI)
 <tr valign=top><td><b>getlines</b><td>void<td><tt>console.getlines()
+<td>3.11
 <td>Auto-detect the number of rows/lines on the user's terminal (ANSI)
 <tr valign=top><td><b>getxy</b><td>object<td><tt>console.getxy()
+<td>3.11
 <td>Returns the current cursor position as an object (with x and y properties)
 <tr valign=top><td><b>lock_input</b><td>void<td><tt>console.lock_input([boolean lock])
+<td>3.10
 <td>Lock the user input thread (allowing direct client socket access)
 <tr valign=top><td><b>telnet_cmd</b><td>void<td><tt>console.telnet_cmd(number cmd [,number option])
+<td>3.10
 <td>Send telnet command (with optional command option) to remote client
 <tr valign=top><td><b>handle_ctrlkey</b><td>boolean<td><tt>console.handle_ctrlkey(string key [,number mode])
+<td>3.11
 <td>Call internal control key handler for specified control key, returns true if handled
 </table>
 <br>
@@ -1448,48 +1997,68 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Name</font>
 <th align=left width=100>
 <font color="white">Type</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>status</b><td>number
-<td>status bitfield (see <tt>CON_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)</td>
+<td>3.10
+<td>status bitfield (see <tt>CON_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)
 <tr valign=top><td><b>line_counter</b><td>number
-<td>current line counter (used for automatic screen pause)</td>
+<td>3.10
+<td>current line counter (used for automatic screen pause)
 <tr valign=top><td><b>attributes</b><td>number
-<td>current display attributes (set with number or string value)</td>
+<td>3.10
+<td>current display attributes (set with number or string value)
 <tr valign=top><td><b>top_of_screen</b><td>number
-<td>set to 1 if the terminal cursor is already at the top of the screen</td>
+<td>3.10
+<td>set to 1 if the terminal cursor is already at the top of the screen
 <tr valign=top><td><b>screen_rows</b><td>number
-<td>number of terminal screen rows (in lines)</td>
+<td>3.10
+<td>number of terminal screen rows (in lines)
 <tr valign=top><td><b>screen_columns</b><td>number
-<td>number of terminal screen columns (in character cells)</td>
+<td>3.11
+<td>number of terminal screen columns (in character cells)
 <tr valign=top><td><b>autoterm</b><td>number
-<td>bitfield of automatically detected terminal settings (see <tt>USER_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)</td>
+<td>3.10
+<td>bitfield of automatically detected terminal settings (see <tt>USER_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)
 <tr valign=top><td><b>terminal</b><td>string
-<td>terminal type description (e.g. 'ANSI')</td>
+<td>3.11
+<td>terminal type description (e.g. 'ANSI')
 <tr valign=top><td><b>timeout</b><td>number
-<td>user inactivity timeout reference</td>
+<td>3.10
+<td>user inactivity timeout reference
 <tr valign=top><td><b>timeleft_warning</b><td>number
-<td>low timeleft warning flag</td>
+<td>3.10
+<td>low timeleft warning flag
 <tr valign=top><td><b>aborted</b><td>number
-<td>input/output has been aborted</td>
+<td>3.10
+<td>input/output has been aborted
 <tr valign=top><td><b>abortable</b><td>number
-<td>output can be aborted with Ctrl-C</td>
+<td>3.10
+<td>output can be aborted with Ctrl-C
 <tr valign=top><td><b>telnet_mode</b><td>number
-<td>current telnet mode bitfield (see <tt>TELNET_MODE_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)</td>
+<td>3.10
+<td>current telnet mode bitfield (see <tt>TELNET_MODE_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)
 <tr valign=top><td><b>wordwrap</b><td>string
-<td>word-wrap buffer (used by getstr)	- <small>READ ONLY</small></td>
+<td>3.10
+<td>word-wrap buffer (used by getstr)	- <small>READ ONLY</small>
 <tr valign=top><td><b>question</b><td>string
-<td>current yes/no question (set by yesno and noyes)</td>
+<td>3.10
+<td>current yes/no question (set by yesno and noyes)
 <tr valign=top><td><b>getstr_offset</b><td>number
-<td>cursor position offset for use with <tt>getstr(K_USEOFFSET)</tt></td>
+<td>3.11
+<td>cursor position offset for use with <tt>getstr(K_USEOFFSET)</tt>
 <tr valign=top><td><b>ctrlkey_passthru</b><td>number
-<td>control key pass-through bitmask, set bits represent control key combinations <i>not</i> handled by <tt>inkey()</tt> method</td>
+<td>3.10
+<td>control key pass-through bitmask, set bits represent control key combinations <i>not</i> handled by <tt>inkey()</tt> method
 </table>
 <h2><a name=msg_area>msg_area object</a>
 <br><font size=-1>Message Areas</font>
 </h2>
 <h2><a name=msg_area.sub>msg_area.sub object</a>
 <br><font size=-1>Associative array of all sub-boards (use internal code as index)</font>
+<font size=-1> - introduced in v3.11</font>
 </h2>
 <h2><a name=msg_area.grp_list>msg_area.grp_list array</a>
 <br><font size=-1>Message Groups</font>
@@ -1506,13 +2075,13 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>number</b><td>number
-<td>group number</td>
+<td>group number
 <tr valign=top><td><b>name</b><td>string
-<td>group name</td>
+<td>group name
 <tr valign=top><td><b>description</b><td>string
-<td>group description</td>
+<td>group description
 <tr valign=top><td><b>ars</b><td>string
-<td>group access requirements</td>
+<td>group access requirements
 </table>
 <h2><a name=msg_area.grp_list.sub_list>msg_area.grp_list.sub_list array</a>
 <br><font size=-1>Message Sub-boards</h2>(all properties are <small>READ ONLY</small> except for <i>scan_ptr</i>, <i>scan_cfg</i>, and <i>last_read</i>)</font>
@@ -1529,67 +2098,68 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>number</b><td>number
-<td>sub-board number</td>
+<td>sub-board number
 <tr valign=top><td><b>grp_number</b><td>number
-<td>group number</td>
+<td>group number
 <tr valign=top><td><b>code</b><td>string
-<td>sub-board internal code</td>
+<td>sub-board internal code
 <tr valign=top><td><b>name</b><td>string
-<td>sub-board name</td>
+<td>sub-board name
 <tr valign=top><td><b>description</b><td>string
-<td>sub-board description</td>
+<td>sub-board description
 <tr valign=top><td><b>qwk_name</b><td>string
-<td>sub-board QWK name</td>
+<td>sub-board QWK name
 <tr valign=top><td><b>newsgroup</b><td>string
-<td>newsgroup name (as configured or dymamically generated)</td>
+<td>newsgroup name (as configured or dymamically generated)
 <tr valign=top><td><b>ars</b><td>string
-<td>sub-board access requirements</td>
+<td>sub-board access requirements
 <tr valign=top><td><b>read_ars</b><td>string
-<td>sub-board reading requirements</td>
+<td>sub-board reading requirements
 <tr valign=top><td><b>post_ars</b><td>string
-<td>sub-board posting requirements</td>
+<td>sub-board posting requirements
 <tr valign=top><td><b>operator_ars</b><td>string
-<td>sub-board operator requirements</td>
+<td>sub-board operator requirements
 <tr valign=top><td><b>moderated_ars</b><td>string
-<td>sub-board moderated-user requirements (if non-blank)</td>
+<td>sub-board moderated-user requirements (if non-blank)
 <tr valign=top><td><b>data_dir</b><td>string
-<td>sub-board data storage location</td>
+<td>sub-board data storage location
 <tr valign=top><td><b>fidonet_origin</b><td>string
-<td>FidoNet origin line</td>
+<td>FidoNet origin line
 <tr valign=top><td><b>qwknet_tagline</b><td>string
-<td>QWK Network tagline</td>
+<td>QWK Network tagline
 <tr valign=top><td><b>settings</b><td>number
-<td>toggle options (bitfield)</td>
+<td>toggle options (bitfield)
 <tr valign=top><td><b>ptridx</b><td>number
-<td>index into message scan configuration/pointer file</td>
+<td>index into message scan configuration/pointer file
 <tr valign=top><td><b>qwk_conf</b><td>number
-<td>QWK conference number</td>
+<td>QWK conference number
 <tr valign=top><td><b>max_crcs</b><td>number
-<td>configured maximum number of message CRCs to store (for dupe checking)</td>
+<td>configured maximum number of message CRCs to store (for dupe checking)
 <tr valign=top><td><b>max_msgs</b><td>number
-<td>configured maximum number of messages before purging</td>
+<td>configured maximum number of messages before purging
 <tr valign=top><td><b>max_age</b><td>number
-<td>configured maximum age (in days) of messages before expiration</td>
+<td>configured maximum age (in days) of messages before expiration
 <tr valign=top><td><b>can_read</b><td>boolean
-<td>user has sufficient access to read messages</td>
+<td>user has sufficient access to read messages
 <tr valign=top><td><b>can_post</b><td>boolean
-<td>user has sufficient access to post messages</td>
+<td>user has sufficient access to post messages
 <tr valign=top><td><b>is_operator</b><td>boolean
-<td>user has operator access to this message area</td>
+<td>user has operator access to this message area
 <tr valign=top><td><b>is_moderated</b><td>boolean
-<td>user's posts are moderated</td>
+<td>user's posts are moderated
 <tr valign=top><td><b>scan_ptr</b><td>number
-<td>user's current new message scan pointer (highest-read message number)</td>
+<td>user's current new message scan pointer (highest-read message number)
 <tr valign=top><td><b>scan_cfg</b><td>number
-<td>user's message scan configuration (bitfield) see <tt>SUB_SCAN_*</tt> in <tt>sbbsdefs.js</tt> for valid bits</td>
+<td>user's message scan configuration (bitfield) see <tt>SUB_SCAN_*</tt> in <tt>sbbsdefs.js</tt> for valid bits
 <tr valign=top><td><b>lead_read</b><td>number
-<td>user's last-read message number</td>
+<td>user's last-read message number
 </table>
 <h2><a name=file_area>file_area object</a>
 <br><font size=-1>File Transfer Areas</font>
 </h2>
 <h2><a name=file_area.dir>file_area.dir object</a>
 <br><font size=-1>Associative array of all directories (use internal code as index)</font>
+<font size=-1> - introduced in v3.11</font>
 </h2>
 <table border=1 width=100%>
 <caption align=left><b><tt>file_area</tt>
@@ -1620,15 +2190,15 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>number</b><td>number
-<td>library number</td>
+<td>library number
 <tr valign=top><td><b>name</b><td>string
-<td>library name</td>
+<td>library name
 <tr valign=top><td><b>description</b><td>string
-<td>library description</td>
+<td>library description
 <tr valign=top><td><b>ars</b><td>string
-<td>library access requirements</td>
+<td>library access requirements
 <tr valign=top><td><b>link</b><td>string
-<td>library link (for HTML index)</td>
+<td>library link (for HTML index)
 </table>
 <h2><a name=file_area.lib_list.dir_list>file_area.lib_list.dir_list array</a>
 <br><font size=-1>File Transfer Directories</font>
@@ -1645,63 +2215,64 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>number</b><td>number
-<td>directory number</td>
+<td>directory number
 <tr valign=top><td><b>lib_number</b><td>number
-<td>library number</td>
+<td>library number
 <tr valign=top><td><b>code</b><td>string
-<td>directory internal code</td>
+<td>directory internal code
 <tr valign=top><td><b>name</b><td>string
-<td>directory name</td>
+<td>directory name
 <tr valign=top><td><b>description</b><td>string
-<td>directory description</td>
+<td>directory description
 <tr valign=top><td><b>path</b><td>string
-<td>directory file storage location</td>
+<td>directory file storage location
 <tr valign=top><td><b>ars</b><td>string
-<td>directory access requirements</td>
+<td>directory access requirements
 <tr valign=top><td><b>upload_ars</b><td>string
-<td>directory upload requirements</td>
+<td>directory upload requirements
 <tr valign=top><td><b>download_ars</b><td>string
-<td>directory download requirements</td>
+<td>directory download requirements
 <tr valign=top><td><b>exempt_ars</b><td>string
-<td>directory exemption requirements</td>
+<td>directory exemption requirements
 <tr valign=top><td><b>operator_ars</b><td>string
-<td>directory operator requirements</td>
+<td>directory operator requirements
 <tr valign=top><td><b>extensions</b><td>string
-<td>allowed file extensions (comma delimited)</td>
+<td>allowed file extensions (comma delimited)
 <tr valign=top><td><b>upload_sem</b><td>string
-<td>upload semaphore file</td>
+<td>upload semaphore file
 <tr valign=top><td><b>data_dir</b><td>string
-<td>directory data storage location</td>
+<td>directory data storage location
 <tr valign=top><td><b>settings</b><td>number
-<td>toggle options (bitfield)</td>
+<td>toggle options (bitfield)
 <tr valign=top><td><b>seqdev</b><td>number
-<td>sequential (slow storage) device number</td>
+<td>sequential (slow storage) device number
 <tr valign=top><td><b>sort</b><td>number
-<td>sort order (see <tt>SORT_*</tt> in <tt>sbbsdefs.js</tt> for valid values)</td>
+<td>sort order (see <tt>SORT_*</tt> in <tt>sbbsdefs.js</tt> for valid values)
 <tr valign=top><td><b>max_files</b><td>number
-<td>configured maximum number of files</td>
+<td>configured maximum number of files
 <tr valign=top><td><b>max_age</b><td>number
-<td>configured maximum age (in days) of files before expiration</td>
+<td>configured maximum age (in days) of files before expiration
 <tr valign=top><td><b>upload_credit_pct</b><td>number
-<td>percent of file size awarded uploader in credits upon file upload</td>
+<td>percent of file size awarded uploader in credits upon file upload
 <tr valign=top><td><b>download_credit_pct</b><td>number
-<td>percent of file size awarded uploader in credits upon subsequent downloads</td>
+<td>percent of file size awarded uploader in credits upon subsequent downloads
 <tr valign=top><td><b>link</b><td>string
-<td>directory link (for HTML index)</td>
+<td>directory link (for HTML index)
 <tr valign=top><td><b>can_upload</b><td>boolean
-<td>user has sufficient access to upload files</td>
+<td>user has sufficient access to upload files
 <tr valign=top><td><b>can_download</b><td>boolean
-<td>user has sufficient access to download files</td>
+<td>user has sufficient access to download files
 <tr valign=top><td><b>is_exempt</b><td>boolean
-<td>user is exempt from download credit costs</td>
+<td>user is exempt from download credit costs
 <tr valign=top><td><b>is_operator</b><td>boolean
-<td>user has operator access to this directory</td>
+<td>user has operator access to this directory
 </table>
 <h2><a name=xtrn_area>xtrn_area object</a>
 <br><font size=-1>External Program Areas</font>
 </h2>
 <h2><a name=xtrn_area.prog>xtrn_area.prog object</a>
 <br><font size=-1>Associative array of all external programs (use internal code as index)</font>
+<font size=-1> - introduced in v3.11</font>
 </h2>
 <h2><a name=xtrn_area.sec_list>xtrn_area.sec_list array</a>
 <br><font size=-1>Online Program (door) Sections</font>
@@ -1718,13 +2289,13 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>number</b><td>number
-<td>external program section number</td>
+<td>external program section number
 <tr valign=top><td><b>code</b><td>string
-<td>external program section internal code</td>
+<td>external program section internal code
 <tr valign=top><td><b>name</b><td>string
-<td>external program section name</td>
+<td>external program section name
 <tr valign=top><td><b>ars</b><td>string
-<td>external program section access requirements</td>
+<td>external program section access requirements
 </table>
 <h2><a name=xtrn_area.sec_list.prog_list>xtrn_area.sec_list.prog_list array</a>
 <br><font size=-1>Online External Programs (doors)</font>
@@ -1741,40 +2312,41 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>code</b><td>string
-<td>internal code</td>
+<td>internal code
 <tr valign=top><td><b>name</b><td>string
-<td>name</td>
+<td>name
 <tr valign=top><td><b>cmd</b><td>string
-<td>command-line</td>
+<td>command-line
 <tr valign=top><td><b>clean_cmd</b><td>string
-<td>clean-up command-line</td>
+<td>clean-up command-line
 <tr valign=top><td><b>startup_dir</b><td>string
-<td>startup directory</td>
+<td>startup directory
 <tr valign=top><td><b>ars</b><td>string
-<td>access requirements</td>
+<td>access requirements
 <tr valign=top><td><b>execution_ars</b><td>string
-<td>execution requirements</td>
+<td>execution requirements
 <tr valign=top><td><b>settings</b><td>number
-<td>toggle options (bitfield)</td>
+<td>toggle options (bitfield)
 <tr valign=top><td><b>type</b><td>number
-<td>drop file type</td>
+<td>drop file type
 <tr valign=top><td><b>event</b><td>number
-<td>event type (0=none)</td>
+<td>event type (0=none)
 <tr valign=top><td><b>textra</b><td>number
-<td>extra time given to users running this program</td>
+<td>extra time given to users running this program
 <tr valign=top><td><b>max_time</b><td>number
-<td>maximum time allowed in program</td>
+<td>maximum time allowed in program
 <tr valign=top><td><b>cost</b><td>number
-<td>execution cost (credits to run this program)</td>
+<td>execution cost (credits to run this program)
 <tr valign=top><td><b>number</b><td>number
-<td>program number</td>
+<td>program number
 <tr valign=top><td><b>sec_number</b><td>number
-<td>program section number</td>
+<td>program section number
 <tr valign=top><td><b>can_run</b><td>boolean
-<td>user has sufficient access to run this program</td>
+<td>user has sufficient access to run this program
 </table>
 <h2><a name=xtrn_area.event>xtrn_area.event object</a>
 <br><font size=-1>Associative array of all timed events (use internal code as index)</font>
+<font size=-1> - introduced in v3.11</font>
 </h2>
 <table border=1 width=100%>
 <caption align=left><b><tt>xtrn_area.event</tt>
@@ -1788,26 +2360,27 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>cmd</b><td>string
-<td>command-line</td>
+<td>command-line
 <tr valign=top><td><b>startup_dir</b><td>string
-<td>startup directory</td>
+<td>startup directory
 <tr valign=top><td><b>node_num</b><td>number
-<td>node number</td>
+<td>node number
 <tr valign=top><td><b>time</b><td>number
-<td>time to execute</td>
+<td>time to execute
 <tr valign=top><td><b>freq</b><td>number
-<td>frequency to execute</td>
+<td>frequency to execute
 <tr valign=top><td><b>days</b><td>number
-<td>days of week to execute (bitfield)</td>
+<td>days of week to execute (bitfield)
 <tr valign=top><td><b>mdays</b><td>number
-<td>days of month to execute (bitfield)</td>
+<td>days of month to execute (bitfield)
 <tr valign=top><td><b>last_run</b><td>number
-<td>date/time last run (in time_t format)</td>
+<td>date/time last run (in time_t format)
 <tr valign=top><td><b>settings</b><td>number
-<td>toggle options (bitfield)</td>
+<td>toggle options (bitfield)
 </table>
 <h2><a name=xtrn_area.editor>xtrn_area.editor object</a>
 <br><font size=-1>Associative array of all external editors (use internal code as index)</font>
+<font size=-1> - introduced in v3.11</font>
 </h2>
 <table border=1 width=100%>
 <caption align=left><b><tt>xtrn_area.editor</tt>
@@ -1821,15 +2394,15 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>name</b><td>string
-<td>name</td>
+<td>name
 <tr valign=top><td><b>cmd</b><td>string
-<td>command-line</td>
+<td>command-line
 <tr valign=top><td><b>ars</b><td>string
-<td>access requirements</td>
+<td>access requirements
 <tr valign=top><td><b>settings</b><td>number
-<td>toggle options (bitfield)</td>
+<td>toggle options (bitfield)
 <tr valign=top><td><b>type</b><td>number
-<td>drop file type</td>
+<td>drop file type
 </table>
 <h2><a name=MsgBase>MsgBase class</a>
 <br><font size=-1>Class used for accessing message bases</font>
@@ -1846,25 +2419,36 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Returns</font>
 <th align=left width=200>
 <font color="white">Usage</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>open</b><td>boolean<td><tt>MsgBase.open()
+<td>3.10
 <td>open message base
 <tr valign=top><td><b>close</b><td>boolean<td><tt>MsgBase.close()
+<td>3.10
 <td>close message base (if open)
 <tr valign=top><td><b>get_msg_header</b><td>object<td><tt>MsgBase.get_msg_header([boolean by_offset,] number_or_id)
+<td>3.10
 <td>returns a specific message header, <i>null</i> on failure
 <tr valign=top><td><b>put_msg_header</b><td>boolean<td><tt>MsgBase.put_msg_header([boolean by_offset,] number, object header)
+<td>3.10
 <td>write a message header
 <tr valign=top><td><b>get_msg_body</b><td>string<td><tt>MsgBase.get_msg_body([boolean by_offset,] number_or_id [,boolean strip_ctrl_a])
+<td>3.10
 <td>returns the body text of a specific message, <i>null</i> on failure
 <tr valign=top><td><b>get_msg_tail</b><td>string<td><tt>MsgBase.get_msg_tail([boolean by_offset,] number_or_id [,boolean strip_ctrl_a])
+<td>3.10
 <td>returns the tail text of a specific message, <i>null</i> on failure
 <tr valign=top><td><b>get_msg_index</b><td>object<td><tt>MsgBase.get_msg_index([boolean by_offset,] number)
+<td>3.11
 <td>returns a specific message index, <i>null</i> on failure. The index object will contain the following properties:<br><table><tr><td><tt>subject</tt><td>CRC-16 of lowercase message subject<tr><td><tt>to</tt><td>CRC-16 of lowercase recipient's name (or user number if e-mail)<tr><td><tt>from</tt><td>CRC-16 of lowercase sender's name (or user number if e-mail)<tr><td><tt>attr</tt><td>Attribute bitfield<tr><td><tt>time</tt><td>Date/time (in time_t format)<tr><td><tt>number</tt><td>Message number<tr><td><tt>offset</tt><td>Byte-offset into header file</table>
 <tr valign=top><td><b>remove_msg</b><td>boolean<td><tt>MsgBase.remove_msg([boolean by_offset,] number_or_id)
+<td>3.11
 <td>mark message as deleted
 <tr valign=top><td><b>save_msg</b><td>boolean<td><tt>MsgBase.save_msg(object header, string body_text)
+<td>3.10
 <td>create a new message in message base, the <i>header</i> object may contain the following properties:<br><table><tr><td><tt>subject</tt><td>Message subject <i>(required)</i><tr><td><tt>to</tt><td>Recipient's name <i>(required)</i><tr><td><tt>to_ext</tt><td>Recipient's user number (for local e-mail)<tr><td><tt>to_org</tt><td>Recipient's organization<tr><td><tt>to_net_type</tt><td>Recipient's network type (default: 0 for local)<tr><td><tt>to_net_addr</tt><td>Recipient's network address<tr><td><tt>to_agent</tt><td>Recipient's agent type<tr><td><tt>from</tt><td>Sender's name <i>(required)</i><tr><td><tt>from_ext</tt><td>Sender's user number<tr><td><tt>from_org</tt><td>Sender's organization<tr><td><tt>from_net_type</tt><td>Sender's network type (default: 0 for local)<tr><td><tt>from_net_addr</tt><td>Sender's network address<tr><td><tt>replyto</tt><td>Replies should be sent to this name<tr><td><tt>replyto_ext</tt><td>Replies should be sent to this user number<tr><td><tt>replyto_org</tt><td>Replies should be sent to organization<tr><td><tt>replyto_net_type</tt><td>Replies should be sent to this network type<tr><td><tt>replyto_net_addr</tt><td>Replies should be sent to this network address<tr><td><tt>replyto_agent</tt><td>Replies should be sent to this agent type<tr><td><tt>id</tt><td>Message's RFC-822 compliant Message-ID<tr><td><tt>reply_id</tt><td>Message's RFC-822 compliant Reply-ID<tr><td><tt>reverse_path</tt><td>Message's SMTP sender address<tr><td><tt>path</tt><td>Messages's NNTP path<tr><td><tt>newsgroups</tt><td>Message's NNTP newsgroups header<tr><td><tt>ftn_msgid</tt><td>FidoNet FTS-9 Message-ID<tr><td><tt>ftn_reply</tt><td>FidoNet FTS-9 Reply-ID<tr><td><tt>ftn_area</tt><td>FidoNet FTS-4 echomail AREA tag<tr><td><tt>ftn_flags</tt><td>FidoNet FSC-53 FLAGS<tr><td><tt>ftn_pid</tt><td>FidoNet FSC-46 Program Identifier<tr><td><tt>ftn_tid</tt><td>FidoNet FSC-46 Tosser Identifier<tr><td><tt>date</tt><td>RFC-822 formatted date/time<tr><td><tt>attr</tt><td>Attribute bitfield<tr><td><tt>auxattr</tt><td>Auxillary attribute bitfield<tr><td><tt>netattr</tt><td>Network attribute bitfield<tr><td><tt>when_written_time</tt><td>Date/time (in time_t format)<tr><td><tt>when_written_zone</tt><td>Time zone<tr><td><tt>when_imported_time</tt><td>Date/time message was imported<tr><td><tt>when_imported_zone</tt><td>Time zone<tr><td><tt>thread_orig</tt><td>Replying to this message number<tr><td><tt>thread_next</tt><td>Number of next message in this thread<tr><td><tt>thread_first</tt><td>Number of first reply to this message<tr><td><tt>field_list[].type</tt><td>Other SMB header fields (type)<tr><td><tt>field_list[].data</tt><td>Other SMB header fields (data)</table>
 </table>
 <br>
@@ -1877,34 +2461,49 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Name</font>
 <th align=left width=100>
 <font color="white">Type</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>error</b><td>string
-<td>last occurred message base error - <small>READ ONLY</small></td>
+<td>3.10
+<td>last occurred message base error - <small>READ ONLY</small>
 <tr valign=top><td><b>file</b><td>string
-<td>base path and filename of message base - <small>READ ONLY</small></td>
+<td>3.10
+<td>base path and filename of message base - <small>READ ONLY</small>
 <tr valign=top><td><b>retry_time</b><td>number
-<td>message base open/lock retry timeout (in seconds)</td>
+<td>3.10
+<td>message base open/lock retry timeout (in seconds)
 <tr valign=top><td><b>retry_delay</b><td>number
-<td>delay between message base open/lock retries (in milliseconds)</td>
+<td>3.11
+<td>delay between message base open/lock retries (in milliseconds)
 <tr valign=top><td><b>first_msg</b><td>number
-<td>first message number - <small>READ ONLY</small></td>
+<td>3.10
+<td>first message number - <small>READ ONLY</small>
 <tr valign=top><td><b>last_msg</b><td>number
-<td>last message number - <small>READ ONLY</small></td>
+<td>3.10
+<td>last message number - <small>READ ONLY</small>
 <tr valign=top><td><b>total_msgs</b><td>number
-<td>total number of messages - <small>READ ONLY</small></td>
+<td>3.10
+<td>total number of messages - <small>READ ONLY</small>
 <tr valign=top><td><b>max_crcs</b><td>number
-<td>maximum number of message CRCs to store (for dupe checking) - <small>READ ONLY</small></td>
+<td>3.10
+<td>maximum number of message CRCs to store (for dupe checking) - <small>READ ONLY</small>
 <tr valign=top><td><b>max_msgs</b><td>number
-<td>maximum number of messages before expiration - <small>READ ONLY</small></td>
+<td>3.10
+<td>maximum number of messages before expiration - <small>READ ONLY</small>
 <tr valign=top><td><b>max_age</b><td>number
-<td>maximum age (in days) of messages to store - <small>READ ONLY</small></td>
+<td>3.10
+<td>maximum age (in days) of messages to store - <small>READ ONLY</small>
 <tr valign=top><td><b>attributes</b><td>number
-<td>message base attributes - <small>READ ONLY</small></td>
+<td>3.10
+<td>message base attributes - <small>READ ONLY</small>
 <tr valign=top><td><b>subnum</b><td>number
-<td>sub-board number (0-based, -1 for e-mail) - <small>READ ONLY</small></td>
+<td>3.10
+<td>sub-board number (0-based, -1 for e-mail) - <small>READ ONLY</small>
 <tr valign=top><td><b>is_open</b><td>boolean
-<td><i>true</i> if the message base has been opened successfully - <small>READ ONLY</small></td>
+<td>3.10
+<td><i>true</i> if the message base has been opened successfully - <small>READ ONLY</small>
 </table>
 <h2><a name=MsgBase.cfg>MsgBase.cfg object</a>
 <br><font size=-1>Configuration parameters for this message area (<i>sub-boards only</i>) - <small>READ ONLY</small></font>
@@ -1921,47 +2520,47 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>number</b><td>number
-<td>sub-board number</td>
+<td>sub-board number
 <tr valign=top><td><b>grp_number</b><td>number
-<td>group number</td>
+<td>group number
 <tr valign=top><td><b>code</b><td>string
-<td>sub-board internal code</td>
+<td>sub-board internal code
 <tr valign=top><td><b>name</b><td>string
-<td>sub-board name</td>
+<td>sub-board name
 <tr valign=top><td><b>description</b><td>string
-<td>sub-board description</td>
+<td>sub-board description
 <tr valign=top><td><b>qwk_name</b><td>string
-<td>sub-board QWK name</td>
+<td>sub-board QWK name
 <tr valign=top><td><b>newsgroup</b><td>string
-<td>newsgroup name (as configured or dymamically generated)</td>
+<td>newsgroup name (as configured or dymamically generated)
 <tr valign=top><td><b>ars</b><td>string
-<td>sub-board access requirements</td>
+<td>sub-board access requirements
 <tr valign=top><td><b>read_ars</b><td>string
-<td>sub-board reading requirements</td>
+<td>sub-board reading requirements
 <tr valign=top><td><b>post_ars</b><td>string
-<td>sub-board posting requirements</td>
+<td>sub-board posting requirements
 <tr valign=top><td><b>operator_ars</b><td>string
-<td>sub-board operator requirements</td>
+<td>sub-board operator requirements
 <tr valign=top><td><b>moderated_ars</b><td>string
-<td>sub-board moderated-user requirements (if non-blank)</td>
+<td>sub-board moderated-user requirements (if non-blank)
 <tr valign=top><td><b>data_dir</b><td>string
-<td>sub-board data storage location</td>
+<td>sub-board data storage location
 <tr valign=top><td><b>fidonet_origin</b><td>string
-<td>FidoNet origin line</td>
+<td>FidoNet origin line
 <tr valign=top><td><b>qwknet_tagline</b><td>string
-<td>QWK Network tagline</td>
+<td>QWK Network tagline
 <tr valign=top><td><b>settings</b><td>number
-<td>toggle options (bitfield)</td>
+<td>toggle options (bitfield)
 <tr valign=top><td><b>ptridx</b><td>number
-<td>index into message scan configuration/pointer file</td>
+<td>index into message scan configuration/pointer file
 <tr valign=top><td><b>qwk_conf</b><td>number
-<td>QWK conference number</td>
+<td>QWK conference number
 <tr valign=top><td><b>max_crcs</b><td>number
-<td>configured maximum number of message CRCs to store (for dupe checking)</td>
+<td>configured maximum number of message CRCs to store (for dupe checking)
 <tr valign=top><td><b>max_msgs</b><td>number
-<td>configured maximum number of messages before purging</td>
+<td>configured maximum number of messages before purging
 <tr valign=top><td><b>max_age</b><td>number
-<td>configured maximum age (in days) of messages before expiration</td>
+<td>configured maximum age (in days) of messages before expiration
 </table>
 <h2><a name=File>File class</a>
 <br><font size=-1>Class used for opening, creating, reading, or writing files on the local file system<p>Special features include:</h2><ol type=disc><li>Exclusive-access files (default) or shared files<ol type=circle><li>optional record-locking<li>buffered or non-buffered I/O</ol><li>Support for binary files<ol type=circle><li>native or network byte order (endian)<li>automatic Unix-to-Unix (<i>UUE</i>), yEncode (<i>yEnc</i>) or Base64 encoding/decoding</ol><li>Support for ASCII text files<ol type=circle><li>supports line-based I/O<ol type=square><li>entire file may be read or written as an array of strings<li>individual lines may be read or written one line at a time</ol><li>supports fixed-length records<ol type=square><li>optional end-of-text (<i>etx</i>) character for automatic record padding/termination<li>Synchronet <tt>.dat</tt> files use an <i>etx</i> value of 3 (Ctrl-C)</ol><li>supports <tt>.ini</tt> formated configuration files<li>optional ROT13 encoding/translation</ol><li>Dynamically-calculated industry standard checksums (e.g. CRC-16, CRC-32, MD5)</ol></font>
@@ -1978,51 +2577,75 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Returns</font>
 <th align=left width=200>
 <font color="white">Usage</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>open</b><td>boolean<td><tt>File.open([string mode, boolean shareable, number buflen])
+<td>3.10
 <td>open file, <i>shareable</i> defaults to <i>false</i>, <i>buflen</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><tt>a&nbsp</tt> open for writing at the end of the file (appending); creates the file first if it doesnꊰ exist<br><tt>r+</tt> open for both reading and writing (the file must exist)<br><tt>w+</tt> open an empty file for both reading and writing; if the given file exists, its contents are destroyed<br><tt>a+</tt> open for reading and appending<br><tt>b&nbsp</tt> open in binary (untranslated) mode; translations involving carriage-return and linefeed characters are suppressed (e.g. <tt>r+b</tt>)<br>
 <tr valign=top><td><b>close</b><td>void<td><tt>File.close()
+<td>3.10
 <td>close file
 <tr valign=top><td><b>remove</b><td>boolean<td><tt>File.remove()
+<td>3.10
 <td>remove the file from the disk
 <tr valign=top><td><b>clear_error</b><td>boolean<td><tt>File.clear_error()
+<td>3.10
 <td>clears the current error value (AKA clearError)
 <tr valign=top><td><b>flush</b><td>boolean<td><tt>File.flush()
+<td>3.10
 <td>flush/commit buffers to disk
 <tr valign=top><td><b>rewind</b><td>boolean<td><tt>File.rewind()
+<td>3.11
 <td>repositions the file pointer (<i>position</i>) to the beginning of a file and clears error and end-of-file indicators
 <tr valign=top><td><b>lock</b><td>boolean<td><tt>File.lock([offset, length])
+<td>3.10
 <td>lock file record for exclusive access (file must be opened <i>shareable</i>)
 <tr valign=top><td><b>unlock</b><td>boolean<td><tt>File.unlock([offset, length])
+<td>3.10
 <td>unlock file record for exclusive access
 <tr valign=top><td><b>read</b><td>string<td><tt>File.read([maxlen])
+<td>3.10
 <td>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
 <tr valign=top><td><b>readln</b><td>string<td><tt>File.readln([maxlen])
+<td>3.10
 <td>read a line-feed terminated string, <i>maxlen</i> defaults to 512 characters
 <tr valign=top><td><b>readBin</b><td>number<td><tt>File.readBin([bytes])
+<td>3.10
 <td>read a binary integer from the file, default number of <i>bytes</i> is 4 (32-bits)
 <tr valign=top><td><b>readAll</b><td>array<td><tt>File.readAll()
+<td>3.10
 <td>read all lines into an array of strings
 <tr valign=top><td><b>write</b><td>boolean<td><tt>File.write(string text [,len])
+<td>3.10
 <td>write a string to the file (optionally unix-to-unix or base64 decoding in the process)
 <tr valign=top><td><b>writeln</b><td>boolean<td><tt>File.writeln([string text])
+<td>3.10
 <td>write a line-feed terminated string to the file
 <tr valign=top><td><b>writeBin</b><td>boolean<td><tt>File.writeBin(value [,bytes])
+<td>3.10
 <td>write a binary integer to the file, default number of <i>bytes</i> is 4 (32-bits)
 <tr valign=top><td><b>writeAll</b><td>boolean<td><tt>File.writeAll(array lines)
+<td>3.10
 <td>write an array of strings to file
 <tr valign=top><td><b>printf</b><td>number<td><tt>File.printf(string format [,args])
+<td>3.10
 <td>write a formatted string to the file (ala fprintf) - <small>CAUTION: for experienced C programmers ONLY</small>
 <tr valign=top><td><b>iniGetSections</b><td>array<td><tt>File.iniGetSections([prefix])
+<td>3.11
 <td>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>
 <tr valign=top><td><b>iniGetKeys</b><td>array<td><tt>File.iniGetKeys(section)
+<td>3.11
 <td>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>
 <tr valign=top><td><b>iniGetValue</b><td>string<td><tt>File.iniGetValue(section, key [,default])
+<td>3.11
 <td>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. will return a <i>bool</i>, <i>number</i>, <i>string</i>, or an <i>array of strings</i> determined by the type of <i>default</i> value specified
 <tr valign=top><td><b>iniGetObject</b><td>object<td><tt>File.iniGetObject(section)
+<td>3.11
 <td>parse an entire section from a .ini file and return all of its keys and values as properties of an object
 <tr valign=top><td><b>iniGetAllObjects</b><td>array<td><tt>File.iniGetAllObjects([name_property] [,prefix])
+<td>3.11
 <td>parse all sections from a .ini file and return all sections and keys an array of objects with each section's keys as properties of each section object, <i>name_property</i> is the name of the property to create to contain the section's name (default is <tt>"name"</tt>), the optional <i>prefix</i> has the same use as in the <tt>iniGetSections</tt> method, if a <i>prefix</i> is specified, it is removed from each section's name
 </table>
 <br>
@@ -2035,54 +2658,79 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Name</font>
 <th align=left width=100>
 <font color="white">Type</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>name</b><td>string
-<td>filename specified in constructor - <small>READ ONLY</small></td>
+<td>3.10
+<td>filename specified in constructor - <small>READ ONLY</small>
 <tr valign=top><td><b>mode</b><td>string
-<td>mode string specified in <i>open</i> call - <small>READ ONLY</small></td>
+<td>3.10
+<td>mode string specified in <i>open</i> call - <small>READ ONLY</small>
 <tr valign=top><td><b>exists</b><td>boolean
-<td><i>true</i> if the file exists - <small>READ ONLY</small></td>
+<td>3.10
+<td><i>true</i> if the file exists - <small>READ ONLY</small>
 <tr valign=top><td><b>is_open</b><td>boolean
-<td><i>true</i> if the file has been opened successfully - <small>READ ONLY</small></td>
+<td>3.10
+<td><i>true</i> if the file has been opened successfully - <small>READ ONLY</small>
 <tr valign=top><td><b>eof</b><td>boolean
-<td><i>true</i> if the current file position is at the <i>end of file</i> - <small>READ ONLY</small></td>
+<td>3.10
+<td><i>true</i> if the current file position is at the <i>end of file</i> - <small>READ ONLY</small>
 <tr valign=top><td><b>error</b><td>number
-<td>the last occurred error value (use clear_error to clear) - <small>READ ONLY</small></td>
+<td>3.10
+<td>the last occurred error value (use clear_error to clear) - <small>READ ONLY</small>
 <tr valign=top><td><b>descriptor</b><td>number
-<td>the open file descriptor (advanced use only) - <small>READ ONLY</small></td>
+<td>3.10
+<td>the open file descriptor (advanced use only) - <small>READ ONLY</small>
 <tr valign=top><td><b>etx</b><td>number
-<td>end-of-text character (advanced use only), if non-zero used by <i>read</i>, <i>readln</i>, and <i>write</i></td>
+<td>3.10
+<td>end-of-text character (advanced use only), if non-zero used by <i>read</i>, <i>readln</i>, and <i>write</i>
 <tr valign=top><td><b>debug</b><td>boolean
-<td>set to <i>true</i> to enable debug log output</td>
+<td>3.10
+<td>set to <i>true</i> to enable debug log output
 <tr valign=top><td><b>position</b><td>number
-<td>the current file position (offset in bytes), change value to seek within file</td>
+<td>3.10
+<td>the current file position (offset in bytes), change value to seek within file
 <tr valign=top><td><b>date</b><td>number
-<td>last modified date/time (in time_t format)</td>
+<td>3.11
+<td>last modified date/time (in time_t format)
 <tr valign=top><td><b>length</b><td>number
-<td>the current length of the file (in bytes)</td>
+<td>3.10
+<td>the current length of the file (in bytes)
 <tr valign=top><td><b>attributes</b><td>number
-<td>file mode/attributes</td>
+<td>3.10
+<td>file mode/attributes
 <tr valign=top><td><b>network_byte_order</b><td>boolean
-<td>set to <i>true</i> if binary data is to be written and read in Network Byte Order (big end first)</td>
+<td>3.11
+<td>set to <i>true</i> if binary data is to be written and read in Network Byte Order (big end first)
 <tr valign=top><td><b>rot13</b><td>boolean
-<td>set to <i>true</i> to enable automatic ROT13 translatation of text</td>
+<td>3.11
+<td>set to <i>true</i> to enable automatic ROT13 translatation of text
 <tr valign=top><td><b>uue</b><td>boolean
-<td>set to <i>true</i> to enable automatic Unix-to-Unix encode and decode on <tt>read</tt> and <tt>write</tt> calls</td>
+<td>3.11
+<td>set to <i>true</i> to enable automatic Unix-to-Unix encode and decode on <tt>read</tt> and <tt>write</tt> calls
 <tr valign=top><td><b>yenc</b><td>boolean
-<td>set to <i>true</i> to enable automatic yEnc encode and decode on <tt>read</tt> and <tt>write</tt> calls</td>
+<td>3.11
+<td>set to <i>true</i> to enable automatic yEnc encode and decode on <tt>read</tt> and <tt>write</tt> calls
 <tr valign=top><td><b>base64</b><td>boolean
-<td>set to <i>true</i> to enable automatic Base64 encode and decode on <tt>read</tt> and <tt>write</tt> calls</td>
+<td>3.11
+<td>set to <i>true</i> to enable automatic Base64 encode and decode on <tt>read</tt> and <tt>write</tt> calls
 <tr valign=top><td><b>crc16</b><td>number
-<td>calculated 16-bit CRC of file contents - <small>READ ONLY</small></td>
+<td>3.11
+<td>calculated 16-bit CRC of file contents - <small>READ ONLY</small>
 <tr valign=top><td><b>crc32</b><td>number
-<td>calculated 32-bit CRC of file contents - <small>READ ONLY</small></td>
+<td>3.11
+<td>calculated 32-bit CRC of file contents - <small>READ ONLY</small>
 <tr valign=top><td><b>chksum</b><td>number
-<td>calculated 32-bit checksum of file contents - <small>READ ONLY</small></td>
+<td>3.11
+<td>calculated 32-bit checksum of file contents - <small>READ ONLY</small>
 <tr valign=top><td><b>md5_hex</b><td>undefined
-<td>calculated 128-bit MD5 digest of file contents as hexadecimal string - <small>READ ONLY</small></td>
+<td>3.11
+<td>calculated 128-bit MD5 digest of file contents as hexadecimal string - <small>READ ONLY</small>
 <tr valign=top><td><b>md5_base64</b><td>undefined
-<td>calculated 128-bit MD5 digest of file contents as base64-encoded string - <small>READ ONLY</small></td>
+<td>3.11
+<td>calculated 128-bit MD5 digest of file contents as base64-encoded string - <small>READ ONLY</small>
 </table>
 <h2><a name=Socket>Socket class</a>
 <br><font size=-1>Class used for TCP/IP socket communications</font>
@@ -2099,43 +2747,63 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Returns</font>
 <th align=left width=200>
 <font color="white">Usage</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
 <tr valign=top><td><b>close</b><td>void<td><tt>Socket.close()
+<td>3.10
 <td>close (shutdown) the socket immediately
-<tr valign=top><td><b>bind</b><td>boolean<td><tt>Socket.bind([port])
-<td>bind socket to a port (number or service name)
+<tr valign=top><td><b>bind</b><td>boolean<td><tt>Socket.bind([port] [,ip_address])
+<td>3.11
+<td>bind socket to a TCP or UDP <i>port</i> (number or service name), optionally specifying a network interface (via <i>ip_address</i>)
 <tr valign=top><td><b>connect</b><td>boolean<td><tt>Socket.connect(host, port [,timeout])
-<td>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</i> (seconds)
+<td>3.11
+<td>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)
 <tr valign=top><td><b>listen</b><td>boolean<td><tt>Socket.listen()
+<td>3.10
 <td>place socket in a state to listen for incoming connections (use before an accept)
 <tr valign=top><td><b>accept</b><td>object<td><tt>Socket.accept()
+<td>3.10
 <td>accept an incoming connection, returns a new <i>Socket</i> object representing the new connection
 <tr valign=top><td><b>send</b><td>boolean<td><tt>Socket.send(data)
+<td>3.10
 <td>send a string (AKA write)
 <tr valign=top><td><b>sendto</b><td>boolean<td><tt>Socket.sendto(data, address, port)
+<td>3.10
 <td>send data to a specific host (IP address or host name) and port (number or service name), for UDP sockets
 <tr valign=top><td><b>sendfile</b><td>boolean<td><tt>Socket.sendfile(filename)
+<td>3.10
 <td>send an entire file over the socket
 <tr valign=top><td><b>sendBin</b><td>boolean<td><tt>Socket.sendBin(number value [,number bytes])
+<td>3.11
 <td>send a binary integer over the socket, default number of bytes is 4 (32-bits)
 <tr valign=top><td><b>recv</b><td>string<td><tt>Socket.recv([maxlen])
+<td>3.10
 <td>receive a string, default maxlen is 512 characters (AKA read)
 <tr valign=top><td><b>peek</b><td>string<td><tt>Socket.peek([maxlen])
+<td>3.10
 <td>receive a string, default maxlen is 512 characters, leaves string in receive buffer
 <tr valign=top><td><b>recvline</b><td>string<td><tt>Socket.recvline([maxlen] [,timeout])
+<td>3.10
 <td>receive a line-feed terminated string, default maxlen is 512 characters, default timeout is 30 seconds (AKA readline and readln)
 <tr valign=top><td><b>recvfrom</b><td>object<td><tt>Socket.recvfrom([bool binary] [,maxlen or int_size])
+<td>3.11
 <td>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><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)
 <tr valign=top><td><b>recvBin</b><td>number<td><tt>Socket.recvBin([number bytes])
+<td>3.11
 <td>receive a binary integer from the socket, default number of bytes is 4 (32-bits)
 <tr valign=top><td><b>getoption</b><td>number<td><tt>Socket.getoption(option)
+<td>3.10
 <td>get socket option value, option may be socket option name (see <tt>sockopts</tt> in <tt>sockdefs.js</tt>) or number
 <tr valign=top><td><b>setoption</b><td>boolean<td><tt>Socket.setoption(option, value)
+<td>3.10
 <td>set socket option value, option may be socket option name (see <tt>sockopts</tt> in <tt>sockdefs.js</tt>) or number
 <tr valign=top><td><b>ioctl</b><td>number<td><tt>Socket.ioctl(command [,argument])
+<td>3.10
 <td>send socket IOCTL (advanced)
 <tr valign=top><td><b>poll</b><td>number<td><tt>Socket.poll([number timeout] [,bool write])
+<td>3.10
 <td>poll socket for read or write ability (default is <i>read</i>), default timeout value is 0.0 seconds (immediate timeout)
 </table>
 <br>
@@ -2148,36 +2816,52 @@ Generated for <b>Synchronet v3.11a alpha Debug</b>, compiled Sep 26 2003 15:56
 <font color="white">Name</font>
 <th align=left width=100>
 <font color="white">Type</font>
+<th align=left width=50>
+<font color="white">Ver</font>
 <th align=left>
 <font color="white">Description</font>
-<tr valign=top><td><b>descriptor</b><td>number
-<td>error status for the last socket operation that failed - <small>READ ONLY</small></td>
 <tr valign=top><td><b>error</b><td>number
-<td><i>true</i> if socket is in a connected state - <small>READ ONLY</small></td>
+<td>3.11
+<td>error status for the last socket operation that failed - <small>READ ONLY</small>
 <tr valign=top><td><b>is_connected</b><td>boolean
-<td><i>true</i> if socket can accept written data - <small>READ ONLY</small></td>
+<td>3.10
+<td><i>true</i> if socket is in a connected state - <small>READ ONLY</small>
 <tr valign=top><td><b>is_writeable</b><td>boolean
-<td><i>true</i> if data is waiting to be read from socket - <small>READ ONLY</small></td>
+<td>3.11
+<td><i>true</i> if socket can accept written data - <small>READ ONLY</small>
 <tr valign=top><td><b>data_waiting</b><td>boolean
-<td>number of bytes waiting to be read - <small>READ ONLY</small></td>
+<td>3.10
+<td><i>true</i> if data is waiting to be read from socket - <small>READ ONLY</small>
 <tr valign=top><td><b>nread</b><td>number
-<td>enable debug logging</td>
+<td>3.10
+<td>number of bytes waiting to be read - <small>READ ONLY</small>
 <tr valign=top><td><b>debug</b><td>number
-<td>socket descriptor (advanced uses only)</td>
+<td>3.10
+<td>enable debug logging
+<tr valign=top><td><b>descriptor</b><td>number
+<td>3.10
+<td>socket descriptor (advanced uses only)
 <tr valign=top><td><b>nonblocking</b><td>boolean
-<td>use non-blocking operation (default is <i>false</i>)</td>
+<td>3.10
+<td>use non-blocking operation (default is <i>false</i>)
 <tr valign=top><td><b>local_ip_address</b><td>string
-<td>local IP address (string in dotted-decimal format)</td>
+<td>3.10
+<td>local IP address (string in dotted-decimal format)
 <tr valign=top><td><b>local_port</b><td>number
-<td>local TCP or UDP port number</td>
+<td>3.10
+<td>local TCP or UDP port number
 <tr valign=top><td><b>remote_ip_address</b><td>string
-<td>remote IP address (string in dotted-decimal format)</td>
+<td>3.10
+<td>remote IP address (string in dotted-decimal format)
 <tr valign=top><td><b>remote_port</b><td>number
-<td>remote TCP or UDP port number</td>
+<td>3.10
+<td>remote TCP or UDP port number
 <tr valign=top><td><b>type</b><td>number
-<td>socket type, <tt>SOCK_STREAM</tt> (TCP) or <tt>SOCK_DGRAM</tt> (UDP)</td>
+<td>3.10
+<td>socket type, <tt>SOCK_STREAM</tt> (TCP) or <tt>SOCK_DGRAM</tt> (UDP)
 <tr valign=top><td><b>network_byte_order</b><td>boolean
-<td><i>true</i> if binary data is to be sent in Network Byte Order (big end first), default is <i>true</i></td>
+<td>3.11
+<td><i>true</i> if binary data is to be sent in Network Byte Order (big end first), default is <i>true</i>
 </table>
 <p><small>
-Totals: 445 properties, 247 methods
+Totals: 452 properties, 252 methods