terminal.py:  Initial work to support printing as well as many different file types (similar to the way images are handled now).
Merge branch 'master' into printing
terminal.py:  Committing some incomplete stuff that needs to be continued later...
Merge branch 'master' into printing
terminal.py:  The new logic surrounding capturing file output is in place.  It is working with images like it used to and PDF support has been added as well.  Still needs work to be able to capture PDFs that have multiple %%EOF tags.
gateone.py:  Added support for giving a temp file location to the terminal emulator.  Still need to add an handler to serve up these files.
Merge branch 'master' into printing
terminal.py:  Capturing PDFs now works well.  Still in the middle of working out all the edge cases though.  Need a commit so I can switch braches ;)
gateone.py:  Added a DownloadHandler() for /downloads/ URLs.  This is to support terminal.py's new functionality in regards to FileTypes.
Merge branch 'master' into printing
terminal.py:  Gate One now officially supports PDFs!  You can 'cat somefile.pdf' just like you can 'cat someimage.jpeg' or 'cat someimage.png'.  Notes on this below...
terminal.py:  In order to support PDFs the way Gate One captures terminal output has undergone a bit of a rework.  Instead of having hard-coded regular expressions and a capture_image() function Terminal now uses subclasses of a new FileType() class and a new capture_file() function which uses the functions contained in a given FileType to capture the file.  As a demonstration of the flexibility of this mechanism, images are automatically resized and output directly to the terminal as IMG tags with data::URIs as their SRC while PDFs are rendered as clickable icons which will open in a new window (using the new DownloadHandler in gateone.py).  Coinciding with this change is updates to the logic of Terminal.write():  It has been modified considerably to work with container formats (like PDFs) and overall should be a bit more accurate and performant than it used to be.
terminal.py:  There are four new subclasses of FileType() included with Terminal:  ImageFile(FileType), PNGFile(ImageFile), JPEGFile(ImageFile), and PDFFile(FileType).  Each has their own detailed docstrings and comments.
terminal.py:  A new function has been added:  Terminal.add_magic().  If you make your own subclass of FileType() you can add it using this function and Terminal() will magically be able to recognize and capture it!  It doesn't get much easier than that!
terminal.py:  Added a new kind of callback:  CALLBACK_MESSAGE.  It will get called when the terminal emulator needs to send a message to the client without mucking around with their current screen.
terminal.py:  Just a note about PDFFile:  Support for generating thumbnails of the captured PDFs using Ghostscript is included but currently commented out because it is a blocking call and too slow.  Feel free to try it out if you like:  Works great except for the fact that all of Gate One will hang for two to four seconds while the thumbnail is generated.  I might make this a configurable option in the future.  I am also considering ways to render the thumbnail in the background and merely sending an updated image to the client when its ready (might require some serious architecture changes though).
terminal.py:  Autowrap mode is now forced.  This means that long lines will be copied as multiple, hard-wrapped lines but it is a small price to pay for everything else working properly.  There were just too many issues with things like 'top' and editing long command lines in the shell without this.  Along with this change I have modified Terminal.carriage_return() to be as dumb as possible (it just sets self.cursorX to 0 like it used to before I went down the autowrap rabbit hole).
gateone.py:  Added TerminalWebSocket.send_message().  It sends a message to the client using the 'notice' WebSocket handler (aka GateOne.Visual.serverMessageAction() in gateone.js).  Should've added this a long time ago (so simple yet so useful).
gateone.py:  Added terminal.CALLBACK_MESSAGE support to TerminalWebSocket.new_terminal().
gateone.py:  Renamed reset_terminal() to reset_client_terminal().  I might actually get rid of this function entirely since the reason for its existence has long passed.
gateone.py:  Added a *new* function reset_terminal() function that *actually* performs a terminal reset manuever.
gateone.py:  When executing ./gateone.py --kill it will remove the session directory to ensure there's no confusion about what terminals are still running when Gate One starts back up again.
termio.py:  Changed how the rate limiter works:  Instead of truncating output (which could result in lost bits of images, PDFs, and whatnot) it will now simply detach the handler that calls Multiplex._read() when there's output ready on the file descriptor for 10 seconds.  Also, if the user sends a keystroke it will disengage the rate limiter immediately allowing whatever program it was to continue.  The message in gateone.js that tells the user about the rate limiter has been updated to reflect this.
termio.py:  The most basic of rate limits is now always applied:  No more than one read per 50ms.  This is imperceptable to the human mind and won't make any difference to network latency (it isn't added on top of network latency...  It is just a minimum delay between screen updates if you have a fast-updating program).
gateone.js:  Attached the resetTerminalAction() to the WebSocket actions.  So it will actually work now--if I ever find a use for it :)
gateone.js:  Fixed an issue where you could get an "Uncaught TypeError" when reconnecting to a Gate One server if all your existing terminals were closed.
go_process.js:  Cleaned up some leftover code from a forgotten time.  When fairies and scrollback buffers lived together in harmony.
Documentation:  Rebuilt to reflect the changes in gateone.py, terminal.py, and termio.py